From: Douglas Bagnall Date: Sun, 4 Mar 2018 00:50:51 +0000 (+1300) Subject: tests/smbcontrol: reduce ping test false positive rate X-Git-Tag: talloc-2.1.12~269 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ffcc3671cc238b19636e74d3e3ea71fa59a51b16;p=thirdparty%2Fsamba.git tests/smbcontrol: reduce ping test false positive rate The ping test was failing when a transient ldap_server process died between the time it was listed and the time it was pinged. We stop treating that as failure. Signed-off-by: Douglas Bagnall Reviewed-by: Andrew Bartlett Autobuild-User(master): Andrew Bartlett Autobuild-Date(master): Mon Mar 5 01:33:46 CET 2018 on sn-devel-144 --- diff --git a/python/samba/tests/blackbox/smbcontrol.py b/python/samba/tests/blackbox/smbcontrol.py index eca6cc559a1..37e0ab78974 100644 --- a/python/samba/tests/blackbox/smbcontrol.py +++ b/python/samba/tests/blackbox/smbcontrol.py @@ -15,8 +15,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . # - -from samba.tests import BlackboxTestCase +from __future__ import print_function +from samba.tests import BlackboxTestCase, BlackboxProcessError from samba.messaging import Messaging COMMAND = "bin/smbcontrol" @@ -44,8 +44,40 @@ class SmbcontrolBlockboxTests(BlackboxTestCase): """Test that all the samba processes can be pinged""" processes = self.msg_ctx.irpc_all_servers() + for p in processes: for id in p.ids: if p.name != "samba": - self.check_run("%s %d %s" % (COMMAND, id.pid, PING), - msg="trying to ping %s" % p.name) + try: + self.check_run("%s %d %s" % (COMMAND, id.pid, PING), + msg="trying to ping %s" % p.name) + except BlackboxProcessError as e: + # This process could not be pinged, which is + # expected (occasionally) if the ldap_server + # is using the "standard process model" and + # forking a short-lived child for each + # connection. We don't care about this, so we + # list the processes again and assume that + # only those that remain are relevant to the + # ping test. Additionally we ensure that at + # least one process of each name remains -- in + # the ldap_server case, we expect at least the + # parent to be there. + name_exists = False + surviving_processes = self.msg_ctx.irpc_all_servers() + for q in surviving_processes: + if q.name == p.name: + name_exists = True + if id.pid in [x.pid for x in q.ids]: + # the unpingable server is still + # listed, meaning it is broken + raise + + if not name_exists: + # it looks like the service genuinely died + # just at this moment + raise + + print("Ignoring error %s:" % e) + print("the process probably died before our ping") + continue