Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.58 and 1.147.2.61

version 1.147.2.58, 2009/04/05 01:29:48 version 1.147.2.61, 2009/11/10 19:40:20
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.57 2009/03/17 16:39:20 quanah Exp $ */  /* $OpenLDAP$ */
 /* syncprov.c - syncrepl provider */  /* syncprov.c - syncrepl provider */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
Line 137  typedef struct syncprov_info_t { Line 137  typedef struct syncprov_info_t {
         ldap_pvt_thread_rdwr_t  si_csn_rwlock;          ldap_pvt_thread_rdwr_t  si_csn_rwlock;
         ldap_pvt_thread_mutex_t si_ops_mutex;          ldap_pvt_thread_mutex_t si_ops_mutex;
         ldap_pvt_thread_mutex_t si_mods_mutex;          ldap_pvt_thread_mutex_t si_mods_mutex;
           ldap_pvt_thread_mutex_t si_resp_mutex;
 } syncprov_info_t;  } syncprov_info_t;
   
 typedef struct opcookie {  typedef struct opcookie {
Line 1324  syncprov_op_cleanup( Operation *op, Slap Line 1325  syncprov_op_cleanup( Operation *op, Slap
         /* Remove op from lock table */          /* Remove op from lock table */
         mt = opc->smt;          mt = opc->smt;
         if ( mt ) {          if ( mt ) {
                 modinst *mi = mt->mt_mods;                  ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
                   mt->mt_mods = mt->mt_mods->mi_next;
                 /* If there are more, promote the next one */                  /* If there are more, promote the next one */
                 if ( mi->mi_next ) {                  if ( mt->mt_mods ) {
                         ldap_pvt_thread_mutex_lock( &mt->mt_mutex );  
                         mt->mt_mods = mi->mi_next;  
                         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_mutex_unlock( &mt->mt_mutex );
                         ldap_pvt_thread_mutex_lock( &si->si_mods_mutex );                          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_mutex_unlock( &si->si_mods_mutex );                          ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );
Line 1646  syncprov_op_response( Operation *op, Sla Line 1646  syncprov_op_response( Operation *op, Sla
                 char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];                  char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
                 int do_check = 0, have_psearches, foundit, csn_changed = 0;                  int do_check = 0, have_psearches, foundit, csn_changed = 0;
   
                   ldap_pvt_thread_mutex_lock( &si->si_resp_mutex );
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
                 maxcsn.bv_val = cbuf;                  maxcsn.bv_val = cbuf;
Line 1699  syncprov_op_response( Operation *op, Sla Line 1701  syncprov_op_response( Operation *op, Sla
                                         }                                          }
                                 }                                  }
                         }                          }
                         return SLAP_CB_CONTINUE;                          goto leave;
                 }                  }
   
                 slap_get_commit_csn( op, &maxcsn, &foundit );                  slap_get_commit_csn( op, &maxcsn, &foundit );
Line 1752  syncprov_op_response( Operation *op, Sla Line 1754  syncprov_op_response( Operation *op, Sla
                 /* Don't do any processing for consumer contextCSN updates */                  /* Don't do any processing for consumer contextCSN updates */
                 if ( op->o_dont_replicate ) {                  if ( op->o_dont_replicate ) {
                         ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );                          ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
                         return SLAP_CB_CONTINUE;                          goto leave;
                 }                  }
   
                 si->si_numops++;                  si->si_numops++;
Line 1819  syncprov_op_response( Operation *op, Sla Line 1821  syncprov_op_response( Operation *op, Sla
                 if ( si->si_logs && op->o_tag != LDAP_REQ_ADD ) {                  if ( si->si_logs && op->o_tag != LDAP_REQ_ADD ) {
                         syncprov_add_slog( op );                          syncprov_add_slog( op );
                 }                  }
   leave:          ldap_pvt_thread_mutex_unlock( &si->si_resp_mutex );
         }          }
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
 }  }
Line 1946  syncprov_op_mod( Operation *op, SlapRepl Line 1948  syncprov_op_mod( Operation *op, SlapRepl
                 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 );
                           if ( mt->mt_mods == NULL ) {
                                   /* Cannot reuse this mt, as another thread is about
                                    * to release it in syncprov_op_cleanup.
                                    */
                                   ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
                                   mt = NULL;
                           }
                   }
                   if ( mt ) {
                         ldap_pvt_thread_mutex_unlock( &si->si_mods_mutex );                          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;
Line 2679  sp_cf_gen(ConfigArgs *c) Line 2690  sp_cf_gen(ConfigArgs *c)
                 case SP_CHKPT:                  case SP_CHKPT:
                         if ( si->si_chkops || si->si_chktime ) {                          if ( si->si_chkops || si->si_chktime ) {
                                 struct berval bv;                                  struct berval bv;
                                   /* we assume si_chktime is a multiple of 60
                                    * because the parsed value was originally
                                    * multiplied by 60 */
                                 bv.bv_len = snprintf( c->cr_msg, sizeof( c->cr_msg ),                                  bv.bv_len = snprintf( c->cr_msg, sizeof( c->cr_msg ),
                                         "%d %d", si->si_chkops, si->si_chktime );                                          "%d %d", si->si_chkops, si->si_chktime/60 );
                                 if ( bv.bv_len >= sizeof( c->cr_msg ) ) {                                  if ( bv.bv_len >= sizeof( c->cr_msg ) ) {
                                         rc = 1;                                          rc = 1;
                                 } else {                                  } else {
Line 2967  syncprov_db_init( Line 2981  syncprov_db_init(
         ldap_pvt_thread_rdwr_init( &si->si_csn_rwlock );          ldap_pvt_thread_rdwr_init( &si->si_csn_rwlock );
         ldap_pvt_thread_mutex_init( &si->si_ops_mutex );          ldap_pvt_thread_mutex_init( &si->si_ops_mutex );
         ldap_pvt_thread_mutex_init( &si->si_mods_mutex );          ldap_pvt_thread_mutex_init( &si->si_mods_mutex );
           ldap_pvt_thread_mutex_init( &si->si_resp_mutex );
   
         csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN;          csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN;
         csn_anlist[0].an_name = slap_schema.si_ad_entryCSN->ad_cname;          csn_anlist[0].an_name = slap_schema.si_ad_entryCSN->ad_cname;
Line 3004  syncprov_db_destroy( Line 3019  syncprov_db_destroy(
                         ber_bvarray_free( si->si_ctxcsn );                          ber_bvarray_free( si->si_ctxcsn );
                 if ( si->si_sids )                  if ( si->si_sids )
                         ch_free( si->si_sids );                          ch_free( si->si_sids );
                   ldap_pvt_thread_mutex_destroy( &si->si_resp_mutex );
                 ldap_pvt_thread_mutex_destroy( &si->si_mods_mutex );                  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_rdwr_destroy( &si->si_csn_rwlock );                  ldap_pvt_thread_rdwr_destroy( &si->si_csn_rwlock );

Removed from v.1.147.2.58  
changed lines
  Added in v.1.147.2.61


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org