[DRBD-cvs] r1739 - in trunk: drbd drbd/linux user

svn at svn.drbd.org svn at svn.drbd.org
Fri Jan 28 12:01:33 CET 2005


Author: phil
Date: 2005-01-28 12:01:30 +0100 (Fri, 28 Jan 2005)
New Revision: 1739

Modified:
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/linux/drbd.h
   trunk/user/drbdadm_parser.y
   trunk/user/drbdadm_scanner.fl
   trunk/user/drbdsetup.c
Log:
* Implemented the "split-brain-fix" config file switch,
  that enables the use outdate-peer helper script.
* Added the UNIQUE flag, early work on roadmap item 9


Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/drbd/drbd_fs.c	2005-01-28 11:01:30 UTC (rev 1739)
@@ -348,6 +348,9 @@
 
 	drbd_free_ll_dev(mdev);
 
+	if(new_conf.split_brain_fix) __set_bit(SPLIT_BRAIN_FIX,&mdev->flags);
+	else __clear_bit(SPLIT_BRAIN_FIX,&mdev->flags);
+
 	mdev->md_bdev  = bdev2;
 	mdev->md_file  = filp2;
 	mdev->md_index = new_conf.meta_index;

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/drbd/drbd_int.h	2005-01-28 11:01:30 UTC (rev 1739)
@@ -619,10 +619,11 @@
 	UNPLUG_REMOTE,		// whether sending a "UnplugRemote" makes sense
 	PROCESS_EE_RUNNING,	// eek!
 	MD_IO_ALLOWED,		// EXPLAIN
-	SENT_DISK_FAILURE,	// sending it once is enough
 	MD_DIRTY,		// current gen counts and flags not yet on disk
 	SYNC_STARTED,		// Needed to agree on the exact point in time..
 	UUID_CHANGED,           // UUID changed. Need fullsync.
+	UNIQUE,                 // Set on one node, cleared on the peer!
+	SPLIT_BRAIN_FIX,        // Set if split-brain-fix is configured
 };
 
 struct drbd_bitmap; // opaque for Drbd_Conf

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/drbd/drbd_main.c	2005-01-28 11:01:30 UTC (rev 1739)
@@ -520,7 +520,8 @@
 		else if( ns.s.role == Primary && ns.s.conn < Connected &&
 			 ns.s.disk <= Outdated ) rv=-2;
 
