Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.10 and 1.187

version 1.147.2.10, 2007/09/29 09:55:22 version 1.187, 2007/05/14 19:25:48
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.9 2007/09/27 21:38:26 ralf Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.186 2007/04/20 20:32:58 kurt 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 585  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;
         AttributeAssertion eq = ATTRIBUTEASSERTION_INIT;  #ifdef LDAP_COMP_MATCH
           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 655  again: Line 659  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 893  syncprov_qtask( void *ctx, void *arg ) Line 896  syncprov_qtask( void *ctx, void *arg )
         BackendDB be;          BackendDB be;
         int rc;          int rc;
   
         op = &opbuf.ob_op;          op = (Operation *) &opbuf;
         *op = *so->s_op;          *op = *so->s_op;
         op->o_hdr = &opbuf.ob_hdr;          op->o_hdr = (Opheader *)(op+1);
         op->o_controls = opbuf.ob_controls;          op->o_controls = (void **)(op->o_hdr+1);
         memset( op->o_controls, 0, sizeof(opbuf.ob_controls) );          memset( op->o_controls, 0, SLAP_MAX_CIDS * sizeof(void *));
   
         *op->o_hdr = *so->s_op->o_hdr;          *op->o_hdr = *so->s_op->o_hdr;
   
Line 1281  syncprov_op_cleanup( Operation *op, Slap Line 1284  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 1310  syncprov_checkpoint( Operation *op, Slap Line 1312  syncprov_checkpoint( Operation *op, Slap
         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 1480  syncprov_playlog( Operation *op, SlapRep Line 1481  syncprov_playlog( Operation *op, SlapRep
                 SlapReply frs = { REP_RESULT };                  SlapReply frs = { REP_RESULT };
                 int rc;                  int rc;
                 Filter mf, af;                  Filter mf, af;
                 AttributeAssertion eq = ATTRIBUTEASSERTION_INIT;  #ifdef LDAP_COMP_MATCH
                   AttributeAssertion eq = { NULL, BER_BVNULL, NULL };
   #else
                   AttributeAssertion eq;
   #endif
                 slap_callback cb = {0};                  slap_callback cb = {0};
   
                 fop = *op;                  fop = *op;
Line 1680  syncprov_op_compare( Operation *op, Slap Line 1685  syncprov_op_compare( Operation *op, Slap
   
                 rs->sr_err = LDAP_COMPARE_FALSE;                  rs->sr_err = LDAP_COMPARE_FALSE;
   
                 if ( attr_valfind( &a,                  if ( value_find_ex( op->oq_compare.rs_ava->aa_desc,
                         SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH |                          SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH |
                                 SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH,                                  SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH,
                                 &op->oq_compare.rs_ava->aa_value, NULL, op->o_tmpmemctx ) == 0 )                                  a.a_nvals, &op->oq_compare.rs_ava->aa_value, op->o_tmpmemctx ) == 0 )
                 {                  {
                         rs->sr_err = LDAP_COMPARE_TRUE;                          rs->sr_err = LDAP_COMPARE_TRUE;
                 }                  }
Line 1806  syncprov_search_cleanup( Operation *op, Line 1811  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 1828  syncprov_detach_op( Operation *op, synco Line 1825  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 = offsetof( SyncOperationBuffer, sob_extra ) +          size = sizeof(Operation) + sizeof(Opheader) +
                 (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;
         sopbuf2 = ch_calloc( 1, size );          op2 = (Operation *)ch_calloc( 1, size );
         op2 = &sopbuf2->sob_op;          op2->o_hdr = (Opheader *)(op2+1);
         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 1846  syncprov_detach_op( Operation *op, synco Line 1842  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 *) ptr;                  op2->ors_attrs = (AttributeName *)(op2->o_hdr + 1);
                 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 2301  syncprov_operational( Line 2297  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 );
                                         }                                          }
                                         if ( a->a_nvals != a->a_vals ) {                                          free( 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;  
                                 }                                  }
                                 attr_valadd( a, si->si_ctxcsn, si->si_ctxcsn, si->si_numcsns );                                  ber_bvarray_dup_x( &a->a_vals, si->si_ctxcsn, NULL );
                                   a->a_nvals = a->a_vals;
                         }                          }
                         ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );                          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
Line 2368  sp_cf_gen(ConfigArgs *c) Line 2359  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->cr_msg, "%d %d",                                  bv.bv_len = sprintf( c->msg, "%d %d",
                                         si->si_chkops, si->si_chktime );                                          si->si_chkops, si->si_chktime );
                                 bv.bv_val = c->cr_msg;                                  bv.bv_val = c->msg;
                                 value_add_one( &c->rvalue_vals, &bv );                                  value_add_one( &c->rvalue_vals, &bv );
                         } else {                          } else {
                                 rc = 1;                                  rc = 1;
Line 2429  sp_cf_gen(ConfigArgs *c) Line 2420  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->cr_msg, sizeof( c->cr_msg ), "%s unable to parse checkpoint ops # \"%s\"",                          snprintf( c->msg, sizeof( c->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->cr_msg, 0 );                                  "%s: %s\n", c->log, c->msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 if ( si->si_chkops <= 0 ) {                  if ( si->si_chkops <= 0 ) {
                         snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s invalid checkpoint ops # \"%d\"",                          snprintf( c->msg, sizeof( c->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->cr_msg, 0 );                                  "%s: %s\n", c->log, c->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->cr_msg, sizeof( c->cr_msg ), "%s unable to parse checkpoint time \"%s\"",                          snprintf( c->msg, sizeof( c->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->cr_msg, 0 );                                  "%s: %s\n", c->log, c->msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 if ( si->si_chktime <= 0 ) {                  if ( si->si_chktime <= 0 ) {
                         snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s invalid checkpoint time \"%d\"",                          snprintf( c->msg, sizeof( c->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->cr_msg, 0 );                                  "%s: %s\n", c->log, c->msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 si->si_chktime *= 60;                  si->si_chktime *= 60;
Line 2463  sp_cf_gen(ConfigArgs *c) Line 2454  sp_cf_gen(ConfigArgs *c)
                 int size = c->value_int;                  int size = c->value_int;
   
                 if ( size < 0 ) {                  if ( size < 0 ) {
                         snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s size %d is negative",                          snprintf( c->msg, sizeof( c->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->cr_msg, 0 );                                  "%s: %s\n", c->log, c->msg, 0 );
                         return ARG_BAD_CONF;                          return ARG_BAD_CONF;
                 }                  }
                 sl = si->si_logs;                  sl = si->si_logs;
Line 2510  syncprov_db_otask( Line 2501  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;          OperationBuffer opbuf = { 0 };
         Operation *op;          Operation *op = (Operation *) &opbuf;
         Entry *e = NULL;          Entry *e = NULL;
         Attribute *a;          Attribute *a;
         int rc;          int rc;
Line 2541  syncprov_db_open( Line 2531  syncprov_db_open(
         }          }
   
         thrctx = ldap_pvt_thread_pool_context();          thrctx = ldap_pvt_thread_pool_context();
         connection_fake_init( &conn, &opbuf, thrctx );          connection_fake_init( &conn, op, 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 2555  syncprov_db_open( Line 2544  syncprov_db_open(
   
                 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 );
                         si->si_numcsns = a->a_numvals;                          for ( i = 0; !BER_BVISNULL( &a->a_vals[i] ); i++ );
                         si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, a->a_numvals, NULL );                          si->si_numcsns = i;
                           si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, i, NULL );
                 }                  }
                 overlay_entry_release_ov( op, e, 0, on );                  overlay_entry_release_ov( op, e, 0, on );
                 if ( si->si_ctxcsn ) {                  if ( si->si_ctxcsn ) {
Line 2602  out: Line 2593  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 2613  syncprov_db_close( Line 2603  syncprov_db_close(
                 return 0;                  return 0;
         }          }
         if ( si->si_numops ) {          if ( si->si_numops ) {
                 Connection conn = {0};                  Connection conn;
                 OperationBuffer opbuf;                  OperationBuffer opbuf;
                 Operation *op;                  Operation *op = (Operation *) &opbuf;
                 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, &opbuf, thrctx );                  connection_fake_init( &conn, op, 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 2633  syncprov_db_close( Line 2622  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 2666  syncprov_db_init( Line 2654  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 2786  static int syncprov_parseCtrl ( Line 2773  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 );
                 if ( slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx ) ||                  slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx );
                         sr->sr_state.rid == -1 ) {                  if ( 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.147.2.10  
changed lines
  Added in v.1.187


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