good for merge On Tue, 2010-03-09 at 07:11 +1100, Angus Salkeld wrote: > Add a new test case to check that an application that > is attempting to conect to corosync via cpg_initialze() > does not leak memory if corosync is not running. > > -Angus > > Signed-off-by: Angus Salkeld <[email protected]> > --- > cts/agents/cpg_test_agent.c | 6 +++++ > cts/corosync.py | 51 +++++++++++++++++++++++++++++++++++++----- > cts/corotests.py | 39 ++++++++++++++++++++++++++++++++ > 3 files changed, 90 insertions(+), 6 deletions(-) > > diff --git a/cts/agents/cpg_test_agent.c b/cts/agents/cpg_test_agent.c > index 593aadc..c7cc6a0 100644 > --- a/cts/agents/cpg_test_agent.c > +++ b/cts/agents/cpg_test_agent.c > @@ -371,6 +371,11 @@ static void do_command (int sock, char* func, > char*args[], int num_args) > } else if (strcmp ("cpg_initialize",func) == 0) { > int retry_count = 0; > > + if (strcmp (args[0], "retry") != 0) { > + cpg_initialize (&cpg_handle, &callbacks); > + return; > + } > + > result = cpg_initialize (&cpg_handle, &callbacks); > while (result != CS_OK) { > syslog (LOG_ERR, > @@ -602,6 +607,7 @@ int main (int argc, char *argv[]) > > openlog (NULL, LOG_CONS|LOG_PID, LOG_DAEMON); > > + syslog (LOG_INFO, "starting...\n"); > list_init (&msg_log_head); > list_init (&config_chg_log_head); > > diff --git a/cts/corosync.py b/cts/corosync.py > index 21cb5b5..43bbaa2 100644 > --- a/cts/corosync.py > +++ b/cts/corosync.py > @@ -352,12 +352,47 @@ class TestAgent(object): > except RuntimeError, msg: > return False > > - def start(self): > + def memory_used(self): > + cmd = 'grep VmRSS /proc/$(pidof ' > + if self.with_valgrind: > + cmd = cmd + 'valgrind' > + else: > + cmd = cmd + self.binary > + cmd = cmd + ')/status | sed "s/VmRSS:[ \t]\+\([0-9]\+\) kB/\\1/"' > + > + rc = self.rsh(self.node, cmd, stdout=1) > + print 'TestAgent mem used: ' + rc > + return int(rc) > + > + def dump_mem_info(self): > + fname = '/tmp/mem_check_test_agent.txt' > + self.rsh.cp("%s:%s" % (self.node, fname), fname) > + > + f = file(fname) > + while True: > + line = f.readline() > + if len(line) == 0: > + break > + print line.strip() > + f.close() > + > + > + def start(self, with_valgrind=False): > '''Set up the given ScenarioComponent''' > + > + self.with_valgrind = with_valgrind > self.env.debug('test agent: start (' + self.node + ')') > self.sock = socket.socket (socket.AF_INET, socket.SOCK_STREAM) > ip = socket.gethostbyname(self.node) > - self.rsh(self.node, self.binary, blocking=0) > + val = 'valgrind ' > + val += '--leak-check=full ' > + val += '--show-reachable=yes ' > + val += '--log-file=/tmp/mem_check_test_agent.txt ' > + if with_valgrind: > + self.rsh(self.node, val + self.binary, blocking=0) > + else: > + self.rsh(self.node, self.binary, blocking=0) > + > is_connected = False > retries = 0 > while not is_connected: > @@ -376,7 +411,10 @@ class TestAgent(object): > '''Tear down (undo) the given ScenarioComponent''' > self.env.debug('test agent: stop (' + self.node + ')') > self.sock.close () > - self.rsh(self.node, "killall " + self.binary + " 2>/dev/null") > + if self.with_valgrind: > + self.rsh(self.node, "killall valgrind 2>/dev/null") > + else: > + self.rsh(self.node, "killall " + self.binary + " 2>/dev/null") > self.started = False > > def send (self, args): > @@ -463,9 +501,10 @@ class CpgTestAgent(TestAgent): > self.initialized = False > self.nodeid = None > > - def start(self): > - TestAgent.start(self) > - self.send(["cpg_initialize"]) > + def start(self, with_valgrind=False): > + TestAgent.start(self, with_valgrind) > + if not with_valgrind: > + self.send(["cpg_initialize", "retry"]) > self.used = False > > def stop(self): > diff --git a/cts/corotests.py b/cts/corotests.py > index d950d5c..187c0c4 100644 > --- a/cts/corotests.py > +++ b/cts/corotests.py > @@ -357,6 +357,44 @@ class MemLeakSession(CoroTest): > return self.failure(str(mem_leaked) + 'kB memory leaked.') > > > +################################################################### > +class CoroIpcMemLeak(CoroTest): > + ''' > + Reproduce a memory leak in coroipc when corosync is not > + running. > + ''' > + def __init__(self, cm): > + CoroTest.__init__(self,cm) > + self.name="CoroIpcMemLeak" > + > + def setup(self, node): > + ret = CoroTest.setup(self, node) > + self.CM.rsh(node, "killall -9 corosync") > + self.CM.rsh(node, "rm -f /var/run/corosync.pid") > + time.sleep(3) > + self.CM.agent[node].stop() > + self.CM.agent[node].start(with_valgrind=True) > + return ret > + > + def __call__(self, node): > + self.incr("calls") > + # get & record the mem used by cpg_test_agent > + > + self.CM.agent[node].send(["cpg_initialize", "let_fail"]) > + mem1 = self.CM.agent[node].memory_used() > + for c in range(0, 100): > + self.CM.agent[node].send(["cpg_initialize", "let_fail"]) > + > + mem2 = self.CM.agent[node].memory_used() > + diff = mem2 - mem1 > + if mem2 > mem1: > + self.CM.agent[node].stop() > + time.sleep(3) > + self.CM.agent[node].dump_mem_info() > + return self.failure('memory leaked by: ' + str(diff)) > + else: > + return self.success() > + > > AllTestClasses = [] > AllTestClasses.append(MemLeakObject) > @@ -367,6 +405,7 @@ AllTestClasses.append(CpgCfgChgOnNodeLeave_v1) > AllTestClasses.append(CpgCfgChgOnNodeLeave_v2) > AllTestClasses.append(CpgCfgChgOnExecCrash) > AllTestClasses.append(CpgMsgOrderBasic) > +AllTestClasses.append(CoroIpcMemLeak) > > AllTestClasses.append(FlipTest) > AllTestClasses.append(RestartTest)
_______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
