good for merge On Thu, 2010-03-25 at 07:38 +1100, Angus Salkeld wrote: > Signed-off-by: Angus Salkeld <[email protected]> > --- > cts/agents/cpg_test_agent.c | 42 +++++--- > cts/corotests.py | 220 > ++++++++++++++++++------------------------- > 2 files changed, 119 insertions(+), 143 deletions(-) > > diff --git a/cts/agents/cpg_test_agent.c b/cts/agents/cpg_test_agent.c > index 9db370d..de47ca8 100644 > --- a/cts/agents/cpg_test_agent.c > +++ b/cts/agents/cpg_test_agent.c > @@ -96,36 +96,35 @@ static int32_t my_msgs_to_send; > static int32_t total_stored_msgs = 0; > static hdb_handle_t poll_handle; > > + > +static void send_some_more_messages (void * unused); > + > static char* err_status_string (char * buf, size_t buf_len, msg_status_t > status) > { > switch (status) { > case MSG_OK: > strncpy (buf, "OK", buf_len); > - return buf; > break; > case MSG_NODEID_ERR: > strncpy (buf, "NODEID_ERR", buf_len); > - return buf; > break; > case MSG_PID_ERR: > strncpy (buf, "PID_ERR", buf_len); > - return buf; > break; > case MSG_SEQ_ERR: > strncpy (buf, "SEQ_ERR", buf_len); > - return buf; > break; > case MSG_SIZE_ERR: > strncpy (buf, "SIZE_ERR", buf_len); > - return buf; > break; > case MSG_SHA1_ERR: > - default: > strncpy (buf, "SHA1_ERR", buf_len); > - return buf; > + break; > + default: > + strncpy (buf, "UNKNOWN_ERR", buf_len); > break; > } > - > + return buf; > } > > static void delivery_callback ( > @@ -160,7 +159,7 @@ static void delivery_callback ( > status = MSG_SIZE_ERR; > } > sha1_init (&sha1_hash); > - sha1_process (&sha1_hash, msg_pt->payload, msg_pt->size); > + sha1_process (&sha1_hash, msg_pt->payload, (msg_pt->size - sizeof > (msg_t))); > sha1_done (&sha1_hash, sha1_compare); > if (memcmp (sha1_compare, msg_pt->sha1, 20) != 0) { > syslog (LOG_ERR, "%s(); msg seq:%d; incorrect hash", > @@ -285,8 +284,19 @@ static void read_messages (int sock, char* atmost_str) > send (sock, big_and_buf, strlen (big_and_buf), 0); > } > > +static void send_some_more_messages_later (void) > +{ > + poll_timer_handle timer_handle; > + cpg_dispatch (cpg_handle, CS_DISPATCH_ALL); > + poll_timer_add ( > + poll_handle, > + 100, NULL, > + send_some_more_messages, > + &timer_handle); > +} > + > static unsigned char buffer[200000]; > -static void send_some_more_messages (void) > +static void send_some_more_messages (void * unused) > { > msg_t my_msg; > struct iovec iov[2]; > @@ -302,7 +312,7 @@ static void send_some_more_messages (void) > > send_now = my_msgs_to_send; > > - syslog (LOG_DEBUG,"%s() send_now:%d", __func__, send_now); > + //syslog (LOG_DEBUG,"%s() send_now:%d", __func__, send_now); > my_msg.pid = my_pid; > my_msg.nodeid = my_nodeid; > payload_size = (rand() % 100000); > @@ -325,6 +335,7 @@ static void send_some_more_messages (void) > res = cpg_flow_control_state_get (cpg_handle, &fc_state); > if (res == CS_OK && fc_state == CPG_FLOW_CONTROL_ENABLED) { > /* lets do this later */ > + send_some_more_messages_later (); > syslog (LOG_INFO, "%s() flow control enabled.", > __func__); > return; > } > @@ -332,6 +343,7 @@ static void send_some_more_messages (void) > res = cpg_mcast_joined (cpg_handle, CPG_TYPE_AGREED, iov, 2); > if (res == CS_ERR_TRY_AGAIN) { > /* lets do this later */ > + send_some_more_messages_later (); > syslog (LOG_INFO, "%s() cpg_mcast_joined() says try > again.", > __func__); > return; > @@ -357,10 +369,10 @@ static void msg_blaster (int sock, char* > num_to_send_str) > /* control the limits */ > if (my_msgs_to_send <= 0) > my_msgs_to_send = 1; > - if (my_msgs_to_send > 1000) > - my_msgs_to_send = 1000; > + if (my_msgs_to_send > 10000) > + my_msgs_to_send = 10000; > > - send_some_more_messages (); > + send_some_more_messages (NULL); > } > > > @@ -541,7 +553,7 @@ static int server_process_data_fn (hdb_handle_t handle, > exit (0); > } else { > if (my_msgs_to_send > 0) > - send_some_more_messages (); > + send_some_more_messages (NULL); > > big_and_buf_rx[nbytes] = '\0'; > > diff --git a/cts/corotests.py b/cts/corotests.py > index d07eb5f..92ea570 100644 > --- a/cts/corotests.py > +++ b/cts/corotests.py > @@ -44,19 +44,12 @@ class CoroTest(CTSTest): > CTSTest.__init__(self,cm) > self.start = StartTest(cm) > self.stop = StopTest(cm) > + self.config = {} > > def setup(self, node): > ret = CTSTest.setup(self, node) > - self.CM.apply_new_config() > - > - for n in self.CM.Env["nodes"]: > - if not self.CM.StataCM(n): > - self.incr("started") > - self.start(n) > - return ret > - > > - def setup_sec_key(self, node): > + # setup the authkey > localauthkey = '/tmp/authkey' > if not os.path.exists(localauthkey): > self.CM.rsh(node, 'corosync-keygen') > @@ -67,6 +60,20 @@ class CoroTest(CTSTest): > #copy key onto other nodes > self.CM.rsh.cp(localauthkey, "%s:%s" % (n, > "/etc/corosync/authkey")) > > + # copy over any new config > + for c in self.config: > + self.CM.new_config[c] = self.config[c] > + > + # apply the config > + self.CM.apply_new_config() > + > + # start any killed corosync's > + for n in self.CM.Env["nodes"]: > + if not self.CM.StataCM(n): > + self.incr("started") > + self.start(n) > + return ret > + > > def teardown(self, node): > self.CM.apply_default_config() > @@ -190,42 +197,12 @@ class CpgCfgChgOnExecCrash(CpgConfigChangeBase): > > > ################################################################### > -class CpgCfgChgOnNodeLeave_v2(CpgConfigChangeBase): > +class CpgCfgChgOnNodeIsolate(CpgConfigChangeBase): > > def __init__(self, cm): > CpgConfigChangeBase.__init__(self,cm) > - self.name="CpgCfgChgOnNodeLeave_v2" > + self.name="CpgCfgChgOnNodeIsolate" > > - def setup(self, node): > - self.CM.new_config['compatibility'] = 'none' > - self.CM.new_config['totem/token'] = 10000 > - return CpgConfigChangeBase.setup(self, node) > - > - def failure_action(self): > - self.CM.log("isolating node " + self.wobbly) > - self.CM.isolate_node(self.wobbly) > - > - def __call__(self, node): > - self.incr("calls") > - self.failure_action() > - return self.wait_for_config_change() > - > - def teardown(self, node): > - self.CM.unisolate_node (self.wobbly) > - return CpgConfigChangeBase.teardown(self, node) > - > -################################################################### > -class CpgCfgChgOnNodeLeave_v1(CpgConfigChangeBase): > - > - def __init__(self, cm): > - CpgConfigChangeBase.__init__(self,cm) > - self.name="CpgCfgChgOnNodeLeave_v1" > - > - def setup(self, node): > - self.CM.new_config['compatibility'] = 'whitetank' > - self.CM.new_config['totem/token'] = 10000 > - return CpgConfigChangeBase.setup(self, node) > - > def failure_action(self): > self.CM.log("isolating node " + self.wobbly) > self.CM.isolate_node(self.wobbly) > @@ -268,15 +245,13 @@ class CpgMsgOrderBase(CoroTest): > > for n in self.CM.Env["nodes"]: > msgs[n] = [] > - got = False > stopped = False > - self.CM.debug( " getting messages from " + n ) > + waited = 0 > > - while len(msgs[n]) < self.total_num_msgs and not stopped: > + while len(msgs[n]) < self.total_num_msgs and waited < 60: > > msg = self.CM.agent[n].read_messages(25) > if not msg == None: > - got = True > msgl = msg.split(";") > > # remove empty entries > @@ -288,106 +263,52 @@ class CpgMsgOrderBase(CoroTest): > not_done = False > > msgs[n].extend(msgl) > - elif msg == None and got: > - self.CM.debug(" done getting messages from " + n) > - stopped = True > - > - if not got: > + elif msg == None: > time.sleep(1) > + waited = waited + 1 > + > + if len(msgs[n]) < self.total_num_msgs: > + return self.failure("expected %d messages from %s got %d" % > (self.total_num_msgs, n, len(msgs[n]))) > > fail = False > + error_message = '' > for i in range(0, self.total_num_msgs): > first = None > for n in self.CM.Env["nodes"]: > + # first test for errors > + params = msgs[n][i].split(":") > + if not 'OK' in params[3]: > + fail = True > + error_message = 'error: ' + params[3] + ' in received > message' > + self.CM.log(str(params)) > + > + # then look for out of order messages > if first == None: > first = n > else: > if not msgs[first][i] == msgs[n][i]: > # message order not the same! > fail = True > + error_message = 'message out of order' > self.CM.log(msgs[first][i] + " != " + msgs[n][i]) > > if fail: > - return self.failure() > + return self.failure(error_message) > else: > return self.success() > > ################################################################### > class CpgMsgOrderBasic(CpgMsgOrderBase): > ''' > - each sends & logs 100 messages > + each sends & logs 1000 messages > ''' > def __init__(self, cm): > CpgMsgOrderBase.__init__(self,cm) > self.name="CpgMsgOrderBasic" > + self.num_msgs_per_node = 9000 > > def __call__(self, node): > self.incr("calls") > - > - self.num_msgs_per_node = 100 > - self.cpg_msg_blaster() > - return self.wait_and_validate_order() > - > -class CpgMsgOrderThreads(CpgMsgOrderBase): > - ''' > - each sends & logs 100 messages > - ''' > - def __init__(self, cm): > - CpgMsgOrderBase.__init__(self,cm) > - self.name="CpgMsgOrderThreads" > - > - def setup(self, node): > - self.CM.new_config['totem/threads'] = 4 > - return CpgMsgOrderBase.setup(self, node) > - > - def __call__(self, node): > - self.incr("calls") > - > - self.num_msgs_per_node = 100 > - self.cpg_msg_blaster() > - return self.wait_and_validate_order() > - > - > -class CpgMsgOrderSecNss(CpgMsgOrderBase): > - ''' > - each sends & logs 100 messages > - ''' > - def __init__(self, cm): > - CpgMsgOrderBase.__init__(self,cm) > - self.name="CpgMsgOrderSecNss" > - > - def setup(self, node): > - self.setup_sec_key(node) > - self.CM.new_config['totem/secauth'] = 'on' > - self.CM.new_config['totem/crypto_accept'] = 'new' > - self.CM.new_config['totem/crypto_type'] = 'nss' > - return CpgMsgOrderBase.setup(self, node) > - > - def __call__(self, node): > - self.incr("calls") > - > - self.num_msgs_per_node = 100 > - self.cpg_msg_blaster() > - return self.wait_and_validate_order() > - > -class CpgMsgOrderSecSober(CpgMsgOrderBase): > - ''' > - each sends & logs 100 messages > - ''' > - def __init__(self, cm): > - CpgMsgOrderBase.__init__(self,cm) > - self.name="CpgMsgOrderSecSober" > - > - def setup(self, node): > - self.setup_sec_key(node) > - self.CM.new_config['totem/secauth'] = 'on' > - self.CM.new_config['totem/crypto_type'] = 'sober' > - return CpgMsgOrderBase.setup(self, node) > - > - def __call__(self, node): > - self.incr("calls") > - > - self.num_msgs_per_node = 100 > self.cpg_msg_blaster() > return self.wait_and_validate_order() > > @@ -506,22 +427,17 @@ class ServiceLoadTest(CoroTest): > > return self.success() > > - > +GenTestClasses = [] > +GenTestClasses.append(CpgMsgOrderBasic) > +GenTestClasses.append(CpgCfgChgOnExecCrash) > +GenTestClasses.append(CpgCfgChgOnGroupLeave) > +GenTestClasses.append(CpgCfgChgOnNodeLeave) > +GenTestClasses.append(CpgCfgChgOnNodeIsolate) > > AllTestClasses = [] > AllTestClasses.append(ServiceLoadTest) > -AllTestClasses.append(CpgMsgOrderBasic) > -AllTestClasses.append(CpgMsgOrderThreads) > -AllTestClasses.append(CpgMsgOrderSecNss) > -AllTestClasses.append(CpgMsgOrderSecSober) > AllTestClasses.append(MemLeakObject) > AllTestClasses.append(MemLeakSession) > -AllTestClasses.append(CpgCfgChgOnExecCrash) > -AllTestClasses.append(CpgCfgChgOnGroupLeave) > -AllTestClasses.append(CpgCfgChgOnNodeLeave) > -AllTestClasses.append(CpgCfgChgOnNodeLeave_v1) > -AllTestClasses.append(CpgCfgChgOnNodeLeave_v2) > - > AllTestClasses.append(FlipTest) > AllTestClasses.append(RestartTest) > AllTestClasses.append(StartOnebyOne) > @@ -534,10 +450,58 @@ AllTestClasses.append(RestartOnebyOne) > > def CoroTestList(cm, audits): > result = [] > + configs = [] > + empty = {} > + configs.append(empty) > + > + a = {} > + a['compatibility'] = 'none' > + a['totem/token'] = 10000 > + configs.append(a) > + > + b = {} > + b['compatibility'] = 'whitetank' > + b['totem/token'] = 10000 > + configs.append(b) > + > + c = {} > + c['totem/secauth'] = 'on' > + c['totem/crypto_accept'] = 'new' > + c['totem/crypto_type'] = 'nss' > + configs.append(c) > + > + d = {} > + d['totem/secauth'] = 'on' > + d['totem/crypto_type'] = 'sober' > + configs.append(d) > + > + e = {} > + e['totem/threads'] = 4 > + configs.append(e) > + > + #quorum/provider= > + f = {} > + f['quorum/provider'] = 'corosync_quorum_ykd' > + configs.append(f) > + > + num=1 > + for cfg in configs: > + for testclass in GenTestClasses: > + bound_test = testclass(cm) > + if bound_test.is_applicable(): > + bound_test.Audits = audits > + bound_test.config = cfg > + bound_test.name = bound_test.name + '_' + str(num) > + result.append(bound_test) > + num = num + 1 > + > + > + > for testclass in AllTestClasses: > bound_test = testclass(cm) > if bound_test.is_applicable(): > bound_test.Audits = audits > result.append(bound_test) > + > return result >
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
