Hi, All
I confirmed the problem that was not deleted in syncrepl of V2.4.30.
The provider operates it in "syncprov-sessionlog 100". After I delete 150 in a provider, and going syncrepl Only 100 cases are deleted in the consumer side.
After examining it, the following parts seem to have a problem.
servers/slapd/overlays/syncprov.c:2638 if ( sl->sl_num > 0 ) { int i; for ( i=0; i<sl->sl_numcsns; i++ ) { /* SID not present == new enough */ if ( minsid < sl->sl_sids[i] ) { do_play = 1; break; } /* SID present and new enough */ if ( minsid == sl->sl_sids[i] && ber_bvcmp( &mincsn, &sl->sl_mincsn[i] ) >= 0 ) { do_play = 1; break; } } /* SID not present == new enough */ if ( i == sl->sl_numcsns ) do_play = 1; } if ( do_play ) { do_present = 0; /* mutex is unlocked in playlog */ syncprov_playlog( op, rs, sl, srs, ctxcsn, numcsns, sids ); } else { ldap_pvt_thread_mutex_unlock( &sl->sl_mutex ); }
Then, it corrected as follows. === - if ( minsid == sl->sl_sids[i] - && ber_bvcmp( &mincsn, &sl->sl_mincsn[i] ) >= 0 ) { + if ( minsid == sl->sl_sids[i] ) { + if ( ber_bvcmp( &mincsn, &sl->sl_mincsn[i] ) >= 0 ) { do_play = 1; + } break; }
Is this correction wrong?
HIRABAYASHI Satoshi s_hira@nifty.com
s_hira@nifty.com wrote:
Hi, All
I confirmed the problem that was not deleted in syncrepl of V2.4.30.
Looks like you're right, but please post this to the OpenLDAP ITS for tracking purposes.
The provider operates it in "syncprov-sessionlog 100". After I delete 150 in a provider, and going syncrepl Only 100 cases are deleted in the consumer side.
After examining it, the following parts seem to have a problem.
servers/slapd/overlays/syncprov.c:2638 if ( sl->sl_num> 0 ) { int i; for ( i=0; i<sl->sl_numcsns; i++ ) { /* SID not present == new enough */ if ( minsid< sl->sl_sids[i] ) { do_play = 1; break; } /* SID present and new enough */ if ( minsid == sl->sl_sids[i] && ber_bvcmp(&mincsn,&sl->sl_mincsn[i] )>= 0 ) { do_play = 1; break; } } /* SID not present == new enough */ if ( i == sl->sl_numcsns ) do_play = 1; } if ( do_play ) { do_present = 0; /* mutex is unlocked in playlog */ syncprov_playlog( op, rs, sl, srs, ctxcsn, numcsns, sids ); } else { ldap_pvt_thread_mutex_unlock(&sl->sl_mutex ); }
Then, it corrected as follows.
if ( minsid == sl->sl_sids[i]
-&& ber_bvcmp(&mincsn,&sl->sl_mincsn[i] )>= 0 ) {
if ( minsid == sl->sl_sids[i] ) {
if ( ber_bvcmp(&mincsn,&sl->sl_mincsn[i] )>= 0 ) { do_play = 1;
} break; }
Is this correction wrong?
HIRABAYASHI Satoshi s_hira@nifty.com
openldap-technical@openldap.org