https://bugs.openldap.org/show_bug.cgi?id=9705
Issue ID: 9705 Summary: synprov put add info into wrong cookie while performing test059-consumer-config Product: OpenLDAP Version: 2.4.59 Hardware: All OS: All Status: UNCONFIRMED Keywords: needs_review Severity: normal Priority: --- Component: overlays Assignee: bugs@openldap.org Reporter: gil77for@gmail.com Target Milestone: ---
There is an issue with syncrepl and syncprov working together in parallel. The issue can be seen in provider LDAP server logs of test059-consumer-config. For linux this problem does not cause the test to malfunction, but it may cause replication to malfunction on other systems (or possibly on linux in a different situation from the test). In case of OpenVMS we have this issue.
The problem is detected under the following circumstances, followed by a step-by-step description of the actions in test 059 that lead to malfunction:
1. Adding replication configuration for the dn: olcDatabase={1}ldif,cn=config
dn: olcDatabase={1}ldif,cn=config changetype: modify add: olcSyncrepl olcSyncrepl: {0}rid=001 provider=ldap://localhost:9001/ binddn="cn=config" bindmethod=simple credentials=******** searchbase="cn=schema,cn=config" type=refreshAndPersist retry="3 5 300 5" timeout=3 suffixmassage="cn=schema,cn=config,cn=consumer"
this registers a syncInfo structure with the parameter rid=001 inside the syncrepl engine. the corresponding syncCookie and cookieState are also created inside this structure
2. adding includes by ldapadd to the configuration, this causes {1}ldif,cn=config to be filled on the provider and register this adding in rid=001 syncInfo cookies with sid=001:
include: file:///LDAP$SCHEMA:core.ldif include: file:///LDAP$SCHEMA:cosine.ldif include: file:///LDAP$SCHEMA:inetorgperson.ldif include: file:///LDAP$SCHEMA:openldap.ldif include: file:///LDAP$SCHEMA:nis.ldif
3. Adding replication configuration for the dn: olcDatabase={1}mdb,cn=config,cn=consumer:
dn: olcDatabase={1}mdb,cn=config,cn=consumer objectClass: olcDatabaseConfig objectClass: olcmdbConfig olcDatabase: {1}mdb olcSuffix: dc=example,dc=com olcDbDirectory: [.testdir.db_2_a] olcRootDN: cn=Manager,dc=example,dc=com olcRootPW: secret olcSyncRepl: rid=002 provider=ldap://localhost:9001/ binddn="cn=Manager,dc=example,dc=com" bindmethod=simple credentials=secret searchbase="dc=example,dc=com" type=refreshAndPersist retry="3 5 300 5" timeout=3 olcUpdateRef: ldap://localhost:9001/
this registers new syncInfo structure with the parameter rid=002 inside the syncrepl engine. Should also be added info into cookies of this structure but this is the issue. The info about {1}mdb,cn=config,cn=consumer is added to the cookie of structure with rid=001 (!!!). Thus the cookie about {1}ldif is overrides by this new cookie data. It can be seen in provider server logs (was run on linux):
…… 61275c7d ldif_back_add: "olcDatabase={1}mdb,cn=config,cn=consumer" 61275c7d oc_check_required entry (olcDatabase={1}mdb,cn=config,cn=consumer), objectClass "olcMdbConfig" …… 61275c7d slap_get_csn: conn=1007 op=3 generated new csn=20210826091853.649104Z#000000#001#000000 manage=1 61275c7d slap_queue_csn: queueing 0x7fcdf4106bc0 20210826091853.649104Z#000000#001#000000 61275c7d ldif_write_entry: wrote entry "olcDatabase={1}mdb,cn=config,cn=consumer" 61275c7d ldif_back_add: err: 0 text: 61275c7d send_ldap_result: conn=1007 op=3 p=3 61275c7d send_ldap_result: err=0 matched="" text="" 61275c7d conn=1007 op=3 syncprov_matchops: recording uuid for dn=olcDatabase={1}mdb,cn=config,cn=consumer on opc=0x7fcdf4001608 …… 61275c7d slap_graduate_commit_csn: removing 0x7fcdf4106bc0 20210826091853.649104Z#000000#001#000000 61275c7d conn=1004 op=1 syncprov_sendresp: cookie=rid=001,sid=001,csn=20210826091853.649104Z#000000#001#000000 61275c7d conn=1004 op=1 syncprov_sendresp: sending LDAP_SYNC_ADD, dn=olcDatabase={1}mdb,cn=config,cn=consumer ……
rid=002 should be there!
When running on linux, this does not cause a problem for the test, because syncprov task works later than the ldif database replication on consumer by syncrepl task. And the overlapped cookie entry does not matter anymore.
In our case (OpenVMS) the order of asynchronous tasks (syncrepl and syncprov) is different and overwriting the cookie leads to loss of ldif database replication and failure of the test. The consumer does not receive scheme data. The differences in the order of tasks are caused by the features of pthreads library implementation for the VMS. But it should not matter for LDAP operation.