[DRBD-cvs] svn commit by phil - r2264 - in trunk/drbd: . linux - Imlemented item 34 of the ROADMAP

drbd-cvs at lists.linbit.com drbd-cvs at lists.linbit.com
Thu Jul 6 16:29:54 CEST 2006


Author: phil
Date: 2006-07-06 16:29:52 +0200 (Thu, 06 Jul 2006)
New Revision: 2264

Modified:
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/linux/drbd_config.h
Log:
Imlemented item 34 of the ROADMAP



Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/drbd_int.h	2006-07-06 14:29:52 UTC (rev 2264)
@@ -315,7 +315,9 @@
 	MayIgnore = 0x100, // Flag only to test if (cmd > MayIgnore) ...
 	MAX_OPT_CMD,
 
-	HandShake = 0xfffe // FIXED for the next century!
+	HandShakeM = 0xfff1, // First Packet on the MetaSock
+	HandShakeS = 0xfff2, // First Packet on the Socket
+	HandShake  = 0xfffe  // FIXED for the next century!
 } Drbd_Packet_Cmd;
 
 static inline const char* cmdname(Drbd_Packet_Cmd cmd)

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/drbd_main.c	2006-07-06 14:29:52 UTC (rev 2264)
@@ -1823,7 +1823,6 @@
 	int rv,sent=0;
 
 	if (!sock) return -1000;
-	if ((volatile int)mdev->state.conn < WFReportParams) return -1001;
 
 	// THINK  if (signal_pending) return ... ?
 

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/drbd_receiver.c	2006-07-06 14:29:52 UTC (rev 2264)
@@ -448,7 +448,8 @@
 	return 0;
 }
 
