Hi folks, I have been facing a problem of making a simple cgi GUI for working with md raid, and reporting back the information. I ended up using the monitor mode event mechanism for various things including updating the rebuild percentage. Soon after, people started complaining that 20% increments in progress are rather silly. I noticed long ago in the list the thought/request that those increments may be a bit smaller. So, here's a patch (attachment) to allow sending RebuildNN events at any percent increment, specified on mdadm commandline. Any comments? Is this a desirable feature? Anything I should change to make it acceptable? Regards, Zdenek Behan
From d99a9125a0b713c9d0f2390330862d15500204a7 Mon Sep 17 00:00:00 2001 From: Zdenek Behan <rain@xxxxxxxxx> Date: Wed, 14 Oct 2009 22:06:39 +0200 Subject: [PATCH] Monitor: add option to specify rebuild increments, ie. the percent increments after which RebuildNN event is generated This is particulary useful when using --program option, rather than (only) syslog for alerts. Signed-off-by: Zdenek Behan <rain@xxxxxxxxx> --- Monitor.c | 26 +++++++++++++------------- ReadMe.c | 2 ++ mdadm.c | 12 ++++++++++-- mdadm.h | 2 +- 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/Monitor.c b/Monitor.c index af486d7..63493b7 100644 --- a/Monitor.c +++ b/Monitor.c @@ -33,14 +33,6 @@ static void alert(char *event, char *dev, char *disc, char *mailaddr, char *mailfrom, char *cmd, int dosyslog); -static char *percentalerts[] = { - "RebuildStarted", - "Rebuild20", - "Rebuild40", - "Rebuild60", - "Rebuild80", -}; - /* The largest number of disks current arrays can manage is 384 * This really should be dynamically, but that will have to wait * At least it isn't MD_SB_DISKS. @@ -49,7 +41,7 @@ static char *percentalerts[] = { int Monitor(mddev_dev_t devlist, char *mailaddr, char *alert_cmd, int period, int daemonise, int scan, int oneshot, - int dosyslog, int test, char* pidfile) + int dosyslog, int test, char* pidfile, int increments) { /* * Every few seconds, scan every md device looking for changes @@ -77,8 +69,8 @@ int Monitor(mddev_dev_t devlist, * An active device had a reverse transition * RebuildStarted * percent went from -1 to +ve - * Rebuild20 Rebuild40 Rebuild60 Rebuild80 - * percent went from below to not-below that number + * RebuildNN + * percent went from below to not-below NN% * DeviceDisappeared * Couldn't access a device which was previously visible * @@ -311,9 +303,17 @@ int Monitor(mddev_dev_t devlist, if (mse && st->percent >= 0 && mse->percent >= 0 && - (mse->percent / 20) > (st->percent / 20)) - alert(percentalerts[mse->percent/20], + (mse->percent / increments) > (st->percent / increments)) { + char percentalert[15]; // "RebuildNN" or "RebuildStarted" + + if((mse->percent / increments) == 0) + snprintf(percentalert, 15, "RebuildStarted"); + else + snprintf(percentalert, 11, "Rebuild%02d", mse->percent); + + alert(percentalert, dev, NULL, mailaddr, mailfrom, alert_cmd, dosyslog); + } if (mse && mse->percent == -1 && diff --git a/ReadMe.c b/ReadMe.c index 90b4daf..3e53e57 100644 --- a/ReadMe.c +++ b/ReadMe.c @@ -176,6 +176,7 @@ struct option long_options[] = { {"mail", 1, 0, 'm'}, {"program", 1, 0, 'p'}, {"alert", 1, 0, 'p'}, + {"increment", 1, 0, 'r'}, {"delay", 1, 0, 'd'}, {"daemonise", 0, 0, 'f'}, {"daemonize", 0, 0, 'f'}, @@ -495,6 +496,7 @@ char Help_monitor[] = " --mail= -m : Address to mail alerts of failure to\n" " --program= -p : Program to run when an event is detected\n" " --alert= : same as --program\n" +" --increment= -r : Report RebuildNN events in the given increment. default=20\n" " --delay= -d : seconds of delay between polling state. default=60\n" " --config= -c : specify a different config file\n" " --scan -s : find mail-address/program in config file\n" diff --git a/mdadm.c b/mdadm.c index bb3e5bb..a7c579c 100644 --- a/mdadm.c +++ b/mdadm.c @@ -89,6 +89,7 @@ int main(int argc, char *argv[]) int require_homehost = 1; char *mailaddr = NULL; char *program = NULL; + int increments = 20; int delay = 0; int daemonise = 0; char *pidfile = NULL; @@ -697,7 +698,14 @@ int main(int argc, char *argv[]) else program = optarg; continue; - + case O(MONITOR,'r'): /* rebuild increments */ + increments = atoi(optarg); + if (increments>99 || increments<1) + { + fprintf(stderr, Name ": please specify positive integer between 1 and 99 as rebuild increments.\n"); + exit(2); + } + continue; case O(MONITOR,'d'): /* delay in seconds */ case O(GROW, 'd'): case O(BUILD,'d'): /* delay for bitmap updates */ @@ -1377,7 +1385,7 @@ int main(int argc, char *argv[]) } rv= Monitor(devlist, mailaddr, program, delay?delay:60, daemonise, scan, oneshot, - dosyslog, test, pidfile); + dosyslog, test, pidfile, increments); break; case GROW: diff --git a/mdadm.h b/mdadm.h index 91ba624..dc7ebe6 100644 --- a/mdadm.h +++ b/mdadm.h @@ -744,7 +744,7 @@ extern int Examine(mddev_dev_t devlist, int brief, int export, int scan, extern int Monitor(mddev_dev_t devlist, char *mailaddr, char *alert_cmd, int period, int daemonise, int scan, int oneshot, - int dosyslog, int test, char *pidfile); + int dosyslog, int test, char *pidfile, int increments); extern int Kill(char *dev, int force, int quiet, int noexcl); extern int Wait(char *dev); -- 1.6.0.6