[DRBD-cvs] svn commit by phil - r2046 - trunk/drbd - Worked on the following scenario: Secondary / Secondary

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Mon Jan 9 23:06:31 CET 2006


Author: phil
Date: 2006-01-09 23:06:29 +0100 (Mon, 09 Jan 2006)
New Revision: 2046

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
Log:
Worked on the following scenario:
   Secondary / Secondary

1 The disk of the right node gets removed by 'drbdadm detach'
2 The left node gets promoted to primary and devoted to secondary again.
  (=new UUID)
3 The right node gets it disk again with 'drbdadm attach'

Now, this causes a resync, just as expected.


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2006-01-09 20:29:28 UTC (rev 2045)
+++ trunk/drbd/drbd_fs.c	2006-01-09 22:06:29 UTC (rev 2046)
@@ -880,8 +880,9 @@
 		bd_release(mdev->this_bdev);
 		mdev->this_bdev->bd_disk = mdev->vdisk;
 
-		if ( (mdev->state.conn < WFReportParams &&
-		      mdev->bc->md.uuid[Bitmap] == 0) || forced ) {
+		if ( ( ( mdev->state.conn < Connected ||
+			 mdev->state.pdsk <= Attaching ) &&
+		       mdev->bc->md.uuid[Bitmap] == 0) || forced ) {
 			drbd_uuid_new_current(mdev);
 		}
 	}

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-01-09 20:29:28 UTC (rev 2045)
+++ trunk/drbd/drbd_main.c	2006-01-09 22:06:29 UTC (rev 2046)
@@ -764,10 +764,13 @@
 	}
 
 	/*  Lost contact to peer's copy of the data  */
-	if (ns.role == Primary &&
-	    os.pdsk > DUnknown && ns.pdsk <= DUnknown ) {
-		/* Only do it if we have not yet done it... */
-		if ( mdev->bc->md.uuid[Bitmap] == 0 ) {
+	if ( os.pdsk > DUnknown && ns.pdsk <= DUnknown ) {
+		if ( mdev->p_uuid ) {
+			kfree(mdev->p_uuid);
+			mdev->p_uuid = NULL;
+		}
+		if (ns.role == Primary && mdev->bc->md.uuid[Bitmap] == 0 ) {
+			/* Only do it if we have not yet done it... */
 			INFO("Creating new current UUID\n");
 			drbd_uuid_new_current(mdev);
 		}

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2006-01-09 20:29:28 UTC (rev 2045)
+++ trunk/drbd/drbd_receiver.c	2006-01-09 22:06:29 UTC (rev 2046)
@@ -1870,8 +1870,9 @@
 	drbd_determin_dev_size(mdev);
 	drbd_bm_unlock(mdev); // }
 
-	if (mdev->p_uuid && mdev->state.conn <= Connected ) {
+	if (mdev->p_uuid && mdev->state.conn <= Connected && inc_local(mdev)) {
 		nconn=drbd_sync_handshake(mdev,mdev->state.peer);
+		dec_local(mdev);
 
 		if(nconn == conn_mask) return FALSE;
 
@@ -1940,8 +1941,10 @@
 
 	peer_state.i = be32_to_cpu(p->state);
 
-	if (mdev->p_uuid && mdev->state.conn <= Connected ) {
+	if (mdev->p_uuid && mdev->state.conn <= Connected && 
+	    inc_md_only(mdev,Attaching) ) {
 		nconn=drbd_sync_handshake(mdev,peer_state.role);
+		dec_local(mdev);
 
 		if(nconn == conn_mask) return FALSE;
 	}
@@ -1954,7 +1957,7 @@
 		}
 	}
 
-        if ( peer_state.disk == Attaching ) {
+        if ( peer_state.disk == Attaching && nconn == Connected ) {
 		// Peer should promote from Attaching to UpToDate.
 		drbd_send_state(mdev);
 		peer_state.disk = UpToDate;



More information about the drbd-cvs mailing list