Fixed slapo-rwm reusing freed filter (ITS#5732)
Fixed slapo-rwm entry get (ITS#5773)
Fixed slapo-syncprov runqueue removal (ITS#5776)
+ Fixed slapo-syncprov unreplicatable ops (ITS#5709)
Added slapo-translucent try local bind when remote fails (ITS#5656)
Added slapo-translucent support for PasswordModify exop (ITS#5656)
Fixed tools simple bind without SASL (ITS#5753)
be->be_requires = frontendDB->be_requires;
be->be_ssf_set = frontendDB->be_ssf_set;
- be->be_pcl_mutexp = &be->be_pcl_mutex;
- ldap_pvt_thread_mutex_init( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_init( &be->be_pcl_mutex );
/* assign a default depth limit for alias deref */
be->be_max_deref_depth = SLAPD_DEFAULT_MAXDEREFDEPTH;
BER_BVZERO( maxcsn );
}
- ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_lock( &be->be_pcl_mutex );
LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
if ( csne->ce_opid == op->o_opid && csne->ce_connid == op->o_connid ) {
}
if ( committed_csne && maxcsn ) *maxcsn = committed_csne->ce_csn;
- ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_unlock( &be->be_pcl_mutex );
}
void
struct slap_csn_entry *csne;
BackendDB *be = op->o_bd->bd_self;
- ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_lock( &be->be_pcl_mutex );
LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
if ( csne->ce_opid == op->o_opid && csne->ce_connid == op->o_connid ) {
}
}
- ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_unlock( &be->be_pcl_mutex );
}
void
if ( op->o_bd == NULL ) return;
be = op->o_bd->bd_self;
-#if 0
- /* it is NULL when we get here from the frontendDB;
- * alternate fix: initialize frontendDB like all other backends */
- assert( op->o_bd->be_pcl_mutexp != NULL );
-#endif
-
- if ( be->be_pcl_mutexp == NULL ) return;
-
- ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_lock( &be->be_pcl_mutex );
LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
if ( csne->ce_opid == op->o_opid && csne->ce_connid == op->o_connid ) {
}
}
- ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_unlock( &be->be_pcl_mutex );
return;
}
Debug( LDAP_DEBUG_SYNC, "slap_queue_csn: queing %p %s\n", csn->bv_val, csn->bv_val, 0 );
- ldap_pvt_thread_mutex_lock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_lock( &be->be_pcl_mutex );
ber_dupbv( &pending->ce_csn, csn );
ber_bvreplace_x( &op->o_csn, &pending->ce_csn, op->o_tmpmemctx );
pending->ce_state = SLAP_CSN_PENDING;
LDAP_TAILQ_INSERT_TAIL( be->be_pending_csn_list,
pending, ce_csn_link );
- ldap_pvt_thread_mutex_unlock( be->be_pcl_mutexp );
+ ldap_pvt_thread_mutex_unlock( &be->be_pcl_mutex );
}
int
frontendDB->be_def_limit.lms_s_pr_hide = 0; /* don't hide number of entries left */
frontendDB->be_def_limit.lms_s_pr_total = 0; /* number of total entries returned by pagedResults equal to hard limit */
-#if 0
- /* FIXME: do we need this? */
- frontendDB->be_pcl_mutexp = &frontendDB->be_pcl_mutex;
- ldap_pvt_thread_mutex_init( frontendDB->be_pcl_mutexp );
-#endif
+ ldap_pvt_thread_mutex_init( &frontendDB->be_pcl_mutex );
/* suffix */
frontendDB->be_suffix = ch_calloc( 2, sizeof( struct berval ) );
cm->db = *be;
SLAP_DBFLAGS(&cm->db) |= SLAP_DBFLAG_NO_SCHEMA_CHECK;
cm->db.be_private = NULL;
- cm->db.be_pcl_mutexp = &cm->db.be_pcl_mutex;
+ cm->db.bd_self = &cm->db;
cm->qm = qm;
cm->numattrsets = 0;
cm->num_entries_limit = 5;
{
struct berval maxcsn = BER_BVNULL;
char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
- int do_check = 0, have_psearches;
+ int do_check = 0, have_psearches, foundit;
/* Update our context CSN */
cbuf[0] = '\0';
ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
- slap_get_commit_csn( op, &maxcsn );
+ slap_get_commit_csn( op, &maxcsn, &foundit );
if ( BER_BVISNULL( &maxcsn ) && SLAP_GLUE_SUBORDINATE( op->o_bd )) {
/* syncrepl queues the CSN values in the db where
* it is configured , not where the changes are made.
*/
BackendDB *be = op->o_bd;
op->o_bd = select_backend( &be->be_nsuffix[0], 1);
- slap_get_commit_csn( op, &maxcsn );
+ slap_get_commit_csn( op, &maxcsn, &foundit );
op->o_bd = be;
}
if ( !BER_BVISNULL( &maxcsn ) ) {
sizeof(int));
si->si_sids[i] = sid;
}
- } else {
+ } else if ( !foundit ) {
/* internal ops that aren't meant to be replicated */
ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
return SLAP_CB_CONTINUE;
ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
}
- opc->sctxcsn.bv_len = maxcsn.bv_len;
- opc->sctxcsn.bv_val = cbuf;
+ /* only update consumer ctx if this is the greatest csn */
+ if ( bvmatch( &maxcsn, &op->o_csn )) {
+ opc->sctxcsn.bv_len = maxcsn.bv_len;
+ opc->sctxcsn.bv_val = cbuf;
+ }
/* Handle any persistent searches */
ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
on->on_bi.bi_private = ov;
ov->db = *be;
ov->db.be_private = NULL;
- ov->db.be_pcl_mutexp = &ov->db.be_pcl_mutex;
ov->defer_db_open = 1;
if ( !backend_db_init( "ldap", &ov->db, -1, NULL )) {
BerVarray be_update_refs; /* where to refer modifying clients to */
struct be_pcl *be_pending_csn_list;
ldap_pvt_thread_mutex_t be_pcl_mutex;
- ldap_pvt_thread_mutex_t *be_pcl_mutexp;
struct syncinfo_s *be_syncinfo; /* For syncrepl */
void *be_pb; /* Netscape plugin */