[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