[DRBD-cvs] svn commit by phil - r2604 - in trunk: . drbd - Made the sub-second takeover code less verbose. (Untest

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Tue Nov 21 18:29:50 CET 2006


Author: phil
Date: 2006-11-21 18:29:49 +0100 (Tue, 21 Nov 2006)
New Revision: 2604

Modified:
   trunk/ROADMAP
   trunk/drbd/drbd_nl.c
Log:
Made the sub-second takeover code less verbose.
(Untested, will test later.)


Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP	2006-11-20 21:16:22 UTC (rev 2603)
+++ trunk/ROADMAP	2006-11-21 17:29:49 UTC (rev 2604)
@@ -898,6 +898,8 @@
 42 Forward port the abilitiy to resume the TL after IO was frozen,
    in case the connection is reestablished again.
 
+43 Fix indexed meta-data.
+
 Maybe:
 
 *  Switch to protocol C in case we are running without a local 

Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c	2006-11-20 21:16:22 UTC (rev 2603)
+++ trunk/drbd/drbd_nl.c	2006-11-21 17:29:49 UTC (rev 2604)
@@ -243,7 +243,7 @@
 		mdev->this_bdev->bd_contains = mdev->this_bdev;
 	}
 
-	if ( new_role & Secondary ) {
+	if ( new_role == Secondary ) {
 		/* If I got here, I am Primary. I claim me for myself. If that
 		 * does not succeed, someone other has claimed me, so I cannot
 		 * become Secondary. */
@@ -253,8 +253,12 @@
 			bd_release(mdev->this_bdev);
 	}
 
+	if ( new_role == Primary ) {
+		request_ping(mdev); // Detect a dead peer ASAP
+	}
+
 	mask.i = 0; mask.role = role_mask;
-	val.i  = 0; val.role  = new_role & role_mask;
+	val.i  = 0; val.role  = new_role;
 
 	while (try++ < 3) {
 		r = _drbd_request_state(mdev,mask,val,0);
@@ -280,7 +284,13 @@
 
 			continue;
 		}
-
+		if( r == SS_TwoPrimaries ) {
+			// Maybe the peer is detected as dead very soon...
+			set_current_state(TASK_INTERRUPTIBLE);
+			schedule_timeout((mdev->net_conf->ping_timeo+1)*HZ/10);
+			if(try == 1) try++; // only a single retry in this case.
+			continue;
+		}
 		if ( r < SS_Success ) {
 			r = drbd_request_state(mdev,mask,val); // Be verbose.
 			if( r < SS_Success ) goto fail;
@@ -305,7 +315,7 @@
 	 * but that means someone is misusing DRBD...
 	 * */
 
-	if (new_role & Secondary) {
+	if (new_role == Secondary) {
 		set_disk_ro(mdev->vdisk, TRUE );
 	} else {
 		if(inc_net(mdev)) {
@@ -324,7 +334,7 @@
 		}
 	}
 
-	if((new_role & Secondary) && inc_local(mdev) ) {
+	if((new_role == Secondary) && inc_local(mdev) ) {
 		drbd_al_to_on_disk_bm(mdev);
 		dec_local(mdev);
 	}
@@ -340,7 +350,7 @@
 	return r;
 
  fail:
-	if ( new_role & Secondary ) {
+	if ( new_role == Secondary ) {
 		D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
 		bd_release(mdev->this_bdev);
 	}
@@ -353,7 +363,6 @@
 			   struct drbd_nl_cfg_reply *reply)
 {
 	struct primary primary_args;
-	int rv;
 
 	memset(&primary_args, 0, sizeof(struct primary));
 	if(!primary_from_tags(mdev,nlp->tag_list,&primary_args)) {
@@ -361,15 +370,8 @@
 		return 0;
 	}
 
-	request_ping(mdev); // Detect a dead peer ASAP
-	rv = drbd_set_role(mdev, Primary, primary_args.overwrite_peer);
-	if( rv == SS_TwoPrimaries ) { 
-		set_current_state(TASK_INTERRUPTIBLE);
-		schedule_timeout((mdev->net_conf->ping_timeo+1)*HZ/10);
-		rv = drbd_set_role(mdev, Primary, primary_args.overwrite_peer);
-	}
-	
-	reply->ret_code = rv;
+	reply->ret_code = drbd_set_role(mdev, Primary, primary_args.overwrite_peer);
+
 	return 0;
 }
 



More information about the drbd-cvs mailing list