From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lon Hohberger Date: Wed, 27 Feb 2013 13:31:56 -0500 Subject: [Cluster-devel] [PATCH] rgmanager: Don't duplicate configuration change events In-Reply-To: <20130226164051.GA467810@redhat.com> References: <20130226164051.GA467810@redhat.com> Message-ID: <512E511C.3030204@redhat.com> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit On 02/26/2013 11:40 AM, Ryan McCabe wrote: > If a cluster configuration change is detected while there are events > on the event queue that take some time to process, a large number of > duplicate configuration update events are put onto the event queue. > With a large number of services and a small status poll interval, > thousands of duplicate events can be put onto the queue. > > This patch causes rgmanager to queue only one config event per detected > configuration change. Good catch there. Ack / Reviewed-by: Lon Hohberger -- Lon > > This applies only to the RHEL5 branch. > > Signed-off-by: Ryan McCabe > --- > rgmanager/src/daemons/main.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c > index 1c7f746..59150c3 100644 > --- a/rgmanager/src/daemons/main.c > +++ b/rgmanager/src/daemons/main.c > @@ -73,6 +73,7 @@ static int port = RG_PORT; > static char *rgmanager_lsname = "rgmanager"; /* XXX default */ > static int status_poll_interval = DEFAULT_CHECK_INTERVAL; > static int stops_queued = 0; > +static int lastqver = 0; > > int next_node_id(cluster_member_list_t *membership, int me); > > @@ -750,7 +751,7 @@ dump_internal_state(int fd) > int > event_loop(msgctx_t *localctx, msgctx_t *clusterctx) > { > - int n = 0, max, ret, oldver, newver; > + int n = 0, max, ret, oldver = 0, newver = 0; > fd_set rfds; > msgctx_t *newctx; > struct timeval tv; > @@ -826,9 +827,14 @@ event_loop(msgctx_t *localctx, msgctx_t *clusterctx) > return 0; > > if (need_reconfigure || check_config_update(&oldver, &newver)) { > + /* Only queue configuration events once per detected config update */ > + if (!need_reconfigure && newver <= lastqver) > + return 0; > + > need_reconfigure = 0; > configure_rgmanager(-1, 0, NULL); > config_event_q(oldver, newver); > + lastqver = newver; > return 0; > } > >