Note: "permalinks" may not be as permanent as we would like,
direct links of old sources may well be a few messages off.
/ 2004-05-19 18:40:20 +0400
\ Eugene Crosser:
> On Wed, 2004-05-19 at 18:28, Lars Ellenberg wrote:
>
> > > > but it is the brutal solution, so IO may hang for some seconds while the
> > > > connection handshake is done... and it is not even strictly correct, since
> > > > theoretically there still is a race :(
> > >
> > > In cvs checkouted around 15:30 today, things did not change to good.
> >
> > not to bad either, I hope?
>
> Nope, the same, apparently. Syncsource stays in "100.0%" state as it
> did before.
please try this patch, I'd like to see if that has some impact
before I do a check in.
Thanks,
Lars
Index: drbd_main.c
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.177
diff -u -p -r1.73.2.177 drbd_main.c
--- drbd_main.c 18 May 2004 16:20:42 -0000 1.73.2.177
+++ drbd_main.c 19 May 2004 15:15:20 -0000
@@ -680,7 +680,7 @@ int drbd_send_param(drbd_dev *mdev, int
}
/* See the comment at receive_bitmap() */
-int drbd_send_bitmap(drbd_dev *mdev)
+int _drbd_send_bitmap(drbd_dev *mdev)
{
int buf_i,want;
int ok=TRUE, bm_i=0;
@@ -703,10 +703,20 @@ int drbd_send_bitmap(drbd_dev *mdev)
want=min_t(int,MBDS_PACKET_SIZE,(bm_words-bm_i)*sizeof(long));
for(buf_i=0;buf_i<want/sizeof(long);buf_i++)
buffer[buf_i] = cpu_to_lel(bm[bm_i++]);
- ok = drbd_send_cmd(mdev,mdev->data.socket,ReportBitMap,
- p, sizeof(*p) + want);
+ ok = _drbd_send_cmd(mdev,mdev->data.socket,ReportBitMap,
+ p, sizeof(*p) + want, 0);
} while (ok && want);
+
vfree(p);
+ return ok;
+}
+
+int drbd_send_bitmap(drbd_dev *mdev)
+{
+ int ok;
+ down(&mdev->data.mutex);
+ ok=_drbd_send_bitmap(mdev);
+ up(&mdev->data.mutex);
return ok;
}
Index: drbd_receiver.c
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.159
diff -u -p -r1.97.2.159 drbd_receiver.c
--- drbd_receiver.c 18 May 2004 22:06:55 -0000 1.97.2.159
+++ drbd_receiver.c 19 May 2004 15:15:22 -0000
@@ -1247,8 +1247,21 @@ STATIC int receive_param(drbd_dev *mdev,
if( sync ) {
if(have_good == 1) {
- drbd_send_bitmap(mdev);
+ /*
+ * receiver expects the whole bitmap in one go.
+ * so get the data.mutex here.
+ * set_cstate within the mutex to avoid a race
+ * between up() and the
+ * wait_event(cstate != WFBitMap*) condition
+ * above.
+ */
+ down(&mdev->data.mutex);
set_cstate(mdev,WFBitMapS);
+ /* FIXME, here we actually have to wait for
+ * ap_bio_cnt == 0 and/or local_cnt == 0
+ */
+ _drbd_send_bitmap(mdev);
+ up(&mdev->data.mutex);
} else { // have_good == -1
if ( (mdev->state == Primary) &&
(mdev->gen_cnt[Flags] & MDF_Consistent) ) {
Index: linux/drbd_config.h
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/linux/Attic/drbd_config.h,v
retrieving revision 1.1.2.6
diff -u -p -r1.1.2.6 drbd_config.h
--- linux/drbd_config.h 19 May 2004 10:03:59 -0000 1.1.2.6
+++ linux/drbd_config.h 19 May 2004 15:15:22 -0000
@@ -30,7 +30,7 @@
//#define DBG_SPINLOCKS // enables MUST_HOLD macro (assertions for spinlocks)
//#define DBG_ASSERTS // drbd_assert_breakpoint() function
//#define DUMP_MD 1 // Dump metadata to syslog upon connect
-//#define DUMP_MD 2 // Dump even all cstate changes
+#define DUMP_MD 2 // Dump even all cstate changes
//#define SIGHAND_HACK // Needed for RH 2.4.20 and later kernels.
//#define REDHAT_HLIST_BACKPORT // Makes DRBD work on RH9 kernels