struct berval *cs_pvals;
int *cs_psids;
int cs_pnum;
+
+ /* serialize multi-consumer refreshes */
+ ldap_pvt_thread_mutex_t cs_refresh_mutex;
} cookie_state;
#define SYNCDATA_DEFAULT 0 /* entries are plain LDAP entries */
return changed;
}
+#define SYNC_TIMEOUT 0
+#define SYNC_SHUTDOWN -100
+#define SYNC_ERROR -101
+#define SYNC_REPOLL -102
+#define SYNC_PAUSED -103
+
static int
do_syncrep1(
Operation *op,
void *ssl;
#endif
+ while ( ldap_pvt_thread_mutex_trylock( &si->si_cookieState->cs_refresh_mutex )) {
+ if ( slapd_shutdown )
+ return SYNC_SHUTDOWN;
+ if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
+ ldap_pvt_thread_yield();
+ }
+
si->si_lastconnect = slap_get_time();
si->si_refreshDone = 0;
rc = slap_client_connect( &si->si_ld, &si->si_bindconf );
ldap_unbind_ext( si->si_ld, NULL, NULL );
si->si_ld = NULL;
}
+ ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_refresh_mutex );
}
return rc;
return rc;
}
-#define SYNC_TIMEOUT 0
-#define SYNC_SHUTDOWN -100
-#define SYNC_ERROR -101
-#define SYNC_REPOLL -102
-#define SYNC_PAUSED -103
-
static int
get_pmutex(
syncinfo_t *si
struct timeval tout = { 0, 0 };
int refreshDeletes = 0;
+ int refreshEnded = 0;
char empty[6] = "empty";
if ( slapd_shutdown ) {
Debug( LDAP_DEBUG_SYNC,
"do_syncrep2: %s LDAP_RES_SEARCH_RESULT\n",
si->si_ridtxt );
+ refreshEnded = 1;
err = LDAP_OTHER; /* FIXME check parse result properly */
ldap_parse_result( si->si_ld, msg, &err, NULL, NULL, NULL,
&rctrls, 0 );
}
ber_scanf( ber, /*"{"*/ "}" );
if ( si->si_refreshDone ) {
- Debug( LDAP_DEBUG_SYNC, "do_syncrep1: %s finished refresh\n",
+ Debug( LDAP_DEBUG_SYNC, "do_syncrep2: %s finished refresh\n",
si->si_ridtxt );
+ refreshEnded = 1;
}
break;
case LDAP_TAG_SYNC_ID_SET:
"do_syncrep2: %s (%d) %s\n",
si->si_ridtxt, err, ldap_err2string( err ) );
}
+ if ( refreshEnded || ( rc && !si->si_refreshDone ))
+ ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_refresh_mutex );
slap_sync_cookie_free( &syncCookie, 0 );
slap_sync_cookie_free( &syncCookie_req, 0 );
ch_free( sie->si_cookieState->cs_psids );
ber_bvarray_free( sie->si_cookieState->cs_pvals );
ldap_pvt_thread_mutex_destroy( &sie->si_cookieState->cs_pmutex );
+ ldap_pvt_thread_mutex_destroy( &sie->si_cookieState->cs_refresh_mutex );
ch_free( sie->si_cookieState );
}
}
si->si_cookieState = ch_calloc( 1, sizeof( cookie_state ));
ldap_pvt_thread_mutex_init( &si->si_cookieState->cs_mutex );
ldap_pvt_thread_mutex_init( &si->si_cookieState->cs_pmutex );
+ ldap_pvt_thread_mutex_init( &si->si_cookieState->cs_refresh_mutex );
ldap_pvt_thread_cond_init( &si->si_cookieState->cs_cond );
c->be->be_syncinfo = si;