[mdadm PATCH] Introduce a commandline option for setting RebuildNN increment size

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux RAID Wiki]     [ATA RAID]     [Linux SCSI Target Infrastructure]     [Linux Block]     [Linux IDE]     [Linux SCSI]     [Linux Hams]     [Device Mapper]     [Device Mapper Cryptographics]     [Kernel]     [Linux Admin]     [Linux Net]     [GFS]     [RPM]     [git]     [Yosemite Forum]


  Powered by Linux