[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