Skip to content

Commit c8409a3

Browse files
committed
[OVN] Allow to execute MetadataProxyHandler in a local thread
If configuration option "metadata_workers=0", the OVN metadata agent will try to spawn the ``MetadataProxyHandler`` instance inside a local thread, instead of creating a new process. In this case, the method ``MetadataProxyHandler.post_fork_initialize`` is never called and the SB IDL is never created. This patch passes the OVN metadata agent SB IDL instance to the proxy handler instance. This also reduces the number of OVN database active connections. Closes-Bug: #1993181 Change-Id: If9d827228002de7e3a55be660da266b60b0dfb79 (cherry picked from commit f43891b)
1 parent dd7fc47 commit c8409a3

File tree

4 files changed

+26
-18
lines changed

4 files changed

+26
-18
lines changed

neutron/agent/ovn/metadata/agent.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -242,11 +242,6 @@ def start(self):
242242
self.ovs_idl = ovsdb.MetadataAgentOvsIdl().start()
243243
self._load_config()
244244

245-
# Launch the server that will act as a proxy between the VM's and Nova.
246-
proxy = metadata_server.UnixDomainMetadataProxy(self.conf,
247-
self.chassis)
248-
proxy.run()
249-
250245
tables = ('Encap', 'Port_Binding', 'Datapath_Binding', 'SB_Global',
251246
'Chassis')
252247
events = (PortBindingChassisCreatedEvent(self),
@@ -272,13 +267,18 @@ def start(self):
272267
# Now IDL connections can be safely used.
273268
self._post_fork_event.set()
274269

270+
# Launch the server that will act as a proxy between the VM's and Nova.
271+
self._proxy = metadata_server.UnixDomainMetadataProxy(
272+
self.conf, self.chassis, sb_idl=self.sb_idl)
273+
self._proxy.run()
274+
275275
# Do the initial sync.
276276
self.sync()
277277

278278
# Register the agent with its corresponding Chassis
279279
self.register_metadata_agent()
280280

281-
proxy.wait()
281+
self._proxy.wait()
282282

283283
@tenacity.retry(
284284
wait=tenacity.wait_exponential(

neutron/agent/ovn/metadata/server.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@
4444

4545
class MetadataProxyHandler(object):
4646

47-
def __init__(self, conf, chassis):
47+
def __init__(self, conf, chassis, sb_idl):
4848
self.conf = conf
4949
self.chassis = chassis
50-
self._sb_idl = None
50+
self._sb_idl = sb_idl
5151
self._post_fork_event = threading.Event()
5252
self.subscribe()
5353

@@ -193,9 +193,10 @@ def _sign_instance_id(self, instance_id):
193193

194194
class UnixDomainMetadataProxy(object):
195195

196-
def __init__(self, conf, chassis):
196+
def __init__(self, conf, chassis, sb_idl=None):
197197
self.conf = conf
198198
self.chassis = chassis
199+
self.sb_idl = sb_idl
199200
agent_utils.ensure_directory_exists_without_file(
200201
cfg.CONF.metadata_proxy_socket)
201202

@@ -224,7 +225,9 @@ def run(self):
224225
md_workers = self.conf.metadata_workers
225226
if md_workers is None:
226227
md_workers = 2
227-
self.server.start(MetadataProxyHandler(self.conf, self.chassis),
228+
sb_idl = self.sb_idl if md_workers == 0 else None
229+
self.server.start(MetadataProxyHandler(self.conf, self.chassis,
230+
sb_idl),
228231
self.conf.metadata_proxy_socket,
229232
workers=md_workers,
230233
backlog=self.conf.metadata_backlog,

neutron/tests/functional/agent/ovn/metadata/test_metadata_agent.py

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,17 @@ def _start_metadata_agent(self):
8787

8888
ovn_sb_db = self.ovsdb_server_mgr.get_ovsdb_connection_path('sb')
8989
conf.set_override('ovn_sb_connection', ovn_sb_db, group='ovn')
90-
91-
# We don't need the HA proxy server running for now
92-
p = mock.patch.object(metadata_server, 'UnixDomainMetadataProxy')
93-
p.start()
94-
self.addCleanup(p.stop)
90+
conf.set_override('metadata_workers', '0')
9591

9692
self.chassis_name = self.add_fake_chassis(self.FAKE_CHASSIS_HOST)
9793
mock.patch.object(agent.MetadataAgent,
9894
'_get_own_chassis_name',
9995
return_value=self.chassis_name).start()
10096
agt = agent.MetadataAgent(conf)
101-
agt.start()
97+
with mock.patch.object(metadata_server.UnixDomainMetadataProxy,
98+
'wait'):
99+
agt.start()
100+
102101
# Metadata agent will open connections to OVS and SB databases.
103102
# Close connections to them when the test ends,
104103
self.addCleanup(agt.ovs_idl.ovsdb_connection.stop)
@@ -338,3 +337,9 @@ def test__ensure_datapath_checksum_if_dpdk(self):
338337
else:
339338
self.fail('Rule not found in "mangle" table, in namespace %s' %
340339
namespace)
340+
341+
def test_metadata_proxy_handler_idl(self):
342+
# This test relies on the configuration option metadata_workers=0
343+
proxy_sb_idl = self.agent._proxy.server._server._application.sb_idl
344+
agent_sb_idl = self.agent.sb_idl
345+
self.assertEqual(agent_sb_idl, proxy_sb_idl)

neutron/tests/unit/agent/ovn/metadata/test_server.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ def setUp(self):
5555
self.useFixture(self.fake_conf_fixture)
5656
self.log_p = mock.patch.object(agent, 'LOG')
5757
self.log = self.log_p.start()
58-
self.handler = agent.MetadataProxyHandler(self.fake_conf, 'chassis1')
59-
self.handler.sb_idl = mock.Mock()
58+
self.handler = agent.MetadataProxyHandler(self.fake_conf, 'chassis1',
59+
mock.Mock())
6060
self.handler._post_fork_event.set()
6161

6262
def test_call(self):

0 commit comments

Comments
 (0)