Diff for /servers/slapd/overlays/syncprov.c between versions 1.56.2.27 and 1.120

version 1.56.2.27, 2006/01/23 23:52:17 version 1.120, 2005/10/15 01:27:05
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.56.2.26 2006/01/03 22:16:25 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.119 2005/10/14 22:31:22 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/>.
  *   *
  * Copyright 2004-2006 The OpenLDAP Foundation.   * Copyright 2004-2005 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 383  findbase_cb( Operation *op, SlapReply *r Line 383  findbase_cb( Operation *op, SlapReply *r
         return LDAP_SUCCESS;          return LDAP_SUCCESS;
 }  }
   
 static Filter generic_filter = { LDAP_FILTER_PRESENT, { 0 }, NULL };  
 static struct berval generic_filterstr = BER_BVC("(objectclass=*)");  
   
 static int  static int
 syncprov_findbase( Operation *op, fbase_cookie *fc )  syncprov_findbase( Operation *op, fbase_cookie *fc )
 {  {
Line 425  syncprov_findbase( Operation *op, fbase_ Line 422  syncprov_findbase( Operation *op, fbase_
                 fop.ors_tlimit = SLAP_NO_LIMIT;                  fop.ors_tlimit = SLAP_NO_LIMIT;
                 fop.ors_attrs = slap_anlist_no_attrs;                  fop.ors_attrs = slap_anlist_no_attrs;
                 fop.ors_attrsonly = 1;                  fop.ors_attrsonly = 1;
                 fop.ors_filter = &generic_filter;  
                 fop.ors_filterstr = generic_filterstr;  
   
                 fop.o_bd->bd_info = on->on_info->oi_orig;                  fop.o_bd->bd_info = on->on_info->oi_orig;
                 rc = fop.o_bd->be_search( &fop, &frs );                  rc = fop.o_bd->be_search( &fop, &frs );
Line 450  syncprov_findbase( Operation *op, fbase_ Line 445  syncprov_findbase( Operation *op, fbase_
                 case LDAP_SCOPE_SUBTREE:                  case LDAP_SCOPE_SUBTREE:
                         fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base );                          fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base );
                         break;                          break;
   #ifdef LDAP_SCOPE_SUBORDINATE
                 case LDAP_SCOPE_SUBORDINATE:                  case LDAP_SCOPE_SUBORDINATE:
                         fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ) &&                          fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ) &&
                                 !dn_match( fc->fdn, &fc->fss->s_base );                                  !dn_match( fc->fdn, &fc->fss->s_base );
                         break;                          break;
   #endif
                 }                  }
         }          }
   
