Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 23 Jul 2007 12:49:54 GMT
From:      Ulf Lilleengen <lulf@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 123953 for review
Message-ID:  <200707231249.l6NCnsce059881@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help

http://perforce.freebsd.org/chv.cgi?CH=123953

Change 123953 by lulf@lulf_carrot on 2007/07/23 12:49:01

	- Improve RAID-5 growing a bit, by using p->synced to see how far we're
	  in the growing. This means we can run normal requests while growing!
	  (except those that span across the old and new plex, which must be
	  delayed).

Affected files ...

.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#15 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_plex.c#18 edit
.. //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_raid5.c#11 edit

Differences ...

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_init.c#15 (text+ko) ====

@@ -282,6 +282,7 @@
 	origsize = (sdcount - 1) * s->size;
 	origlength = (sdcount - 1) * p->stripesize;
 	printf("Starting growing at 0 reading %jd bytes\n", origlength);
+	p->synced = 0;
 	gv_grow_request(p, 0, MIN(origlength, origsize), BIO_READ, NULL);
 
 	return (0);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_plex.c#18 (text+ko) ====

@@ -554,6 +554,7 @@
 	/* If it was a read, write it. */
 	if (bp->bio_cmd == BIO_READ) {
 		printf("Finished read, do a write\n");
+		p->synced += bp->bio_length;
 		err = gv_grow_request(p, bp->bio_offset, bp->bio_length,
 		    BIO_WRITE, bp->bio_data);
 	/* If it was a write, read next. */
@@ -586,6 +587,9 @@
 			g_topology_lock();
 			gv_access(v->provider, -1, -1, 0);
 			g_topology_unlock();
+			p->synced = 0;
+			/* Issue delayed requests. */
+			gv_plex_flush(p);
 		} else {
 			offset = bp->bio_offset + bp->bio_length;
 			printf("Issuing next bio read at 0x%jx\n", offset);

==== //depot/projects/soc2007/lulf/gvinum_fixup/sys/geom/vinum/geom_vinum_raid5.c#11 (text+ko) ====

@@ -341,15 +341,24 @@
 	type = REQ_TYPE_NORMAL;
 	original = parity = broken = NULL;
 
-	/* Reads must take into account the growing plexes. */
-	if (bp->bio_cmd == BIO_READ)
-		gv_raid5_offset(p, boff, bcount, &real_off, &real_len, &sdno,
-		    &psdno, 1);
-	else
-		gv_raid5_offset(p, boff, bcount, &real_off, &real_len, &sdno,
-		    &psdno, 0);
+	/* XXX: The resize won't crash with rebuild or sync, but we should still
+	 * be aware of it. Also this should perhaps be done on rebuild/check as
+	 * well?
+	 */
+	/* If we're over, we must use the old. */ 
+	if (boff >= p->synced) {
+		gv_raid5_offset(p, boff, bcount, &real_off, &real_len,
+		    &sdno, &psdno, 1);
+	/* Or if over the resized offset, we use all drives. */
+	} else if (boff + bcount <= p->synced) {
+		gv_raid5_offset(p, boff, bcount, &real_off, &real_len,
+		    &sdno, &psdno, 0);
+	/* Else, we're in the middle, and must wait a bit. */
+	} else {
+		bioq_disksort(p->rqueue, bp);
+		return (0);
+	}
 
-	printf("Got sdno %d and psdno %d\n", sdno, psdno);
 	/* Find the right subdisks. */
 	i = 0;
 	LIST_FOREACH(s, &p->subdisks, in_plex) {
@@ -548,9 +557,8 @@
 	int sd, psd, sdcount;
 	off_t len_left, stripeend, stripeoff, stripestart;
 
-	printf("In read we take into account new subdisks.\n");
 	sdcount = p->sdcount;
-	if (growing) {
+		if (growing) {
 		LIST_FOREACH(s, &p->subdisks, in_plex) {
 			if (s->flags & GV_SD_GROW)
 				sdcount--;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200707231249.l6NCnsce059881>