On 08/29/2017 12:05 AM, Martin Wilck wrote: > DAEMON_RUNNING is only used by checkerloop to indicate that > path checkers are running. checkerloop switches back and forth > between DAEMON_IDLE and DAEMON_RUNNING in every iteration, i.e. > it performs two status changes per second on an idle system. > The repeated sd_notify() calls cause a lot of traffic on dbus as > systemd forwards these messages on the system bus. This can be > seen with systemd.log_level=debug. Better skip these notifications > that don't provide useful information to the user, who is very > unlikely to catch the daemon in "running" state anyway. > > Signed-off-by: Martin Wilck <mwilck@xxxxxxxx> > --- > multipathd/main.c | 24 ++++++++++++++++++++---- > 1 file changed, 20 insertions(+), 4 deletions(-) > > diff --git a/multipathd/main.c b/multipathd/main.c > index 4be2c579..b5e2b00d 100644 > --- a/multipathd/main.c > +++ b/multipathd/main.c > @@ -161,15 +161,27 @@ sd_notify_status(void) > case DAEMON_CONFIGURE: > return "STATUS=configure"; > case DAEMON_IDLE: > - return "STATUS=idle"; > case DAEMON_RUNNING: > - return "STATUS=running"; > + return "STATUS=up"; > case DAEMON_SHUTDOWN: > return "STATUS=shutdown"; > } > return NULL; > } > > +static void do_sd_notify(enum daemon_status old_state) > +{ > + /* > + * Checkerloop switches back and forth between idle and running state. > + * No need to tell systemd each time. > + * These notifications cause a lot of overhead on dbus. > + */ > + if ((running_state == DAEMON_IDLE || running_state == DAEMON_RUNNING) && > + (old_state == DAEMON_IDLE || old_state == DAEMON_RUNNING)) > + return; > + sd_notify(0, sd_notify_status()); > +} > + > static void config_cleanup(void *arg) > { > pthread_mutex_unlock(&config_lock); > @@ -179,10 +191,12 @@ void post_config_state(enum daemon_status state) > { > pthread_mutex_lock(&config_lock); > if (state != running_state) { > + enum daemon_status old_state = running_state; > + > running_state = state; > pthread_cond_broadcast(&config_cond); > #ifdef USE_SYSTEMD > - sd_notify(0, sd_notify_status()); > + do_sd_notify(old_state); > #endif > } > pthread_mutex_unlock(&config_lock); > @@ -195,6 +209,8 @@ int set_config_state(enum daemon_status state) > pthread_cleanup_push(config_cleanup, NULL); > pthread_mutex_lock(&config_lock); > if (running_state != state) { > + enum daemon_status old_state = running_state; > + > if (running_state != DAEMON_IDLE) { > struct timespec ts; > > @@ -207,7 +223,7 @@ int set_config_state(enum daemon_status state) > running_state = state; > pthread_cond_broadcast(&config_cond); > #ifdef USE_SYSTEMD > - sd_notify(0, sd_notify_status()); > + do_sd_notify(old_state); > #endif > } > } > Reviewed-by: Hannes Reinecke <hare@xxxxxxxx> Cheers, Hannes -- Dr. Hannes Reinecke Teamlead Storage & Networking hare@xxxxxxx +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel