|
|
b045b9 |
From a0c4a8d69735cb37e5b52b195ec632ce6d1f028f Mon Sep 17 00:00:00 2001
|
|
|
b045b9 |
From: Thierry Bordaz <tbordaz@redhat.com>
|
|
|
b045b9 |
Date: Tue, 21 Nov 2017 17:23:29 +0100
|
|
|
b045b9 |
Subject: [PATCH] Ticket 49460 - replica_write_ruv log a failure even when it
|
|
|
b045b9 |
succeeds
|
|
|
b045b9 |
|
|
|
b045b9 |
Bug Description:
|
|
|
b045b9 |
Minor issue
|
|
|
b045b9 |
If the update of the DB RUV returns a success LDAP_SUCCESS (internal modify),
|
|
|
b045b9 |
it however logs an error as if it failed
|
|
|
b045b9 |
|
|
|
b045b9 |
side effect of https://pagure.io/389-ds-base/issue/48118
|
|
|
b045b9 |
|
|
|
b045b9 |
Fix Description:
|
|
|
b045b9 |
Log a message only on failure
|
|
|
b045b9 |
|
|
|
b045b9 |
https://pagure.io/389-ds-base/issue/49460
|
|
|
b045b9 |
|
|
|
b045b9 |
Reviewed by: Ludwig Krispenz, William Brown
|
|
|
b045b9 |
|
|
|
b045b9 |
Platforms tested: F23
|
|
|
b045b9 |
|
|
|
b045b9 |
Flag Day: no
|
|
|
b045b9 |
|
|
|
b045b9 |
Doc impact: no
|
|
|
b045b9 |
---
|
|
|
b045b9 |
dirsrvtests/tests/tickets/ticket49460_test.py | 115 +++++++++++++++++++++++
|
|
|
b045b9 |
ldap/servers/plugins/replication/repl5_replica.c | 3 +-
|
|
|
b045b9 |
2 files changed, 116 insertions(+), 2 deletions(-)
|
|
|
b045b9 |
create mode 100644 dirsrvtests/tests/tickets/ticket49460_test.py
|
|
|
b045b9 |
|
|
|
b045b9 |
diff --git a/dirsrvtests/tests/tickets/ticket49460_test.py b/dirsrvtests/tests/tickets/ticket49460_test.py
|
|
|
b045b9 |
new file mode 100644
|
|
|
b045b9 |
index 000000000..296b3c9aa
|
|
|
b045b9 |
--- /dev/null
|
|
|
b045b9 |
+++ b/dirsrvtests/tests/tickets/ticket49460_test.py
|
|
|
b045b9 |
@@ -0,0 +1,115 @@
|
|
|
b045b9 |
+import time
|
|
|
b045b9 |
+import ldap
|
|
|
b045b9 |
+import logging
|
|
|
b045b9 |
+import pytest
|
|
|
b045b9 |
+import os
|
|
|
b045b9 |
+import re
|
|
|
b045b9 |
+from lib389._constants import *
|
|
|
b045b9 |
+from lib389.config import Config
|
|
|
b045b9 |
+from lib389 import DirSrv, Entry
|
|
|
b045b9 |
+from lib389.topologies import topology_m3 as topo
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+DEBUGGING = os.getenv("DEBUGGING", default=False)
|
|
|
b045b9 |
+if DEBUGGING:
|
|
|
b045b9 |
+ logging.getLogger(__name__).setLevel(logging.DEBUG)
|
|
|
b045b9 |
+else:
|
|
|
b045b9 |
+ logging.getLogger(__name__).setLevel(logging.INFO)
|
|
|
b045b9 |
+log = logging.getLogger(__name__)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+USER_CN="user"
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+def add_user(server, no, desc='dummy', sleep=True):
|
|
|
b045b9 |
+ cn = '%s%d' % (USER_CN, no)
|
|
|
b045b9 |
+ dn = 'cn=%s,ou=people,%s' % (cn, SUFFIX)
|
|
|
b045b9 |
+ log.fatal('Adding user (%s): ' % dn)
|
|
|
b045b9 |
+ server.add_s(Entry((dn, {'objectclass': ['top', 'person', 'inetuser', 'userSecurityInformation'],
|
|
|
b045b9 |
+ 'sn': ['_%s' % cn],
|
|
|
b045b9 |
+ 'description': [desc]})))
|
|
|
b045b9 |
+ time.sleep(1)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+def check_user(server, no, timeout=10):
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ cn = '%s%d' % (USER_CN, no)
|
|
|
b045b9 |
+ dn = 'cn=%s,ou=people,%s' % (cn, SUFFIX)
|
|
|
b045b9 |
+ found = False
|
|
|
b045b9 |
+ cpt = 0
|
|
|
b045b9 |
+ while cpt < timeout:
|
|
|
b045b9 |
+ try:
|
|
|
b045b9 |
+ server.getEntry(dn, ldap.SCOPE_BASE, "(objectclass=*)")
|
|
|
b045b9 |
+ found = True
|
|
|
b045b9 |
+ break
|
|
|
b045b9 |
+ except ldap.NO_SUCH_OBJECT:
|
|
|
b045b9 |
+ time.sleep(1)
|
|
|
b045b9 |
+ cpt += 1
|
|
|
b045b9 |
+ return found
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+def pattern_errorlog(server, log_pattern):
|
|
|
b045b9 |
+ file_obj = open(server.errlog, "r")
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ found = None
|
|
|
b045b9 |
+ # Use a while true iteration because 'for line in file: hit a
|
|
|
b045b9 |
+ while True:
|
|
|
b045b9 |
+ line = file_obj.readline()
|
|
|
b045b9 |
+ found = log_pattern.search(line)
|
|
|
b045b9 |
+ if ((line == '') or (found)):
|
|
|
b045b9 |
+ break
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ return found
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+def test_ticket_49460(topo):
|
|
|
b045b9 |
+ """Specify a test case purpose or name here
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ :id: d1aa2e8b-e6ab-4fc6-9c63-c6f622544f2d
|
|
|
b045b9 |
+ :setup: Fill in set up configuration here
|
|
|
b045b9 |
+ :steps:
|
|
|
b045b9 |
+ 1. Enable replication logging
|
|
|
b045b9 |
+ 2. Do few updates to generatat RUV update
|
|
|
b045b9 |
+ :expectedresults:
|
|
|
b045b9 |
+ 1. No report of failure when the RUV is updated
|
|
|
b045b9 |
+ """
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ M1 = topo.ms["master1"]
|
|
|
b045b9 |
+ M2 = topo.ms["master2"]
|
|
|
b045b9 |
+ M3 = topo.ms["master3"]
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ for i in (M1, M2, M3):
|
|
|
b045b9 |
+ i.config.loglevel(vals=[256 + 4], service='access')
|
|
|
b045b9 |
+ i.config.loglevel(vals=[LOG_REPLICA, LOG_DEFAULT], service='error')
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ add_user(M1, 11, desc="add to M1")
|
|
|
b045b9 |
+ add_user(M2, 21, desc="add to M2")
|
|
|
b045b9 |
+ add_user(M3, 31, desc="add to M3")
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ for i in (M1, M2, M3):
|
|
|
b045b9 |
+ assert check_user(i, 11)
|
|
|
b045b9 |
+ assert check_user(i, 21)
|
|
|
b045b9 |
+ assert check_user(i, 31)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ time.sleep(10)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ #M1.tasks.cleanAllRUV(suffix=SUFFIX, replicaid='3',
|
|
|
b045b9 |
+ # force=False, args={TASK_WAIT: True})
|
|
|
b045b9 |
+ #time.sleep(10)
|
|
|
b045b9 |
+ regex = re.compile(".*Failed to update RUV tombstone.*LDAP error - 0")
|
|
|
b045b9 |
+ assert not pattern_errorlog(M1, regex)
|
|
|
b045b9 |
+ assert not pattern_errorlog(M2, regex)
|
|
|
b045b9 |
+ assert not pattern_errorlog(M3, regex)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ # If you need any test suite initialization,
|
|
|
b045b9 |
+ # please, write additional fixture for that (including finalizer).
|
|
|
b045b9 |
+ # Topology for suites are predefined in lib389/topologies.py.
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ # If you need host, port or any other data about instance,
|
|
|
b045b9 |
+ # Please, use the instance object attributes for that (for example, topo.ms["master1"].serverid)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+ if DEBUGGING:
|
|
|
b045b9 |
+ # Add debugging steps(if any)...
|
|
|
b045b9 |
+ pass
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+
|
|
|
b045b9 |
+if __name__ == '__main__':
|
|
|
b045b9 |
+ # Run isolated
|
|
|
b045b9 |
+ # -s for DEBUG mode
|
|
|
b045b9 |
+ CURRENT_FILE = os.path.realpath(__file__)
|
|
|
b045b9 |
+ pytest.main("-s %s" % CURRENT_FILE)
|
|
|
b045b9 |
+
|
|
|
b045b9 |
diff --git a/ldap/servers/plugins/replication/repl5_replica.c b/ldap/servers/plugins/replication/repl5_replica.c
|
|
|
b045b9 |
index e3ddd783d..c6d6ee746 100644
|
|
|
b045b9 |
--- a/ldap/servers/plugins/replication/repl5_replica.c
|
|
|
b045b9 |
+++ b/ldap/servers/plugins/replication/repl5_replica.c
|
|
|
b045b9 |
@@ -2829,8 +2829,7 @@ replica_write_ruv(Replica *r)
|
|
|
b045b9 |
/* this includes an internal operation - but since this only happens
|
|
|
b045b9 |
during server startup - its ok that we have lock around it */
|
|
|
b045b9 |
rc = _replica_configure_ruv(r, PR_TRUE);
|
|
|
b045b9 |
- } else /* error */
|
|
|
b045b9 |
- {
|
|
|
b045b9 |
+ } else if (rc != LDAP_SUCCESS) { /* error */
|
|
|
b045b9 |
slapi_log_err(SLAPI_LOG_REPL, repl_plugin_name,
|
|
|
b045b9 |
"replica_write_ruv - Failed to update RUV tombstone for %s; "
|
|
|
b045b9 |
"LDAP error - %d\n",
|
|
|
b045b9 |
--
|
|
|
b045b9 |
2.13.6
|
|
|
b045b9 |
|