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 <neilb@suse.de>
This commit is contained in:
NeilBrown 2008-07-18 16:37:06 +10:00
parent 103f2410ec
commit 1eb252b848
3 changed files with 13 additions and 0 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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