[systemd-devel] dbus-1/kdbus - question about 'queued owners'

Lukasz Skalski l.skalski at samsung.com
Mon Apr 13 04:56:38 PDT 2015


On 04/13/2015 01:46 PM, Daniel Mack wrote:
> Hi Lukasz,
> 

Hi,

> [+dbus ML]
> 
> On 04/10/2015 04:20 PM, Lukasz Skalski wrote:
>> Currently I'm working on some testsuite (let's call it dbus1-spec-test)
>> for dbus-1 specification. My idea is to test dbus-1 specification
>> coverage on systems with dbus-daemon and on systems without dbus-daemon
>> (but with latest systemd, bus-proxyd and kdbus) which will allow us (and
>> all userspace apps) to smoothly switch to kdbus. First results of tests
>> are really good:
> 
> Nice, thanks a lot for doing this!
> 
>> My testsuite have found only one inconsistency between dbus-1 and
>> kdbus-enabled system. Problematic testcase (this one tests rather some
>> dbus-daemon/bus-proxyd behaviors than specification) is as follow:
>>
>> test_request_name_6 (void)
>> {
>>   GDBusConnection *connection_a;
>>   GDBusConnection *connection_b;
>>
>>   BusRequestNameFlagsReply request_reply;
>>   BusReleaseNameFlagsReply release_reply;
>>
>>   /* connect and set up two D-Bus client connections */
>>   connection_a = connect_to_bus();
>>   connection_b = connect_to_bus();
>>
>>   /* 'connection_a' - synchronously acquire name on the bus */
>>   request_reply = request_name (connection_a, "org.my.busname",
>>                                 DBUS_NAME_FLAG_REPLACE_EXISTING |
>>                                 DBUS_NAME_FLAG_DO_NOT_QUEUE);
>>
>>   /* 'connection_a' should be primary owner */
>>   CU_ASSERT (request_reply == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER);
>>
>>   /* 'connection_b' tries to own the same well-known name */
>>   request_reply = request_name (connection_b, "org.my.busname",
>>                                 DBUS_NAME_FLAG_REPLACE_EXISTING);
>>
>>   /* 'connection_b' should be appended to the queue */
>>   CU_ASSERT (request_reply == DBUS_REQUEST_NAME_REPLY_IN_QUEUE);
>>
>>   /* once again 'connection_b' tries to own the same name */
>>   request_reply = request_name (connection_b, "org.my.busname",
>>                                 DBUS_NAME_FLAG_REPLACE_EXISTING);
>>
>>   /* and once again we should get the same return code */
>>   CU_ASSERT (request_reply == DBUS_REQUEST_NAME_REPLY_IN_QUEUE);
> 
> The D-Bus spec isn't totally clear about the return code here, but it is
> about what should happen:
> 
> "If replacement is not possible, *and the method caller is currently not
> in the queue*, the method caller is appended to the queue."
> 
> dbus-daemon seems to return IN_QUEUE to inform the caller that the name
> is in the queue, no matter if the call it replies to was responsible for
> creating the queue entry or if that was already the case.
> 
>>   /* 'connection_a' releases name */
>>   release_reply = release_name (connection_a, "org.my.busname");
>>   CU_ASSERT (release_reply == DBUS_RELEASE_NAME_REPLY_RELEASED);
>>
>>   /* 'connection_b' (now primary owner) also release name
>>   release_reply = release_name (connection_b, "org.my.busname");
>>   CU_ASSERT (release_reply == DBUS_RELEASE_NAME_REPLY_RELEASED);
>>
>>   /* 'connection_b' tries to release once again the same name */
>>   release_reply = release_name (connection_b, "org.my.busname");
>>
>>   /* This assert is source of failure - what we should get
>>      here: REPLY_RELEASED or NON_EXISTENT ? */
>>   CU_ASSERT (release_reply == DBUS_RELEASE_NAME_REPLY_NON_EXISTENT);
> 
> As per the spec, the same connection can only be queued up once for a
> given well-known name, so the correct error code should be NON_EXISTENT.
> 
>> Which solution, kdbus or dbus-daemon, do it correctly?
> 
> kdbus is wrong here IMO. The kernel patch you sent me offlist looks
> resonable. Care to rebase and post it to LKML?

Sure. Thanks for clarification!

> 
> 
> Thanks,
> Daniel
> 
> 

Cheers,
-- 
Lukasz Skalski
Samsung R&D Institute Poland
Samsung Electronics
l.skalski at samsung.com


More information about the dbus mailing list