[DRBD-cvs] r1721 - in trunk: . drbd scripts user

svn at svn.drbd.org svn at svn.drbd.org
Fri Jan 14 21:02:27 CET 2005


Author: phil
Date: 2005-01-14 21:02:24 +0100 (Fri, 14 Jan 2005)
New Revision: 1721

Modified:
   trunk/
   trunk/Makefile
   trunk/drbd/drbd_bitmap.c
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/scripts/drbd
   trunk/user/drbdsetup.c
Log:
svnp run. Investigated 1686 to 1721

r1696 by phil on 2005-01-10 20:50:51 +0100 (Mon, 10 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_int.h
     M /branches/drbd-0.7/drbd/drbd_main.c
     M /branches/drbd-0.7/drbd/drbd_receiver.c
     M /branches/drbd-0.7/testing/write_gc.pl
  
  * On this brand new dual Xeon system the counting of
    epoch_size is broken. Probabely this revision of Xeons
    is doing memory access reordering more agressive than
    previous versions. Converting epoch size form 
    int to atomic_t solved the issue.
  * When reading from an IBM-ServRaid controller (ips), 
    we need to call run_disk_queue() from time to time
    to get sane performance of it.
  * On this RHAT3 box the write_gc.pl program failed
    to correctly write DRBD's magic number. 
    (probabely a bug in the perl version included 
     with RHAT3.)
  

r1697 by phil on 2005-01-12 15:34:57 +0100 (Wed, 12 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_bitmap.c
     M /branches/drbd-0.7/drbd/drbd_fs.c
     M /branches/drbd-0.7/drbd/drbd_receiver.c
     M /branches/drbd-0.7/user/drbdsetup.c
  
  Fixed online resizing
  
  - Allow it on connected devices, as long as one node is primary.
    This is necessary to have the right resync after growing.
  - Fixed bitmap resizing. Before bm_set was completely wrong when 
    shrinking the device. bm_set was slightly wrong when growing
    the device.
  
  

r1698 by phil on 2005-01-12 15:39:35 +0100 (Wed, 12 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_fs.c
  
  Make it compile...
  
  

r1699 by phil on 2005-01-12 16:39:36 +0100 (Wed, 12 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_bitmap.c
  
  This seems to be the last missing piece of working
  online resizing ... 
  

r1710 by phil on 2005-01-13 15:31:17 +0100 (Thu, 13 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/scripts/drbd
  
  Abort the init script in case one of the setup commands fails
  

r1715 by philipp on 2005-01-14 11:22:53 +0100 (Fri, 14 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/Makefile
  
  introduce makeflag PRESERVE_DEBIAN=1 to include debian directory in
  .filelist (make .filelist PRESERVE_DEBIAN=1 ; make tgz)
  



Property changes on: trunk
___________________________________________________________________
Name: propagate:at
   - 1686
   + 1721

Modified: trunk/Makefile
===================================================================
--- trunk/Makefile	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/Makefile	2005-01-14 20:02:24 UTC (rev 1721)
@@ -120,7 +120,7 @@
 .PHONY: .filelist
 .filelist:
 	@ svn info >/dev/null || { echo "you need a svn checkout to do this." ; false ; }
-	@find $$(svn st -v | sed '/^?/d;s/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;/^debian/d' ) \
+	@find $$(svn st -v | sed '/^?/d;s/^.\{8\} \+[0-9]\+ \+[0-9]\+ [a-z]\+ *//;$(if $(PRESERVE_DEBIAN),,/^debian/d)' ) \
 	\! -type d -maxdepth 0 |\
 	sed 's:^:drbd-$(DIST_VERSION)/:' > .filelist
 	@[ -s .filelist ] # assert there is something in .filelist now

Modified: trunk/drbd/drbd_bitmap.c
===================================================================
--- trunk/drbd/drbd_bitmap.c	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_bitmap.c	2005-01-14 20:02:24 UTC (rev 1721)
@@ -274,6 +274,33 @@
 	return cleared;
 }
 
+STATIC void bm_set_surplus(struct drbd_bitmap * b)
+{
+	const unsigned long mask = (1UL << (b->bm_bits & (BITS_PER_LONG-1))) -1;
+	size_t w = b->bm_bits >> LN2_BPL;
+
+	if ( w < b->bm_words ) {
+		b->bm[w++] |= ~mask;
+	}
+
+	if ( w < b->bm_words ) {
+		b->bm[w++] = ~(0UL);
+	}
+}
+
+STATIC unsigned long bm_count_bits(struct drbd_bitmap * b)
+{
+	unsigned long *bm = b->bm;
+	unsigned long *ep = b->bm + b->bm_words;
+	unsigned long bits = 0;
+
+	while ( bm < ep ) {
+		bits += hweight_long(*bm++);
+	}
+
+	return bits;
+}
+
 #define BM_SECTORS_PER_BIT (BM_BLOCK_SIZE/512)
 
 /*
@@ -288,7 +315,7 @@
 {
 	struct drbd_bitmap *b = mdev->bitmap;
 	unsigned long bits, bytes, words, *nbm, *obm = 0;
-	int err = 0;
+	int err = 0, growing;
 
 	D_BUG_ON(!b);
 	MUST_BE_LOCKED();
@@ -349,19 +376,23 @@
 		obm = b->bm;
 		// brgs. move several MB within spinlock...
 		if (obm) {
+			bm_set_surplus(b);
 			D_ASSERT(b->bm[b->bm_words] == DRBD_MAGIC);
 			memcpy(nbm,obm,min_t(size_t,b->bm_words,words)*sizeof(long));
 		}
-		if (b->bm_words < words) { // set all newly allocated bits
-			memset(nbm,-1,(words - b->bm_words)*sizeof(long));
+		growing = words > b->bm_words;
+		if (growing) { // set all newly allocated bits
+			memset( nbm+b->bm_words, -1,
+				(words - b->bm_words) * sizeof(long) );
+			b->bm_set  += bits - b->bm_bits;
 		}
 		nbm[words] = DRBD_MAGIC;
 		b->bm = nbm;
-		b->bm_set  += bits - b->bm_bits;
 		b->bm_bits  = bits;
 		b->bm_words = words;
 		b->bm_dev_capacity = capacity;
 		bm_clear_surplus(b);
+		if( !growing ) b->bm_set = bm_count_bits(b);
 		bm_end_info(mdev, __FUNCTION__ );
 		spin_unlock_irq(&b->bm_lock);
 		INFO("resync bitmap: bits=%lu words=%lu\n",bits,words);

Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_fs.c	2005-01-14 20:02:24 UTC (rev 1721)
@@ -1001,13 +1001,17 @@
 			err = -EBUSY;
 			break;
 		}
+		if ( mdev->state == Secondary && mdev->o_state == Secondary) {
+			err = -EINPROGRESS;
+			break;
+		}
 		err=0;
 		mdev->lo_usize = (unsigned long)arg;
 		drbd_bm_lock(mdev);
 		drbd_determin_dev_size(mdev);
 		drbd_md_write(mdev); // Write mdev->la_size to disk.
 		drbd_bm_unlock(mdev);
-		if (mdev->state.s.conn == Connected) drbd_send_param(mdev,0);
+		if (mdev->state.s.conn == Connected) drbd_send_param(mdev,1);
 		break;
 
 	case DRBD_IOCTL_SET_NET_CONFIG:

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_int.h	2005-01-14 20:02:24 UTC (rev 1721)
@@ -725,7 +725,7 @@
 	atomic_t resync_locked;   // Number of locked elements in resync LRU
 	int open_cnt;
 	u32 gen_cnt[GEN_CNT_SIZE];
-	int epoch_size;
+	atomic_t epoch_size;
 	spinlock_t ee_lock;
 	struct list_head free_ee;   // available
 	struct list_head active_ee; // IO in progress

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_main.c	2005-01-14 20:02:24 UTC (rev 1721)
@@ -1562,9 +1562,9 @@
 
 	if (   mdev->ee_in_use  !=  0
 	    || mdev->ee_vacant  != 32 /* EE_MININUM */
-	    || mdev->epoch_size !=  0)
+	    || atomic_read(&mdev->epoch_size) !=  0)
 		ERR("ee_in_use:%d ee_vacant:%d epoch_size:%d\n",
-		    mdev->ee_in_use, mdev->ee_vacant, mdev->epoch_size);
+		    mdev->ee_in_use, mdev->ee_vacant, atomic_read(&mdev->epoch_size));
 #define ZAP(x) memset(&x,0,sizeof(x))
 	ZAP(mdev->conf);
 	ZAP(mdev->sync_conf);

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/drbd/drbd_receiver.c	2005-01-14 20:02:24 UTC (rev 1721)
@@ -761,8 +761,8 @@
 	spin_lock_irq(&mdev->ee_lock);
 	rv = _drbd_process_ee(mdev,1);
 
-	epoch_size=mdev->epoch_size;
-	mdev->epoch_size=0;
+	epoch_size=atomic_read(&mdev->epoch_size);
+	atomic_set(&mdev->epoch_size,0);
 	spin_unlock_irq(&mdev->ee_lock);
 
 	rv &= drbd_send_b_ack(mdev, p->barrier, epoch_size);
@@ -973,7 +973,7 @@
 	sector_t sector = drbd_ee_get_sector(e);
 	int ok=1;
 
-	mdev->epoch_size++;
+	atomic_inc(&mdev->epoch_size);
 	if(mdev->conf.wire_protocol == DRBD_PROT_C) {
 		if(likely(drbd_bio_uptodate(&e->private_bio))) {
 			ok=drbd_send_ack(mdev,WriteAck,e);
@@ -1144,7 +1144,11 @@
 	mdev->read_cnt += size >> 9;
 	inc_unacked(mdev);
 	drbd_generic_make_request(READ,&e->private_bio);
+	if (atomic_read(&mdev->local_cnt) >= (mdev->conf.max_epoch_size>>4) ) {
+		drbd_kick_lo(mdev);
+	}
 
+
 	return TRUE;
 }
 
@@ -1364,6 +1368,12 @@
 
 	set_bit(MD_DIRTY,&mdev->flags); // we are changing state!
 
+	if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
+		mdev->lo_usize = be64_to_cpu(p->u_size);
+		INFO("Peer sets u_size to %lu KB\n",
+		     (unsigned long)mdev->lo_usize);
+	}
+
 /*lge:
  * FIXME
  * please get the order of tests (re)settings for consider_sync
@@ -1393,12 +1403,6 @@
 	mdev->sync_conf.group =
 		min_t(int,mdev->sync_conf.group,be32_to_cpu(p->sync_group));
 
-	if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
-		mdev->lo_usize = be64_to_cpu(p->u_size);
-		INFO("Peer sets u_size to %lu KB\n",
-		     (unsigned long)mdev->lo_usize);
-	}
-
 	if (mdev->state.s.conn == WFReportParams) {
 		INFO("Connection established.\n");
 	}
@@ -1709,7 +1713,7 @@
 	D_ASSERT(list_empty(&mdev->sync_ee)); // done here
 	D_ASSERT(list_empty(&mdev->done_ee)); // done here
 
-	mdev->epoch_size=0;
+	atomic_set(&mdev->epoch_size,0);
 	mdev->rs_total=0;
 
 	if(atomic_read(&mdev->unacked_cnt)) {

Modified: trunk/scripts/drbd
===================================================================
--- trunk/scripts/drbd	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/scripts/drbd	2005-01-14 20:02:24 UTC (rev 1721)
@@ -71,7 +71,9 @@
 	else echo echo -n ".. ";
 	fi
 	IFS=$IFS_O
-	$CMD
+	$CMD || { 
+	    echo -e "\ncmd $CMD failed!"; exit 20 
+	}
 	IFS=$NEWLINE
     done
     echo -n "]"

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2005-01-14 13:22:04 UTC (rev 1720)
+++ trunk/user/drbdsetup.c	2005-01-14 20:02:24 UTC (rev 1721)
@@ -1098,11 +1098,16 @@
 	}
     }
 
-  fprintf(stderr,"err=ioctl(drbd_fd,DRBD_IOCTL_SET_DISK_SIZE,%lu);\n",u_size);
   err=ioctl(drbd_fd,DRBD_IOCTL_SET_DISK_SIZE,u_size);
   if(err)
     {
       PERROR("ioctl(,SET_DISK_SIZE,) failed");
+      if(err==EBUSY) {
+	fprintf(stderr,"Online resizing is not allowed during resync.");
+      }
+      if(err==EINPROGRESS) {
+	fprintf(stderr,"One node must be primary to do online resizing.");
+      }
       return 20;
     }
 



More information about the drbd-cvs mailing list