[DRBD-cvs] r1677 - in trunk: . drbd drbd/linux scripts user

svn at svn.drbd.org svn at svn.drbd.org
Mon Dec 13 22:11:27 CET 2004


Author: phil
Date: 2004-12-13 22:11:24 +0100 (Mon, 13 Dec 2004)
New Revision: 1677

Modified:
   trunk/ROADMAP
   trunk/drbd/drbd_fs.c
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_receiver.c
   trunk/drbd/drbd_strings.c
   trunk/drbd/drbd_worker.c
   trunk/drbd/linux/drbd.h
   trunk/scripts/drbd.conf
   trunk/user/drbdadm.h
   trunk/user/drbdadm_main.c
   trunk/user/drbdadm_parser.y
   trunk/user/drbdadm_scanner.fl
Log:
Some work on the "outdate-peer" user level call back.


Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/ROADMAP	2004-12-13 21:11:24 UTC (rev 1677)
@@ -34,12 +34,11 @@
   DRDBs behaviour after a split-brain situation:
 
   after-sb-2pri = 
-   disconnect     No automatic resynchronisation gets performed. One
-                  node should drop its net-conf (preferable the
-                  node that would become sync-target)
+   disconnect     No automatic resynchronisation gets performed. Both
+                  nodes should drop their net-conf
                   DEFAULT.
    discard-younger-primary
-                  Auto sync from is the oder primary (curr.behaviour i.t.s.)
+                  Auto sync from is the older primary (curr.behaviour i.t.s.)
    discard-older-primary
                   Auto sync from is the younger primary
    discard-less-modified
@@ -102,7 +101,9 @@
 
   remove option value: on-disconnect=suspend_io
 
-  introduce: 
+  introduce:
+    split-brain-fix;
+    suspend-io-split-brain;pdsk-unknown;
     peer-state-unknown=suspend_io
     peer-state-unknown=continue_io
 

Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/drbd_fs.c	2004-12-13 21:11:24 UTC (rev 1677)
@@ -588,6 +588,50 @@
 	return -EINVAL;
 }
 
+int drbd_khelper(drbd_dev *mdev, char* cmd)
+{
+	char mb[12];
+	char *argv[] = {"/sbin/drbdadm", cmd, mb, NULL };
+	static char *envp[] = { "HOME=/",
+				"TERM=linux",
+				"PATH=/sbin:/usr/sbin:/bin:/usr/bin",
+				NULL };
+	
+	snprintf(mb,12,"minor-%d",(int)(mdev-drbd_conf));
+	return call_usermodehelper("/sbin/drbdadm",argv,envp,1);
+}
+
+drbd_disks_t drbd_try_outdate_peer(drbd_dev *mdev)
+{
+	int r;
+	drbd_disks_t nps;
+
+	D_ASSERT(mdev->state.s.pdsk == DUnknown);
+
+	r=drbd_khelper(mdev,"outdate-peer");
+
+	switch( (r>>8) && 0xff ) {
+	case 3: /* peer is inconsistent */
+		nps = Inconsistent;
+		break;
+	case 4: /* peer is outdated */
+		nps = Outdated;
+		break;
+	case 5: /* peer was down, increase GENCNT ... */
+		drbd_md_inc(mdev,ConnectedCnt);
+		nps = Outdated;
+		break;
+	case 6: /* Peer is primary */
+		nps = DUnknown;
+		break;
+	default:
+		nps = DUnknown;
+		ERR("outdate-peer helper returned %d (%d)\n",(r>>8)&&0xff,r);
+	}
+
+	return nps;
+}
+
 int drbd_set_role(drbd_dev *mdev,drbd_role_t newstate)
 {
 	int r,forced = 0;
@@ -638,6 +682,10 @@
 			forced = 1;
 		}
 	}
