[DRBD-cvs] r1515 - in plus-branches/01-wait-sync-target: documentation scripts user

svn at svn.drbd.org svn at svn.drbd.org
Fri Aug 27 14:39:47 CEST 2004


Author: phil
Date: 2004-08-27 14:39:42 +0200 (Fri, 27 Aug 2004)
New Revision: 1515

Modified:
   plus-branches/01-wait-sync-target/documentation/drbd.conf.sgml
   plus-branches/01-wait-sync-target/scripts/drbd
   plus-branches/01-wait-sync-target/scripts/drbd.conf
   plus-branches/01-wait-sync-target/user/drbdadm_main.c
   plus-branches/01-wait-sync-target/user/drbdadm_parser.y
   plus-branches/01-wait-sync-target/user/drbdadm_scanner.fl
Log:
The implementation of this add-on


Modified: plus-branches/01-wait-sync-target/documentation/drbd.conf.sgml
===================================================================
--- plus-branches/01-wait-sync-target/documentation/drbd.conf.sgml	2004-08-27 12:19:45 UTC (rev 1514)
+++ plus-branches/01-wait-sync-target/documentation/drbd.conf.sgml	2004-08-27 12:39:42 UTC (rev 1515)
@@ -182,7 +182,8 @@
     <manvolnum>8</manvolnum></citerefentry> for detailed description
     of this section's parameters.
     Optional parameters:
-    <option>wfc-timeout</option>, <option>degr-wfc-timeout</option>.
+    <option>wfc-timeout</option>, <option>degr-wfc-timeout</option>,
+    <option>wait-sync-target</option>.
   </para>
   </listitem>
 </varlistentry>

Modified: plus-branches/01-wait-sync-target/scripts/drbd
===================================================================
--- plus-branches/01-wait-sync-target/scripts/drbd	2004-08-27 12:19:45 UTC (rev 1514)
+++ plus-branches/01-wait-sync-target/scripts/drbd	2004-08-27 12:39:42 UTC (rev 1515)
@@ -64,6 +64,14 @@
 	done
 	echo "."
 	$DRBDADM wait_con_int # User interruptible version of wait_connect all
+	for I in $RESOURCES; do
+	    WAIT_TS=`$DRBDADM sh-wait-st $I`
+	    CSTATE=`$DRBDADM cstate $I`
+	    if [ "$WAIT_TS" == "set" -a $CSTATE == "SyncTarget" ]; then
+	        echo "Waiting until sync on $I finished."
+		$DRBDADM wait_sync $I
+	    fi
+	done
 	;;
     stop)
 	echo -n "Stopping all DRBD resources"

Modified: plus-branches/01-wait-sync-target/scripts/drbd.conf
===================================================================
--- plus-branches/01-wait-sync-target/scripts/drbd.conf	2004-08-27 12:19:45 UTC (rev 1514)
+++ plus-branches/01-wait-sync-target/scripts/drbd.conf	2004-08-27 12:39:42 UTC (rev 1515)
@@ -135,6 +135,11 @@
     # is rebooted, this timeout value is used. 
     #
     degr-wfc-timeout 120;    # 2 minutes.
+
+    # The initscript blocks the bootprocess as long as any device
+    # is in SyncTarget cstate. Usefull to prevent current heartbeat
+    # to make a SyncTarget-node primary.
+    # wait-sync-target;
   }
 
   disk {

Modified: plus-branches/01-wait-sync-target/user/drbdadm_main.c
===================================================================
--- plus-branches/01-wait-sync-target/user/drbdadm_main.c	2004-08-27 12:19:45 UTC (rev 1514)
+++ plus-branches/01-wait-sync-target/user/drbdadm_main.c	2004-08-27 12:39:42 UTC (rev 1515)
@@ -81,8 +81,9 @@
 static int adm_up(struct d_resource* ,char* );
 extern int adm_adjust(struct d_resource* ,char* );
 static int adm_dump(struct d_resource* ,char* );
-static int adm_wait_c(struct d_resource* ,char* );
+static int adm_wait(struct d_resource* ,char* );
 static int adm_wait_ci(struct d_resource* ,char* );
+static int adm_show_opt(struct d_resource* ,char* );
 static int sh_resources(struct d_resource* ,char* );
 static int sh_mod_parms(struct d_resource* ,char* );
 static int sh_dev(struct d_resource* ,char* );
@@ -126,7 +127,8 @@
   { "resize",            adm_resize,  0                  ,1,1 },
   { "syncer",            adm_syncer,  0                  ,1,1 },
   { "adjust",            adm_adjust,  0                  ,1,1 },
-  { "wait_connect",      adm_wait_c,  0                  ,1,1 },
+  { "wait_connect",      adm_wait,    "wait_connect"     ,1,1 },
+  { "wait_sync",         adm_wait,    "wait_sync"        ,1,1 },
   { "state",             adm_generic_s,"state"           ,1,1 },
   { "cstate",            adm_generic_s,"cstate"          ,1,1 },
   { "dump",              adm_dump,    0                  ,1,1 },
@@ -136,7 +138,8 @@
   { "sh-dev",            sh_dev,      0                  ,0,1 },
   { "sh-ll-dev",         sh_ll_dev,   0                  ,0,1 },
   { "sh-md-dev",         sh_md_dev,   0                  ,0,1 },
-  { "sh-md-idx",         sh_md_idx,   0                  ,0,1 }
+  { "sh-md-idx",         sh_md_idx,   0                  ,0,1 },
+  { "sh-wait-st",        adm_show_opt,"wait-sync-target" ,0,1 }
 };
 
 
@@ -277,7 +280,37 @@
   return 0;
 }
 
+static char* get_opt_val(struct d_option* base,char* name,char* def)
+{
+  while(base) {
+    if(!strcmp(base->name,name)) {
+      return base->value;
+    }
+    base=base->next;
+  }
+  return def;
+}
 
+static int adm_show_opt(struct d_resource* res,char* optname)
+{
+  char *nf="unset"; // not_found
+  char *v;
+
+  do {
+    if((v=get_opt_val(res->net_options,optname,nf)) != nf) break;
+    if((v=get_opt_val(res->disk_options,optname,nf)) != nf) break;
+    if((v=get_opt_val(res->sync_options,optname,nf)) != nf) break;
+    if((v=get_opt_val(res->startup_options,optname,nf)) != nf) break;
+  } while(0);
+
+  if(v==NULL) v="set"; // boolean option, value == 0
+
+  printf("%s\n",v);
+
+  return 0;
+}
+
+
 static int sh_mod_parms(struct d_resource* res,char* unused)
 {
   int mc=global_options.minor_count;
@@ -594,7 +627,7 @@
 }
 
 
-static int adm_wait_c(struct d_resource* res ,char* unused)
+static int adm_wait(struct d_resource* res ,char* cmd)
 {
   char* argv[20];
   struct d_option* opt;
@@ -602,9 +635,13 @@
 
   argv[argc++]=drbdsetup;
   argv[argc++]=res->me->device;
-  argv[argc++]="wait_connect";
+  argv[argc++]=cmd;
   opt=res->startup_options;
-  make_options(opt);
+  while(opt) {
+    if(strstr(opt->name,"timeout"))
+      ssprintf(argv[argc++],"--%s=%s",opt->name,opt->value);
+    opt=opt->next;
+  }
   argv[argc++]=0;
 
   rv = m_system(argv,SLEEPS_FOREVER);
@@ -616,7 +653,6 @@
   return rv;
 }
 
-
 /* In case a child exited, or exits, its return code is stored as
    negative number in the pids[i] array */
 static int childs_running(pid_t* pids,int opts)
@@ -703,17 +739,6 @@
    return pr;
 }
 
-static char* get_opt_val(struct d_option* base,char* name,char* def)
-{
-  while(base) {
-    if(!strcmp(base->name,name)) {
-      return base->value;
-    }
-    base=base->next;
-  }
-  return def;
-}
-
 void chld_sig_hand(int unused)
 {
   // do nothing. But interrupt systemcalls :)
@@ -763,7 +788,11 @@
     argv[argc++]=res->me->device;
     argv[argc++]="wait_connect";
     opt=res->startup_options;
-    make_options(opt);
+    while(opt) {
+      if(strstr(opt->name,"timeout"))
+	ssprintf(argv[argc++],"--%s=%s",opt->name,opt->value);
+      opt=opt->next;
+    }
     argv[argc++]=0;
 
     pids[i++]=m_system(argv,RETURN_PID);

Modified: plus-branches/01-wait-sync-target/user/drbdadm_parser.y
===================================================================
--- plus-branches/01-wait-sync-target/user/drbdadm_parser.y	2004-08-27 12:19:45 UTC (rev 1514)
+++ plus-branches/01-wait-sync-target/user/drbdadm_parser.y	2004-08-27 12:39:42 UTC (rev 1515)
@@ -119,7 +119,7 @@
 %token TK_MINOR_COUNT TK_DISABLE_IO_HINTS
 %token TK_PROTOCOL TK_INCON_DEGR_CMD
 %token TK_ADDRESS TK_DISK TK_DEVICE TK_META_DISK
-%token <txt> TK_INTEGER TK_STRING
+%token <txt> TK_INTEGER TK_STRING TK_WAIT_SYNC_TARGET
 %token <txt> TK_ON_IO_ERROR TK_SIZE
 %token <txt> TK_TIMEOUT TK_CONNECT_INT TK_PING_INT TK_MAX_BUFFERS TK_IPADDR
 %token <txt> TK_MAX_EPOCH_SIZE TK_SNDBUF_SIZE
@@ -273,4 +273,5 @@
 
 startup_stmt:	  TK_WFC_TIMEOUT      TK_INTEGER   { $$=new_opt($1,$2); }
 		| TK_DEGR_WFC_TIMEOUT TK_INTEGER   { $$=new_opt($1,$2); }
+		| TK_WAIT_SYNC_TARGET		   { $$=new_opt($1,0);  }
 		;

Modified: plus-branches/01-wait-sync-target/user/drbdadm_scanner.fl
===================================================================
--- plus-branches/01-wait-sync-target/user/drbdadm_scanner.fl	2004-08-27 12:19:45 UTC (rev 1514)
+++ plus-branches/01-wait-sync-target/user/drbdadm_scanner.fl	2004-08-27 12:39:42 UTC (rev 1515)
@@ -214,7 +214,8 @@
 <STARTUP>{
   wfc-timeout		do_assign(NUM); CP; return TK_WFC_TIMEOUT;
   degr-wfc-timeout	do_assign(NUM); CP; return TK_DEGR_WFC_TIMEOUT;
-  {NDELIM}		expect_error("one of 'wfc-timeout|degr-wfc-timeout'");
+  wait-sync-target	yy_push_state(SEMICOLON); CP; return TK_WAIT_SYNC_TARGET;
+  {NDELIM}		expect_error("one of 'wfc-timeout|degr-wfc-timeout|wait-sync-target'");
 }
 
 <DISK>{



More information about the drbd-cvs mailing list