-STATIC int drbd_recv_short(drbd_dev *mdev, void *buf, size_t size)
+STATIC int drbd_recv_short(drbd_dev *mdev, struct socket *sock,
+			   void *buf, size_t size)
 {
 	mm_segment_t oldfs;
 	struct iovec iov;
@@ -472,7 +473,7 @@
 	oldfs = get_fs();
 	set_fs(KERNEL_DS);
 
-	rv = sock_recvmsg(mdev->meta.socket, &msg, size, msg.msg_flags);
+	rv = sock_recvmsg(sock, &msg, size, msg.msg_flags);
 
 	set_fs(oldfs);
 
@@ -628,6 +629,27 @@
 STATIC int drbd_do_handshake(drbd_dev *mdev);
 STATIC int drbd_do_auth(drbd_dev *mdev);
 
+STATIC int drbd_send_fp(drbd_dev *mdev,struct socket *sock,Drbd_Packet_Cmd cmd)
+{
+	Drbd_Header *h = (Drbd_Header *) &mdev->data.sbuf.head;
+
+	return _drbd_send_cmd(mdev,sock,cmd,h,sizeof(*h),0);
+}
+
+STATIC Drbd_Packet_Cmd drbd_recv_fp(drbd_dev *mdev,struct socket *sock)
+{
+	Drbd_Header *h = (Drbd_Header *) &mdev->data.sbuf.head;
+	int rr;
+
+	rr = drbd_recv_short(mdev, sock, h, sizeof(*h));
+
+	if( rr==sizeof(*h) && h->magic==BE_DRBD_MAGIC ) {
+		return be16_to_cpu(h->command);
+	}
+
+	return 0xffff;
+}
+
 /*
  * return values:
  *   1 yess, we have a valid connection
@@ -637,55 +659,80 @@
  */
 int drbd_connect(drbd_dev *mdev)
 {
-	struct socket *sock,*msock;
-	int h;
+	struct socket *s, *sock,*msock;
+	int try,h;
 
 	D_ASSERT(mdev->state.conn > StandAlone);
 	D_ASSERT(!mdev->data.socket);
 
 	if(drbd_request_state(mdev,NS(conn,WFConnection)) < SS_Success ) return 0;
-
 	clear_bit(UNIQUE, &mdev->flags);
 
-	/* Break out of unknown connect loops by random wait here. */
-	set_current_state(TASK_INTERRUPTIBLE);
-	schedule_timeout(net_random()%((mdev->net_conf->try_connect_int*HZ)/4));
+	sock  = NULL;
+	msock = NULL;
 
-	while(1) {
-		sock=drbd_try_connect(mdev);
-		if(sock) {
-			msock=drbd_wait_for_connect(mdev);
-			if(msock) {
-				set_bit(UNIQUE, &mdev->flags);
-				break;
-			}
-			else sock_release(sock);
-		} else {
-			sock=drbd_wait_for_connect(mdev);
-			if(sock) {
-				int retry;
-				for (retry=1; retry <= 10; retry++) {
-					// give the other side time to call
-					// bind() & listen()
-					set_current_state(TASK_INTERRUPTIBLE);
-					schedule_timeout(HZ / 10);
-					msock=drbd_try_connect(mdev);
-					if(msock) goto connected;
-					ERR("msock try_connect %d\n",retry);
+	do {
+		for(try=0;;) { // 3 tries, this should take less than a second!
+			s=drbd_try_connect(mdev);
+			if(s || ++try >= 3 ) break;
+			// give the other side time to call bind() & listen()
+			set_current_state(TASK_INTERRUPTIBLE);
+			schedule_timeout(HZ / 10);
+		}
+
+		if(s) {
+			if( !sock ) {
+				if( drbd_send_fp(mdev, s, HandShakeS) ) {
+					sock = s;
+					s = NULL;
 				}
-				sock_release(sock);
+			} else if( !msock ) {
+				if( drbd_send_fp(mdev, s, HandShakeM) ) {
+					msock = s;
+					s = NULL;
+				}
+			} else {
+				ERR("Logic error in drbd_connect()\n");
+				return -1;
 			}
+			if(s) {
+				ERR("Error during sending initial packet.\n");
+				sock_release(s);
+			}
 		}
+
+		if(sock && msock) break;
+
+		s=drbd_wait_for_connect(mdev);		
+		if(s) {
+			switch(drbd_recv_fp(mdev,s)) {
+			case HandShakeS:
+				if(sock) sock_release(sock);
+				sock = s;
+				break;
+			case HandShakeM:
+				if(msock) sock_release(msock);
+				msock = s;
+				if(sock) set_bit(UNIQUE, &mdev->flags);
+				break;
+			default:
+				WARN("Error receiving initial packet\n");
+				sock_release(s);
+			}
+		}
+
 		if(mdev->state.conn == Unconnected) return -1;
 		if(signal_pending(current)) {
 			flush_signals(current);
 			smp_rmb();
-			if (get_t_state(&mdev->receiver) == Exiting)
+			if (get_t_state(&mdev->receiver) == Exiting) {
+				if(sock) sock_release(sock);
+				if(msock) sock_release(msock);
 				return -1;
+			}
 		}
-	}
 
- connected:
+	} while( !sock || !msock );
 
 	msock->sk->sk_reuse=1; /* SO_REUSEADDR */
 	sock->sk->sk_reuse=1; /* SO_REUSEADDR */
@@ -3057,7 +3104,8 @@
 		if (!drbd_process_done_ee(mdev)) goto err;
 		set_bit(SIGNAL_ASENDER, &mdev->flags);
 
-		rv = drbd_recv_short(mdev,buf,expect-received);
+		rv = drbd_recv_short(mdev, mdev->meta.socket,
+				     buf,expect-received);
 		clear_bit(SIGNAL_ASENDER, &mdev->flags);
 
 		flush_signals(current);

Modified: trunk/drbd/linux/drbd_config.h
===================================================================
--- trunk/drbd/linux/drbd_config.h	2006-07-05 11:51:12 UTC (rev 2263)
+++ trunk/drbd/linux/drbd_config.h	2006-07-06 14:29:52 UTC (rev 2264)
@@ -24,7 +24,7 @@
 
 #define REL_VERSION "8.0pre3"
 #define API_VERSION 82
-#define PRO_VERSION 80
+#define PRO_VERSION 81
 
 // undef if you need the workaround in drbd_receiver
 #define HAVE_UML_TO_VIRT 1



More information about the drbd-cvs mailing list