[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