[DRBD-cvs] DRBD CVS: drbd by phil from

drbd-user@lists.linbit.com drbd-user@lists.linbit.com
Thu, 15 Jan 2004 22:38:44 +0100 (CET)


DRBD CVS committal

Author  : phil
Host    : 
Module  : drbd

Dir     : drbd/drbd


Modified Files:
      Tag: rel-0_7-branch
	drbd_dsender.c drbd_int.h drbd_main.c drbd_receiver.c 


Log Message:
* made sending of resync_requests timer based.
* Bugfix to asender: Now it exits if the socket is shut down by the peer.

===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.48
retrieving revision 1.1.2.49
diff -u -3 -r1.1.2.48 -r1.1.2.49
--- drbd_dsender.c	15 Jan 2004 15:21:07 -0000	1.1.2.48
+++ drbd_dsender.c	15 Jan 2004 21:38:43 -0000	1.1.2.49
@@ -94,11 +94,21 @@
 	return 0;
 }
 
-int w_make_resync_request(drbd_dev* mdev, struct drbd_work* w)
+void resync_timer_fn(unsigned long data)
+{
+	drbd_dev* mdev;
+
+	mdev = (drbd_dev*) data;
+
+	__drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
+}
+
+STATIC int w_make_resync_request(drbd_dev* mdev, struct drbd_work* w)
 {
 	struct Pending_read *pr;
 	struct Drbd_Conf    *odev;
 	sector_t sector;
+	int number,i,size;
 
 	PARANOIA_BUG_ON(w != &mdev->resync_work);
 
@@ -126,26 +136,24 @@
 	}
 	D_ASSERT(mdev->cstate == SyncTarget);
 
+#define SLEEP_TIME (HZ/10)
+
+        number = SLEEP_TIME*mdev->sync_conf.rate / ((BM_BLOCK_SIZE/1024)*HZ);
+
+        if(number > 1000) number=1000;  // Remove later
 	if (atomic_read(&mdev->pending_cnt)>1200) {
 		ERR("pending cnt high -- throttling resync.\n");
-		// schedule_timeout(HZ/10); ??
-		// FIXME do we send a write_hint here ?
-
-		/* FIXME if (current_sync_throughput > mdev->sync_conf.rate)
-		 * and (we have other pending writes [//reads ?? ])
-		 * throttle, too...
-		 * If drbd_make_request would not send itself, but just
-		 * queue the work to the worker, the latter (condition)
-		 * simplifies to (!list_empty(work.q))		-lge
-		 */
 		goto requeue;
 	}
 
-	pr = mempool_alloc(drbd_pr_mempool, GFP_USER);
-	if (likely(pr!= NULL)) {
-		int size=BM_BLOCK_SIZE;
-
+	for(i=0;i<number;i++) {
+		pr = mempool_alloc(drbd_pr_mempool, GFP_USER);
+		if (unlikely(pr == NULL)) goto requeue;
+		SET_MAGIC(pr);
+		
+		size = BM_BLOCK_SIZE;
 		sector = bm_get_sector(mdev->mbds_id,&size);
+
 		if (sector == MBDS_DONE) {
 			INVALIDATE_MAGIC(pr);
 			mempool_free(pr,drbd_pr_mempool);
@@ -161,18 +169,19 @@
 
 		inc_pending(mdev);
 		ERR_IF(!drbd_send_drequest(mdev,RSDataRequest,
-					  sector,size,(unsigned long)pr)) {
+					   sector,size,(unsigned long)pr)) {
 			dec_pending(mdev,HERE);
 			return 0; // FAILED. worker will abort!
 		}
 	}
 
    requeue:
-	__drbd_queue_work(mdev,&mdev->data.work,w);
+	mdev->resync_timer.expires = jiffies + SLEEP_TIME;
+	add_timer(&mdev->resync_timer);
 	return 1;
 }
 
-int w_start_resync(drbd_dev *mdev, struct drbd_work *w)
+STATIC int w_start_resync(drbd_dev *mdev, struct drbd_work *w)
 {
 	PARANOIA_BUG_ON(w != &mdev->resync_work);
 
@@ -231,6 +240,7 @@
 	drbd_put_ee(mdev,e);
 	spin_unlock_irq(&mdev->ee_lock);
 
+	if(!ok) ERR("drbd_send_block() failed\n");
 	return ok;
 }
 
@@ -248,6 +258,7 @@
 	drbd_put_ee(mdev,e);
 	spin_unlock_irq(&mdev->ee_lock);
 
+	if(!ok) ERR("drbd_send_block() failed\n");
 	return ok;
 }
 
@@ -278,6 +289,9 @@
 
 	sprintf(current->comm, "drbd%d_worker", (int)(mdev-drbd_conf));
 
+	mdev->resync_timer.function = resync_timer_fn;
+	mdev->resync_timer.data = (unsigned long) mdev;
+	
 	for (;;) {
 		intr = down_interruptible(&mdev->data.work.s);
 
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.91
retrieving revision 1.58.2.92
diff -u -3 -r1.58.2.91 -r1.58.2.92
--- drbd_int.h	15 Jan 2004 15:21:07 -0000	1.58.2.91
+++ drbd_int.h	15 Jan 2004 21:38:43 -0000	1.58.2.92
@@ -668,6 +668,7 @@
 	struct drbd_socket meta; // for ping/ack (metadata) packets
 	volatile unsigned long last_received; // in jiffies, either socket
 	struct drbd_work  resync_work;
+	struct timer_list resync_timer;
 	kdev_t lo_device;         // backing device
 	struct file *lo_file;
 	kdev_t md_device;         // device for meta-data.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.97
retrieving revision 1.73.2.98
diff -u -3 -r1.73.2.97 -r1.73.2.98
--- drbd_main.c	15 Jan 2004 14:26:29 -0000	1.73.2.97
+++ drbd_main.c	15 Jan 2004 21:38:43 -0000	1.73.2.98
@@ -1038,6 +1038,7 @@
 	INIT_LIST_HEAD(&mdev->meta.work.q);
 	INIT_LIST_HEAD(&mdev->resync_work.list);
 	mdev->resync_work.cb = w_resync_inactive;
+	init_timer(&mdev->resync_timer);
 
 	init_waitqueue_head(&mdev->state_wait);
 	init_waitqueue_head(&mdev->cstate_wait);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.83
retrieving revision 1.97.2.84
diff -u -3 -r1.97.2.83 -r1.97.2.84
--- drbd_receiver.c	15 Jan 2004 15:52:19 -0000	1.97.2.83
+++ drbd_receiver.c	15 Jan 2004 21:38:43 -0000	1.97.2.84
@@ -1756,16 +1756,19 @@
 		if (rv == -EAGAIN) {
 			set_bit(SEND_PING,&mdev->flags);
 			continue;
+		} else if (rv < 0) {
+			// if (rv != -ECONNRESET)
+			ERR("sock_recvmsg returned %d\n", rv);
+			goto err;
+		} else if (rv == 0) {
+			ERR("meta connection shut down by peer.\n");
+			goto err;
 		} else if (rv == -EINTR || rv < expect) {
 			LOCK_SIGMASK(current,flags);
 			sigemptyset(&current->pending.signal);
 			RECALC_SIGPENDING(current);
 			UNLOCK_SIGMASK(current,flags);
 			if (rv == -EINTR) rv=0;
-		} else if (rv < 0) {
-			// if (rv != -ECONNRESET)
-				ERR("sock_recvmsg returned %d\n", rv);
-			break;
 		} /* else if (rv > expect) {
 			BUG();
 		} */