Hi!

I saw some integration tests failures recently,
and I think there is a race condition between the
enumeration refresh timeout and the sleeps
after some operations that wait for this timeout.
SSSD fails to populate changes from LDAP in time
and some asserts can fail because of this.

So far I saw 4 tests to fail like this, which
is already quite a lot.

The attached patch modifies the timeout values
and hopefully removes the issue.

Michal
>From b724db15ce0c1593cfdd7b4da8e0c39e97942e8c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Michal=20=C5=BDidek?= <mzi...@redhat.com>
Date: Wed, 2 Dec 2015 16:44:48 +0100
Subject: [PATCH] ldap_test.py: Modify enum cache timeouts

There is a race condation between ldap
enumeration refresh timeout and the sleeps
that wait for the ldap changes to populate
to SSSD if the timeout and the sleeps have
the same value.
---
 src/tests/intg/ldap_test.py | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/tests/intg/ldap_test.py b/src/tests/intg/ldap_test.py
index 757ee20..8ec8dbe 100644
--- a/src/tests/intg/ldap_test.py
+++ b/src/tests/intg/ldap_test.py
@@ -33,7 +33,11 @@ import ldap_ent
 from util import *
 
 LDAP_BASE_DN = "dc=example,dc=com"
-INTERACTIVE_TIMEOUT = 4
+INTERACTIVE_TIMEOUT = 2
+
+
+def wait_for_ldap_enum_refresh():
+    time.sleep(INTERACTIVE_TIMEOUT + 4)
 
 
 @pytest.fixture(scope="module")
@@ -466,11 +470,11 @@ def test_add_remove_user(ldap_conn, blank_rfc2307):
     # Add the user
     ent.assert_passwd(ent.contains_only())
     ldap_conn.add_s(*e)
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_passwd(ent.contains_only(dict(name="user", uid=1001)))
     # Remove the user
     ldap_conn.delete_s(e[0])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_passwd(ent.contains_only())
 
 
@@ -481,11 +485,11 @@ def test_add_remove_group_rfc2307(ldap_conn, blank_rfc2307):
     # Add the group
     ent.assert_group(ent.contains_only())
     ldap_conn.add_s(*e)
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group(ent.contains_only(dict(name="group", gid=2001)))
     # Remove the group
     ldap_conn.delete_s(e[0])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group(ent.contains_only())
 
 
@@ -496,11 +500,11 @@ def test_add_remove_group_rfc2307_bis(ldap_conn, blank_rfc2307_bis):
     # Add the group
     ent.assert_group(ent.contains_only())
     ldap_conn.add_s(*e)
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group(ent.contains_only(dict(name="group", gid=2001)))
     # Remove the group
     ldap_conn.delete_s(e[0])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group(ent.contains_only())
 
 
@@ -511,12 +515,12 @@ def test_add_remove_membership_rfc2307(ldap_conn, user_and_group_rfc2307):
     ent.assert_group_by_name("group", dict(mem=ent.contains_only()))
     ldap_conn.modify_s("cn=group,ou=Groups," + ldap_conn.ds_inst.base_dn,
                        [(ldap.MOD_REPLACE, "memberUid", "user")])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group_by_name("group", dict(mem=ent.contains_only("user")))
     # Remove user from group
     ldap_conn.modify_s("cn=group,ou=Groups," + ldap_conn.ds_inst.base_dn,
                        [(ldap.MOD_DELETE, "memberUid", None)])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group_by_name("group", dict(mem=ent.contains_only()))
 
 
@@ -532,26 +536,26 @@ def test_add_remove_membership_rfc2307_bis(ldap_conn,
     ldap_conn.modify_s("cn=group1,ou=Groups," + ldap_conn.ds_inst.base_dn,
                        [(ldap.MOD_REPLACE, "member",
                          "uid=user,ou=Users," + ldap_conn.ds_inst.base_dn)])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group_by_name("group1", dict(mem=ent.contains_only("user")))
 
     # Add group1 to group2
     ldap_conn.modify_s("cn=group2,ou=Groups," + ldap_conn.ds_inst.base_dn,
                        [(ldap.MOD_REPLACE, "member",
                          "cn=group1,ou=Groups," + ldap_conn.ds_inst.base_dn)])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group_by_name("group2", dict(mem=ent.contains_only("user")))
 
     # Remove group1 from group2
     ldap_conn.modify_s("cn=group2,ou=Groups," + ldap_conn.ds_inst.base_dn,
                        [(ldap.MOD_DELETE, "member", None)])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group_by_name("group2", dict(mem=ent.contains_only()))
 
     # Remove user from group1
     ldap_conn.modify_s("cn=group1,ou=Groups," + ldap_conn.ds_inst.base_dn,
                        [(ldap.MOD_DELETE, "member", None)])
-    time.sleep(INTERACTIVE_TIMEOUT)
+    wait_for_ldap_enum_refresh()
     ent.assert_group_by_name("group1", dict(mem=ent.contains_only()))
 
 
-- 
2.1.0

_______________________________________________
sssd-devel mailing list
sssd-devel@lists.fedorahosted.org
https://lists.fedorahosted.org/admin/lists/sssd-devel@lists.fedorahosted.org

Reply via email to