From: NeilBrown Date: Fri, 18 Jul 2008 06:37:06 +0000 (+1000) Subject: mdmon: ping will wait for manage_mon to catch up. X-Git-Tag: mdadm-3.0-devel1~104 X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=commitdiff_plain;h=1eb252b8488bbdd62ad602561fe8a90ef9079271;hp=103f2410ec581620367d6fde67a3a62f077062a7 mdmon: ping will wait for manage_mon to catch up. When a 'ping' (empty message) is sent to mdmon, we wait for 'monitor' to do a full loop to make sure it has caught up with anything that needs doing. This allows synchronisation between mdadm and mdmon. Maybe monitor should signal managemon rather than managemon polling... Signed-off-by: Neil Brown --- diff --git a/managemon.c b/managemon.c index 447d8ea0..c947552e 100644 --- a/managemon.c +++ b/managemon.c @@ -436,7 +436,15 @@ static void handle_message(struct supertype *container, struct metadata_update * struct metadata_update *mu; if (msg->len == 0) { + int cnt = monitor_loop_cnt; + if (cnt & 1) + cnt += 2; /* wait until next pselect */ + else + cnt += 3; /* wait for 2 pselects */ + wakeup_monitor(); wait_update_handled(); + while (monitor_loop_cnt - cnt < 0) + usleep(10 * 1000); } else { mu = malloc(sizeof(*mu)); mu->len = msg->len; diff --git a/mdmon.h b/mdmon.h index a1f0379b..6c1961ad 100644 --- a/mdmon.h +++ b/mdmon.h @@ -62,3 +62,4 @@ struct mdstat_ent *mdstat_read(int hold, int start); extern int exit_now, manager_ready; extern int mon_tid, mgr_tid; +extern int monitor_loop_cnt; diff --git a/monitor.c b/monitor.c index 31488965..e29d023a 100644 --- a/monitor.c +++ b/monitor.c @@ -405,6 +405,8 @@ static void dprint_wake_reasons(fd_set *fds) } #endif +int monitor_loop_cnt; + static int wait_and_act(struct supertype *container, int nowait) { fd_set rfds; @@ -462,7 +464,9 @@ static int wait_and_act(struct supertype *container, int nowait) sigset_t set; sigprocmask(SIG_UNBLOCK, NULL, &set); sigdelset(&set, SIGUSR1); + monitor_loop_cnt |= 1; rv = pselect(maxfd+1, &rfds, NULL, NULL, NULL, &set); + monitor_loop_cnt += 1; if (rv == -1 && errno == EINTR) rv = 0; #ifdef DEBUG