[DRBD-cvs] r1761 - trunk/drbd

svn at svn.drbd.org svn at svn.drbd.org
Mon Feb 14 17:01:05 CET 2005


Author: phil
Date: 2005-02-14 17:01:02 +0100 (Mon, 14 Feb 2005)
New Revision: 1761

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_req.c
Log:
Another debugging session

* initialize sequencer to 0 on connect
* Fill ee_size before calling req_have_write()
* Print WARN() before waiting for correct seq_num
* Fix various counter if we discard a packet
* Only increate packet_seq if we really send a packet

... this was for sure not the last debugging session, but
we are comming along...


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2005-02-13 19:34:19 UTC (rev 1760)
+++ trunk/drbd/drbd_fs.c	2005-02-14 16:01:02 UTC (rev 1761)
@@ -978,6 +978,10 @@
 	struct ioctl_get_gen_cnt cn;
 	int i;
 
+	if( mdev->state.s.disk <= Failed ) {
+		return -EIO;
+	}
+
 	memset(&cn,0,sizeof(cn));
 
 	for(i=Flags;i<=ArbitraryCnt;i++)

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-02-13 19:34:19 UTC (rev 1760)
+++ trunk/drbd/drbd_main.c	2005-02-14 16:01:02 UTC (rev 1761)
@@ -1292,16 +1292,6 @@
 
 	ERR_IF(!req || !req->master_bio) return FALSE;
 
