X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fsyncrepl.c;h=76b9ec1a97c4e11bbff14032787d0d678f1b9dac;hb=eb3e92481bfbc655164e5c66aa3499a4315ac6ea;hp=d99af0ef2ef67b2ba2fc931ba9a8fa06278e4f17;hpb=686ceac31f1c4f2d7f59362ea830d650a9ca4bcd;p=openldap diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index d99af0ef2e..76b9ec1a97 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -863,6 +863,7 @@ do_syncrep2( } } } + op->o_controls[slap_cids.sc_LDAPsync] = &syncCookie; } } rc = 0; @@ -969,6 +970,7 @@ do_syncrep2( if ( !BER_BVISNULL( &syncCookie.octet_str ) ) { slap_parse_sync_cookie( &syncCookie, NULL ); + op->o_controls[slap_cids.sc_LDAPsync] = &syncCookie; } } if ( ber_peek_tag( ber, &len ) == LDAP_TAG_REFRESHDELETES ) @@ -1037,6 +1039,18 @@ do_syncrep2( "LDAP_RES_INTERMEDIATE", "NEW_COOKIE" ); ber_scanf( ber, "tm", &tag, &cookie ); + Debug( LDAP_DEBUG_SYNC, + "do_syncrep2: %s NEW_COOKIE: %s\n", + si->si_ridtxt, + cookie.bv_val, 0); + if ( !BER_BVISNULL( &cookie ) ) { + ch_free( syncCookie.octet_str.bv_val ); + ber_dupbv( &syncCookie.octet_str, &cookie ); + } + if (!BER_BVISNULL( &syncCookie.octet_str ) ) { + slap_parse_sync_cookie( &syncCookie, NULL ); + op->o_controls[slap_cids.sc_LDAPsync] = &syncCookie; + } break; case LDAP_TAG_SYNC_REFRESH_DELETE: case LDAP_TAG_SYNC_REFRESH_PRESENT: @@ -1066,6 +1080,7 @@ do_syncrep2( if ( !BER_BVISNULL( &syncCookie.octet_str ) ) { slap_parse_sync_cookie( &syncCookie, NULL ); + op->o_controls[slap_cids.sc_LDAPsync] = &syncCookie; } } /* Defaults to TRUE */ @@ -1101,6 +1116,7 @@ do_syncrep2( if ( !BER_BVISNULL( &syncCookie.octet_str ) ) { slap_parse_sync_cookie( &syncCookie, NULL ); + op->o_controls[slap_cids.sc_LDAPsync] = &syncCookie; compare_csns( &syncCookie_req, &syncCookie, &m ); } } @@ -1149,6 +1165,7 @@ do_syncrep2( if ( match < 0 ) { if ( si->si_refreshPresent == 1 && + si_tag != LDAP_TAG_SYNC_NEW_COOKIE && syncCookie_req.numcsns == syncCookie.numcsns ) { syncrepl_del_nonpresent( op, si, NULL, &syncCookie, m ); @@ -1246,8 +1263,13 @@ do_syncrepl( if ( si == NULL ) return NULL; - /* There will never be more than one instance active */ - ldap_pvt_thread_mutex_lock( &si->si_mutex ); + /* Don't get stuck here while a pause is initiated */ + while ( ldap_pvt_thread_mutex_trylock( &si->si_mutex )) { + if ( slapd_shutdown ) + return NULL; + if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool )) + ldap_pvt_thread_yield(); + } switch( abs( si->si_type ) ) { case LDAP_SYNC_REFRESH_ONLY: @@ -2309,6 +2331,12 @@ retry_add:; break; } } + if ( !mod->sml_numvals ) { + /* Drop this op */ + *ml = mod->sml_next; + mod->sml_next = NULL; + slap_mods_free( mod, 1 ); + } break; } } @@ -3188,8 +3216,6 @@ dn_callback( * is actually newer than old entry */ if ( !is_entry_glue( rs->sr_entry )) { - old = attr_find( rs->sr_entry->e_attrs, - slap_schema.si_ad_objectClass ); old = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN ); new = attr_find( dni->new_entry->e_attrs, @@ -4325,13 +4351,22 @@ add_syncrepl( BER_BVISNULL( &si->si_bindconf.sb_uri ) ? "(null)" : si->si_bindconf.sb_uri.bv_val, 0, 0 ); if ( c->be->be_syncinfo ) { + 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; } else { si->si_cookieState = ch_calloc( 1, sizeof( cookie_state )); ldap_pvt_thread_mutex_init( &si->si_cookieState->cs_mutex ); + + c->be->be_syncinfo = si; } - si->si_next = c->be->be_syncinfo; - c->be->be_syncinfo = si; + + si->si_next = NULL; + return 0; } }