diff --git a/managemon.c b/managemon.c index 447d8ea..c947552 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 a1f0379..6c1961a 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 3148896..e29d023 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