]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: speed up router shutdown stopRouter: report when a process is being killed only...
authorLou Berger <lberger@labn.net>
Thu, 7 Dec 2017 18:47:22 +0000 (13:47 -0500)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Wed, 28 Nov 2018 01:22:12 +0000 (20:22 -0500)
Signed-off-by: Lou Berger <lberger@labn.net>
tests/topotests/lib/topogen.py
tests/topotests/lib/topotest.py

index 43a886befb037385ddfe77037c53b92af2170be8..2ea05c9742b42752a75b8e59a1b2f8f7491fa264 100644 (file)
@@ -307,12 +307,16 @@ class Topogen(object):
         """
         Stops the network topology. This function will call the stop() function
         of all gears before calling the mininet stop function, so they can have
-        their oportunity to do a graceful shutdown.
+        their oportunity to do a graceful shutdown. stop() is called twice. The
+        first is a simple kill with no sleep, the second will sleep if not
+        killed and try with a different signal.
         """
         logger.info('stopping topology: {}'.format(self.modname))
 
         for gear in self.gears.values():
-            gear.stop()
+            gear.stop(False)
+        for gear in self.gears.values():
+            gear.stop(True)
 
         self.net.stop()
 
@@ -413,7 +417,7 @@ class TopoGear(object):
         "Basic start function that just reports equipment start"
         logger.info('starting "{}"'.format(self.name))
 
-    def stop(self):
+    def stop(self, wait=True):
         "Basic start function that just reports equipment stop"
         logger.info('stopping "{}"'.format(self.name))
 
@@ -633,13 +637,13 @@ class TopoRouter(TopoGear):
 
         return result
 
-    def stop(self):
+    def stop(self, wait=True):
         """
         Stop router:
         * Kill daemons
         """
         self.logger.debug('stopping')
-        return self.tgen.net[self.name].stopRouter()
+        return self.tgen.net[self.name].stopRouter(wait)
 
     def vtysh_cmd(self, command, isjson=False, daemon=None):
         """
@@ -866,7 +870,7 @@ class TopoExaBGP(TopoHost):
         self.run('chown -R exabgp:exabgp /etc/exabgp')
         self.run('exabgp -e /etc/exabgp/exabgp.env /etc/exabgp/exabgp.cfg')
 
-    def stop(self):
+    def stop(self, wait=True):
         "Stop ExaBGP peer and kill the daemon"
         self.run('kill `cat /var/run/exabgp/exabgp.pid`')
 
index 42ac62213ae530c70de07df34c01c9dd1e375336..487324880de94d3ecac61087d580c2d77b3b8c83 100644 (file)
@@ -534,23 +534,28 @@ class Router(Node):
         set_sysctl(self, 'net.ipv4.ip_forward', 0)
         set_sysctl(self, 'net.ipv6.conf.all.forwarding', 0)
         super(Router, self).terminate()
-    def stopRouter(self):
+    def stopRouter(self, wait=True):
         # Stop Running Quagga or FRR Daemons
         rundaemons = self.cmd('ls -1 /var/run/%s/*.pid' % self.routertype)
         if rundaemons is not None:
+            numRunning = 0
             for d in StringIO.StringIO(rundaemons):
                 daemonpid = self.cmd('cat %s' % d.rstrip()).rstrip()
                 if (daemonpid.isdigit() and pid_exists(int(daemonpid))):
+                    logger.info('killing %s %s' % (self.name, os.path.basename(d.rstrip().rsplit(".", 1)[0])))
                     self.cmd('kill -TERM %s' % daemonpid)
                     self.waitOutput()
-            sleep(2, 'waiting for router "{}" daemons to finish'.format(
-                self.name))
-            # 2nd round of kill if daemons didn't exist
-            for d in StringIO.StringIO(rundaemons):
-                daemonpid = self.cmd('cat %s' % d.rstrip()).rstrip()
-                if (daemonpid.isdigit() and pid_exists(int(daemonpid))):
-                    self.cmd('kill -7 %s' % daemonpid)
-                    self.waitOutput()
+                    if pid_exists(int(daemonpid)):
+                        numRunning += 1
+            if wait and numRunning > 0:
+                sleep(2)
+                # 2nd round of kill if daemons didn't exit
+                for d in StringIO.StringIO(rundaemons):
+                    daemonpid = self.cmd('cat %s' % d.rstrip()).rstrip()
+                    if (daemonpid.isdigit() and pid_exists(int(daemonpid))):
+                        logger.info('killing (-7) %s %s' % (self.name, os.path.basename(d.rstrip().rsplit(".", 1)[0])))
+                        self.cmd('kill -7 %s' % daemonpid)
+                        self.waitOutput()
     def removeIPs(self):
         for interface in self.intfNames():
             self.cmd('ip address flush', interface)