/* syncprov.c - syncrepl provider */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2004-2017 The OpenLDAP Foundation.
+ * Copyright 2004-2018 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
int sl_numcsns;
int sl_num;
int sl_size;
+ int sl_playing;
slog_entry *sl_head;
slog_entry *sl_tail;
ldap_pvt_thread_mutex_t sl_mutex;
* wipe out anything in the log if we see them.
*/
ldap_pvt_thread_mutex_lock( &sl->sl_mutex );
+ /* can only do this if no one else is reading the log at the moment */
+ if (!sl->sl_playing) {
while ( se = sl->sl_head ) {
sl->sl_head = se->se_next;
ch_free( se );
}
sl->sl_tail = NULL;
sl->sl_num = 0;
+ }
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
return;
}
}
}
sl->sl_num++;
+ if (!sl->sl_playing) {
while ( sl->sl_num > sl->sl_size ) {
int i;
se = sl->sl_head;
ch_free( se );
sl->sl_num--;
}
+ }
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
}
}
num = sl->sl_num;
i = 0;
nmods = 0;
+ sl->sl_playing++;
+ ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
uuids = op->o_tmpalloc( (num+1) * sizeof( struct berval ) +
num * UUID_LEN, op->o_tmpmemctx );
AC_MEMCPY(uuids[j].bv_val, se->se_uuid.bv_val, UUID_LEN);
uuids[j].bv_len = UUID_LEN;
}
+ ldap_pvt_thread_mutex_lock( &sl->sl_mutex );
+ sl->sl_playing--;
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
ndel = i;
}
/* Don't do any processing for consumer contextCSN updates */
- if ( op->o_dont_replicate ) {
- if ( op->o_tag == LDAP_REQ_MODIFY &&
- op->orm_modlist->sml_op == LDAP_MOD_REPLACE &&
- op->orm_modlist->sml_desc == slap_schema.si_ad_contextCSN ) {
+ if ( SLAPD_SYNC_IS_SYNCCONN( op->o_connid ) &&
+ op->o_tag == LDAP_REQ_MODIFY &&
+ op->orm_modlist &&
+ op->orm_modlist->sml_op == LDAP_MOD_REPLACE &&
+ op->orm_modlist->sml_desc == slap_schema.si_ad_contextCSN ) {
/* Catch contextCSN updates from syncrepl. We have to look at
* all the attribute values, as there may be more than one csn
* that changed, and only one can be passed in the csn queue.
*/
- csn_changed = syncprov_new_ctxcsn( opc, si, csn_changed,
- op->orm_modlist->sml_numvals, op->orm_modlist->sml_values );
- } else {
- ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
- }
+ csn_changed = syncprov_new_ctxcsn( opc, si, csn_changed,
+ op->orm_modlist->sml_numvals, op->orm_modlist->sml_values );
+ if ( csn_changed )
+ si->si_numops++;
+ goto leave;
+ }
+ if ( op->o_dont_replicate ) {
if ( csn_changed )
si->si_numops++;
+ ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
goto leave;
}
si->si_chktime = 0;
break;
case SP_SESSL:
- if ( si->si_logs )
- si->si_logs->sl_size = 0;
- else
- rc = LDAP_NO_SUCH_ATTRIBUTE;
+ si->si_logs->sl_size = 0;
break;
case SP_NOPRES:
- if ( si->si_nopres )
- si->si_nopres = 0;
- else
- rc = LDAP_NO_SUCH_ATTRIBUTE;
+ si->si_nopres = 0;
break;
case SP_USEHINT:
- if ( si->si_usehint )
- si->si_usehint = 0;
- else
- rc = LDAP_NO_SUCH_ATTRIBUTE;
+ si->si_usehint = 0;
break;
}
return rc;