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) -- 1.6.6.1 _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
