[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Issue in syncprov findcsn code
Not sure this is a bug, but I'm curious... I hit this while checking for
ITS#5661. The code below is from HEAD's syncprov.c:613 (not changed
recently; pardon any unintended line wrapping):
<snip>
again:
switch( mode ) {
case FIND_MAXCSN:
cf.f_choice = LDAP_FILTER_GE;
/* If there are multiple CSNs, use the one with our
serverID */
for ( i=0; i<si->si_numcsns; i++) {
if ( slap_serverID == si->si_sids[i] ) {
maxid = i;
break;
}
}
</snip>
When run by a consumer, with no serverID set (and thus slap_serverID ==
0), it causes the consumer to use the contextCSN with SID == "000"
instead of the most recent one. As a consequence, if one searches the
contextCSN within that consumer, slapo-syncprov's syncprov_operational()
causes only that value to be returned, instead of all contextCSNs. After
the consumer is restarted, all values are correctly returned. To reproduce:
- populate a DSA (SIDs in CSNs will default to "000")
- turn it into a (multi)master by adding the serverID statement (with
SID > "000") and so
- perform a modification (so that the most recent contextCSN will have
SID != "000")
- create a consumer (no serverID statement, so that it defaults to
"000") and let it pull data from the producer
- search the contextCSN of the consumer
I'm not sure this is a bug; it might be harmless, apart from being
definitely misleading. There might be multiple solutions:
- don't let syncprov_operational() muck with contextCSN that way
- make syncprov_findcsn() search the newest contextCSN instead of the
one with its SID
- initialize slapd_serverID with some SID_UNDEFINED in order to take the
action above only when SID is not defined
p.
Ing. Pierangelo Masarati
OpenLDAP Core Team
SysNet s.r.l.
via Dossi, 8 - 27100 Pavia - ITALIA
http://www.sys-net.it
-----------------------------------
Office: +39 02 23998309
Mobile: +39 333 4963172
Fax: +39 0382 476497
Email: ando@sys-net.it
-----------------------------------