[DRBD-cvs] drbd by phil; Worked on the SyncTarget = Primary node ...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Sat, 24 Jan 2004 18:59:15 +0100 (CET)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_actlog.c drbd_compat_wrappers.h drbd_dsender.c drbd_int.h
drbd_receiver.c drbd_req-2.4.c
Log Message:
Worked on the SyncTarget = Primary node case.
The resync LRU now also tracks pending read requests of the resycner
on the Target node. (As it is already done on the Source node).
It is also used to lock out application's updates to the storage
while the resync block is on the fly...
With this the recv_discard() became unused.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.59
retrieving revision 1.1.2.60
diff -u -3 -r1.1.2.59 -r1.1.2.60
--- drbd_actlog.c 21 Jan 2004 15:40:09 -0000 1.1.2.59
+++ drbd_actlog.c 24 Jan 2004 17:59:10 -0000 1.1.2.60
@@ -68,7 +68,7 @@
if (unlikely(bm_ext!=NULL)) {
if(test_bit(BME_NO_WRITES,&bm_ext->flags)) {
spin_unlock_irq(&mdev->al_lock);
- WARN("Delaying app write until sync read is done\n");
+ INFO("Delaying app write until sync read is done\n");
return 0;
}
}
@@ -515,13 +515,9 @@
ext->rs_left -= cleared;
D_ASSERT(ext->rs_left >= 0);
} else {
- if(mdev->cstate == SyncSource) {
- WARN("Recounting sectors"
- " (resync LRU too small?)\n");
- // On the SyncSource the element should be
- // in the cache since drbd_rs_begin_io()
- // pulled it already in.
- }
+ WARN("Recounting sectors (resync LRU too small?)\n");
+ // This element should be in the cache
+ // since drbd_rs_begin_io() pulled it already in.
ext->rs_left = bm_count_sectors(mdev->mbds_id,enr);
lc_changed(mdev->resync,&ext->lce);
}
@@ -559,14 +555,12 @@
cleared = bm_set_bit(mdev, sector, blk_size, SS_IN_SYNC);
+ if( cleared == 0 ) return;
+
spin_lock_irqsave(&mdev->al_lock,flags);
mdev->rs_left -= cleared;
D_ASSERT((long)mdev->rs_left >= 0);
- if( cleared == 0 ) {
- WARN("cleared == 0; sector = %lu\n",sector);
- }
-
if(jiffies - mdev->rs_mark_time > HZ*10) {
mdev->rs_mark_time=jiffies;
mdev->rs_mark_left=mdev->rs_left;
@@ -624,7 +618,9 @@
}
spin_unlock_irq(&mdev->al_lock);
- if(rv) WARN("Delaying sync read until app's write is done\n");
+ if(unlikely(rv)) {
+ INFO("Delaying sync read until app's write is done\n");
+ }
return rv;
}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -3 -r1.1.2.2 -r1.1.2.3
--- drbd_compat_wrappers.h 21 Jan 2004 19:07:38 -0000 1.1.2.2
+++ drbd_compat_wrappers.h 24 Jan 2004 17:59:10 -0000 1.1.2.3
@@ -20,10 +20,10 @@
if(IS_VALID_MDEV(bh->b_private)) {
printk(KERN_ERR DEVICE_NAME" IS_VALID_MDEV(bh->b_private)\n");
}
- return bh->b_blocknr * (bh->b_size>>9) ;
+ return bh->b_rsector;
}
#else
-# define APP_BH_SECTOR(BH) ( (BH)->b_blocknr * ((BH)->b_size>>9) )
+# define APP_BH_SECTOR(BH) ( (BH)->b_rsector )
#endif
/*
@@ -108,6 +108,11 @@
static inline unsigned short drbd_ee_get_size(struct Tl_epoch_entry *ee)
{
return ee->private_bio.b_size;
+}
+
+static inline short drbd_bio_get_size(struct buffer_head *bh)
+{
+ return bh->b_size;
}
static inline char *drbd_bio_kmap(struct buffer_head *bh)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.59
retrieving revision 1.1.2.60
diff -u -3 -r1.1.2.59 -r1.1.2.60
--- drbd_dsender.c 21 Jan 2004 15:40:09 -0000 1.1.2.59
+++ drbd_dsender.c 24 Jan 2004 17:59:10 -0000 1.1.2.60
@@ -208,15 +208,23 @@
pr = mempool_alloc(drbd_pr_mempool, GFP_USER);
if (unlikely(pr == NULL)) goto requeue;
SET_MAGIC(pr);
-
+
+ next_sector:
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);
- mdev->resync_work.cb = w_resync_inactive; //TODO ööö
+ mdev->resync_work.cb = w_resync_inactive;
return 1;
+ }
+
+ drbd_rs_begin_io(mdev,sector);
+ if(unlikely(!bm_get_bit(mdev->mbds_id,sector,BM_BLOCK_SIZE))) {
+ INFO("Block got synced while in drbd_rs_begin_io()\n");
+ drbd_rs_complete_io(mdev,sector);
+ goto next_sector;
}
pr->d.sector = sector;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.102
retrieving revision 1.58.2.103
diff -u -3 -r1.58.2.102 -r1.58.2.103
--- drbd_int.h 21 Jan 2004 19:07:38 -0000 1.58.2.102
+++ drbd_int.h 24 Jan 2004 17:59:10 -0000 1.58.2.103
@@ -541,7 +541,7 @@
sector_t sector;
} d;
enum {
- Discard = 0,
+ Discard = 0, // unused now.
Application = 1,
Resync = 2,
AppAndResync = 3,
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.91
retrieving revision 1.97.2.92
diff -u -3 -r1.97.2.91 -r1.97.2.92
--- drbd_receiver.c 21 Jan 2004 19:07:38 -0000 1.97.2.91
+++ drbd_receiver.c 24 Jan 2004 17:59:10 -0000 1.97.2.92
@@ -833,9 +833,10 @@
STATIC int e_end_resync_block(drbd_dev *mdev, struct drbd_work *w)
{
struct Tl_epoch_entry *e = (struct Tl_epoch_entry*)w;
- drbd_set_in_sync(mdev,
- drbd_ee_get_sector(e),
- drbd_ee_get_size(e));
+ sector_t sector = drbd_ee_get_sector(e);
+
+ drbd_rs_complete_io(mdev,sector); // before set_in_sync() !
+ drbd_set_in_sync(mdev, sector, drbd_ee_get_size(e));
drbd_send_ack(mdev,WriteAck,e);
dec_unacked(mdev,HERE); // FIXME unconditional ??
return TRUE;
@@ -870,14 +871,6 @@
return TRUE;
}
-
-/*
- * these should not happen any more. if they do, we do not properly
- * serialize app and resync requests.
- * yes, I think even app READS should be serialized, or made independent of,
- * resync requests
- * at least they only make sense for aligned (size == BM_BLOCK_SIZE)
- */
int recv_both_read(drbd_dev *mdev, struct Pending_read *pr,
sector_t sector, int data_size)
{
@@ -897,8 +890,9 @@
return FALSE;
}
- // XXX can't we share it somehow?
- memcpy(drbd_bio_kmap(bio),drbd_bio_kmap(&e->private_bio),data_size);
+ // Do not use data_size in the memcpy. The app read might be smaller.
+ memcpy(drbd_bio_kmap(bio),drbd_bio_kmap(&e->private_bio),
+ drbd_bio_get_size(bio));
drbd_bio_kunmap(bio);
drbd_bio_kunmap(&e->private_bio);
@@ -922,28 +916,6 @@
return TRUE;
}
-int recv_discard(drbd_dev *mdev, struct Pending_read *pr /* ignored */,
- sector_t sector, int data_size)
-{
- // THINK maybe ignore this block without using EEs ?
- struct Tl_epoch_entry *e;
-
- ERR("should not happen anymore: %s\n", __func__);
-
- e = read_in_block(mdev,data_size);
- ERR_IF(!e) return FALSE;
-
- // needed to correctly set the ee members for drbd_send_ack
- drbd_ee_prepare_write(mdev, e, sector ,data_size);
- drbd_send_ack(mdev,WriteAck,e);
-
- spin_lock_irq(&mdev->ee_lock);
- drbd_put_ee(mdev,e);
- spin_unlock_irq(&mdev->ee_lock);
-
- return TRUE;
-}
-
STATIC int receive_DataReply(drbd_dev *mdev,Drbd_Header* h)
{
struct Pending_read *pr;
@@ -954,7 +926,6 @@
static int (*funcs[])(struct Drbd_Conf* , struct Pending_read*,
unsigned long,int) = {
- [Discard] = recv_discard,
[Application] = recv_dless_read,
[Resync] = recv_resync_read,
[AppAndResync] = recv_both_read
@@ -1351,7 +1322,6 @@
list_del(le);
bio = pr->d.master_bio;
- drbd_bio_IO_error(bio);
switch(pr->cause) {
case Application:
@@ -1359,11 +1329,17 @@
break;
case AppAndResync:
dec_ap_pending(mdev,HERE);
- case Resync:
dec_rs_pending(mdev,HERE);
+ drbd_rs_complete_io(mdev,APP_BH_SECTOR(bio));
+ break;
+ case Resync:
+ ERR("pr with cause 'Resync' on app_reads list.");
+ break;
case Discard:;
}
+ drbd_bio_IO_error(bio);
+
INVALIDATE_MAGIC(pr);
mempool_free(pr,drbd_pr_mempool);
}
@@ -1378,6 +1354,11 @@
le = workset.next;
list_del(le);
pr = list_entry(le, struct Pending_read, w.list);
+
+ D_ASSERT(pr->cause == Resync);
+ dec_rs_pending(mdev,HERE);
+ drbd_rs_complete_io(mdev,pr->d.sector);
+
mempool_free(pr,drbd_pr_mempool);
INVALIDATE_MAGIC(pr);
}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.40
retrieving revision 1.33.2.41
diff -u -3 -r1.33.2.40 -r1.33.2.41
--- drbd_req-2.4.c 21 Jan 2004 15:40:09 -0000 1.33.2.40
+++ drbd_req-2.4.c 24 Jan 2004 17:59:10 -0000 1.33.2.41
@@ -123,16 +123,12 @@
SET_MAGIC(pr);
pr->d.master_bio = bio;
- // TODO: should only issue AppAndResnc if it is out of sync!
- pr->cause = mdev->cstate == SyncTarget ? AppAndResync : Application;
+ pr->cause = Application;
spin_lock(&mdev->pr_lock);
list_add(&pr->w.list,&mdev->app_reads);
spin_unlock(&mdev->pr_lock);
inc_ap_pending(mdev);
- if(pr->cause == AppAndResync) inc_rs_pending(mdev);
- drbd_send_drequest(mdev,
- pr->cause==AppAndResync ? RSDataRequest:DataRequest,
- bio->b_rsector, bio->b_size,
+ drbd_send_drequest(mdev, DataRequest, bio->b_rsector, bio->b_size,
(unsigned long)pr);
}
@@ -194,25 +190,15 @@
bm_get_bit(mdev->mbds_id,bh->b_rsector,bh->b_size) ) {
struct Pending_read *pr;
if( rw == WRITE ) {
- spin_lock(&mdev->pr_lock);
- pr=drbd_find_read(bh->b_rsector,&mdev->resync_reads);
-
- if(pr) {
- ERR("Will discard a resync_read\n");
- pr->cause = Discard;
- // list del as well ?
- dec_rs_pending(mdev,HERE);
- }
- spin_unlock(&mdev->pr_lock);
-
- // TODO wait until writes of syncer are done.
- // Continue with a mirrored write op.
- // Set some flag to clear it in the bitmap
+ // Actually nothing special to do.
+ // Just do a mirrored write.
+ // Syncronization with the syncer is done
+ // via drbd_[rs|al]_[begin|end]_io()
} else { // rw == READ || rw == READA
spin_lock(&mdev->pr_lock);
pr=drbd_find_read(bh->b_rsector,&mdev->resync_reads);
if(pr) {
- ERR("Upgraded a resync read to an app read\n");
+ INFO("Upgraded a resync read\n");
pr->cause |= Application;
inc_ap_pending(mdev);