As discussed in http://b/112468968#comment17, it looks like Chrome's chromeos::CrosDBusService class's Start method calls dbus::Bus::RequestOwnership before giving ServiceProviderInterface implementations a chance to export methods:
chromeos/dbus/services/cros_dbus_service.cc:
42 // Starts the D-Bus service.
43 void Start() {
...
57 bus_->RequestOwnership(
58 service_name_, dbus::Bus::REQUIRE_PRIMARY_ALLOW_REPLACEMENT,
59 base::Bind(&CrosDBusServiceImpl::OnOwnership, base::Unretained(this)));
60
61 exported_object_ = bus_->GetExportedObject(object_path_);
62 for (size_t i = 0; i < service_providers_.size(); ++i)
63 service_providers_[i]->Start(exported_object_);
This creates a window where the service name is owned but the methods are not yet exported. If other D-Bus clients try to call methods in response to the ownership change, their calls may fail due to the methods not existing. powerd made this mistake at one point too ( issue 331431 ).
I think that this method should be changed so that methods are exported before RequestOwnership is called.
Comment 1 by bugdroid1@chromium.org
, Aug 17