From a8467b8b155f033cfefc99a55a85fe0bf8ee16b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Kuzn=C3=ADk?= Date: Wed, 8 Dec 2021 15:47:45 +0000 Subject: [PATCH] ITS#9761 Fix olcSyncrepl position based insertion --- servers/slapd/syncrepl.c | 16 ++++++++++------ tests/scripts/test086-delta-consumer-config | 8 ++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 96d84b4cc0..68ccec9689 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -7118,7 +7118,7 @@ add_syncrepl( ConfigArgs *c ) { syncinfo_t *si; - int rc = 0; + int i, rc = 0; if ( !( c->be->be_search && c->be->be_add && c->be->be_modify && c->be->be_delete ) ) { snprintf( c->cr_msg, sizeof(c->cr_msg), "database %s does not support " @@ -7255,13 +7255,17 @@ add_syncrepl( BER_BVISNULL( &si->si_bindconf.sb_uri ) ? "(null)" : si->si_bindconf.sb_uri.bv_val ); if ( c->be->be_syncinfo ) { - syncinfo_t *sip; + syncinfo_t **sip; si->si_cookieState = c->be->be_syncinfo->si_cookieState; - /* add new syncrepl to end of list (same order as when deleting) */ - for ( sip = c->be->be_syncinfo; sip->si_next; sip = sip->si_next ); - sip->si_next = si; + for ( i = 0, sip = &c->be->be_syncinfo; + (*sip)->si_next && ( c->valx < 0 || i < c->valx ); + sip = &(*sip)->si_next, i++ ) + /* advance to the desired position */ ; + si->si_next = *sip; + *sip = si; + } else { si->si_cookieState = ch_calloc( 1, sizeof( cookie_state )); ldap_pvt_thread_mutex_init( &si->si_cookieState->cs_mutex ); @@ -7270,10 +7274,10 @@ add_syncrepl( ldap_pvt_thread_cond_init( &si->si_cookieState->cs_cond ); c->be->be_syncinfo = si; + si->si_next = NULL; } si->si_cookieState->cs_ref++; - si->si_next = NULL; syncrepl_monitor_init(); return 0; diff --git a/tests/scripts/test086-delta-consumer-config b/tests/scripts/test086-delta-consumer-config index 8270d13c93..e10874624e 100755 --- a/tests/scripts/test086-delta-consumer-config +++ b/tests/scripts/test086-delta-consumer-config @@ -302,6 +302,14 @@ olcSyncrepl: {0}rid=001 provider=$URI1 binddn="cn=config" bindmethod=simple credentials=$CONFIGPW searchbase="cn=schema,cn=config" $SYNCTYPE retry="3 5 300 5" timeout=3 suffixmassage="cn=schema,cn=config,cn=consumer" +# a dummy stanza we add to the beginning and remove again +olcSyncrepl: {0}rid=006 provider=$URI6 binddn="cn=config" + bindmethod=simple credentials=$CONFIGPW searchbase="cn=schema,cn=config" + $SYNCTYPE retry="3 5 300 5" timeout=3 + suffixmassage="cn=schema,cn=config,cn=consumer" +- +delete: olcSyncrepl +olcSyncrepl: {0} - add: olcMultiProvider olcMultiProvider: TRUE