From b5d7a0b34d532335da7171dd7a308f95638c91c8 Mon Sep 17 00:00:00 2001
From: Thierry Bordaz <tbordaz@redhat.com>
Date: Tue, 19 Nov 2019 09:56:46 +0100
Subject: [PATCH] Ticket 50741 - bdb_start - Detected Disorderly Shutdown last
time Directory Server was running
Bug description:
At startup plugins are started (plugin_dependency_startall) including ldbm database
that read/remove the guardian file (bdb_start).
If one of the plugin fails to start, for example because of a missing dependency,
the statup function just exits without recreating the guardian file.
The next restart will not find the guardian file, trigger a recovery and
log the alarming message "Detected Disorderly Shutdown last time Directory Server was running..."
Fix description:
In case the startup function fails it should call the closing function of all
started plugin: plugin_closeall
The fix also contains fixes for plugin acceptance tests. If DS startup is expected
to fail, it is caught by subprocess.CalledProcessError but actually the startup
function can also return ValueError exception
https://pagure.io/389-ds-base/issue/50741
Reviewed By: Mark Reynolds
---
dirsrvtests/tests/suites/plugins/acceptance_test.py | 6 +++---
ldap/servers/slapd/plugin.c | 1 +
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/dirsrvtests/tests/suites/plugins/acceptance_test.py b/dirsrvtests/tests/suites/plugins/acceptance_test.py
index 8aacb74be..cdb629eef 100644
--- a/dirsrvtests/tests/suites/plugins/acceptance_test.py
+++ b/dirsrvtests/tests/suites/plugins/acceptance_test.py
@@ -64,7 +64,7 @@ def check_dependency(inst, plugin, online=True):
acct_usability.remove('nsslapd-plugin-depends-on-named', plugin.rdn)
else:
plugin.disable()
- with pytest.raises(subprocess.CalledProcessError):
+ with pytest.raises((subprocess.CalledProcessError, ValueError)):
inst.restart()
dse_ldif = DSEldif(inst)
dse_ldif.delete(acct_usability.dn, 'nsslapd-plugin-depends-on-named')
@@ -1739,14 +1739,14 @@ def test_rootdn(topo, args=None):
# First, test that invalid plugin changes are rejected
if args is None:
plugin.replace('rootdn-deny-ip', '12.12.ZZZ.12')
- with pytest.raises(subprocess.CalledProcessError):
+ with pytest.raises((subprocess.CalledProcessError, ValueError)):
inst.restart()
dse_ldif = DSEldif(inst)
dse_ldif.delete(plugin.dn, 'rootdn-deny-ip')
_rootdn_restart(inst)
plugin.replace('rootdn-allow-host', 'host._.com')
- with pytest.raises(subprocess.CalledProcessError):
+ with pytest.raises((subprocess.CalledProcessError, ValueError)):
inst.restart()
dse_ldif = DSEldif(inst)
dse_ldif.delete(plugin.dn, 'rootdn-allow-host')
diff --git a/ldap/servers/slapd/plugin.c b/ldap/servers/slapd/plugin.c
index a77bb5aa7..b00c1bd8f 100644
--- a/ldap/servers/slapd/plugin.c
+++ b/ldap/servers/slapd/plugin.c
@@ -1811,6 +1811,7 @@ plugin_dependency_startall(int argc, char **argv, char *errmsg __attribute__((un
}
i++;
}
+ plugin_closeall(1 /* Close Backends */, 1 /* Close Globals */);
exit(1);
}
--
2.21.1