Line 481  syncprov_findbase( Operation *op, fbase_ Line 478  syncprov_findbase( Operation *op, fbase_
  * CSN, and generate Present records for them. We always collect this result   * CSN, and generate Present records for them. We always collect this result
  * in SyncID sets, even if there's only one match.   * in SyncID sets, even if there's only one match.
  */   */
 typedef enum find_csn_t {  #define FIND_MAXCSN     1
         FIND_MAXCSN     = 1,  #define FIND_CSN        2
         FIND_CSN        = 2,  #define FIND_PRESENT    3
         FIND_PRESENT    = 3  
 } find_csn_t;  
   
 static int  static int
 findmax_cb( Operation *op, SlapReply *rs )  findmax_cb( Operation *op, SlapReply *rs )
Line 508  findcsn_cb( Operation *op, SlapReply *rs Line 503  findcsn_cb( Operation *op, SlapReply *rs
 {  {
         slap_callback *sc = op->o_callback;          slap_callback *sc = op->o_callback;
   
         /* We just want to know that at least one exists, so it's OK if          if ( rs->sr_type == REP_SEARCH && rs->sr_err == LDAP_SUCCESS ) {
          * we exceed the unchecked limit.  
          */  
         if ( rs->sr_err == LDAP_ADMINLIMIT_EXCEEDED ||  
                 (rs->sr_type == REP_SEARCH && rs->sr_err == LDAP_SUCCESS )) {  
                 sc->sc_private = (void *)1;                  sc->sc_private = (void *)1;
         }          }
         return LDAP_SUCCESS;          return LDAP_SUCCESS;
Line 568  findpres_cb( Operation *op, SlapReply *r Line 559  findpres_cb( Operation *op, SlapReply *r
 }  }
   
 static int  static int
 syncprov_findcsn( Operation *op, find_csn_t mode )  syncprov_findcsn( Operation *op, int mode )
 {  {
         slap_overinst           *on = (slap_overinst *)op->o_bd->bd_info;          slap_overinst           *on = (slap_overinst *)op->o_bd->bd_info;
         syncprov_info_t         *si = on->on_bi.bi_private;          syncprov_info_t         *si = on->on_bi.bi_private;
Line 585  syncprov_findcsn( Operation *op, find_cs Line 576  syncprov_findcsn( Operation *op, find_cs
 #else  #else
         AttributeAssertion eq = { NULL, BER_BVNULL };          AttributeAssertion eq = { NULL, BER_BVNULL };
 #endif  #endif
           int i, rc = LDAP_SUCCESS;
         fpres_cookie pcookie;          fpres_cookie pcookie;
         sync_control *srs = NULL;          sync_control *srs = NULL;
         struct slap_limits_set fc_limits;          int findcsn_retry = 1;
         int i, rc = LDAP_SUCCESS, findcsn_retry = 1;  
   
         if ( mode != FIND_MAXCSN ) {          if ( mode != FIND_MAXCSN ) {
                 srs = op->o_controls[slap_cids.sc_LDAPsync];                  srs = op->o_controls[slap_cids.sc_LDAPsync];
Line 639  again: Line 630  again:
                 /* On retry, look for <= */                  /* On retry, look for <= */
                 } else {                  } else {
                         cf.f_choice = LDAP_FILTER_LE;                          cf.f_choice = LDAP_FILTER_LE;
                         fop.ors_limit = &fc_limits;  
                         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 740  syncprov_free_syncop( syncops *so ) Line 729  syncprov_free_syncop( syncops *so )
   
 /* Send a persistent search response */  /* Send a persistent search response */
 static int  static int
 syncprov_sendresp( Operation *op, opcookie *opc, syncops *so,  syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode)
         Entry **e, int mode )  
 {  {
         slap_overinst *on = opc->son;          slap_overinst *on = opc->son;
   
Line 1226  syncprov_checkpoint( Operation *op, Slap Line 1214  syncprov_checkpoint( Operation *op, Slap
         syncprov_info_t         *si = on->on_bi.bi_private;          syncprov_info_t         *si = on->on_bi.bi_private;
         Modifications mod;          Modifications mod;
         Operation opm;          Operation opm;
         SlapReply rsm = { 0 };  
         struct berval bv[2];          struct berval bv[2];
         slap_callback cb = {0};          slap_callback cb = {0};
           int manage = get_manageDSAit(op);
   
         mod.sml_values = bv;          mod.sml_values = bv;
         bv[1].bv_val = NULL;          bv[1].bv_val = NULL;
Line 1248  syncprov_checkpoint( Operation *op, Slap Line 1236  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;
         SLAP_DBFLAGS( opm.o_bd ) |= SLAP_DBFLAG_NOLASTMOD;          opm.o_bd->be_modify( &opm, rs );
         opm.o_bd->be_modify( &opm, &rsm );          opm.o_managedsait = manage;
         SLAP_DBFLAGS( opm.o_bd ) ^= SLAP_DBFLAG_NOLASTMOD;  
         if ( mod.sml_next != NULL ) {  
                 slap_mods_free( mod.sml_next, 1 );  
         }  
 }  }
   
 static void  static void
Line 1429  syncprov_playlog( Operation *op, SlapRep Line 1413  syncprov_playlog( Operation *op, SlapRep
                         mf.f_av_value = uuids[i];                          mf.f_av_value = uuids[i];
                         cb.sc_private = NULL;                          cb.sc_private = NULL;
                         fop.ors_slimit = 1;                          fop.ors_slimit = 1;
                         frs.sr_nentries = 0;  
                         rc = fop.o_bd->be_search( &fop, &frs );                          rc = fop.o_bd->be_search( &fop, &frs );
   
                         /* If entry was not found, add to delete list */                          /* If entry was not found, add to delete list */
Line 1757  syncprov_detach_op( Operation *op, synco Line 1740  syncprov_detach_op( Operation *op, synco
         op2->ors_filterstr.bv_val = ptr;          op2->ors_filterstr.bv_val = ptr;
         strcpy( ptr, so->s_filterstr.bv_val );          strcpy( ptr, so->s_filterstr.bv_val );
         op2->ors_filterstr.bv_len = so->s_filterstr.bv_len;          op2->ors_filterstr.bv_len = so->s_filterstr.bv_len;
         op2->ors_filter = filter_dup( op->ors_filter, NULL );          op2->ors_filter = str2filter( ptr );
         so->s_op = op2;          so->s_op = op2;
   
         /* Copy any cached group ACLs individually */          /* Copy any cached group ACLs individually */
Line 1801  syncprov_search_response( Operation *op, Line 1784  syncprov_search_response( Operation *op,
                         return SLAP_CB_CONTINUE;                          return SLAP_CB_CONTINUE;
                 }                  }
                 a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN );                  a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_entryCSN );
                 if ( a == NULL && rs->sr_operational_attrs != NULL ) {  
                         a = attr_find( rs->sr_operational_attrs, slap_schema.si_ad_entryCSN );  
                 }  
                 if ( a ) {                  if ( a ) {
                         /* Make sure entry is less than the snaphot'd contextCSN */                          /* Make sure entry is less than the snaphot'd contextCSN */
                         if ( ber_bvcmp( &a->a_nvals[0], &ss->ss_ctxcsn ) > 0 )                          if ( ber_bvcmp( &a->a_nvals[0], &ss->ss_ctxcsn ) > 0 )
Line 2197  sp_cf_gen(ConfigArgs *c) Line 2177  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 ) {                  si->si_chkops = atoi( c->argv[1] );
                         sprintf( c->msg, "%s unable to parse checkpoint ops # \"%s\"",                  si->si_chktime = atoi( c->argv[2] ) * 60;
                                 c->argv[0], c->argv[1] );  
                         Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );  
                         return ARG_BAD_CONF;  
                 }  
                 if ( si->si_chkops <= 0 ) {  
                         sprintf( c->msg, "%s invalid checkpoint ops # \"%d\"",  
                                 c->argv[0], si->si_chkops );  
                         Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );  
                         return ARG_BAD_CONF;  
                 }  
                 if ( lutil_atoi( &si->si_chktime, c->argv[2] ) != 0 ) {  
                         sprintf( c->msg, "%s unable to parse checkpoint time \"%s\"",  
                                 c->argv[0], c->argv[1] );  
                         Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );  
                         return ARG_BAD_CONF;  
                 }  
                 if ( si->si_chktime <= 0 ) {  
                         sprintf( c->msg, "%s invalid checkpoint time \"%d\"",  
                                 c->argv[0], si->si_chkops );  
                         Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );  
                         return ARG_BAD_CONF;  
                 }  
                 si->si_chktime *= 60;  
                 break;                  break;
         case SP_SESSL: {          case SP_SESSL: {
                 sessionlog *sl;                  sessionlog *sl;
Line 2280  syncprov_db_open( Line 2237  syncprov_db_open(
         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;
         OperationBuffer opbuf = { 0 };          OperationBuffer opbuf;
         char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];          char ctxcsnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
         Operation *op = (Operation *) &opbuf;          Operation *op = (Operation *) &opbuf;
         Entry *e;          Entry *e;
Line 2324  syncprov_db_open( Line 2281  syncprov_db_open(
                         strcpy( ctxcsnbuf, si->si_ctxcsnbuf );                          strcpy( ctxcsnbuf, si->si_ctxcsnbuf );
                 }                  }
                 be_entry_release_rw( op, e, 0 );                  be_entry_release_rw( op, e, 0 );
                 if ( !BER_BVISEMPTY( &si->si_ctxcsn ) ) {                  op->o_bd->bd_info = (BackendInfo *)on;
                         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;                  ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op );
                         ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op );                  ldap_pvt_thread_join( tid, NULL );
                         ldap_pvt_thread_join( tid, NULL );  
                 }  
         } else if ( SLAP_SYNC_SHADOW( op->o_bd )) {          } else if ( SLAP_SYNC_SHADOW( op->o_bd )) {
                 /* If we're also a consumer, and we didn't find the context entry,                  /* If we're also a consumer, and we didn't find the context entry,
                  * then don't generate anything, wait for our provider to send it                   * then don't generate anything, wait for our provider to send it
Line 2425  syncprov_db_destroy( Line 2380  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 ) {
                 if ( si->si_logs ) {  
                         ch_free( si->si_logs );  
                 }  
                 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_mutex_destroy( &si->si_csn_mutex );
Line 2546  static int syncprov_parseCtrl ( Line 2498  static int syncprov_parseCtrl (
 static slap_overinst            syncprov;  static slap_overinst            syncprov;
   
 int  int
 syncprov_initialize()  syncprov_init()
 {  {
         int rc;          int rc;
   
         rc = register_supported_control( LDAP_CONTROL_SYNC,          rc = register_supported_control( LDAP_CONTROL_SYNC,
                 SLAP_CTRL_SEARCH, NULL,                  SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,
                 syncprov_parseCtrl, &slap_cids.sc_LDAPsync );                  syncprov_parseCtrl, &slap_cids.sc_LDAPsync );
         if ( rc != LDAP_SUCCESS ) {          if ( rc != LDAP_SUCCESS ) {
                 Debug( LDAP_DEBUG_ANY,                  Debug( LDAP_DEBUG_ANY,
Line 2579  syncprov_initialize() Line 2531  syncprov_initialize()
   
         syncprov.on_bi.bi_cf_ocs = spocs;          syncprov.on_bi.bi_cf_ocs = spocs;
   
         generic_filter.f_desc = slap_schema.si_ad_objectClass;  
   
         rc = config_register_schema( spcfg, spocs );          rc = config_register_schema( spcfg, spocs );
         if ( rc ) return rc;          if ( rc ) return rc;
   
Line 2591  syncprov_initialize() Line 2541  syncprov_initialize()
 int  int
 init_module( int argc, char *argv[] )  init_module( int argc, char *argv[] )
 {  {
         return syncprov_initialize();          return syncprov_init();
 }  }
 #endif /* SLAPD_OVER_SYNCPROV == SLAPD_MOD_DYNAMIC */  #endif /* SLAPD_OVER_SYNCPROV == SLAPD_MOD_DYNAMIC */
   

Removed from v.1.56.2.27  
changed lines
  Added in v.1.120


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