Thread (8 messages) 8 messages, 2 authors, 2010-12-26

Re: [PATCH 1/5] external: get number of failed disks for container

From: Neil Brown <hidden>
Date: 2010-12-26 11:33:09

On Thu, 23 Dec 2010 17:02:33 +0100 Przemyslaw Czarnowski
[off-list ref] wrote:
Container degradation here is defined as the number of failed disks in
mostly degraded sub-array. This number is used as value for
array.failed_disks and used in comparison to find best match.

Signed-off-by: Przemyslaw Czarnowski <redacted>
Applied... but ...
quoted hunk ↗ jump to hunk
---
 Incremental.c |   35 ++++++++++++++++++++++++++++++++++-
 1 files changed, 34 insertions(+), 1 deletions(-)
diff --git a/Incremental.c b/Incremental.c
index a4ac1b5..ef719fa 100644
--- a/Incremental.c
+++ b/Incremental.c
@@ -820,6 +820,34 @@ static int count_active(struct supertype *st, struct mdinfo *sra,
 	return cnt;
 }
 
+/* test if container has degraded member(s) */
+int container_members_max_degradation(struct map_ent *map, struct map_ent *me)
should be 'static'.

+{
+	mdu_array_info_t array;
+	int afd;
+	int max_degraded = 0;
+	char devname[100];
+
+	snprintf(devname, sizeof(devname), "md%d", me->devnum);
+	for(; map; map = map->next) {
+		if (!is_subarray(map->metadata) ||
+		    strncmp(me->metadata+1, devname, strlen(devname) != 0))
+			continue;
Rather than formatting devnum as a devname, you can use devname2devnum on
me->metadata+1 and compare that with me->devnum.

And the strncmp should have been for map->metadata+1, not me->metadata+1 !!!!

I have fixed all these.

Thanks,
NeilBrown


quoted hunk ↗ jump to hunk
+		afd = open_dev(map->devnum);
+		if (afd < 0)
+			continue;
+		/* most accurate information regarding array degradation */
+		if (ioctl(afd, GET_ARRAY_INFO, &array) >= 0) {
+			int degraded = array.raid_disks - array.active_disks -
+				       array.spare_disks;
+			if (degraded > max_degraded)
+				max_degraded = degraded;
+		}
+		close(afd);
+	}
+	return (max_degraded);
+}
+
 static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
 			   struct map_ent *target, int bare,
 			   struct supertype *st, int verbose)
@@ -887,7 +915,7 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
 					 GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE|
 					 GET_COMPONENT|GET_VERSION);
 			if (sra)
-				sra->array.failed_disks = 0;
+				sra->array.failed_disks = -1;
 		}
 		if (!sra)
 			continue;
@@ -914,6 +942,11 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol,
 				goto next;
 		} else
 			st2 = st;
+		/* update number of failed disks for mostly degraded
+		 * container member */
+		if (sra->array.failed_disks == -1)
+			sra->array.failed_disks = container_members_max_degradation(map, mp);
+
 		get_dev_size(dfd, NULL, &devsize);
 		if (st2->ss->avail_size(st2, devsize) < sra->component_size) {
 			if (verbose > 1)
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help