Diff for /servers/slapd/overlays/syncprov.c between versions 1.173 and 1.199

version 1.173, 2007/02/05 22:10:23 version 1.199, 2007/09/23 23:31:24
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.172 2007/02/05 08:19:46 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.198 2007/09/23 02:40:17 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 131  typedef struct syncprov_info_t { Line 131  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;
 } syncprov_info_t;  } syncprov_info_t;
Line 404  syncprov_findbase( Operation *op, fbase_ Line 404  syncprov_findbase( Operation *op, fbase_
                 slap_callback cb = {0};                  slap_callback cb = {0};
                 Operation fop;                  Operation fop;
                 SlapReply frs = { REP_RESULT };                  SlapReply frs = { REP_RESULT };
                   BackendInfo *bi;
                 int rc;                  int rc;
   
                 fc->fss->s_flags ^= PS_FIND_BASE;                  fc->fss->s_flags ^= PS_FIND_BASE;
Line 415  syncprov_findbase( Operation *op, fbase_ Line 416  syncprov_findbase( Operation *op, fbase_
                 fop.o_bd = op->o_bd;                  fop.o_bd = op->o_bd;
                 fop.o_time = op->o_time;                  fop.o_time = op->o_time;
                 fop.o_tincr = op->o_tincr;                  fop.o_tincr = op->o_tincr;
                   bi = op->o_bd->bd_info;
   
                 cb.sc_response = findbase_cb;                  cb.sc_response = findbase_cb;
                 cb.sc_private = fc;                  cb.sc_private = fc;
Line 432  syncprov_findbase( Operation *op, fbase_ Line 434  syncprov_findbase( Operation *op, fbase_
                 fop.ors_filter = &generic_filter;                  fop.ors_filter = &generic_filter;
                 fop.ors_filterstr = generic_filterstr;                  fop.ors_filterstr = generic_filterstr;
   
                 fop.o_bd->bd_info = on->on_info->oi_orig;                  rc = overlay_op_walk( &fop, &frs, op_search, on->on_info, on );
                 rc = fop.o_bd->be_search( &fop, &frs );                  op->o_bd->bd_info = bi;
                 fop.o_bd->bd_info = (BackendInfo *)on;  
         } else {          } else {
                 ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex );                  ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex );
                 fc->fbase = 1;                  fc->fbase = 1;
Line 584  syncprov_findcsn( Operation *op, find_cs Line 585  syncprov_findcsn( Operation *op, find_cs
         char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];          char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
         struct berval maxcsn;          struct berval maxcsn;
         Filter cf;          Filter cf;
 #ifdef LDAP_COMP_MATCH          AttributeAssertion eq = ATTRIBUTEASSERTION_INIT;
         AttributeAssertion eq = { NULL, BER_BVNULL, NULL };  
 #else  
         AttributeAssertion eq = { NULL, BER_BVNULL };  
 #endif  
         fpres_cookie pcookie;          fpres_cookie pcookie;
         sync_control *srs = NULL;          sync_control *srs = NULL;
         struct slap_limits_set fc_limits;          struct slap_limits_set fc_limits;
Line 658  again: Line 655  again:
                 } else {                  } else {
                         cf.f_choice = LDAP_FILTER_LE;                          cf.f_choice = LDAP_FILTER_LE;
                         fop.ors_limit = &fc_limits;                          fop.ors_limit = &fc_limits;
                           memset( &fc_limits, 0, sizeof( fc_limits ));
                         fc_limits.lms_s_unchecked = 1;                          fc_limits.lms_s_unchecked = 1;
                         fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)",                          fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)",
                                 cf.f_av_value.bv_val );                                  cf.f_av_value.bv_val );
Line 839  syncprov_qplay( Operation *op, slap_over Line 837  syncprov_qplay( Operation *op, slap_over
         int rc = 0;          int rc = 0;
   
         opc.son = on;          opc.son = on;
         op->o_bd->bd_info = (BackendInfo *)on->on_info;  
   
         for (;;) {          for (;;) {
                 ldap_pvt_thread_mutex_lock( &so->s_mutex );                  ldap_pvt_thread_mutex_lock( &so->s_mutex );
Line 861  syncprov_qplay( Operation *op, slap_over Line 858  syncprov_qplay( Operation *op, slap_over
                 e = NULL;                  e = NULL;
   
                 if ( sr->s_mode != LDAP_SYNC_DELETE ) {                  if ( sr->s_mode != LDAP_SYNC_DELETE ) {
                         rc = be_entry_get_rw( op, &opc.sndn, NULL, NULL, 0, &e );                          rc = overlay_entry_get_ov( op, &opc.sndn, NULL, NULL, 0, &e, on );
                         if ( rc ) {                          if ( rc ) {
                                 Debug( LDAP_DEBUG_SYNC, "syncprov_qplay: failed to get %s, "                                  Debug( LDAP_DEBUG_SYNC, "syncprov_qplay: failed to get %s, "
                                         "error (%d), ignoring...\n", opc.sndn.bv_val, rc, 0 );                                          "error (%d), ignoring...\n", opc.sndn.bv_val, rc, 0 );
Line 873  syncprov_qplay( Operation *op, slap_over Line 870  syncprov_qplay( Operation *op, slap_over
                 rc = syncprov_sendresp( op, &opc, so, &e, sr->s_mode );                  rc = syncprov_sendresp( op, &opc, so, &e, sr->s_mode );
   
                 if ( e ) {                  if ( e ) {
                         be_entry_release_rw( op, e, 0 );                          overlay_entry_release_ov( op, e, 0, on );
                 }                  }
   
                 ch_free( sr );                  ch_free( sr );
Line 881  syncprov_qplay( Operation *op, slap_over Line 878  syncprov_qplay( Operation *op, slap_over
                 if ( rc )                  if ( rc )
                         break;                          break;
         }          }
         op->o_bd->bd_info = (BackendInfo *)on;  
         return rc;          return rc;
 }  }
   
Line 897  syncprov_qtask( void *ctx, void *arg ) Line 893  syncprov_qtask( void *ctx, void *arg )
         BackendDB be;          BackendDB be;
         int rc;          int rc;
   
         op = (Operation *) &opbuf;          op = &opbuf.ob_op;
         *op = *so->s_op;          *op = *so->s_op;
         op->o_hdr = (Opheader *)(op+1);          op->o_hdr = &opbuf.ob_hdr;
         op->o_controls = (void **)(op->o_hdr+1);          op->o_controls = opbuf.ob_controls;
         memset( op->o_controls, 0, SLAP_MAX_CIDS * sizeof(void *));          memset( op->o_controls, 0, sizeof(opbuf.ob_controls) );
   
         *op->o_hdr = *so->s_op->o_hdr;          *op->o_hdr = *so->s_op->o_hdr;
   
         op->o_tmpmemctx = slap_sl_mem_create(SLAP_SLAB_SIZE, SLAP_SLAB_STACK, ctx);          op->o_tmpmemctx = slap_sl_mem_create(SLAP_SLAB_SIZE, SLAP_SLAB_STACK, ctx, 1);
         op->o_tmpmfuncs = &slap_sl_mfuncs;          op->o_tmpmfuncs = &slap_sl_mfuncs;
         op->o_threadctx = ctx;          op->o_threadctx = ctx;
   
Line 982  syncprov_qresp( opcookie *opc, syncops * Line 978  syncprov_qresp( opcookie *opc, syncops *
   
         /* Don't send changes back to their originator */          /* Don't send changes back to their originator */
         sid = slap_parse_csn_sid( &opc->sctxcsn );          sid = slap_parse_csn_sid( &opc->sctxcsn );
         if ( sid == so->s_sid )          if ( sid >= 0 && sid == so->s_sid )
                 return LDAP_SUCCESS;                  return LDAP_SUCCESS;
   
         sr = ch_malloc(sizeof(syncres) + opc->suuid.bv_len + 1 +          sr = ch_malloc(sizeof(syncres) + opc->suuid.bv_len + 1 +
Line 1031  syncprov_drop_psearch( syncops *so, int Line 1027  syncprov_drop_psearch( syncops *so, int
                         ldap_pvt_thread_mutex_lock( &so->s_op->o_conn->c_mutex );                          ldap_pvt_thread_mutex_lock( &so->s_op->o_conn->c_mutex );
                 so->s_op->o_conn->c_n_ops_executing--;                  so->s_op->o_conn->c_n_ops_executing--;
                 so->s_op->o_conn->c_n_ops_completed++;                  so->s_op->o_conn->c_n_ops_completed++;
                 LDAP_STAILQ_REMOVE( &so->s_op->o_conn->c_ops, so->s_op, slap_op,                  LDAP_STAILQ_REMOVE( &so->s_op->o_conn->c_ops, so->s_op, Operation,
                         o_next );                          o_next );
                 if ( lock )                  if ( lock )
                         ldap_pvt_thread_mutex_unlock( &so->s_op->o_conn->c_mutex );                          ldap_pvt_thread_mutex_unlock( &so->s_op->o_conn->c_mutex );
Line 1098  syncprov_matchops( Operation *op, opcook Line 1094  syncprov_matchops( Operation *op, opcook
   
         fbase_cookie fc;          fbase_cookie fc;
         syncops *ss, *sprev, *snext;          syncops *ss, *sprev, *snext;
         Entry *e;          Entry *e = NULL;
         Attribute *a;          Attribute *a;
         int rc;          int rc;
         struct berval newdn;          struct berval newdn;
Line 1120  syncprov_matchops( Operation *op, opcook Line 1116  syncprov_matchops( Operation *op, opcook
                         db = *op->o_bd;                          db = *op->o_bd;
                         op->o_bd = &db;                          op->o_bd = &db;
                 }                  }
                 op->o_bd->bd_info = (BackendInfo *)on->on_info;                  rc = overlay_entry_get_ov( op, fc.fdn, NULL, NULL, 0, &e, on );
                 rc = be_entry_get_rw( op, fc.fdn, NULL, NULL, 0, &e );  
                 /* If we're sending responses now, make a copy and unlock the DB */                  /* If we're sending responses now, make a copy and unlock the DB */
                 if ( e && !saveit ) {                  if ( e && !saveit ) {
                         Entry *e2 = entry_dup( e );                          Entry *e2 = entry_dup( e );
                         be_entry_release_rw( op, e, 0 );                          overlay_entry_release_ov( op, e, 0, on );
                         e = e2;                          e = e2;
                 }                  }
                 op->o_bd->bd_info = (BackendInfo *)on;  
                 if ( rc ) {                  if ( rc ) {
                         op->o_bd = b0;                          op->o_bd = b0;
                         return;                          return;
Line 1223  syncprov_matchops( Operation *op, opcook Line 1217  syncprov_matchops( Operation *op, opcook
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
   
         if ( op->o_tag != LDAP_REQ_ADD && e ) {          if ( op->o_tag != LDAP_REQ_ADD && e ) {
                 op->o_bd->bd_info = (BackendInfo *)on->on_info;                  if ( !SLAP_ISOVERLAY( op->o_bd )) {
                 be_entry_release_rw( op, e, 0 );                          op->o_bd = &db;
                 op->o_bd->bd_info = (BackendInfo *)on;                  }
                   overlay_entry_release_ov( op, e, 0, on );
                   op->o_bd = b0;
         }          }
         if ( freefdn ) {          if ( freefdn ) {
                 op->o_tmpfree( fc.fdn->bv_val, op->o_tmpmemctx );                  op->o_tmpfree( fc.fdn->bv_val, op->o_tmpmemctx );
Line 1285  syncprov_op_cleanup( Operation *op, Slap Line 1281  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 )
 {  {
     syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;          syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;
         Modifications mod;          Modifications mod;
         Operation opm;          Operation opm;
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
         slap_callback cb = {0};          slap_callback cb = {0};
   
           mod.sml_numvals = si->si_numcsns;
         mod.sml_values = si->si_ctxcsn;          mod.sml_values = 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 1308  syncprov_checkpoint( Operation *op, Slap Line 1305  syncprov_checkpoint( Operation *op, Slap
         opm.o_req_ndn = op->o_bd->be_nsuffix[0];          opm.o_req_ndn = op->o_bd->be_nsuffix[0];
         opm.o_bd->bd_info = on->on_info->oi_orig;          opm.o_bd->bd_info = on->on_info->oi_orig;
         opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;          opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;
           opm.o_no_schema_check = 1;
         opm.o_bd->be_modify( &opm, &rsm );          opm.o_bd->be_modify( &opm, &rsm );
         if ( mod.sml_next != NULL ) {          if ( mod.sml_next != NULL ) {
                 slap_mods_free( mod.sml_next, 1 );                  slap_mods_free( mod.sml_next, 1 );
         }          }
           opm.orm_no_opattrs = 0;
 }  }
   
 static void  static void
Line 1481  syncprov_playlog( Operation *op, SlapRep Line 1480  syncprov_playlog( Operation *op, SlapRep
                 SlapReply frs = { REP_RESULT };                  SlapReply frs = { REP_RESULT };
                 int rc;                  int rc;
                 Filter mf, af;                  Filter mf, af;
 #ifdef LDAP_COMP_MATCH                  AttributeAssertion eq = ATTRIBUTEASSERTION_INIT;
                 AttributeAssertion eq = { NULL, BER_BVNULL, NULL };  
 #else  
                 AttributeAssertion eq;  
 #endif  
                 slap_callback cb = {0};                  slap_callback cb = {0};
   
                 fop = *op;                  fop = *op;
Line 1555  syncprov_op_response( Operation *op, Sla Line 1550  syncprov_op_response( Operation *op, Sla
   
                 /* 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 ) ) {
                         int i, sid;                          int i, sid;
Line 1582  syncprov_op_response( Operation *op, Sla Line 1577  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 1598  syncprov_op_response( Operation *op, Sla Line 1593  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 ) {
                           ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
                         syncprov_checkpoint( op, rs, on );                          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 1661  syncprov_op_compare( Operation *op, Slap Line 1658  syncprov_op_compare( Operation *op, Slap
   
                 a.a_desc = slap_schema.si_ad_contextCSN;                  a.a_desc = slap_schema.si_ad_contextCSN;
   
                 ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                  ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
   
                 a.a_vals = si->si_ctxcsn;                  a.a_vals = si->si_ctxcsn;
                 a.a_nvals = a.a_vals;                  a.a_nvals = a.a_vals;
Line 1693  syncprov_op_compare( Operation *op, Slap Line 1690  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 1809  syncprov_search_cleanup( Operation *op, Line 1806  syncprov_search_cleanup( Operation *op,
         return 0;          return 0;
 }  }
   
   typedef struct SyncOperationBuffer {
           Operation               sob_op;
           Opheader                sob_hdr;
           AttributeName   sob_extra;      /* not always present */
           /* Further data allocated here */
   } SyncOperationBuffer;
   
 static void  static void
 syncprov_detach_op( Operation *op, syncops *so, slap_overinst *on )  syncprov_detach_op( Operation *op, syncops *so, slap_overinst *on )
 {  {
           SyncOperationBuffer *sopbuf2;
         Operation *op2;          Operation *op2;
         int i, alen = 0;          int i, alen = 0;
         size_t size;          size_t size;
Line 1823  syncprov_detach_op( Operation *op, synco Line 1828  syncprov_detach_op( Operation *op, synco
                 alen += op->ors_attrs[i].an_name.bv_len + 1;                  alen += op->ors_attrs[i].an_name.bv_len + 1;
         }          }
         /* Make a new copy of the operation */          /* Make a new copy of the operation */
         size = sizeof(Operation) + sizeof(Opheader) +          size = offsetof( SyncOperationBuffer, sob_extra ) +
                 (i ? ( (i+1) * sizeof(AttributeName) + alen) : 0) +                  (i ? ( (i+1) * sizeof(AttributeName) + alen) : 0) +
                 op->o_req_dn.bv_len + 1 +                  op->o_req_dn.bv_len + 1 +
                 op->o_req_ndn.bv_len + 1 +                  op->o_req_ndn.bv_len + 1 +
                 op->o_ndn.bv_len + 1 +                  op->o_ndn.bv_len + 1 +
                 so->s_filterstr.bv_len + 1;                  so->s_filterstr.bv_len + 1;
         op2 = (Operation *)ch_calloc( 1, size );          sopbuf2 = ch_calloc( 1, size );
         op2->o_hdr = (Opheader *)(op2+1);          op2 = &sopbuf2->sob_op;
           op2->o_hdr = &sopbuf2->sob_hdr;
   
         /* Copy the fields we care about explicitly, leave the rest alone */          /* Copy the fields we care about explicitly, leave the rest alone */
         *op2->o_hdr = *op->o_hdr;          *op2->o_hdr = *op->o_hdr;
Line 1840  syncprov_detach_op( Operation *op, synco Line 1846  syncprov_detach_op( Operation *op, synco
         op2->o_request = op->o_request;          op2->o_request = op->o_request;
         op2->o_private = on;          op2->o_private = on;
   
           ptr = (char *) sopbuf2 + offsetof( SyncOperationBuffer, sob_extra );
         if ( i ) {          if ( i ) {
                 op2->ors_attrs = (AttributeName *)(op2->o_hdr + 1);                  op2->ors_attrs = (AttributeName *) ptr;
                 ptr = (char *)(op2->ors_attrs+i+1);                  ptr = (char *) &op2->ors_attrs[i+1];
                 for (i=0; !BER_BVISNULL( &op->ors_attrs[i].an_name ); i++) {                  for (i=0; !BER_BVISNULL( &op->ors_attrs[i].an_name ); i++) {
                         op2->ors_attrs[i] = op->ors_attrs[i];                          op2->ors_attrs[i] = op->ors_attrs[i];
                         op2->ors_attrs[i].an_name.bv_val = ptr;                          op2->ors_attrs[i].an_name.bv_val = ptr;
                         ptr = lutil_strcopy( ptr, op->ors_attrs[i].an_name.bv_val ) + 1;                          ptr = lutil_strcopy( ptr, op->ors_attrs[i].an_name.bv_val ) + 1;
                 }                  }
                 BER_BVZERO( &op2->ors_attrs[i].an_name );                  BER_BVZERO( &op2->ors_attrs[i].an_name );
         } else {  
                 ptr = (char *)(op2->o_hdr + 1);  
         }          }
   
         op2->o_authz = op->o_authz;          op2->o_authz = op->o_authz;
         op2->o_ndn.bv_val = ptr;          op2->o_ndn.bv_val = ptr;
         ptr = lutil_strcopy(ptr, op->o_ndn.bv_val) + 1;          ptr = lutil_strcopy(ptr, op->o_ndn.bv_val) + 1;
Line 1928  syncprov_search_response( Operation *op, Line 1934  syncprov_search_response( Operation *op,
                         sid = slap_parse_csn_sid( &a->a_nvals[0] );                          sid = slap_parse_csn_sid( &a->a_nvals[0] );
   
                         /* Don't send changed entries back to the originator */                          /* Don't send changed entries back to the originator */
                         if ( sid == srs->sr_state.sid ) {                          if ( sid == srs->sr_state.sid && srs->sr_state.numcsns ) {
                                 Debug( LDAP_DEBUG_SYNC,                                  Debug( LDAP_DEBUG_SYNC,
                                         "Entry %s changed by peer, ignored\n",                                          "Entry %s changed by peer, ignored\n",
                                         rs->sr_entry->e_name.bv_val, 0, 0 );                                          rs->sr_entry->e_name.bv_val, 0, 0 );
Line 2066  syncprov_op_search( Operation *op, SlapR Line 2072  syncprov_op_search( Operation *op, SlapR
                 *sop = so;                  *sop = so;
                 ldap_pvt_thread_mutex_init( &sop->s_mutex );                  ldap_pvt_thread_mutex_init( &sop->s_mutex );
                 sop->s_rid = srs->sr_state.rid;                  sop->s_rid = srs->sr_state.rid;
                 sop->s_rid = srs->sr_state.sid;                  sop->s_sid = srs->sr_state.sid;
                 sop->s_inuse = 1;                  sop->s_inuse = 1;
   
                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );                  ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
Line 2076  syncprov_op_search( Operation *op, SlapR Line 2082  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 );
         numcsns = si->si_numcsns;          numcsns = si->si_numcsns;
         if ( numcsns ) {          if ( numcsns ) {
                 ber_bvarray_dup_x( &ctxcsn, si->si_ctxcsn, op->o_tmpmemctx );                  ber_bvarray_dup_x( &ctxcsn, si->si_ctxcsn, op->o_tmpmemctx );
Line 2087  syncprov_op_search( Operation *op, SlapR Line 2093  syncprov_op_search( Operation *op, SlapR
                 ctxcsn = NULL;                  ctxcsn = NULL;
                 sids = NULL;                  sids = NULL;
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_csn_mutex );          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                   
         /* If we have a cookie, handle the PRESENT lookups */          /* If we have a cookie, handle the PRESENT lookups */
         if ( srs->sr_state.ctxcsn ) {          if ( srs->sr_state.ctxcsn ) {
Line 2180  no_change:  nochange = 1; Line 2186  no_change:  nochange = 1;
                         /* No, so a reload is required */                          /* No, so a reload is required */
                         /* the 2.2 consumer doesn't send this hint */                          /* the 2.2 consumer doesn't send this hint */
                         if ( si->si_usehint && srs->sr_rhint == 0 ) {                          if ( si->si_usehint && srs->sr_rhint == 0 ) {
                                   if ( ctxcsn )
                                           ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );                                  send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
Line 2188  no_change:  nochange = 1; Line 2196  no_change:  nochange = 1;
                         /* If changed and doing Present lookup, send Present UUIDs */                          /* If changed and doing Present lookup, send Present UUIDs */
                         if ( do_present && syncprov_findcsn( op, FIND_PRESENT ) !=                          if ( do_present && syncprov_findcsn( op, FIND_PRESENT ) !=
                                 LDAP_SUCCESS ) {                                  LDAP_SUCCESS ) {
                                   if ( ctxcsn )
                                           ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 send_ldap_result( op, rs );                                  send_ldap_result( op, rs );
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
Line 2273  syncprov_operational( Line 2283  syncprov_operational(
                                         break;                                          break;
                         }                          }
   
                         ldap_pvt_thread_mutex_lock( &si->si_csn_mutex );                          ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock );
                         if ( si->si_ctxcsn ) {                          if ( si->si_ctxcsn ) {
                                 if ( !a ) {                                  if ( !a ) {
                                         for ( ap = &rs->sr_operational_attrs; *ap;                                          for ( ap = &rs->sr_operational_attrs; *ap;
Line 2291  syncprov_operational( Line 2301  syncprov_operational(
                                                 a = attr_find( rs->sr_entry->e_attrs,                                                  a = attr_find( rs->sr_entry->e_attrs,
                                                         slap_schema.si_ad_contextCSN );                                                          slap_schema.si_ad_contextCSN );
                                         }                                          }
                                         free( a->a_vals );                                          if ( a->a_nvals != a->a_vals ) {
                                                   ber_bvarray_free( a->a_nvals );
                                           }
                                           a->a_nvals = NULL;
                                           ber_bvarray_free( a->a_vals );
                                           a->a_vals = NULL;
                                           a->a_numvals = 0;
                                 }                                  }
                                 ber_bvarray_dup_x( &a->a_vals, si->si_ctxcsn, NULL );                                  attr_valadd( a, si->si_ctxcsn, si->si_ctxcsn, si->si_numcsns );
                                 a->a_nvals = a->a_vals;  
                         }                          }
                         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 2353  sp_cf_gen(ConfigArgs *c) Line 2368  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;
                                 bv.bv_len = sprintf( c->msg, "%d %d",                                  bv.bv_len = sprintf( c->cr_msg, "%d %d",
                                         si->si_chkops, si->si_chktime );                                          si->si_chkops, si->si_chktime );
                                 bv.bv_val = c->msg;                                  bv.bv_val = c->cr_msg;
                                 value_add_one( &c->rvalue_vals, &bv );                                  value_add_one( &c->rvalue_vals, &bv );
                         } else {                          } else {
                                 rc = 1;                                  rc = 1;
Line 2414  sp_cf_gen(ConfigArgs *c) Line 2429  sp_cf_gen(ConfigArgs *c)
         switch ( c->type ) {          switch ( c->type ) {
         case SP_CHKPT:          case SP_CHKPT:
                 if ( lutil_atoi( &si->si_chkops, c->argv[1] ) != 0 ) {                  if ( lutil_atoi( &si->si_chkops, c->argv[1] ) != 0 ) {
                         snprintf( c->msg, sizeof( c->msg ), "%s unable to parse checkpoint ops # \"%s\"",                          snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s unable to parse checkpoint ops # \"%s\"",
                                 c->argv[0], c->argv[1] );                                  c->argv[0], c->argv[1] );
                         Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,                          Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
                                 "%s: %s\n", c->log, c->msg, 0 );                                  "%s: %s\n", c->log, c->cr_msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 if ( si->si_chkops <= 0 ) {                  if ( si->si_chkops <= 0 ) {
                         snprintf( c->msg, sizeof( c->msg ), "%s invalid checkpoint ops # \"%d\"",                          snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s invalid checkpoint ops # \"%d\"",
                                 c->argv[0], si->si_chkops );                                  c->argv[0], si->si_chkops );
                         Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,                          Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
                                 "%s: %s\n", c->log, c->msg, 0 );                                  "%s: %s\n", c->log, c->cr_msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 if ( lutil_atoi( &si->si_chktime, c->argv[2] ) != 0 ) {                  if ( lutil_atoi( &si->si_chktime, c->argv[2] ) != 0 ) {
                         snprintf( c->msg, sizeof( c->msg ), "%s unable to parse checkpoint time \"%s\"",                          snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s unable to parse checkpoint time \"%s\"",
                                 c->argv[0], c->argv[1] );                                  c->argv[0], c->argv[1] );
                         Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,                          Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
                                 "%s: %s\n", c->log, c->msg, 0 );                                  "%s: %s\n", c->log, c->cr_msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 if ( si->si_chktime <= 0 ) {                  if ( si->si_chktime <= 0 ) {
                         snprintf( c->msg, sizeof( c->msg ), "%s invalid checkpoint time \"%d\"",                          snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s invalid checkpoint time \"%d\"",
                                 c->argv[0], si->si_chkops );                                  c->argv[0], si->si_chkops );
                         Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,                          Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
                                 "%s: %s\n", c->log, c->msg, 0 );                                  "%s: %s\n", c->log, c->cr_msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 si->si_chktime *= 60;                  si->si_chktime *= 60;
Line 2448  sp_cf_gen(ConfigArgs *c) Line 2463  sp_cf_gen(ConfigArgs *c)
                 int size = c->value_int;                  int size = c->value_int;
   
                 if ( size < 0 ) {                  if ( size < 0 ) {
                         snprintf( c->msg, sizeof( c->msg ), "%s size %d is negative",                          snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s size %d is negative",
                                 c->argv[0], size );                                  c->argv[0], size );
                         Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,                          Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE,
                                 "%s: %s\n", c->log, c->msg, 0 );                                  "%s: %s\n", c->log, c->cr_msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 sl = si->si_logs;                  sl = si->si_logs;
Line 2495  syncprov_db_otask( Line 2510  syncprov_db_otask(
  */   */
 static int  static int
 syncprov_db_open(  syncprov_db_open(
     BackendDB *be          BackendDB *be,
           ConfigReply *cr
 )  )
 {  {
         slap_overinst   *on = (slap_overinst *) be->bd_info;          slap_overinst   *on = (slap_overinst *) be->bd_info;
         syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;          syncprov_info_t *si = (syncprov_info_t *)on->on_bi.bi_private;
   
         Connection conn = { 0 };          Connection conn = { 0 };
         OperationBuffer opbuf = { 0 };          OperationBuffer opbuf;
         Operation *op = (Operation *) &opbuf;          Operation *op;
         Entry *e;          Entry *e = NULL;
         Attribute *a;          Attribute *a;
         int rc;          int rc;
         void *thrctx = NULL;          void *thrctx = NULL;
Line 2525  syncprov_db_open( Line 2541  syncprov_db_open(
         }          }
   
         thrctx = ldap_pvt_thread_pool_context();          thrctx = ldap_pvt_thread_pool_context();
         connection_fake_init( &conn, op, thrctx );          connection_fake_init( &conn, &opbuf, thrctx );
           op = &opbuf.ob_op;
         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;
   
         op->o_bd->bd_info = on->on_info->oi_orig;          rc = overlay_entry_get_ov( op, be->be_nsuffix, NULL,
         rc = be_entry_get_rw( op, be->be_nsuffix, NULL,                  slap_schema.si_ad_contextCSN, 0, &e, on );
                 slap_schema.si_ad_contextCSN, 0, &e );  
   
         if ( e ) {          if ( e ) {
                 ldap_pvt_thread_t tid;                  ldap_pvt_thread_t tid;
   
                 a = attr_find( e->e_attrs, slap_schema.si_ad_contextCSN );                  a = attr_find( e->e_attrs, slap_schema.si_ad_contextCSN );
                 if ( a ) {                  if ( a ) {
                         int i;  
                         ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL );                          ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL );
                         for ( i=0; !BER_BVISEMPTY( &a->a_vals[i] ); i++ );                          si->si_numcsns = a->a_numvals;
                         si->si_numcsns = i;                          si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, a->a_numvals, NULL );
                         si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, i );  
                 }                  }
                 be_entry_release_rw( op, e, 0 );                  overlay_entry_release_ov( op, e, 0, on );
                 if ( si->si_ctxcsn ) {                  if ( si->si_ctxcsn ) {
                         op->o_bd->bd_info = (BackendInfo *)on;  
                         op->o_req_dn = be->be_suffix[0];                          op->o_req_dn = be->be_suffix[0];
                         op->o_req_ndn = be->be_nsuffix[0];                          op->o_req_ndn = be->be_nsuffix[0];
                         op->ors_scope = LDAP_SCOPE_SUBTREE;                          op->ors_scope = LDAP_SCOPE_SUBTREE;
Line 2589  out: Line 2602  out:
  */   */
 static int  static int
 syncprov_db_close(  syncprov_db_close(
     BackendDB *be          BackendDB *be,
           ConfigReply *cr
 )  )
 {  {
     slap_overinst   *on = (slap_overinst *) be->bd_info;      slap_overinst   *on = (slap_overinst *) be->bd_info;
Line 2599  syncprov_db_close( Line 2613  syncprov_db_close(
                 return 0;                  return 0;
         }          }
         if ( si->si_numops ) {          if ( si->si_numops ) {
                 Connection conn;                  Connection conn = {0};
                 OperationBuffer opbuf;                  OperationBuffer opbuf;
                 Operation *op = (Operation *) &opbuf;                  Operation *op;
                 SlapReply rs = {REP_RESULT};                  SlapReply rs = {REP_RESULT};
                 void *thrctx;                  void *thrctx;
   
                 thrctx = ldap_pvt_thread_pool_context();                  thrctx = ldap_pvt_thread_pool_context();
                 connection_fake_init( &conn, op, thrctx );                  connection_fake_init( &conn, &opbuf, thrctx );
                   op = &opbuf.ob_op;
                 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;
Line 2618  syncprov_db_close( Line 2633  syncprov_db_close(
   
 static int  static int
 syncprov_db_init(  syncprov_db_init(
         BackendDB *be          BackendDB *be,
           ConfigReply *cr
 )  )
 {  {
         slap_overinst   *on = (slap_overinst *)be->bd_info;          slap_overinst   *on = (slap_overinst *)be->bd_info;
Line 2633  syncprov_db_init( Line 2649  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 );
   
Line 2650  syncprov_db_init( Line 2666  syncprov_db_init(
   
 static int  static int
 syncprov_db_destroy(  syncprov_db_destroy(
         BackendDB *be          BackendDB *be,
           ConfigReply *cr
 )  )
 {  {
         slap_overinst   *on = (slap_overinst *)be->bd_info;          slap_overinst   *on = (slap_overinst *)be->bd_info;
Line 2668  syncprov_db_destroy( Line 2685  syncprov_db_destroy(
                                                                   
                         ch_free( si->si_logs );                          ch_free( si->si_logs );
                 }                  }
                   if ( si->si_ctxcsn )
                           ber_bvarray_free( si->si_ctxcsn );
                   if ( si->si_sids )
                           ch_free( si->si_sids );
                 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 );
         }          }
   
Line 2701  static int syncprov_parseCtrl ( Line 2722  static int syncprov_parseCtrl (
                 return LDAP_PROTOCOL_ERROR;                  return LDAP_PROTOCOL_ERROR;
         }          }
   
           if ( BER_BVISNULL( &ctrl->ldctl_value ) ) {
                   rs->sr_text = "Sync control value is absent";
                   return LDAP_PROTOCOL_ERROR;
           }
   
         if ( BER_BVISEMPTY( &ctrl->ldctl_value ) ) {          if ( BER_BVISEMPTY( &ctrl->ldctl_value ) ) {
                 rs->sr_text = "Sync control value is empty (or absent)";                  rs->sr_text = "Sync control value is empty";
                 return LDAP_PROTOCOL_ERROR;                  return LDAP_PROTOCOL_ERROR;
         }          }
   
Line 2760  static int syncprov_parseCtrl ( Line 2786  static int syncprov_parseCtrl (
         sr->sr_rhint = rhint;          sr->sr_rhint = rhint;
         if (!BER_BVISNULL(&cookie)) {          if (!BER_BVISNULL(&cookie)) {
                 ber_dupbv_x( &sr->sr_state.octet_str, &cookie, op->o_tmpmemctx );                  ber_dupbv_x( &sr->sr_state.octet_str, &cookie, op->o_tmpmemctx );
                 slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx );                  if ( slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx ) ||
                 if ( sr->sr_state.rid == -1 ) {                          sr->sr_state.rid == -1 ) {
                         rs->sr_text = "Sync control : cookie parsing error";                          rs->sr_text = "Sync control : cookie parsing error";
                         return LDAP_PROTOCOL_ERROR;                          return LDAP_PROTOCOL_ERROR;
                 }                  }

Removed from v.1.173  
changed lines
  Added in v.1.199


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