[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