D-Bus interface to update multiple properties in one shot

Deepak Kodihalli dkodihal at linux.vnet.ibm.com
Fri Sep 7 20:15:54 AEST 2018


I've come across openbmc apps that implement D-Bus interfaces comprised 
of more than one D-Bus property (phosphor-networkd is a good example), 
and they need to react only after all the properties or a specific set 
of properties have been set, and not after every individual property is 
set. This can be due to functional or performance reasons. For instance 
in the case of phosphor-networkd, it has to restart a networkd systemd 
unit when a property changes. Multiple restarts can actually cause 
systemd to prevent the unit from further restarts. Multiple restarts is 
also not desirable in terms of the app's performance. What 
phosphor-networkd does today is to start a 5 (or 10) second timer when a 
property is set, and restart the networkd unit after the timeout, so as 
to accumulate other properties being set in this time. I believe other 
daemons are doing this as well.

One solution is to design these APIs as D-Bus methods as opposed to a 
set of D-Bus properties. We've avoided this in general because you'd 
then need to define separate getters and setters, and like mentioned 
earlier, a caller may want to set only a subset of all the properties in 
the interface.

A proposal we discussed in a meet recently is to implement a new 
xyz.openbmc_project.Object.Properties D-Bus interface with a method 
called 'Update', which accepts a dictionary of property-value pairs. A 
D-Bus object may implement this interface to be able to set multiple 
properties in one go. The type of the value would need to be a variant 
of all native D-Bus data types. Supporting container data types is 
probably going to be hard, so this may have to be restricted to 
non-container data types. The key would be a string - the property name. 
Thoughts on this proposal?


More information about the openbmc mailing list