diff options
author | Brad Bishop <bradleyb@us.ibm.com> | 2015-11-03 10:40:17 -0500 |
---|---|---|
committer | Brad Bishop <bradleyb@us.ibm.com> | 2015-11-03 10:40:17 -0500 |
commit | cb7aa60e51c6ab95cac5bdee2b88e9c09b282d94 (patch) | |
tree | 968087d1f52184206a889035589668bf6ff648a0 /phosphor-mapper | |
parent | 54d3ec986dac57ffc27907e2191eb7bf3e04909f (diff) | |
download | phosphor-objmgr-cb7aa60e51c6ab95cac5bdee2b88e9c09b282d94.tar.gz phosphor-objmgr-cb7aa60e51c6ab95cac5bdee2b88e9c09b282d94.zip |
Defer mapper name registration to post discovery
When systemd units that depend on objectmapper name registration
currently get started, they block while objectmapper does all
its initial discovery. This change ensures that the mapper is
ready to receive requests before registering the service name on
dbus.
Diffstat (limited to 'phosphor-mapper')
-rw-r--r-- | phosphor-mapper | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/phosphor-mapper b/phosphor-mapper index 1415e24..5bdcd8d 100644 --- a/phosphor-mapper +++ b/phosphor-mapper @@ -34,8 +34,7 @@ class ObjectMapper(dbus.service.Object): self.name_match = name_match self.intf_match = intf_match self.tag_match = OpenBMCMapper.ListMatch(['children', 'interface']) - - self.discovery_done = False + self.service = None gobject.idle_add(self.discover) self.bus.dbus.add_signal_receiver(self.bus_handler, @@ -50,13 +49,20 @@ class ObjectMapper(dbus.service.Object): signal_name = 'InterfacesRemoved', sender_keyword = 'sender') + def discovery_pending(self): + return not bool(self.service) + def interfaces_added_handler(self, path, iprops, **kw): + if self.discovery_pending(): + return matches = [ x for x in iprops.iterkeys() if self.intf_match(x) ] d = self.cache.setdefault(path, {}) d[path].setdefault(kw['sender'], []).extend(matches) self.cache[path] = d def interfaces_removed_handler(self, path, interfaces, **kw): + if self.discovery_pending(): + return item = self.cache[path] name = kw['sender'] for x in interfaces: @@ -94,7 +100,7 @@ class ObjectMapper(dbus.service.Object): del self.cache[x] def bus_handler(self, service, old, new): - if not self.discovery_done or \ + if self.discovery_pending() or \ not self.name_match(service): return @@ -113,17 +119,17 @@ class ObjectMapper(dbus.service.Object): self.add_interfaces(x, owner, y['interfaces']) def discover(self, owners = None): - discovery = not self.discovery_done if not owners: owners = [ IntrospectionParser(x, self.bus.dbus, self.tag_match, self.intf_match) \ for x in self.bus.get_owner_names(self.name_match) ] - self.discovery_done = True for o in owners: self.add_items(o.name, o.introspect()) - if discovery: + if self.discovery_pending(): print "ObjectMapper discovery complete..." + self.service = dbus.service.BusName( + OpenBMCMapper.MAPPER_NAME, self.bus.dbus) @dbus.service.method(OpenBMCMapper.MAPPER_IFACE, 's', 'a{sas}') def GetObject(self, path): @@ -154,7 +160,6 @@ class BusWrapper: if __name__ == '__main__': dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) bus = dbus.SystemBus() - s = dbus.service.BusName(OpenBMCMapper.MAPPER_NAME, bus) o = ObjectMapper(BusWrapper(bus), OpenBMCMapper.MAPPER_PATH) loop = gobject.MainLoop() |