[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(¤t->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();
} */