[DRBD-cvs] r1780 - in trunk: . drbd user

www-data www-data at garcon.linbit.com
Wed Apr 6 10:57:04 CEST 2005


Author: phil
Date: 2005-04-06 10:56:58 +0200 (Wed, 06 Apr 2005)
New Revision: 1780

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_worker.c
   trunk/user/drbdtool_common.c
Log:
Some polish on the data generation UUID work...


Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/ROADMAP	2005-04-06 08:56:58 UTC (rev 1780)
@@ -171,9 +171,8 @@
   drbdadm is the nice front end. It always uses the right 
   back end (drbdmeta or drbdsetup)...
 
-  drbdadm md-set-gc 1:2:3:4:5:6 r0
-  drbdadm md-get-gc r0
-  drbdadm md-get/set-{la-size|consistent|etc...} resources....
+  drbdadm set-gi 1:2:3:4:5:6 r0
+  drbdadm get-gi r0
   drbdadm md-create r0
 
   md-create would ask nasty questions about whether you are really 
@@ -468,9 +467,9 @@
            NB: If they are needed, I think they can be implemented
                as special UUID values.
 
-  80% DONE. Kernel part is implemented, little tested. Userlang parts
-            implemented, seem to work. Known bugs: Upon connect
-            sync_handshake is not called, need to fix this.
+  90% DONE. Kernel part is implemented, userlang parts are implemented,
+	    only "drbdadm set-gi" is still unimplemented.
+	    Everything seems to work so far. Should be tested more.
 
 17 Something like
 

Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/drbd/drbd_fs.c	2005-04-06 08:56:58 UTC (rev 1780)
@@ -838,7 +838,7 @@
 
 	if (mdev->state.s.conn >= WFReportParams) {
 		/* if this was forced, we should consider sync */
-		if(forced) drbd_send_gen_cnt(mdev);
+		if(forced) drbd_send_uuids(mdev);
 		drbd_send_state(mdev);
 	}
 
@@ -1106,7 +1106,7 @@
 		drbd_md_write(mdev); // Write mdev->la_size to disk.
 		drbd_bm_unlock(mdev);
 		if (mdev->state.s.conn == Connected) {
-			drbd_send_gen_cnt(mdev); // to start sync...
+			drbd_send_uuids(mdev); // to start sync...
 			drbd_send_sizes(mdev);
 		}
 		break;

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/drbd/drbd_int.h	2005-04-06 08:56:58 UTC (rev 1780)
@@ -740,6 +740,7 @@
 	int open_cnt;
 	unsigned int md_flags;
 	u64 uuid[UUID_SIZE];
+	u64 as_c_uuid;         // Store the peers c-uuid until resync finished.
 	u64 *p_uuid;
 	atomic_t epoch_size;
 	spinlock_t ee_lock;
@@ -800,7 +801,7 @@
 extern int drbd_send(drbd_dev *mdev, struct socket *sock,
 		     void* buf, size_t size, unsigned msg_flags);
 extern int drbd_send_protocol(drbd_dev *mdev);
-extern int drbd_send_gen_cnt(drbd_dev *mdev);
+extern int drbd_send_uuids(drbd_dev *mdev);
 extern int drbd_send_sizes(drbd_dev *mdev);
 extern int drbd_send_state(drbd_dev *mdev);
 extern int _drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
@@ -834,7 +835,8 @@
 extern void drbd_md_write(drbd_dev *mdev);
 extern int drbd_md_read(drbd_dev *mdev);
 // maybe define them below as inline?
-extern void drbd_uuid_set_current(drbd_dev *mdev, u64 val);
+extern void drbd_uuid_set(drbd_dev *mdev,int idx, u64 val);
+extern void _drbd_uuid_set(drbd_dev *mdev, int idx, u64 val);
 extern void drbd_uuid_new_current(drbd_dev *mdev);
 extern void drbd_uuid_reset_bm(drbd_dev *mdev);
 extern void drbd_md_set_flag(drbd_dev *mdev, int flags);

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/drbd/drbd_main.c	2005-04-06 08:56:58 UTC (rev 1780)
@@ -677,12 +677,6 @@
 		drbd_panic("No access to good data anymore.\n");
 	}
 
-	if ( os.s.conn != Connected && ns.s.conn == Connected && 
-	     mdev->p_uuid ) {
-		kfree(mdev->p_uuid);
-		mdev->p_uuid = 0;
-	}
-
 	return rv;
 }
 
@@ -956,7 +950,7 @@
 			     (Drbd_Header*)&p,sizeof(p));
 }
 
-int drbd_send_gen_cnt(drbd_dev *mdev)
+int drbd_send_uuids(drbd_dev *mdev)
 {
 	Drbd_GenCnt_Packet p;
 	int i;
@@ -2346,19 +2340,39 @@
 }
 
 
-void drbd_uuid_set_current(drbd_dev *mdev, u64 val)
+
+
+static void drbd_uuid_move_history(drbd_dev *mdev)
 {
-	mdev->uuid[Current] = val;
+	int i;
+
+	for ( i=History_start ; i<History_end ; i++ ) {
+		mdev->uuid[i+1] = mdev->uuid[i];
+	}
+}
+
+void _drbd_uuid_set(drbd_dev *mdev, int idx, u64 val)
+{
 	if (mdev->state.s.role == Primary) {
-		mdev->uuid[Current] |= 1;
+		mdev->uuid[idx] = val | 1;
 	} else {
-		mdev->uuid[Current] &= ~((u64)1);
+		mdev->uuid[idx] = val & ~((u64)1);
 	}
 }
 
