From 385b0ad203da40a2c0110948c0f46feb78ead2be Mon Sep 17 00:00:00 2001 From: shanyunfan33 Date: Thu, 16 Dec 2021 10:48:53 +0800 Subject: [PATCH] Add wait event for metadataagent sb_idl resolve bug:'MetadataAgent' object has no attribute 'sb_idl' Closes-Bug: #1953295 Change-Id: Id83bee82e5c476395ff422dcaf89c0095e74a8ec --- neutron/agent/ovn/metadata/agent.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/neutron/agent/ovn/metadata/agent.py b/neutron/agent/ovn/metadata/agent.py index 62a152aa720..ba026b1567d 100644 --- a/neutron/agent/ovn/metadata/agent.py +++ b/neutron/agent/ovn/metadata/agent.py @@ -15,6 +15,7 @@ import collections import functools import re +import threading import uuid from neutron_lib import constants as n_const @@ -200,6 +201,18 @@ class MetadataAgent(object): self._process_monitor = external_process.ProcessMonitor( config=self.conf, resource_type='metadata') + self._sb_idl = None + self._post_fork_event = threading.Event() + + @property + def sb_idl(self): + if not self._sb_idl: + self._post_fork_event.wait() + return self._sb_idl + + @sb_idl.setter + def sb_idl(self, val): + self._sb_idl = val def _load_config(self): self.chassis = self._get_own_chassis_name() @@ -244,6 +257,7 @@ class MetadataAgent(object): # Chassis table. # Open the connection to OVN SB database. self.has_chassis_private = False + self._post_fork_event.clear() try: self.sb_idl = ovsdb.MetadataAgentOvnSbIdl( chassis=self.chassis, tables=tables + ('Chassis_Private', ), @@ -254,6 +268,9 @@ class MetadataAgent(object): chassis=self.chassis, tables=tables, events=events + (ChassisCreateEvent(self), )).start() + # Now IDL connections can be safely used. + self._post_fork_event.set() + # Do the initial sync. self.sync()