summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--managemon.c8
-rw-r--r--mdmon.h1
-rw-r--r--monitor.c4
3 files changed, 13 insertions, 0 deletions
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