Diff for /servers/slapd/overlays/syncprov.c between versions 1.56.2.6 and 1.56.2.9

version 1.56.2.6, 2005/04/29 21:29:10 version 1.56.2.9, 2005/07/11 05:55:33
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.56.2.5 2005/03/14 22:25:02 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.88 2005/07/10 08:20:21 hallvard 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 25 Line 25
 #include <ac/string.h>  #include <ac/string.h>
 #include "lutil.h"  #include "lutil.h"
 #include "slap.h"  #include "slap.h"
   #include "config.h"
   
 /* A modify request on a particular entry */  /* A modify request on a particular entry */
 typedef struct modinst {  typedef struct modinst {
Line 547  syncprov_findcsn( Operation *op, int mod Line 548  syncprov_findcsn( Operation *op, int mod
         SlapReply frs = { REP_RESULT };          SlapReply frs = { REP_RESULT };
         char buf[LDAP_LUTIL_CSNSTR_BUFSIZE + STRLENOF("(entryCSN<=)")];          char buf[LDAP_LUTIL_CSNSTR_BUFSIZE + STRLENOF("(entryCSN<=)")];
         char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];          char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
         struct berval fbuf, maxcsn;          struct berval maxcsn;
         Filter cf, af;          Filter cf, af;
 #ifdef LDAP_COMP_MATCH  #ifdef LDAP_COMP_MATCH
         AttributeAssertion eq = { NULL, BER_BVNULL, NULL };          AttributeAssertion eq = { NULL, BER_BVNULL, NULL };
Line 571  syncprov_findcsn( Operation *op, int mod Line 572  syncprov_findcsn( Operation *op, int mod
         /* We want pure entries, not referrals */          /* We want pure entries, not referrals */
         fop.o_managedsait = SLAP_CONTROL_CRITICAL;          fop.o_managedsait = SLAP_CONTROL_CRITICAL;
   
         fbuf.bv_val = buf;  
         cf.f_ava = &eq;          cf.f_ava = &eq;
         cf.f_av_desc = slap_schema.si_ad_entryCSN;          cf.f_av_desc = slap_schema.si_ad_entryCSN;
         cf.f_next = NULL;          cf.f_next = NULL;
Line 580  syncprov_findcsn( Operation *op, int mod Line 580  syncprov_findcsn( Operation *op, int mod
         fop.ors_limit = NULL;          fop.ors_limit = NULL;
         fop.ors_tlimit = SLAP_NO_LIMIT;          fop.ors_tlimit = SLAP_NO_LIMIT;
         fop.ors_filter = &cf;          fop.ors_filter = &cf;
         fop.ors_filterstr = fbuf;          fop.ors_filterstr.bv_val = buf;
   
         switch( mode ) {          switch( mode ) {
         case FIND_MAXCSN:          case FIND_MAXCSN:
                 cf.f_choice = LDAP_FILTER_GE;                  cf.f_choice = LDAP_FILTER_GE;
                 cf.f_av_value = si->si_ctxcsn;                  cf.f_av_value = si->si_ctxcsn;
                 fbuf.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 );
                 fop.ors_attrsonly = 0;                  fop.ors_attrsonly = 0;
                 fop.ors_attrs = csn_anlist;                  fop.ors_attrs = csn_anlist;
Line 600  syncprov_findcsn( Operation *op, int mod Line 600  syncprov_findcsn( Operation *op, int mod
         case FIND_CSN:          case FIND_CSN:
                 cf.f_choice = LDAP_FILTER_LE;                  cf.f_choice = LDAP_FILTER_LE;
                 cf.f_av_value = srs->sr_state.ctxcsn;                  cf.f_av_value = srs->sr_state.ctxcsn;
                 fbuf.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 );
                 fop.ors_attrsonly = 1;                  fop.ors_attrsonly = 1;
                 fop.ors_attrs = slap_anlist_no_attrs;                  fop.ors_attrs = slap_anlist_no_attrs;
Line 1074  syncprov_matchops( Operation *op, opcook Line 1074  syncprov_matchops( Operation *op, opcook
                 }                  }
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
 done:  
         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;                  op->o_bd->bd_info = (BackendInfo *)on->on_info;
                 be_entry_release_rw( op, e, 0 );                  be_entry_release_rw( op, e, 0 );
Line 1150  syncprov_checkpoint( Operation *op, Slap Line 1150  syncprov_checkpoint( Operation *op, Slap
         mod.sml_nvalues = NULL;          mod.sml_nvalues = NULL;
         mod.sml_desc = slap_schema.si_ad_contextCSN;          mod.sml_desc = slap_schema.si_ad_contextCSN;
         mod.sml_op = LDAP_MOD_REPLACE;          mod.sml_op = LDAP_MOD_REPLACE;
           mod.sml_flags = 0;
         mod.sml_next = NULL;          mod.sml_next = NULL;
   
         cb.sc_response = slap_null_cb;          cb.sc_response = slap_null_cb;
Line 1994  syncprov_operational( Line 1995  syncprov_operational(
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
 }  }
   
   enum {
           SP_CHKPT = 1,
           SP_SESSL
   };
   
   static ConfigDriver sp_cf_gen;
   
   static ConfigTable spcfg[] = {
           { "syncprov-checkpoint", "ops> <minutes", 3, 3, 0, ARG_MAGIC|SP_CHKPT,
                   sp_cf_gen, "( OLcfgOvAt:1.1 NAME 'olcSpCheckpoint' "
                           "DESC 'ContextCSN checkpoint interval in ops and minutes' "
                           "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
           { "syncprov-sessionlog", "size", 2, 2, 0, ARG_INT|ARG_MAGIC|SP_SESSL,
                   sp_cf_gen, "( OLcfgOvAt:1.2 NAME 'olcSpSessionlog' "
                           "DESC 'Session log size in ops' "
                           "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
           { NULL, NULL, 0, 0, 0, ARG_IGNORED }
   };
   
   static ConfigOCs spocs[] = {
           { "( OLcfgOvOc:1.1 "
                   "NAME 'olcSyncProvConfig' "
                   "DESC 'SyncRepl Provider configuration' "
                   "SUP olcOverlayConfig "
                   "MAY ( olcSpCheckpoint $ olcSpSessionlog ) )",
                           Cft_Overlay, spcfg },
           { NULL, 0, NULL }
   };
   
 static int  static int
 syncprov_db_config(  sp_cf_gen(ConfigArgs *c)
         BackendDB       *be,  
         const char      *fname,  
         int             lineno,  
         int             argc,  
         char    **argv  
 )  
 {  {
         slap_overinst           *on = (slap_overinst *)be->bd_info;          slap_overinst           *on = (slap_overinst *)c->bi;
         syncprov_info_t         *si = (syncprov_info_t *)on->on_bi.bi_private;          syncprov_info_t         *si = (syncprov_info_t *)on->on_bi.bi_private;
           int rc = 0;
   
         if ( strcasecmp( argv[ 0 ], "syncprov-checkpoint" ) == 0 ) {          if ( c->op == SLAP_CONFIG_EMIT ) {
                 if ( argc != 3 ) {                  switch ( c->type ) {
                         fprintf( stderr, "%s: line %d: wrong number of arguments in "                  case SP_CHKPT:
                                 "\"syncprov-checkpoint <ops> <minutes>\"\n", fname, lineno );                          if ( si->si_chkops || si->si_chktime ) {
                         return -1;                                  struct berval bv;
                                   bv.bv_len = sprintf( c->msg, "%d %d",
                                           si->si_chkops, si->si_chktime );
                                   bv.bv_val = c->msg;
                                   value_add_one( &c->rvalue_vals, &bv );
                           } else {
                                   rc = 1;
                           }
                           break;
                   case SP_SESSL:
                           if ( si->si_logs ) {
                                   c->value_int = si->si_logs->sl_size;
                           } else {
                                   rc = 1;
                           }
                           break;
                 }                  }
                 si->si_chkops = atoi( argv[1] );                  return rc;
                 si->si_chktime = atoi( argv[2] ) * 60;          } else if ( c->op == LDAP_MOD_DELETE ) {
                 return 0;                  switch ( c->type ) {
                   case SP_CHKPT:
         } else if ( strcasecmp( argv[0], "syncprov-sessionlog" ) == 0 ) {                          si->si_chkops = 0;
                 sessionlog *sl;                          si->si_chktime = 0;
                 int size;                          break;
                 if ( argc != 2 ) {                  case SP_SESSL:
                         fprintf( stderr, "%s: line %d: wrong number of arguments in "                          if ( si->si_logs )
                                 "\"syncprov-sessionlog <size>\"\n", fname, lineno );                                  si->si_logs->sl_size = 0;
                         return -1;                          else
                                   rc = LDAP_NO_SUCH_ATTRIBUTE;
                           break;
                 }                  }
                 size = atoi( argv[1] );                  return rc;
           }
           switch ( c->type ) {
           case SP_CHKPT:
                   si->si_chkops = atoi( c->argv[1] );
                   si->si_chktime = atoi( c->argv[2] ) * 60;
                   break;
           case SP_SESSL: {
                   sessionlog *sl;
                   int size = c->value_int;
   
                 if ( size < 0 ) {                  if ( size < 0 ) {
                         fprintf( stderr,                          sprintf( c->msg, "%s size %d is negative",
                                 "%s: line %d: session log size %d is negative\n",                                  c->argv[0], size );
                                 fname, lineno, size );                          Debug( LDAP_DEBUG_CONFIG, "%s: %s\n", c->log, c->msg, 0 );
                         return -1;                          return ARG_BAD_CONF;
                 }                  }
                 sl = si->si_logs;                  sl = si->si_logs;
                 if ( !sl ) {                  if ( !sl ) {
Line 2042  syncprov_db_config( Line 2094  syncprov_db_config(
                         si->si_logs = sl;                          si->si_logs = sl;
                 }                  }
                 sl->sl_size = size;                  sl->sl_size = size;
                 return 0;                  }
                   break;
         }          }
           return rc;
         return SLAP_CONF_UNKNOWN;  
 }  }
   
 /* Cheating - we have no thread pool context for these functions,  /* Cheating - we have no thread pool context for these functions,
Line 2061  typedef struct thread_keys { Line 2113  typedef struct thread_keys {
 /* A fake thread context */  /* A fake thread context */
 static thread_keys thrctx[MAXKEYS];  static thread_keys thrctx[MAXKEYS];
   
   /* ITS#3456 we cannot run this search on the main thread, must use a
    * child thread in order to insure we have a big enough stack.
    */
   static void *
   syncprov_db_otask(
           void *ptr
   )
   {
           syncprov_findcsn( ptr, FIND_MAXCSN );
           return NULL;
   }
   
 /* Read any existing contextCSN from the underlying db.  /* Read any existing contextCSN from the underlying db.
  * Then search for any entries newer than that. If no value exists,   * Then search for any entries newer than that. If no value exists,
  * just generate it. Cache whatever result.   * just generate it. Cache whatever result.
Line 2102  syncprov_db_open( Line 2166  syncprov_db_open(
                 slap_schema.si_ad_contextCSN, 0, &e );                  slap_schema.si_ad_contextCSN, 0, &e );
   
         if ( e ) {          if ( e ) {
                   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 ) {
                         si->si_ctxcsn.bv_len = a->a_nvals[0].bv_len;                          si->si_ctxcsn.bv_len = a->a_nvals[0].bv_len;
Line 2117  syncprov_db_open( Line 2183  syncprov_db_open(
                 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;
                 syncprov_findcsn( op, FIND_MAXCSN );                  ldap_pvt_thread_create( &tid, 0, syncprov_db_otask, op );
                   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 2132  syncprov_db_open( Line 2199  syncprov_db_open(
         }          }
   
         /* If our ctxcsn is different from what was read from the root          /* If our ctxcsn is different from what was read from the root
          * entry, write the new value out.           * entry, make sure we do a checkpoint on close
          */           */
         if ( strcmp( si->si_ctxcsnbuf, ctxcsnbuf )) {          if ( strcmp( si->si_ctxcsnbuf, ctxcsnbuf )) {
                 SlapReply rs = {REP_RESULT};                  si->si_numops++;
                 syncprov_checkpoint( op, &rs, on );  
         }          }
   
 out:  out:
Line 2338  syncprov_init() Line 2404  syncprov_init()
                 SLAP_CTRL_HIDE|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 ) {
                 fprintf( stderr, "Failed to register control %d\n", rc );                  Debug( LDAP_DEBUG_ANY,
                           "syncprov_init: Failed to register control %d\n", rc, 0, 0 );
                 return rc;                  return rc;
         }          }
   
         syncprov.on_bi.bi_type = "syncprov";          syncprov.on_bi.bi_type = "syncprov";
         syncprov.on_bi.bi_db_init = syncprov_db_init;          syncprov.on_bi.bi_db_init = syncprov_db_init;
         syncprov.on_bi.bi_db_config = syncprov_db_config;  
         syncprov.on_bi.bi_db_destroy = syncprov_db_destroy;          syncprov.on_bi.bi_db_destroy = syncprov_db_destroy;
         syncprov.on_bi.bi_db_open = syncprov_db_open;          syncprov.on_bi.bi_db_open = syncprov_db_open;
         syncprov.on_bi.bi_db_close = syncprov_db_close;          syncprov.on_bi.bi_db_close = syncprov_db_close;
Line 2361  syncprov_init() Line 2427  syncprov_init()
         syncprov.on_bi.bi_extended = syncprov_op_extended;          syncprov.on_bi.bi_extended = syncprov_op_extended;
         syncprov.on_bi.bi_operational = syncprov_operational;          syncprov.on_bi.bi_operational = syncprov_operational;
   
           syncprov.on_bi.bi_cf_ocs = spocs;
   
           rc = config_register_schema( spcfg, spocs );
           if ( rc ) return rc;
   
         return overlay_register( &syncprov );          return overlay_register( &syncprov );
 }  }
   

Removed from v.1.56.2.6  
changed lines
  Added in v.1.56.2.9


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