Diff for /servers/slapd/overlays/syncprov.c between versions 1.56.2.41 and 1.56.2.42

version 1.56.2.41, 2007/01/25 12:06:09 version 1.56.2.42, 2007/02/07 01:51:36
Line 1 Line 1
 /* $OpenLDAP$ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.56.2.41 2007/01/25 12:06:09 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 127  typedef struct syncprov_info_t { Line 127  typedef struct syncprov_info_t {
         time_t  si_chklast;     /* time of last checkpoint */          time_t  si_chklast;     /* time of last checkpoint */
         Avlnode *si_mods;       /* entries being modified */          Avlnode *si_mods;       /* entries being modified */
         sessionlog      *si_logs;          sessionlog      *si_logs;
         ldap_pvt_thread_mutex_t si_csn_mutex;          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;
         char            si_ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];          char            si_ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
Line 1245  syncprov_op_cleanup( Operation *op, Slap Line 1245  syncprov_op_cleanup( Operation *op, Slap
 }  }
   
 static void  static void
 syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on,  syncprov_checkpoint( Operation *op, SlapReply *rs, slap_overinst *on )
         struct berval *csn )  
 {  {
           syncprov_info_t         *si = on->on_bi.bi_private;
         Modifications mod;          Modifications mod;
         Operation opm;          Operation opm;
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
Line 1255  syncprov_checkpoint( Operation *op, Slap Line 1255  syncprov_checkpoint( Operation *op, Slap
         slap_callback cb = {0};          slap_callback cb = {0};
   
         /* If ctxcsn is empty, delete it */          /* If ctxcsn is empty, delete it */
         if ( BER_BVISEMPTY( csn )) {          if ( BER_BVISEMPTY( &si->si_ctxcsn )) {
                 mod.sml_values = NULL;                  mod.sml_values = NULL;
         } else {          } else {
                 mod.sml_values = bv;                  mod.sml_values = bv;
                 bv[1].bv_val = NULL;                  bv[1].bv_val = NULL;
                 bv[0] = *csn;                  bv[0] = si->si_ctxcsn;
         }          }
         mod.sml_nvalues = NULL;          mod.sml_nvalues = NULL;
         mod.sml_desc = slap_schema.si_ad_contextCSN;          mod.sml_desc = slap_schema.si_ad_contextCSN;
Line 1373  syncprov_playlog( Operation *op, SlapRep Line 1373  syncprov_playlog( Operation *op, SlapRep
          * and everything else at the end. Do this first so we can           * and everything else at the end. Do this first so we can
          * unlock the list mutex.           * unlock the list mutex.
          */           */
         Debug( LDAP_DEBUG_SYNC, "srs csn %s\n", srs-> sr_state.ctxcsn.bv_val, 0, 0 );          Debug( LDAP_DEBUG_SYNC, "srs csn %s\n", srs->sr_state.ctxcsn.bv_val, 0, 0 );
         for ( se=sl->sl_head; se; se=se->se_next ) {          for ( se=sl->sl_head; se; se=se->se_next ) {
                 Debug( LDAP_DEBUG_SYNC, "log csn %s\n", se-> se_csn.bv_val,                  Debug( LDAP_DEBUG_SYNC, "log csn %s\n", se->se_csn.bv_val, 0, 0 );
 0, 0 );                  ndel = ber_bvcmp( &se->se_csn, &srs->sr_state.ctxcsn );
                 ndel = ber_bvcmp( &se->se_csn, &srs->sr_state.ctxcsn );                  if ( ndel <= 0 ) {
                 if ( ndel <= 0 ) {                          Debug( LDAP_DEBUG_SYNC, "cmp %d, too old\n", ndel, 0, 0 );
                         Debug( LDAP_DEBUG_SYNC, "cmp %d, too old\n", ndel,                          continue;
 0, 0 );                  }
                         continue;                  ndel = ber_bvcmp( &se->se_csn, ctxcsn );
                 }                  if ( ndel > 0 ) {
                 ndel = ber_bvcmp( &se->se_csn, ctxcsn );                          Debug( LDAP_DEBUG_SYNC, "cmp %d, too new\n", ndel, 0, 0 );
                 if ( ndel > 0 ) {                          break;
                         Debug( LDAP_DEBUG_SYNC, "cmp %d, too new\n", ndel,                  }
 0, 0 );  
                         break;  
                 }  
                 if ( se->se_tag == LDAP_REQ_DELETE ) {                  if ( se->se_tag == LDAP_REQ_DELETE ) {
                         j = i;                          j = i;
                         i++;                          i++;
Line 1508  syncprov_op_response( Operation *op, Sla Line 1505  syncprov_op_response( Operation *op, Sla
         {          {
                 struct berval maxcsn = BER_BVNULL;                  struct berval maxcsn = BER_BVNULL;
                 char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];                  char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
                 int do_check = 0;                  int do_check=0;
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
                 ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_wlock( &si->si_csn_rwlock );
                 slap_get_commit_csn( op, &maxcsn );                  slap_get_commit_csn( op, &maxcsn );
                 if ( !BER_BVISNULL( &maxcsn ) ) {                  if ( !BER_BVISNULL( &maxcsn ) ) {
                         strcpy( cbuf, maxcsn.bv_val );                          strcpy( cbuf, maxcsn.bv_val );
Line 1525  syncprov_op_response( Operation *op, Sla Line 1522  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 ( SLAP_SYNC_SHADOW( op->o_bd ) &&                   if ( SLAP_SYNC_SHADOW( op->o_bd ) && 
                         op->o_msgid == SLAP_SYNC_UPDATE_MSGID ) {                          op->o_msgid == SLAP_SYNC_UPDATE_MSGID ) {
                         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
                         return SLAP_CB_CONTINUE;                          return SLAP_CB_CONTINUE;
                 }                  }
   
Line 1541  syncprov_op_response( Operation *op, Sla Line 1538  syncprov_op_response( Operation *op, Sla
                                 si->si_chklast = op->o_time;                                  si->si_chklast = op->o_time;
                         }                          }
                 }                  }
                 ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
   
                 opc->sctxcsn.bv_len = maxcsn.bv_len;  
                 opc->sctxcsn.bv_val = cbuf;  
   
                 if ( do_check ) {                  if ( do_check ) {
                         syncprov_checkpoint( op, rs, on, &opc->sctxcsn );                          ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
                           syncprov_checkpoint( op, rs, on );
                           ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
   
                   opc->sctxcsn.bv_len = maxcsn.bv_len;
                   opc->sctxcsn.bv_val = cbuf;
   
                 /* Handle any persistent searches */                  /* Handle any persistent searches */
                 if ( si->si_ops ) {                  if ( si->si_ops ) {
                         switch(op->o_tag) {                          switch(op->o_tag) {
Line 1609  syncprov_op_compare( Operation *op, Slap Line 1608  syncprov_op_compare( Operation *op, Slap
                 a.a_vals = bv;                  a.a_vals = bv;
                 a.a_nvals = a.a_vals;                  a.a_nvals = a.a_vals;
   
                 ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
   
                 rs->sr_err = access_allowed( op, &e, op->oq_compare.rs_ava->aa_desc,                  rs->sr_err = access_allowed( op, &e, op->oq_compare.rs_ava->aa_desc,
                         &op->oq_compare.rs_ava->aa_value, ACL_COMPARE, NULL );                          &op->oq_compare.rs_ava->aa_value, ACL_COMPARE, NULL );
Line 1638  syncprov_op_compare( Operation *op, Slap Line 1637  syncprov_op_compare( Operation *op, Slap
   
 return_results:;  return_results:;
   
                 ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
   
                 send_ldap_result( op, rs );                  send_ldap_result( op, rs );
   
Line 1998  syncprov_op_search( Operation *op, SlapR Line 1997  syncprov_op_search( Operation *op, SlapR
         }          }
   
         /* snapshot the ctxcsn */          /* snapshot the ctxcsn */
         ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );          ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
         strcpy( csnbuf, si->si_ctxcsnbuf );          strcpy( csnbuf, si->si_ctxcsnbuf );
         ctxcsn.bv_len = si->si_ctxcsn.bv_len;          ctxcsn.bv_len = si->si_ctxcsn.bv_len;
         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
         ctxcsn.bv_val = csnbuf;          ctxcsn.bv_val = csnbuf;
                   
         /* If we have a cookie, handle the PRESENT lookups */          /* If we have a cookie, handle the PRESENT lookups */
Line 2158  syncprov_operational( Line 2157  syncprov_operational(
                                 *ap = a;                                  *ap = a;
                         }                          }
   
                         ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
                         if ( !ap ) {                          if ( !ap ) {
                                 strcpy( a->a_vals[0].bv_val, si->si_ctxcsnbuf );                                  strcpy( a->a_vals[0].bv_val, si->si_ctxcsnbuf );
                         } else {                          } else {
                                 ber_dupbv( &a->a_vals[0], &si->si_ctxcsn );                                  ber_dupbv( &a->a_vals[0], &si->si_ctxcsn );
                         }                          }
                         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
         }          }
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
Line 2478  syncprov_db_close( Line 2477  syncprov_db_close(
                 op->o_bd = be;                  op->o_bd = be;
                 op->o_dn = be->be_rootdn;                  op->o_dn = be->be_rootdn;
                 op->o_ndn = be->be_rootndn;                  op->o_ndn = be->be_rootndn;
                 syncprov_checkpoint( op, &rs, on, &si->si_ctxcsn );                  syncprov_checkpoint( op, &rs, on );
         }          }
   
     return 0;      return 0;
Line 2501  syncprov_db_init( Line 2500  syncprov_db_init(
   
         si = ch_calloc(1, sizeof(syncprov_info_t));          si = ch_calloc(1, sizeof(syncprov_info_t));
         on->on_bi.bi_private = si;          on->on_bi.bi_private = si;
         ldap_pvt_thread_mutex_init( &si->si_csn_mutex );          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 );
         si->si_ctxcsn.bv_val = si->si_ctxcsnbuf;          si->si_ctxcsn.bv_val = si->si_ctxcsnbuf;
Line 2539  syncprov_db_destroy( Line 2538  syncprov_db_destroy(
                 }                  }
                 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_mutex_destroy( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_destroy( &si->si_csn_rwlock );
                 ch_free( si );                  ch_free( si );
         }          }
   

Removed from v.1.56.2.41  
changed lines
  Added in v.1.56.2.42


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