mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-30 13:30:57 +08:00
Fix mod locking
This commit is contained in:
parent
cc78fb525b
commit
4ffff34a65
@ -102,7 +102,7 @@ typedef struct syncprov_info_t {
|
|||||||
Avlnode *si_mods; /* entries being modified */
|
Avlnode *si_mods; /* entries being modified */
|
||||||
ldap_pvt_thread_mutex_t si_csn_mutex;
|
ldap_pvt_thread_mutex_t si_csn_mutex;
|
||||||
ldap_pvt_thread_mutex_t si_ops_mutex;
|
ldap_pvt_thread_mutex_t si_ops_mutex;
|
||||||
ldap_pvt_thread_rdwr_t si_mods_rwlock;
|
ldap_pvt_thread_mutex_t si_mods_mutex;
|
||||||
char si_ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
|
char si_ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
|
||||||
} syncprov_info_t;
|
} syncprov_info_t;
|
||||||
|
|
||||||
@ -971,9 +971,9 @@ syncprov_op_cleanup( Operation *op, SlapReply *rs )
|
|||||||
|
|
||||||
/* Remove op from lock table */
|
/* Remove op from lock table */
|
||||||
mtdummy.mt_op = op;
|
mtdummy.mt_op = op;
|
||||||
ldap_pvt_thread_rdwr_rlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );
|
||||||
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );
|
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );
|
||||||
ldap_pvt_thread_rdwr_runlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
|
||||||
if ( mt ) {
|
if ( mt ) {
|
||||||
modinst *mi = mt->mt_mods;
|
modinst *mi = mt->mt_mods;
|
||||||
|
|
||||||
@ -984,9 +984,9 @@ syncprov_op_cleanup( Operation *op, SlapReply *rs )
|
|||||||
mt->mt_op = mt->mt_mods->mi_op;
|
mt->mt_op = mt->mt_mods->mi_op;
|
||||||
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
|
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
|
||||||
} else {
|
} else {
|
||||||
ldap_pvt_thread_rdwr_wlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );
|
||||||
avl_delete( &si->si_mods, mt, sp_avl_cmp );
|
avl_delete( &si->si_mods, mt, sp_avl_cmp );
|
||||||
ldap_pvt_thread_rdwr_wunlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
|
||||||
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
|
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
|
||||||
ldap_pvt_thread_mutex_destroy( &mt->mt_mutex );
|
ldap_pvt_thread_mutex_destroy( &mt->mt_mutex );
|
||||||
ch_free( mt );
|
ch_free( mt );
|
||||||
@ -1207,11 +1207,11 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
|
|||||||
|
|
||||||
/* See if we're already modifying this entry... */
|
/* See if we're already modifying this entry... */
|
||||||
mtdummy.mt_op = op;
|
mtdummy.mt_op = op;
|
||||||
ldap_pvt_thread_rdwr_wlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );
|
||||||
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );
|
mt = avl_find( si->si_mods, &mtdummy, sp_avl_cmp );
|
||||||
if ( mt ) {
|
if ( mt ) {
|
||||||
ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
|
ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
|
||||||
ldap_pvt_thread_rdwr_wunlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
|
||||||
mt->mt_tail->mi_next = mi;
|
mt->mt_tail->mi_next = mi;
|
||||||
mt->mt_tail = mi;
|
mt->mt_tail = mi;
|
||||||
/* wait for this op to get to head of list */
|
/* wait for this op to get to head of list */
|
||||||
@ -1220,6 +1220,7 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
|
|||||||
ldap_pvt_thread_yield();
|
ldap_pvt_thread_yield();
|
||||||
ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
|
ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
|
||||||
}
|
}
|
||||||
|
ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
|
||||||
} else {
|
} else {
|
||||||
/* Record that we're modifying this entry now */
|
/* Record that we're modifying this entry now */
|
||||||
mt = ch_malloc( sizeof(modtarget) );
|
mt = ch_malloc( sizeof(modtarget) );
|
||||||
@ -1228,7 +1229,7 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
|
|||||||
mt->mt_op = mi->mi_op;
|
mt->mt_op = mi->mi_op;
|
||||||
ldap_pvt_thread_mutex_init( &mt->mt_mutex );
|
ldap_pvt_thread_mutex_init( &mt->mt_mutex );
|
||||||
avl_insert( &si->si_mods, mt, sp_avl_cmp, avl_dup_error );
|
avl_insert( &si->si_mods, mt, sp_avl_cmp, avl_dup_error );
|
||||||
ldap_pvt_thread_rdwr_wunlock( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( op->o_tag != LDAP_REQ_ADD )
|
if ( op->o_tag != LDAP_REQ_ADD )
|
||||||
@ -1773,7 +1774,7 @@ syncprov_db_init(
|
|||||||
on->on_bi.bi_private = si;
|
on->on_bi.bi_private = si;
|
||||||
ldap_pvt_thread_mutex_init( &si->si_csn_mutex );
|
ldap_pvt_thread_mutex_init( &si->si_csn_mutex );
|
||||||
ldap_pvt_thread_mutex_init( &si->si_ops_mutex );
|
ldap_pvt_thread_mutex_init( &si->si_ops_mutex );
|
||||||
ldap_pvt_thread_rdwr_init( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_init( &si->si_mods_mutex );
|
||||||
si->si_ctxcsn.bv_val = si->si_ctxcsnbuf;
|
si->si_ctxcsn.bv_val = si->si_ctxcsnbuf;
|
||||||
|
|
||||||
csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN;
|
csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN;
|
||||||
@ -1794,7 +1795,7 @@ syncprov_db_destroy(
|
|||||||
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;
|
syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;
|
||||||
|
|
||||||
if ( si ) {
|
if ( si ) {
|
||||||
ldap_pvt_thread_rdwr_destroy( &si->si_mods_rwlock );
|
ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex );
|
||||||
ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex );
|
ldap_pvt_thread_mutex_destroy( &si->si_ops_mutex );
|
||||||
ldap_pvt_thread_mutex_destroy( &si->si_csn_mutex );
|
ldap_pvt_thread_mutex_destroy( &si->si_csn_mutex );
|
||||||
ch_free( si );
|
ch_free( si );
|
||||||
|
Loading…
Reference in New Issue
Block a user