+	if ( r == -7 ) {
+		drbd_disks_t nps = drbd_try_outdate_peer(mdev);
+		r = drbd_request_state(mdev,NS2(role,newstate & 0x3,pdsk,nps));
+	}
 	if ( r <= 0) { 
 		print_st_err(mdev,os,ns,r);
 		return -EACCES; 
@@ -823,7 +871,7 @@
 
 	spin_lock_irq(&mdev->req_lock);
 	os = mdev->state;
-	if( mdev->state.s.disk != UpToDate ) { 
+	if( mdev->state.s.disk < Outdated ) { 
 		r=-999;
 	} else {
 		r = _drbd_set_state(mdev, _NS(disk,Outdated), 0);
@@ -833,12 +881,12 @@
 	
 	if( r == 2 ) return 0;
 	if( r == -999 ) {
-		return -EBADMSG; // TODO better errnos.
+		return -EINVAL;
 	}
 	after_state_ch(mdev,os,ns); // TODO decide if neccesarry.
 	
 	if( r <= 0 ) {
-		return -EISCONN;
+		return -EIO;
 	}
 	
 	drbd_md_write(mdev);
@@ -973,7 +1021,6 @@
 
 		drbd_sync_me(mdev); /* FIXME what if fsync returns error */
 
-		set_bit(DO_NOT_INC_CONCNT,&mdev->flags);
 		drbd_thread_stop(&mdev->receiver);
 
 		if ( mdev->state.s.conn == StandAlone && 

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/drbd_int.h	2004-12-13 21:11:24 UTC (rev 1677)
@@ -616,7 +616,6 @@
 	SEND_PING,		// whether asender should send a ping asap
 	WRITER_PRESENT,		// somebody opened us with write intent
 	STOP_SYNC_TIMER,	// tell timer to cancel itself
-	DO_NOT_INC_CONCNT,	// well, don't ...
 	ON_PRI_INC_HUMAN,       // When we become primary increase human-count
 	ON_PRI_INC_TIMEOUTEX,   // When " - "  increase timeout-count
 	UNPLUG_QUEUED,		// only relevant with kernel 2.4
@@ -965,6 +964,7 @@
 extern int drbd_set_role(drbd_dev *mdev,drbd_role_t newstate);
 extern int drbd_ioctl(struct inode *inode, struct file *file,
 		      unsigned int cmd, unsigned long arg);
+drbd_disks_t drbd_try_outdate_peer(drbd_dev *mdev);
 
 // drbd_worker.c
 extern int drbd_worker(struct Drbd_thread *thi);

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/drbd_main.c	2004-12-13 21:11:24 UTC (rev 1677)
@@ -419,8 +419,7 @@
 	/*  State sanitising  */
 	if( ns.s.conn < Connected ) {
 		ns.s.peer = Unknown;
-		ns.s.pdsk = DUnknown;
-		if( ns.s.disk > Consistent ) ns.s.disk = Consistent;
+		if ( ns.s.pdsk > DUnknown ) ns.s.pdsk = DUnknown;
 	}
 
 	if( ns.s.conn > Connected && ns.s.disk <= Failed ) {
@@ -478,14 +477,16 @@
 		if( !mdev->conf.two_primaries && 
 		    ns.s.role == Primary && ns.s.peer == Primary ) rv=-1;
 
-		if( ns.s.role == Primary && ns.s.disk <= Inconsistent && 
-		    ns.s.conn < Connected ) rv=-2;
+		if( ns.s.role == Primary && ns.s.conn < Connected &&
+		    ns.s.disk <= Outdated ) rv=-2;
 
+		if( ns.s.role == Primary && ns.s.conn < Connected &&
+		    ns.s.pdsk >= Unknown ) rv=-7;
+
 		if( ns.s.role == Primary && ns.s.disk <= Inconsistent && 
 		    ns.s.pdsk <= Inconsistent ) rv=-2;
 
-		if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent && 
-		    ns.s.conn < Connected ) rv=-3;
+		if( ns.s.peer == Primary && ns.s.pdsk <= Inconsistent ) rv=-3;
 
 		if( ns.s.conn > Connected && 
 		    ns.s.disk < UpToDate && ns.s.pdsk < UpToDate ) rv=-4;
@@ -1637,7 +1638,6 @@
 				drbd_set_role(mdev,Secondary);
 				up(&mdev->device_mutex);
 				drbd_sync_me(mdev);
-				set_bit(DO_NOT_INC_CONCNT,&mdev->flags);
 				drbd_thread_stop(&mdev->receiver);
 				drbd_thread_stop(&mdev->worker);
 			}

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/drbd_receiver.c	2004-12-13 21:11:24 UTC (rev 1677)
@@ -1367,7 +1367,7 @@
 	consider_sync = ((nconn=mdev->state.s.conn) == WFReportParams);
 	if(drbd_determin_dev_size(mdev)) consider_sync=0;
 
-	if(test_bit(DISKLESS, &mdev->flags)) consider_sync=0;
+	if(mdev->state.s.disk==Diskless) consider_sync=0;
 
 	drbd_bm_unlock(mdev); // }
 
@@ -1632,23 +1632,6 @@
 	}
 }
 
-void drbd_khelper(drbd_dev *mdev, char* cmd)
-{
-	int ret;
-	char mb[12];
-	char *argv[] = {"/sbin/drbdadm", cmd, mb, NULL };
-	static char *envp[] = { "HOME=/",
-				"TERM=linux",
-				"PATH=/sbin:/usr/sbin:/bin:/usr/bin",
-				NULL };
-	
-	snprintf(mb,12,"minor-%d",(int)(mdev-drbd_conf));
-	ret = call_usermodehelper("/sbin/drbdadm",argv,envp,1);
-	if(ret) {
-		ERR("call_usermodhelper failed with %d\n",(ret>>8) & 0xff);
-	}
-}
-
 STATIC void drbd_disconnect(drbd_dev *mdev)
 {
 	D_ASSERT(mdev->state.s.conn < Connected);
@@ -1756,14 +1739,11 @@
 	}
 
 	if (mdev->state.s.role == Primary) {
-		if(!test_bit(DO_NOT_INC_CONCNT,&mdev->flags))
-			drbd_md_inc(mdev,ConnectedCnt);
+		drbd_disks_t nps = drbd_try_outdate_peer(mdev);
+		drbd_request_state(mdev,NS(pdsk,nps));
 		drbd_md_write(mdev);
 	}
-	clear_bit(DO_NOT_INC_CONCNT,&mdev->flags);
 
-	drbd_khelper(mdev,"on-disconnect");
-
 	INFO("Connection lost.\n");
 }
 

Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/drbd_strings.c	2004-12-13 21:11:24 UTC (rev 1677)
@@ -65,6 +65,7 @@
 	[4] = "Refusing to be inconsistent on both nodes",
 	[5] = "Refusing to be syncing and diskless",
 	[6] = "Refusing to be Outdated while Connected",