-	p.head.magic   = BE_DRBD_MAGIC;
-	p.head.command = cpu_to_be16(Data);
-	p.head.length  = cpu_to_be16( sizeof(p)-sizeof(Drbd_Header)
-				     + drbd_req_get_size(req) );
-
-	p.sector   = cpu_to_be64(drbd_req_get_sector(req));
-	p.block_id = (unsigned long)req;
-	p.seq_num  = cpu_to_be32( req->seq_num =
-				  atomic_add_return(1,&mdev->packet_seq) );
-
 	/* About tl_add():
 	1. This must be within the semaphor,
 	   to ensure right order in tl_ data structure and to
@@ -1334,11 +1324,29 @@
 		ok = _drbd_send_barrier(mdev);
 	if(ok) {
 		if (mdev->conf.two_primaries) {
-			if(ee_have_write(mdev,req)) return -1;
+			if(ee_have_write(mdev,req)) {
+				ok=-1;
+				goto out;
+			}
 		} else {
 			tl_add(mdev,req);
 		}
+
+		p.head.magic   = BE_DRBD_MAGIC;
+		p.head.command = cpu_to_be16(Data);
+		p.head.length  = cpu_to_be16( sizeof(p)-sizeof(Drbd_Header)
+					      + drbd_req_get_size(req) );
+
+		p.sector   = cpu_to_be64(drbd_req_get_sector(req));
+		p.block_id = (unsigned long)req;
+		p.seq_num  = cpu_to_be32( req->seq_num =
+				     atomic_add_return(1,&mdev->packet_seq) );
+
 		dump_packet(mdev,mdev->data.socket,0,(void*)&p, __FILE__, __LINE__);
+		// Instrumentation
+		set_current_state(TASK_INTERRUPTIBLE);
+		schedule_timeout(HZ);
+
 		set_bit(UNPLUG_REMOTE,&mdev->flags);
 		ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);
 		if(ok) {
@@ -1357,6 +1365,7 @@
 		drbd_end_req(req,RQ_DRBD_SENT,ERF_NOTLD|1,
 			     drbd_req_get_sector(req));
 	}
+ out:
 	spin_lock(&mdev->send_task_lock);
 	mdev->send_task=NULL;
 	spin_unlock(&mdev->send_task_lock);

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-02-13 19:34:19 UTC (rev 1760)
+++ trunk/drbd/drbd_receiver.c	2005-02-14 16:01:02 UTC (rev 1761)
@@ -716,6 +716,9 @@
 	sock->sk->sk_sndtimeo = mdev->conf.timeout*HZ/20;
 	sock->sk->sk_rcvtimeo = MAX_SCHEDULE_TIMEOUT;
 
+	atomic_set(&mdev->packet_seq,0);
+	mdev->peer_seq=0;
+
 	drbd_thread_start(&mdev->asender);
 
 	drbd_send_protocol(mdev);
@@ -1071,6 +1074,10 @@
 		return TRUE;
 	}
 
+	e->block_id = p->block_id; // no meaning on this side, e* on partner
+	drbd_ee_prepare_write(mdev, e, sector, data_size);
+	e->w.cb     = e_end_block;
+
 	/* This wait_event is here to make sure that never ever an
 	   DATA packet traveling via sock can overtake an ACK packet
 	   traveling on msock 
@@ -1078,6 +1085,10 @@
 	*/
 	if (mdev->conf.two_primaries) {
 		packet_seq = be32_to_cpu(p->seq_num);
+		if( packet_seq > peer_seq(mdev)+1 ) {
+			WARN(" will wait till (packet_seq) %d <= %d\n",
+			     packet_seq,peer_seq(mdev)+1);
+		}
 		if( wait_event_interruptible(mdev->cstate_wait, 
 					     packet_seq <= peer_seq(mdev)+1) )
 			return FALSE;
@@ -1092,6 +1103,8 @@
 			spin_lock_irq(&mdev->ee_lock);
 			drbd_put_ee(mdev,e);
 			spin_unlock_irq(&mdev->ee_lock);
+			atomic_inc(&mdev->epoch_size);
+			dec_local(mdev);
 			WARN("Concurrent write! [DISCARD BY LIST] sec=%lu\n",
 			     (unsigned long)sector);
 			return TRUE;
@@ -1103,7 +1116,7 @@
 			if( req->rq_status & RQ_DRBD_SENT ) {
 				/* Conflicting write, got ACK */
 				/* write afterwards ...*/
-				WARN("Concurrent write! [W AFTERWARDS] "
+				WARN("Concurrent write! [W AFTERWARDS1] "
 				     "sec=%lu\n",(unsigned long)sector);
 				if( wait_event_interruptible(mdev->cstate_wait,
 					       !req_have_write(mdev,e))) {
@@ -1118,12 +1131,14 @@
 					spin_lock_irq(&mdev->ee_lock);
 					drbd_put_ee(mdev,e);
 					spin_unlock_irq(&mdev->ee_lock);
+					atomic_inc(&mdev->epoch_size);
+					dec_local(mdev);
 					WARN("Concurrent write! [DISCARD BY FLAG] sec=%lu\n",
 					     (unsigned long)sector);
 					return TRUE;
 				} else {
 					/* write afterwards do not exp ACK */
-					WARN("Concurrent write! [W AFTERWARDS] sec=%lu\n",
+					WARN("Concurrent write! [W AFTERWARDS2] sec=%lu\n",
 					     (unsigned long)sector);
 					drbd_send_discard(mdev,req);
 					drbd_end_req(req, RQ_DRBD_SENT, 1, sector);
@@ -1139,11 +1154,6 @@
 		}
 	}
 
-	e->block_id = p->block_id; // no meaning on this side, e* on partner
-
-	drbd_ee_prepare_write(mdev, e, sector, data_size);
-	e->w.cb     = e_end_block;
-
 	spin_lock_irq(&mdev->ee_lock);
 	list_add(&e->w.list,&mdev->active_ee);
 	spin_unlock_irq(&mdev->ee_lock);
@@ -1160,6 +1170,10 @@
 		break;
 	}
 
+	// Instrumentation
+	set_current_state(TASK_INTERRUPTIBLE);
+	schedule_timeout(HZ);
+
 	drbd_generic_make_request(WRITE,&e->private_bio);
 
 	receive_data_tail(mdev,data_size);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2005-02-13 19:34:19 UTC (rev 1760)
+++ trunk/drbd/drbd_req.c	2005-02-14 16:01:02 UTC (rev 1761)
@@ -317,6 +317,8 @@
 			case -1: /* concurrent write */
 				WARN("Concurrent write! [DISCARD L] sec=%lu\n",
 				     (unsigned long)sector);
+				dec_local(mdev);
+				dec_ap_pending(mdev);
 				local=0;
 				drbd_end_req(req, RQ_DRBD_DONE, 1, sector);
 				break;



More information about the drbd-cvs mailing list