[DRBD-cvs] svn commit by phil - r2603 - in trunk: drbd drbd/linux scripts user - Splitted the generic timeout and the ping timeout. This

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Mon Nov 20 22:16:26 CET 2006


Author: phil
Date: 2006-11-20 22:16:22 +0100 (Mon, 20 Nov 2006)
New Revision: 2603

Modified:
   trunk/drbd/drbd_nl.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/linux/drbd_limits.h
   trunk/drbd/linux/drbd_nl.h
   trunk/scripts/drbd.conf
   trunk/user/drbdadm_scanner.fl
   trunk/user/drbdsetup.c
Log:
Splitted the generic timeout and the ping timeout. This allows
us to support sub-second failover times!

 When we are asked to become primary we need to check if the
 peer is still alive. Since the asender-thread is a real-time
 task, this works really fast.



Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/drbd/drbd_nl.c	2006-11-20 21:16:22 UTC (rev 2603)
@@ -353,6 +353,7 @@
 			   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)) {
@@ -360,8 +361,15 @@
 		return 0;
 	}
 
-	reply->ret_code = drbd_set_role(mdev, Primary, primary_args.overwrite_peer);
-
+	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;
 	return 0;
 }
 
@@ -1006,6 +1014,8 @@
 		new_conf->want_lose       = 0;
 		new_conf->two_primaries   = 0;
 		new_conf->wire_protocol   = DRBD_PROT_C;
+		new_conf->ping_timeo      = DRBD_PING_TIMEO_DEF;
+		new_conf->rr_conflict     = DRBD_RR_CONFLICT_DEF;
 	}
 
 	if (!net_conf_from_tags(mdev,nlp->tag_list,new_conf)) {

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/drbd/drbd_receiver.c	2006-11-20 21:16:22 UTC (rev 2603)
@@ -769,7 +769,7 @@
 	sock->sk->sk_sndbuf = mdev->net_conf->sndbuf_size;
 	sock->sk->sk_rcvbuf = mdev->net_conf->sndbuf_size;
 	/* NOT YET ...
-	 * sock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/20;
+	 * sock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10;
 	 * sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
 	 * first set it to the HandShake timeout, wich is hardcoded for now: */
 	sock->sk->sk_sndtimeo =
@@ -779,7 +779,7 @@
 	msock->sk->sk_priority=TC_PRIO_INTERACTIVE;
 	tcp_sk(sock->sk)->nonagle = 1;
 	msock->sk->sk_sndbuf = 2*32767;
-	msock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/20;
+	msock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10;
 	msock->sk->sk_rcvtimeo = mdev->net_conf->ping_int*HZ;
 
 	mdev->data.socket = sock;
@@ -799,7 +799,7 @@
 		}
 	}
 
-	sock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/20;
+	sock->sk->sk_sndtimeo = mdev->net_conf->timeout*HZ/10;
 	sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
 
 	atomic_set(&mdev->packet_seq,0);
