tests/smbcontrol: reduce ping test false positive rate
[samba.git] / python / samba / tests / blackbox / smbcontrol.py
index eca6cc559a1d890aad7ac69c8fa12f98b3bdada9..37e0ab78974b528694c4368527e57e8cc85cb313 100644 (file)
@@ -15,8 +15,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 #
-
-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