# 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"
"""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