[SCM] Samba Shared Repository - branch master updated
Andrew Bartlett
abartlet at samba.org
Fri Nov 23 10:41:02 UTC 2018
The branch, master has been updated
via fabc3c9d382 source4 smbd prefork: Add code comments
via 830a6502047 WHATSNEW: prefork restart
via 2db38370e3f samba-tool processes: display pre-fork masters and workers
via 0c10c0e17a1 source4 dcerpc_server: remove irpc_add_name
via 46b164de676 source4 smbd prefork: Cleanup messaging on restart
via 11d424e1999 source4 messaging: clean up terminated processes
via 40941e98f85 source4 smbd prefork: Add backoff to process restart
via 6c850b77c4a source4 smbd prefork: restart on non zero exit code
via 3315a28ea92 source4 smbd process: pass the fatal flag to terminate
via d4641c8f76b source4 smbd prefork: Restart failed processes
via 1adb5b2122a source4 smbd prefork: Pass restart information
via 5fa134dc83e source4 smbd test: prefork process restart
from 6b136a8184d replmd: remove unnecessary indent
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit fabc3c9d3827fd30d7cec674105218c97c04e801
Author: Tim Beale <timbeale at catalyst.net.nz>
Date: Thu Nov 22 10:35:01 2018 +1300
source4 smbd prefork: Add code comments
Add some comments to the prefork code explaining what's going on.
Signed-off-by: Tim Beale <timbeale at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
Autobuild-User(master): Andrew Bartlett <abartlet at samba.org>
Autobuild-Date(master): Fri Nov 23 11:40:49 CET 2018 on sn-devel-144
commit 830a65020475886af6bd1edc347c0a2b96d14a38
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Wed Sep 19 15:25:02 2018 +1200
WHATSNEW: prefork restart
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 2db38370e3f6f4c91e87c8c469f3b3c59c0f3a68
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Fri Sep 14 09:38:56 2018 +1200
samba-tool processes: display pre-fork masters and workers
Tag prefork work processes with "(worker 0)", and sort the process list
on server name to get a consistent order.
Service: PID
--------------------------------------
cldap_server 15588
...
ldap_server 15584
ldap_server(worker 0) 15627
ldap_server(worker 1) 15630
ldap_server(worker 2) 15632
ldap_server(worker 3) 15634
nbt_server 15576
notify-daemon 15638
...
samba 0
...
wrepl_server 15580
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 0c10c0e17a11b7a33c1de20ecd8b37830af909f7
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Tue Sep 11 07:38:06 2018 +1200
source4 dcerpc_server: remove irpc_add_name
Remove the irpc_add_name from dcesrv_sock_accept, as it results in two
identical names being registered for a process.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 46b164de67689c57d316701557b9847a0b9e45c1
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Fri Sep 14 09:45:38 2018 +1200
source4 smbd prefork: Cleanup messaging on restart
Clean up names registered in messaging for a terminated process.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 11d424e1999e50f036ce2b33411f6f607c60a487
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Fri Sep 14 09:43:59 2018 +1200
source4 messaging: clean up terminated processes
Now that the smbd pre-fork process model restarts failed processes rather than
terminating, we end up with names registered to defunct processes.
This patch adds a function to clean up all the names registered to a process.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 40941e98f8508daf59b83e05461ebeab4bebaacd
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Wed Sep 5 07:31:22 2018 +1200
source4 smbd prefork: Add backoff to process restart
Add new smbd.conf variables 'prefork backoff increment' and
'prefork maximum backoff' to control the rate at which failed pre-forked
processes are restarted.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 6c850b77c4ae6c4aa6d914f7ccedc2bcce939217
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Tue Sep 4 12:12:49 2018 +1200
source4 smbd prefork: restart on non zero exit code
Restart any pre-fork master or worker process that exits with a non
zero exit code.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 3315a28ea92438eca499fb87b863cbd2db50a6a6
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Tue Sep 4 10:09:38 2018 +1200
source4 smbd process: pass the fatal flag to terminate
Pass the fatal flag supplied to task_server_terminate to the process
task_terminate method. It will be used by the task_terminate methods to
set an appropriate exit code. The process_prefork model will use a non
zero exit code to indicate that the process should be restarted.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit d4641c8f76b7764f81ce246d2a2b8103593d0dac
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Mon Sep 3 09:34:17 2018 +1200
source4 smbd prefork: Restart failed processes
Restart any pre-forked master or worker process that terminated with SIGABRT,
SIGBUS, SIGFPE, SIGILL or SIGSYS
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 1adb5b2122a2026a5910852ac33b83f656f9b4c2
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Fri Aug 31 11:40:18 2018 +1200
source4 smbd prefork: Pass restart information
Pass information about the pre-fork master and worker processes that
will allow them to be restarted.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
commit 5fa134dc83e0fae21c1b20d722d6040f49a152e4
Author: Gary Lockyer <gary at catalyst.net.nz>
Date: Tue Sep 18 08:37:02 2018 +1200
source4 smbd test: prefork process restart
Add tests for the restarting of failed/terminated process, by the
pre-fork process model.
Signed-off-by: Gary Lockyer <gary at catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet at samba.org>
-----------------------------------------------------------------------
Summary of changes:
WHATSNEW.txt | 20 +-
.../smbdotconf/base/preforkbackoffincrement.xml | 25 +
.../preforkmaximumbackoff.xml} | 7 +-
lib/param/loadparm.c | 2 +
python/samba/netcmd/processes.py | 75 ++-
python/samba/tests/prefork_restart.py | 467 ++++++++++++++
selftest/target/README | 6 +
selftest/target/Samba.pm | 1 +
selftest/target/Samba4.pm | 40 ++
source3/param/loadparm.c | 2 +
source4/kdc/kdc-heimdal.c | 3 +-
source4/lib/messaging/messaging.c | 42 ++
source4/lib/messaging/messaging.h | 2 +
source4/rpc_server/dcerpc_server.c | 2 -
source4/selftest/tests.py | 10 +
source4/smbd/process_model.h | 16 +-
source4/smbd/process_prefork.c | 677 ++++++++++++++++-----
source4/smbd/process_single.c | 29 +-
source4/smbd/process_standard.c | 31 +-
source4/smbd/service_stream.c | 3 +-
source4/smbd/service_task.c | 4 +-
21 files changed, 1274 insertions(+), 190 deletions(-)
create mode 100644 docs-xml/smbdotconf/base/preforkbackoffincrement.xml
copy docs-xml/smbdotconf/{winbind/idmapnegativecachetime.xml => base/preforkmaximumbackoff.xml} (55%)
create mode 100644 python/samba/tests/prefork_restart.py
Changeset truncated at 500 lines:
diff --git a/WHATSNEW.txt b/WHATSNEW.txt
index 98ada34e5c6..fc43edc8e86 100644
--- a/WHATSNEW.txt
+++ b/WHATSNEW.txt
@@ -63,6 +63,18 @@ information about how the users are spread across groups in your domain.
The 'samba-tool group list --verbose' command has also been updated to include
the number of users in each group.
+prefork process restart
+-----------------------
+
+The pre-fork process model now restarts failed processes. The delay between
+restart attempts is controlled by the "prefork backoff increment" (default = 10)
+and "prefork maximum backoff" (default = 120) smbd.conf parameters. A linear
+back off strategy is used with "prefork backoff increment" added to the
+delay between restart attempts up until it reaches "prefork maximum backoff".
+
+Using the default sequence the restart delays (in seconds) are:
+ 0, 10, 20, ..., 120, 120, ...
+
REMOVED FEATURES
================
@@ -75,8 +87,12 @@ The samba_backup script has been removed. This has now been replaced by the
smb.conf changes
================
- Parameter Name Description Default
- -------------- ----------- -------
+ Parameter Name Description Default
+ -------------- ----------- -------
+ prefork backoff increment Delay added to process restart 10 (seconds)
+ between attempts.
+ prefork maximum backoff Maximum delay for process between 120 (seconds)
+ process restart attempts
KNOWN ISSUES
diff --git a/docs-xml/smbdotconf/base/preforkbackoffincrement.xml b/docs-xml/smbdotconf/base/preforkbackoffincrement.xml
new file mode 100644
index 00000000000..2cb1cc32fd8
--- /dev/null
+++ b/docs-xml/smbdotconf/base/preforkbackoffincrement.xml
@@ -0,0 +1,25 @@
+<samba:parameter name="prefork backoff increment"
+ context="G"
+ type="integer"
+ xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
+<description>
+ <para>This option specifies the number of seconds added to the delay
+ before a prefork master or worker process is restarted. The
+ restart is initially zero, the prefork backoff increment is
+ added to the delay on each restart up to the value specified by
+ "prefork maximum backoff".
+ </para>
+
+ <para>Additionally the the backoff for an individual service by using
+ "prefork backoff increment: service name"
+ i.e. "prefork backoff increment:ldap = 2" to set the
+ backoff increment to 2.</para>
+
+ <para>If the backoff increment is 2 and the maximum backoff is 5.
+ There will be a zero second delay for the first restart. A two
+ second delay for the second restart. A four second delay for the
+ third and any subsequent restarts</para>
+</description>
+
+<value type="default">10</value>
+</samba:parameter>
diff --git a/docs-xml/smbdotconf/winbind/idmapnegativecachetime.xml b/docs-xml/smbdotconf/base/preforkmaximumbackoff.xml
similarity index 55%
copy from docs-xml/smbdotconf/winbind/idmapnegativecachetime.xml
copy to docs-xml/smbdotconf/base/preforkmaximumbackoff.xml
index 32c4e1f8308..17e530d5db8 100644
--- a/docs-xml/smbdotconf/winbind/idmapnegativecachetime.xml
+++ b/docs-xml/smbdotconf/base/preforkmaximumbackoff.xml
@@ -1,11 +1,12 @@
-<samba:parameter name="idmap negative cache time"
+<samba:parameter name="prefork maximum backoff"
context="G"
type="integer"
xmlns:samba="http://www.samba.org/samba/DTD/samba-doc">
<description>
- <para>This parameter specifies the number of seconds that Winbind's
- idmap interface will cache negative SID/uid/gid query results.
+ <para>This option controls the maximum delay before a failed pre-fork
+ process is restarted.
</para>
+
</description>
<value type="default">120</value>
diff --git a/lib/param/loadparm.c b/lib/param/loadparm.c
index 484c8913009..a7dbc6f8f0b 100644
--- a/lib/param/loadparm.c
+++ b/lib/param/loadparm.c
@@ -2997,6 +2997,8 @@ struct loadparm_context *loadparm_init(TALLOC_CTX *mem_ctx)
"49152-65535");
lpcfg_do_global_parameter(lp_ctx, "prefork children", "4");
+ lpcfg_do_global_parameter(lp_ctx, "prefork backoff increment", "10");
+ lpcfg_do_global_parameter(lp_ctx, "prefork maximum backoff", "120");
lpcfg_do_global_parameter(lp_ctx, "check parent directory delete on close", "no");
diff --git a/python/samba/netcmd/processes.py b/python/samba/netcmd/processes.py
index d04a548abd7..0406b1859ca 100644
--- a/python/samba/netcmd/processes.py
+++ b/python/samba/netcmd/processes.py
@@ -49,6 +49,42 @@ class cmd_processes(Command):
takes_args = []
+ #
+ # Get details of the samba services currently registered in irpc
+ # The prefork process model registers names in the form:
+ # prefork-master-<service> and prefork-worker-<service>-<instance>
+ #
+ # To allow this routine to identify pre-fork master and worker process
+ #
+ # returns a tuple (filtered, masters, workers)
+ #
+ # filtered - is a list of services with the prefork-* removed
+ # masters - dictionary keyed on service name of prefork master processes
+ # workers - dictionary keyed on service name containing an ordered list
+ # of worker processes.
+ def get_service_data(self, msg_ctx):
+ services = msg_ctx.irpc_all_servers()
+ filtered = []
+ masters = {}
+ workers = {}
+ for service in services:
+ for id in service.ids:
+ if service.name.startswith("prefork-master"):
+ ns = service.name.split("-")
+ name = ns[2] + "_server"
+ masters[name] = service.ids[0].pid
+ elif service.name.startswith("prefork-worker"):
+ ns = service.name.split("-")
+ name = ns[2] + "_server"
+ instance = int(ns[3])
+ pid = service.ids[0].pid
+ if name not in workers:
+ workers[name] = {}
+ workers[name][instance] = (instance, pid)
+ else:
+ filtered.append(service)
+ return (filtered, masters, workers)
+
def run(self, sambaopts, versionopts, section_name=None,
name=None, pid=None):
@@ -72,9 +108,36 @@ class cmd_processes(Command):
if server_id.pid == int(pid):
self.outf.write("%s\n" % name.name)
else:
- names = msg_ctx.irpc_all_servers()
- self.outf.write(" Service: PID \n")
- self.outf.write("-----------------------------\n")
- for name in names:
- for server_id in name.ids:
- self.outf.write("%-16s %6d\n" % (name.name, server_id.pid))
+ seen = {} # Service entries already printed, service names can
+ # be registered multiple times against a process
+ # but we should only display them once.
+ prefork = {} # Services running in the prefork process model
+ # want to ensure that the master process and workers
+ # are grouped to together.
+ (services, masters, workers) = self.get_service_data(msg_ctx)
+ self.outf.write(" Service: PID\n")
+ self.outf.write("--------------------------------------\n")
+
+ for service in sorted(services, key=lambda x: x.name):
+ if service.name in masters:
+ # If this service is running in a pre-forked process we
+ # want to print the master process followed by all the
+ # worker processes
+ pid = masters[service.name]
+ if pid not in prefork:
+ prefork[pid] = True
+ self.outf.write("%-26s %6d\n" %
+ (service.name, pid))
+ if service.name in workers:
+ ws = workers[service.name]
+ for w in ws:
+ (instance, pid) = ws[w]
+ sn = "{0}(worker {1})".format(
+ service.name, instance)
+ self.outf.write("%-26s %6d\n" % (sn, pid))
+ else:
+ for server_id in service.ids:
+ if (service.name, server_id.pid) not in seen:
+ self.outf.write("%-26s %6d\n"
+ % (service.name, server_id.pid))
+ seen[(service.name, server_id.pid)] = True
diff --git a/python/samba/tests/prefork_restart.py b/python/samba/tests/prefork_restart.py
new file mode 100644
index 00000000000..5233ca1f805
--- /dev/null
+++ b/python/samba/tests/prefork_restart.py
@@ -0,0 +1,467 @@
+# Tests for process restarting in the pre-fork process model
+#
+# Copyright (C) Andrew Bartlett <abartlet at samba.org> 2018
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# 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 __future__ import print_function
+"""Tests process restarting in the pre-fork process model.
+ NOTE: As this test kills samba processes it won't play nicely with other
+ tests, so needs to be run in it's own environment.
+"""
+
+
+import os
+import signal
+import time
+
+import samba
+from samba.tests import TestCase, delete_force
+from samba.dcerpc import echo, netlogon
+from samba.messaging import Messaging
+from samba.samdb import SamDB
+from samba.credentials import Credentials, DONT_USE_KERBEROS
+from samba.compat import get_string
+from samba.dsdb import (
+ UF_WORKSTATION_TRUST_ACCOUNT,
+ UF_PASSWD_NOTREQD)
+from samba.dcerpc.misc import SEC_CHAN_WKSTA
+from samba.auth import system_session
+
+NUM_WORKERS = 4
+MACHINE_NAME = "PFRS"
+
+
+class PreforkProcessRestartTests(TestCase):
+
+ def setUp(self):
+ super(PreforkProcessRestartTests, self).setUp()
+ lp_ctx = self.get_loadparm()
+ self.msg_ctx = Messaging(lp_ctx=lp_ctx)
+
+ def tearDown(self):
+ super(PreforkProcessRestartTests, self).tearDown()
+
+ def get_process_data(self):
+ services = self.msg_ctx.irpc_all_servers()
+
+ processes = []
+ for service in services:
+ for id in service.ids:
+ processes.append((service.name, id.pid))
+ return processes
+
+ def get_process(self, name):
+ processes = self.get_process_data()
+ for pname, pid in processes:
+ if name == pname:
+ return pid
+ return None
+
+ def get_worker_pids(self, name, workers):
+ pids = []
+ for x in range(workers):
+ process_name = "prefork-worker-{0}-{1}".format(name, x)
+ pids.append(self.get_process(process_name))
+ self.assertIsNotNone(pids[x])
+ return pids
+
+ def wait_for_workers(self, name, workers):
+ num_workers = len(workers)
+ for x in range(num_workers):
+ process_name = "prefork-worker-{0}-{1}".format(name, x)
+ self.wait_for_process(process_name, workers[x], 0, 1, 30)
+
+ def wait_for_process(self, name, pid, initial_delay, wait, timeout):
+ time.sleep(initial_delay)
+ delay = initial_delay
+ while delay < timeout:
+ p = self.get_process(name)
+ if p is not None and p != pid:
+ # process has restarted
+ return
+ time.sleep(wait)
+ delay += wait
+ self.fail("Times out after {0} seconds waiting for {1} to restart".
+ format(delay, name))
+
+ def check_for_duplicate_processes(self):
+ processes = self.get_process_data()
+ process_map = {}
+ for name, p in processes:
+ if (name.startswith("prefork-") or
+ name.endswith("_server") or
+ name.endswith("srv")):
+
+ if name in process_map:
+ if p != process_map[name]:
+ self.fail(
+ "Duplicate process for {0}, pids {1} and {2}".
+ format(name, p, process_map[name]))
+
+ def simple_bind(self):
+ creds = self.insta_creds(template=self.get_credentials())
+ creds.set_bind_dn("%s\\%s" % (creds.get_domain(),
+ creds.get_username()))
+
+ self.samdb = SamDB(url="ldaps://%s" % os.environ["SERVER"],
+ lp=self.get_loadparm(),
+ credentials=creds)
+
+ def rpc_echo(self):
+ conn = echo.rpcecho("ncalrpc:", self.get_loadparm())
+ self.assertEquals([1, 2, 3], conn.EchoData([1, 2, 3]))
+
+ def netlogon(self):
+ server = os.environ["SERVER"]
+ host = os.environ["SERVER_IP"]
+ lp = self.get_loadparm()
+
+ credentials = self.get_credentials()
+
+ session = system_session()
+ ldb = SamDB(url="ldap://%s" % host,
+ session_info=session,
+ credentials=credentials,
+ lp=lp)
+ machine_pass = samba.generate_random_password(32, 32)
+ machine_name = MACHINE_NAME
+ machine_dn = "cn=%s,%s" % (machine_name, ldb.domain_dn())
+
+ delete_force(ldb, machine_dn)
+
+ utf16pw = ('"%s"' % get_string(machine_pass)).encode('utf-16-le')
+ ldb.add({
+ "dn": machine_dn,
+ "objectclass": "computer",
+ "sAMAccountName": "%s$" % machine_name,
+ "userAccountControl":
+ str(UF_WORKSTATION_TRUST_ACCOUNT | UF_PASSWD_NOTREQD),
+ "unicodePwd": utf16pw})
+
+ machine_creds = Credentials()
+ machine_creds.guess(lp)
+ machine_creds.set_secure_channel_type(SEC_CHAN_WKSTA)
+ machine_creds.set_kerberos_state(DONT_USE_KERBEROS)
+ machine_creds.set_password(machine_pass)
+ machine_creds.set_username(machine_name + "$")
+ machine_creds.set_workstation(machine_name)
+
+ netlogon.netlogon(
+ "ncacn_ip_tcp:%s[schannel,seal]" % server,
+ lp,
+ machine_creds)
+
+ delete_force(ldb, machine_dn)
+
+ def test_ldap_master_restart(self):
+ # check ldap connection, do a simple bind
+ self.simple_bind()
+
+ # get ldap master process
+ pid = self.get_process("prefork-master-ldap")
+ self.assertIsNotNone(pid)
+
+ # Get the worker processes
+ workers = self.get_worker_pids("ldap", NUM_WORKERS)
+
+ # kill it
+ os.kill(pid, signal.SIGTERM)
+
+ # wait for the process to restart
+ self.wait_for_process("prefork-master-ldap", pid, 1, 1, 30)
+
+ # restarting the master restarts the workers as well, so make sure
+ # they have finished restarting
+ self.wait_for_workers("ldap", workers)
+
+ # get ldap master process
+ new_pid = self.get_process("prefork-master-ldap")
+ self.assertIsNotNone(new_pid)
+
+ # check that the pid has changed
+ self.assertNotEquals(pid, new_pid)
+
+ # check that the worker processes have restarted
+ new_workers = self.get_worker_pids("ldap", NUM_WORKERS)
+ for x in range(NUM_WORKERS):
+ self.assertNotEquals(workers[x], new_workers[x])
+
+ # check that the previous server entries have been removed.
+ self.check_for_duplicate_processes()
+
+ # check ldap connection, another simple bind
+ self.simple_bind()
+
+ def test_ldap_worker_restart(self):
+ # check ldap connection, do a simple bind
+ self.simple_bind()
+
+ # get ldap master process
+ pid = self.get_process("prefork-master-ldap")
+ self.assertIsNotNone(pid)
+
+ # Get the worker processes
+ workers = self.get_worker_pids("ldap", NUM_WORKERS)
+
+ # kill worker 0
+ os.kill(workers[0], signal.SIGTERM)
+
+ # wait for the process to restart
+ self.wait_for_process("prefork-worker-ldap-0", pid, 1, 1, 30)
+
+ # get ldap master process
+ new_pid = self.get_process("prefork-master-ldap")
+ self.assertIsNotNone(new_pid)
+
+ # check that the pid has not changed
+ self.assertEquals(pid, new_pid)
+
+ # check that the worker processes have restarted
+ new_workers = self.get_worker_pids("ldap", NUM_WORKERS)
+ # process 0 should have a new pid the others should be unchanged
+ self.assertNotEquals(workers[0], new_workers[0])
+ self.assertEquals(workers[1], new_workers[1])
+ self.assertEquals(workers[2], new_workers[2])
+ self.assertEquals(workers[3], new_workers[3])
+
+ # check that the previous server entries have been removed.
+ self.check_for_duplicate_processes()
+
+ # check ldap connection, another simple bind
+ self.simple_bind()
+
+ #
+ # Kill all the ldap worker processes and ensure that they are restarted
+ # correctly
+ #
+ def test_ldap_all_workers_restart(self):
+ # check ldap connection, do a simple bind
+ self.simple_bind()
+
+ # get ldap master process
+ pid = self.get_process("prefork-master-ldap")
+ self.assertIsNotNone(pid)
+
+ # Get the worker processes
+ workers = self.get_worker_pids("ldap", NUM_WORKERS)
+
+ # kill all the worker processes
+ for x in workers:
+ os.kill(x, signal.SIGTERM)
+
+ # wait for the worker processes to restart
+ self.wait_for_workers("ldap", workers)
+
+ # get ldap master process
+ new_pid = self.get_process("prefork-master-ldap")
+ self.assertIsNotNone(new_pid)
+
+ # check that the pid has not changed
+ self.assertEquals(pid, new_pid)
+
+ # check that the worker processes have restarted
+ new_workers = self.get_worker_pids("ldap", NUM_WORKERS)
+ for x in range(NUM_WORKERS):
+ self.assertNotEquals(workers[x], new_workers[x])
+
+ # check that the previous server entries have been removed.
+ self.check_for_duplicate_processes()
+
+ # check ldap connection, another simple bind
+ self.simple_bind()
+
+ def test_rpc_master_restart(self):
+ # check rpc connection, make a rpc echo request
+ self.rpc_echo()
+
+ # get rpc master process
+ pid = self.get_process("prefork-master-rpc")
+ self.assertIsNotNone(pid)
+
+ # Get the worker processes
+ workers = self.get_worker_pids("rpc", NUM_WORKERS)
+
+ # kill it
+ os.kill(pid, signal.SIGTERM)
+
--
Samba Shared Repository
More information about the samba-cvs
mailing list