+
+void drbd_uuid_set(drbd_dev *mdev, int idx, u64 val)
+{
+	if(mdev->uuid[idx]) {
+		drbd_uuid_move_history(mdev);
+		mdev->uuid[History_start]=mdev->uuid[idx];
+	}
+	_drbd_uuid_set(mdev,idx,val);
+}
+
 void drbd_uuid_new_current(drbd_dev *mdev)
 {
-	D_ASSERT(mdev->uuid[Bitmap] = 0);
+	D_ASSERT(mdev->uuid[Bitmap] == 0);
 	mdev->uuid[Bitmap] = mdev->uuid[Current];
 	get_random_bytes(&mdev->uuid[Current], sizeof(u64));
 	if (mdev->state.s.role == Primary) {
@@ -2370,14 +2384,9 @@
 
 void drbd_uuid_reset_bm(drbd_dev *mdev)
 {
-	int i;
-
 	if (mdev->uuid[Bitmap] == 0) return;
 
-	for ( i=History_start ; i<History_end ; i++ ) {
-		mdev->uuid[i+1] = mdev->uuid[i];
-	}
-
+	drbd_uuid_move_history(mdev);
 	mdev->uuid[History_start]=mdev->uuid[Bitmap];
 	mdev->uuid[Bitmap]=0;
 }

Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/drbd/drbd_receiver.c	2005-04-06 08:56:58 UTC (rev 1780)
@@ -717,7 +717,7 @@
 	drbd_send_protocol(mdev);
 	drbd_send_sync_param(mdev,&mdev->sync_conf);
 	drbd_send_sizes(mdev);
-	drbd_send_gen_cnt(mdev);
+	drbd_send_uuids(mdev);
 	drbd_send_state(mdev);
 
 	return 1;
@@ -1371,7 +1371,8 @@
 		drbd_bm_unlock(mdev); // }
 	} else if (hg < 0) { // become sync target
 		drbd_md_clear_flag(mdev,MDF_Consistent);
-		drbd_uuid_set_current(mdev,mdev->p_uuid[Bitmap]);
+		drbd_uuid_set(mdev,Current,mdev->p_uuid[Bitmap]);
+		mdev->as_c_uuid = mdev->p_uuid[Current];
 		rv = WFBitMapT;		
 	} else {
 		rv = Connected;
@@ -1466,6 +1467,8 @@
 	
 	if (mdev->p_uuid) {
 		nconn=drbd_sync_handshake(mdev);
+		kfree(mdev->p_uuid);
+		mdev->p_uuid = 0;
 		if(nconn == conn_mask) return FALSE;
 
 		if(drbd_request_state(mdev,NS(conn,nconn)) <= 0) {
@@ -1529,8 +1532,10 @@
 	nconn = mdev->state.s.conn;
 	if (nconn == WFReportParams ) nconn = Connected;
 
-	if (mdev->p_uuid && mdev->state.s.conn <= Connected) {
+	if (mdev->p_uuid) {
 		nconn=drbd_sync_handshake(mdev);
+		kfree(mdev->p_uuid);
+		mdev->p_uuid = 0;
 		if(nconn == conn_mask) return FALSE;
 	}
 
@@ -1539,7 +1544,7 @@
 	if (mdev->state.s.conn > WFReportParams ) {
 		if( nconn > Connected && peer_state.s.conn == Connected) {
 			// we want resync, peer has not yet decided to sync...
-			drbd_send_gen_cnt(mdev);
+			drbd_send_uuids(mdev);
 			drbd_send_state(mdev);
 		}
 	}
@@ -1731,7 +1736,7 @@
 	[RSDataRequest]    = receive_DataRequest, //receive_RSDataRequest,
 	[SyncParam]        = receive_SyncParam,
 	[ReportProtocol]   = receive_protocol,
-	[ReportUUIDs]     = receive_uuids,
+	[ReportUUIDs]      = receive_uuids,
 	[ReportSizes]      = receive_sizes,
 	[ReportState]      = receive_state,
 };

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/drbd/drbd_worker.c	2005-04-06 08:56:58 UTC (rev 1780)
@@ -391,7 +391,9 @@
 	mdev->rs_paused = 0;
 
 	if ( mdev->state.s.conn == SyncTarget ) {
-		drbd_uuid_set_current(mdev,mdev->p_uuid[Current]);
+		/* Do not pushin the peer's Bitmap UUID into my History. */
+		_drbd_uuid_set(mdev,Current,mdev->as_c_uuid);
+		// mdev->as_c_uuid = 0xf0deadbeefbabe0fLL;
 	}
 	drbd_uuid_reset_bm(mdev);
 

Modified: trunk/user/drbdtool_common.c
===================================================================
--- trunk/user/drbdtool_common.c	2005-04-05 14:25:45 UTC (rev 1779)
+++ trunk/user/drbdtool_common.c	2005-04-06 08:56:58 UTC (rev 1780)
@@ -339,5 +339,20 @@
 
 void dt_pretty_print_uuids(const __u64* uuid, unsigned int flags)
 {
+	printf(
+"\n"
+"       +--<  Current data generation UUID  >-\n"
+"       |               +--<  Bitmap's base data generation UUID  >-\n"
+"       |               |                 +--<  younger historiy UUID  >-\n"
+"       |               |                 |         +-<  older history  >-\n"
+"       V               V                 V         V\n");               
 	dt_print_uuids(uuid, flags);
+	printf(
+"                                                                    ^ ^ ^ ^ ^\n"
+"                                      -<  Data consistancy flag  >--+ | | | |\n"
+"                             -<  Data was/is currently up-to-date  >--+ | | |\n"
+"                                  -<  Node was/is currently primary  >--+ | |\n"
+"                                  -<  Node was/is currently connected  >--+ |\n"
+"          -<  Node was in to progress of setting all bits in the bitmap  >--+\n"
+"\n");
 }



More information about the drbd-cvs mailing list