Problem with waiting for a service to be available

Randell Jesup rjesup at wgate.com
Thu Sep 17 14:09:31 PDT 2009


There seems to be a designed-in timing hole in the DBus architecture, or
perhaps it isn't obvious (or explained) how you're supposed to wait for
a service to be available.  Note that "ServiceName" is using dbus-c++
(the working "git" tree branch with ecore integration).  Perhaps even
it's a dbus-c++ issue, though it doesn't seem like it.


If (like Qt's wrapper does to update ::isValid()) your application
watches for NameOwnerChanged to know when a destination is available to
send methods to, the ordering of operations leaves a timing hole.  To
whit:

(From what dbus-monitor sees, what my Qt apps sees, and what another
application would probably see):

:1.17 sends AddMatch to DBus for NameOwnerChanged signal

Assumes: we've connected NameOwnerChanged signal to internal Qt slot
Time goes by, and then we start up the server for ServiceName

signal NameOwnerChanged for :1.35
:1.35 sends Hello to DBus
signal NameOwnerChanged for ServiceName
:1.35 sends RequestName to DBus for ServiceName

At this point, the listener notices NameOwnerChanged, and sends a method
(init()) to to ServiceName.  Note that it may do this as soon as
NameOwnerChanged for ServiceName is delivered to :1.17

:1.17 sends init to Servicename
:1.35 sends AddMatch to DBus for ServiceName

Wait around 15-30 seconds....

:1.35 finally acts like it got method init() (and I think sends a reply,
         which dbus isn't configured to let dbus-monitor see)
:1.17 sends version to ServiceName

Note that if ServiceName is already registered before :1.17 starts up,
there are no unusual delays.

Simplified profile (sorry, I didn't have the initial signal of
NameOwnerChanged for :1.35 in here)

mc	1253210449	162033	1	:1.35	/org/freedesktop/DBus	org.freedesktop.DBus	Hello
sig	1253210449	204469	10	/org/freedesktop/DBus	org.freedesktop.DBus	NameOwnerChanged
mc	1253210449	204727	2	:1.35	/org/freedesktop/DBus	org.freedesktop.DBus	RequestName
mc	1253210449	223718	52	:1.17	/com/foo/ServiceName	com.foo.ServiceName	init
mc	1253210449	250102	3	:1.35	/org/freedesktop/DBus	org.freedesktop.DBus	AddMatch
mc	1253210474	268186	53	:1.17	/com/foo/ServiceName	com.foo.ServiceName	version
mc	1253210475	397637	54	:1.17	/com/foo/ServiceName	com.foo.ServiceName	command

So, I assume the delay is a retry within dbus to deliver the message
before giving up.  Even if it's queued in dbus, why isn't it delivered
when :1.35 (ServiceName) does the AddMatch?

Also note: the previous owner of ServiceName had been killed, and
appropriate NameOwnerChanged had occurred.  From another run:

sig	1253221607	797520	17	/org/freedesktop/DBus	org.freedesktop.DBus	NameOwnerChanged
mc	1253221607	797769	11	:1.44	/org/freedesktop/DBus	org.freedesktop.DBus	ReleaseName
sig	1253221607	867286	18	/org/freedesktop/DBus	org.freedesktop.DBus	NameOwnerChanged

The first NameOwnerChanged is for com.foo.ServiceName, the second is for :1.44
-- 
Randell Jesup, Worldgate
rjesup at wgate.com


More information about the dbus mailing list