+	[7] = "Refusing to be Primary while peer is not outdated",
 };
 
 const char* conns_to_name(drbd_conns_t s) {

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/drbd_worker.c	2004-12-13 21:11:24 UTC (rev 1677)
@@ -757,10 +757,10 @@
 	   */
 	drbd_global_unlock();
 
-	if (mdev->cstate == SyncTarget) {
+	if (mdev->state.s.conn == SyncTarget) {
 		D_ASSERT(!test_bit(STOP_SYNC_TIMER,&mdev->flags));
 		mod_timer(&mdev->resync_timer,jiffies);
-	} else if (mdev->cstate == PausedSyncT) { 
+	} else if (mdev->state.s.conn == PausedSyncT) { 
 		D_ASSERT(test_bit(STOP_SYNC_TIMER,&mdev->flags));
 		clear_bit(STOP_SYNC_TIMER,&mdev->flags);
 	}

Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/drbd/linux/drbd.h	2004-12-13 21:11:24 UTC (rev 1677)
@@ -200,11 +200,11 @@
 } drbd_conns_t;
 
 typedef enum {
-	DUnknown,
 	Diskless,
 	Failed,         /* Becomes Diskless as soon as we told it the peer */
 	Inconsistent,
 	Outdated,
+	DUnknown,
 	Consistent,     /* Might be Outdated, might be UpToDate ... */
 	UpToDate,
 	disk_mask=7
@@ -215,8 +215,8 @@
 		unsigned role : 2 ;   // 3/3      primary/secondary/unknown
 		unsigned peer : 2 ;   // 3/3      primary/secondary/unknown
 		unsigned conn : 5 ;   // 17/32    cstates
-		unsigned disk : 3 ;   // 7/7      from DUnknown to UpToDate
-		unsigned pdsk : 3 ;   // 7/7      from DUnknown to UpToDate
+		unsigned disk : 3 ;   // 7/7      from Diskless to UpToDate
+		unsigned pdsk : 3 ;   // 7/7      from Diskless to UpToDate
 		unsigned susp : 1 ;   // 2/2      IO suspended  no/yes
 		unsigned _pad : 16;   // 0        unused
 	} s;

Modified: trunk/scripts/drbd.conf
===================================================================
--- trunk/scripts/drbd.conf	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/scripts/drbd.conf	2004-12-13 21:11:24 UTC (rev 1677)
@@ -129,7 +129,7 @@
 
     # Commands to run in case we loose connection. Use this script in 
     # in conjunction with the on-disconnect=suspend_io configuration.
-    # on-disconnect "/usr/lib/drbd/outdate-peer.sh";
+    # outdate-peer "/usr/lib/drbd/outdate-peer.sh";
   }
 
   startup {

Modified: trunk/user/drbdadm.h
===================================================================
--- trunk/user/drbdadm.h	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/user/drbdadm.h	2004-12-13 21:11:24 UTC (rev 1677)
@@ -77,7 +77,7 @@
 extern void validate_resource(struct d_resource *);
 extern int check_uniq(const char* what, const char *fmt, ...);
 extern void verify_ips(struct d_resource* res);
-extern void schedule_dcmd( int (* function)(struct d_resource*,char* ),
+extern void schedule_dcmd( int (* function)(struct d_resource*,const char* ),
 			   struct d_resource* res,
 			   int order);
 

Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/user/drbdadm_main.c	2004-12-13 21:11:24 UTC (rev 1677)
@@ -69,7 +69,7 @@
 
 struct deferred_cmd
 {
-  int (* function)(struct d_resource*,char* );
+  int (* function)(struct d_resource*,const char* );
   struct d_resource* res;
   struct deferred_cmd* next;
 };
@@ -116,7 +116,7 @@
 
 struct deferred_cmd *deferred_cmds[3] = { NULL, NULL, NULL };
 
-void schedule_dcmd( int (* function)(struct d_resource*,char* ),
+void schedule_dcmd( int (* function)(struct d_resource*,const char* ),
 		    struct d_resource* res,
 		    int order)
 {
@@ -195,7 +195,7 @@
   { "set-gc",            admm_generic,          0, 1 },
   { "pri-on-incon-degr", adm_khelper,           0, 1 },
   { "pri-sees-sec-with-higher-gc", adm_khelper, 0, 1 },
-  { "on-disconnect",     adm_khelper,           0, 1 },
+  { "outdate-peer",      adm_khelper,           0, 1 },
   { "wait_con_int",      adm_wait_ci,           1, 0 },
   { "sh-resources",      sh_resources,          0, 0 },
   { "sh-mod-parms",      sh_mod_parms,          0, 0 },

Modified: trunk/user/drbdadm_parser.y
===================================================================
--- trunk/user/drbdadm_parser.y	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/user/drbdadm_parser.y	2004-12-13 21:11:24 UTC (rev 1677)
@@ -249,6 +249,7 @@
 %token <txt> TK_KO_COUNT TK_ON_DISCONNECT TK_DIALOG_REFRESH
 %token <txt> TK_ALLOW_TWO_PRIMARIES
 %token <txt> TK_PRI_ON_INCON_DEGR TK_PRI_SEES_SEC_WITH_HIGHER_GC
+%token <txt> TK_OUTDATE_PEER
 
 %type <txt> hostname resource_name
 %type <d_option> disk_stmts disk_stmt
@@ -430,5 +431,5 @@
 handler_stmt:	  TK_PRI_ON_INCON_DEGR TK_STRING	{ $$=new_opt($1,$2); }
 		| TK_PRI_SEES_SEC_WITH_HIGHER_GC TK_STRING
 		{ $$=new_opt($1,$2); }
-		| TK_ON_DISCONNECT TK_STRING		{ $$=new_opt($1,$2); }
+		| TK_OUTDATE_PEER TK_STRING		{ $$=new_opt($1,$2); }
 		;

Modified: trunk/user/drbdadm_scanner.fl
===================================================================
--- trunk/user/drbdadm_scanner.fl	2004-12-13 15:20:07 UTC (rev 1676)
+++ trunk/user/drbdadm_scanner.fl	2004-12-13 21:11:24 UTC (rev 1677)
@@ -276,12 +276,12 @@
 <HANDLERS>{
   pri-on-incon-degr	do_assign(STRING); CP; return TK_PRI_ON_INCON_DEGR;
   pri-sees-sec-with-higher-gc	do_assign(STRING); CP; return TK_PRI_SEES_SEC_WITH_HIGHER_GC;
-  on-disconnect		do_assign(STRING); CP; return TK_ON_DISCONNECT;
+  outdate-peer		do_assign(STRING); CP; return TK_OUTDATE_PEER;
   {NDELIM}		{
 	  		  expect_error(
 				"one of 'pri-on-incon-degr|"
 				"pri-sees-sec-with-higher-gc|"
-				"on-disconnect");
+				"outdate-peer");
 			}
 }
 



More information about the drbd-cvs mailing list