-		else if( ns.s.role == Primary && ns.s.conn < Connected &&
+		else if( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) && 
+			 ns.s.role == Primary && ns.s.conn < Connected &&
 			 ns.s.pdsk >= DUnknown ) rv=-7;
 
 		else if( ns.s.role == Primary && ns.s.disk <= Inconsistent && 

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/drbd/drbd_receiver.c	2005-01-28 11:01:30 UTC (rev 1739)
@@ -628,11 +628,15 @@
 
 	if(drbd_request_state(mdev,NS(conn,WFConnection)) <= 0 ) return 0;
 
+	clear_bit(UNIQUE, &mdev->flags);
 	while(1) {
 		sock=drbd_try_connect(mdev);
 		if(sock) {
 			msock=drbd_wait_for_connect(mdev);
-			if(msock) break;
+			if(msock) {
+				set_bit(UNIQUE, &mdev->flags);
+				break;
+			}
 			else sock_release(sock);
 		} else {
 			sock=drbd_wait_for_connect(mdev);
@@ -1774,7 +1778,8 @@
 		drbd_thread_start(&mdev->worker);
 	}
 
-	if (mdev->state.s.role == Primary) {
+	if ( test_bit(SPLIT_BRAIN_FIX,&mdev->flags) && 
+	     mdev->state.s.role == Primary) {
 		drbd_disks_t nps = drbd_try_outdate_peer(mdev);
 		drbd_request_state(mdev,NS(pdsk,nps));
 		drbd_md_write(mdev);

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/drbd/linux/drbd.h	2005-01-28 11:01:30 UTC (rev 1739)
@@ -76,6 +76,7 @@
 	IN enum io_error_handler on_io_error;
 	IN int      meta_device;
 	IN int      meta_index;
+	IN int      split_brain_fix;
 };
 
 enum disconnect_handler {

Modified: trunk/user/drbdadm_parser.y
===================================================================
--- trunk/user/drbdadm_parser.y	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/user/drbdadm_parser.y	2005-01-28 11:01:30 UTC (rev 1739)
@@ -241,7 +241,7 @@
 %token TK_PROTOCOL TK_HANDLERS
 %token TK_ADDRESS TK_DISK TK_DEVICE TK_META_DISK
 %token <txt> TK_MINOR_COUNT TK_INTEGER TK_STRING
-%token <txt> TK_ON_IO_ERROR TK_SIZE
+%token <txt> TK_ON_IO_ERROR TK_SIZE TK_SPLIT_BRAIN_FIX
 %token <txt> TK_TIMEOUT TK_CONNECT_INT TK_PING_INT TK_MAX_BUFFERS TK_IPADDR
 %token <txt> TK_MAX_EPOCH_SIZE TK_SNDBUF_SIZE
 %token <txt> TK_SKIP_SYNC TK_USE_CSUMS TK_RATE TK_SYNC_GROUP TK_AL_EXTENTS
@@ -351,6 +351,7 @@
 disk_stmt:	  TK_ON_IO_ERROR TK_STRING { $$=new_opt($1,$2); }
 		| TK_SIZE TK_INTEGER
 		{ $$=new_opt($1,$2); range_check(R_DISK_SIZE,$1,$2); }
+		| TK_SPLIT_BRAIN_FIX       { $$=new_opt($1,0);  }
 		;
 
 net_stmts:	  /* empty */	           { $$ = 0; }

Modified: trunk/user/drbdadm_scanner.fl
===================================================================
--- trunk/user/drbdadm_scanner.fl	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/user/drbdadm_scanner.fl	2005-01-28 11:01:30 UTC (rev 1739)
@@ -228,7 +228,8 @@
 
 <DISK>{
   on-io-error		do_assign(IO_ERROR); CP; return TK_ON_IO_ERROR;
-  {NDELIM}		expect_error("'on-io-error'");
+  split-brain-fix 	yy_push_state(SEMICOLON); CP; return TK_SPLIT_BRAIN_FIX;
+  {NDELIM}		expect_error("'on-io-error|split-brain-fix'");
 }
 
 <IO_ERROR>{

Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c	2005-01-27 13:46:55 UTC (rev 1738)
+++ trunk/user/drbdsetup.c	2005-01-28 11:01:30 UTC (rev 1739)
@@ -171,6 +171,7 @@
    (struct option[]) {
      { "size",       required_argument, 0, 'd' },
      { "on-io-error",required_argument, 0, 'e' },
+     { "split-brain-fix",  no_argument, 0, 'b' },
      { 0,            0,                 0, 0 } } },
   {"resize", cmd_disk_size,             0,
    (struct option[]) {
@@ -403,6 +404,7 @@
 {
   cn->config.disk_size = 0; /* default not known */
   cn->config.on_io_error = DEF_ON_IO_ERROR;
+  cn->config.split_brain_fix = 0;
 
   if(argc==0) return 0;
 
@@ -431,6 +433,9 @@
 	  fprintf(stderr,"%s: '%s' is an invalid on-io-error handler.\n",
 		  cmdname,optarg);
 	  return 20;
+	case 'b':
+	  cn->config.split_brain_fix = 1;
+	  break;
 	case 1:	// non option argument. see getopt_long(3)
 	  fprintf(stderr,"%s: Unexpected nonoption argument '%s'\n",cmdname,optarg);
 	case '?':



More information about the drbd-cvs mailing list