@@ -3262,10 +3262,8 @@
 	while (get_t_state(thi) == Running) {
 		if (test_and_clear_bit(SEND_PING, &mdev->flags)) {
 			ERR_IF(!drbd_send_ping(mdev)) goto err;
-			// half ack timeout only,
-			// since sendmsg waited the other half already
 			mdev->meta.socket->sk->sk_rcvtimeo =
-				mdev->net_conf->timeout*HZ/20;
+				mdev->net_conf->ping_timeo*HZ/10;
 		}
 
 		while(1) {
@@ -3305,7 +3303,7 @@
 			goto err;
 		} else if (rv == -EAGAIN) {
 			if( mdev->meta.socket->sk->sk_rcvtimeo ==
-			    mdev->net_conf->timeout*HZ/20) {
+			    mdev->net_conf->ping_timeo*HZ/10 ) {
 				ERR("PingAck did not arrive in time.\n");
 				goto err;
 			}

Modified: trunk/drbd/linux/drbd_limits.h
===================================================================
--- trunk/drbd/linux/drbd_limits.h	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/drbd/linux/drbd_limits.h	2006-11-20 21:16:22 UTC (rev 2603)
@@ -54,6 +54,11 @@
 #define DRBD_PING_INT_MAX 120
 #define DRBD_PING_INT_DEF 10
 
+ /* timeout for the ping packets.*/
+#define DRBD_PING_TIMEO_MIN  1
+#define DRBD_PING_TIMEO_MAX  100
+#define DRBD_PING_TIMEO_DEF  5
+
   /* max number of write requests between write barriers */
 #define DRBD_MAX_EPOCH_SIZE_MIN 1
 #define DRBD_MAX_EPOCH_SIZE_MAX 20000

Modified: trunk/drbd/linux/drbd_nl.h
===================================================================
--- trunk/drbd/linux/drbd_nl.h	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/drbd/linux/drbd_nl.h	2006-11-20 21:16:22 UTC (rev 2603)
@@ -47,6 +47,7 @@
 	INTEGER(	25,	T_MAY_IGNORE,	after_sb_1p)
 	INTEGER(	26,	T_MAY_IGNORE,	after_sb_2p)
 	INTEGER(	39,	T_MAY_IGNORE,	rr_conflict)
+	INTEGER(	40,	T_MAY_IGNORE,	ping_timeo)
 	BIT(		27,	T_MAY_IGNORE,	want_lose)
 	BIT(		28,	T_MAY_IGNORE,	two_primaries)
 )

Modified: trunk/scripts/drbd.conf
===================================================================
--- trunk/scripts/drbd.conf	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/scripts/drbd.conf	2006-11-20 21:16:22 UTC (rev 2603)
@@ -224,6 +224,7 @@
     # timeout       60;    #  6 seconds  (unit = 0.1 seconds)
     # connect-int   10;    # 10 seconds  (unit = 1 second)
     # ping-int      10;    # 10 seconds  (unit = 1 second)
+    # ping-timeout   5;    # 500 ms (unit = 0.1 seconds)
 
     # Maximal number of requests (4K) to be allocated by DRBD.
     # The minimum is hardcoded to 32 (=128 kByte).

Modified: trunk/user/drbdadm_scanner.fl
===================================================================
--- trunk/user/drbdadm_scanner.fl	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/user/drbdadm_scanner.fl	2006-11-20 21:16:22 UTC (rev 2603)
@@ -80,6 +80,7 @@
 max-epoch-size		{ DP; CP; RC(MAX_EPOCH_SIZE); return TK_NET_OPTION;}
 after-sb-[012]pri	{ DP; CP; return TK_NET_OPTION;		} 
 rr-conflict 		{ DP; CP; return TK_NET_OPTION;		} 
+ping-timeout 		{ DP; CP; return TK_NET_OPTION;		} 
 unplug-watermark	{ DP; CP; return TK_NET_OPTION;         }
 allow-two-primaries	{ DP; CP; return TK_NET_SWITCH;		}
 rate			{ DP; CP; RC(RATE); return TK_SYNCER_OPTION;	}

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2006-11-19 12:54:50 UTC (rev 2602)
+++ trunk/user/drbdsetup.c	2006-11-20 21:16:22 UTC (rev 2603)
@@ -290,6 +290,7 @@
 		 { "after-sb-1pri",'B',	T_after_sb_1p,EH(asb1p_n,AFTER_SB_1P) },
 		 { "after-sb-2pri",'C',	T_after_sb_2p,EH(asb2p_n,AFTER_SB_2P) },
 		 { "rr-conflict",'R',	T_rr_conflict,EH(rrcf_n,RR_CONFLICT) },
+		 { "ping-timeout",'p',  T_ping_timeo,	   EN(PING_TIMEO,1) },
 		 { "discard-my-data",'D', T_want_lose,     EB },
 		 CLOSE_OPTIONS }} }, },
 



More information about the drbd-cvs mailing list