From: Howard Chu Date: Fri, 30 Sep 2011 09:27:04 +0000 (-0700) Subject: ITS#7037 restart consumer on Persist errors X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=3ca52e4f94bf3bf5fb96585e9eb2617cccfa8f6a;p=openldap ITS#7037 restart consumer on Persist errors Consumer should never get NO_SUCH_OBJECT for an Add to the underlying DB during Persist phase. --- diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 3fd5489e53..1b1db2f737 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -2846,8 +2846,24 @@ retry_add:; case LDAP_REFERRAL: /* we assume that LDAP_NO_SUCH_OBJECT is returned - * only if the suffix entry is not present */ + * only if the suffix entry is not present. + * This should not happen during Persist phase. + */ case LDAP_NO_SUCH_OBJECT: + if ( abs(si->si_type) == LDAP_SYNC_REFRESH_AND_PERSIST && + si->si_refreshDone ) { + /* Something's wrong, start over */ + ber_bvarray_free( si->si_syncCookie.ctxcsn ); + si->si_syncCookie.ctxcsn = NULL; + ldap_pvt_thread_mutex_lock( &si->si_cookieState->cs_mutex ); + ber_bvarray_free( si->si_cookieState->cs_vals ); + ch_free( si->si_cookieState->cs_sids ); + si->si_cookieState->cs_vals = NULL; + si->si_cookieState->cs_sids = 0; + si->si_cookieState->cs_num = 0; + ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex ); + return LDAP_NO_SUCH_OBJECT; + } rc = syncrepl_add_glue( op, entry ); entry = NULL; break;