Diff for /servers/slapd/overlays/syncprov.c between versions 1.38 and 1.40

version 1.38, 2004/12/05 19:57:34 version 1.40, 2004/12/07 01:20:15
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/ppolicy.c,v 1.31 2004/12/05 01:00:19 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.39 2004/12/06 19:32:53 hyc Exp $ */
 /* 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 102  typedef struct syncprov_info_t { Line 102  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;
   
Line 971  syncprov_op_cleanup( Operation *op, Slap Line 971  syncprov_op_cleanup( Operation *op, Slap
   
         /* 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;
   
Line 984  syncprov_op_cleanup( Operation *op, Slap Line 984  syncprov_op_cleanup( Operation *op, Slap
                         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 );
Line 1207  syncprov_op_mod( Operation *op, SlapRepl Line 1207  syncprov_op_mod( Operation *op, SlapRepl
   
                 /* 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 */
Line 1220  syncprov_op_mod( Operation *op, SlapRepl Line 1220  syncprov_op_mod( Operation *op, SlapRepl
                                 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) );
Line 1228  syncprov_op_mod( Operation *op, SlapRepl Line 1229  syncprov_op_mod( Operation *op, SlapRepl
                         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 )
Line 1688  syncprov_db_open( Line 1689  syncprov_db_open(
   
         Connection conn;          Connection conn;
         char opbuf[OPERATION_BUFFER_SIZE];          char opbuf[OPERATION_BUFFER_SIZE];
           char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
         Operation *op = (Operation *)opbuf;          Operation *op = (Operation *)opbuf;
         Entry *e;          Entry *e;
         Attribute *a;          Attribute *a;
Line 1698  syncprov_db_open( Line 1700  syncprov_db_open(
         op->o_dn = be->be_rootdn;          op->o_dn = be->be_rootdn;
         op->o_ndn = be->be_rootndn;          op->o_ndn = be->be_rootndn;
   
           ctxcsnbuf[0] = '\0';
   
         op->o_bd->bd_info = on->on_info->oi_orig;          op->o_bd->bd_info = on->on_info->oi_orig;
         rc = be_entry_get_rw( op, be->be_nsuffix, NULL,          rc = be_entry_get_rw( op, be->be_nsuffix, NULL,
                 slap_schema.si_ad_contextCSN, 0, &e );                  slap_schema.si_ad_contextCSN, 0, &e );
Line 1711  syncprov_db_open( Line 1715  syncprov_db_open(
                         strncpy( si->si_ctxcsnbuf, a->a_nvals[0].bv_val,                          strncpy( si->si_ctxcsnbuf, a->a_nvals[0].bv_val,
                                 si->si_ctxcsn.bv_len );                                  si->si_ctxcsn.bv_len );
                         si->si_ctxcsnbuf[si->si_ctxcsn.bv_len] = '\0';                          si->si_ctxcsnbuf[si->si_ctxcsn.bv_len] = '\0';
                           strcpy( ctxcsnbuf, si->si_ctxcsnbuf );
                 }                  }
                 be_entry_release_r( op, e );                  be_entry_release_r( op, e );
                 op->o_bd->bd_info = (BackendInfo *)on;                  op->o_bd->bd_info = (BackendInfo *)on;
Line 1725  syncprov_db_open( Line 1730  syncprov_db_open(
                                 &si->si_ctxcsn, 0 );                                  &si->si_ctxcsn, 0 );
         }          }
   
           /* If our ctxcsn is different from what was read from the root
            * entry, write the new value out.
            */
           if ( strcmp( si->si_ctxcsnbuf, ctxcsnbuf )) {
                   SlapReply rs = {REP_RESULT};
                   syncprov_checkpoint( op, &rs, on );
           }
   
         op->o_bd->bd_info = (BackendInfo *)on;          op->o_bd->bd_info = (BackendInfo *)on;
         return 0;          return 0;
 }  }
Line 1773  syncprov_db_init( Line 1786  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;
Line 1794  syncprov_db_destroy( Line 1807  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 );

Removed from v.1.38  
changed lines
  Added in v.1.40


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