[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