Diff for /servers/slapd/overlays/syncprov.c between versions 1.99 and 1.106

version 1.99, 2005/08/23 01:25:21 version 1.106, 2005/09/14 13:25:52
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.98 2005/08/15 05:18:19 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.105 2005/09/09 02:53:56 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 116  typedef struct syncprov_info_t { Line 116  typedef struct syncprov_info_t {
         int             si_chkops;      /* checkpointing info */          int             si_chkops;      /* checkpointing info */
         int             si_chktime;          int             si_chktime;
         int             si_numops;      /* number of ops since last checkpoint */          int             si_numops;      /* number of ops since last checkpoint */
           int             si_nopres;      /* Skip present phase */
         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;
Line 142  typedef struct fbase_cookie { Line 143  typedef struct fbase_cookie {
         int fscope;     /* if TRUE then fdn is within the psearch scope */          int fscope;     /* if TRUE then fdn is within the psearch scope */
 } fbase_cookie;  } fbase_cookie;
   
 static AttributeName csn_anlist[2];  static AttributeName csn_anlist[3];
 static AttributeName uuid_anlist[2];  static AttributeName uuid_anlist[2];
   
 /* Build a LDAPsync intermediate state control */  /* Build a LDAPsync intermediate state control */
Line 178  syncprov_state_ctrl( Line 179  syncprov_state_ctrl(
                 }                  }
         }          }
   
           /* FIXME: what if entryuuid is NULL or empty ? */
   
         if ( send_cookie && cookie ) {          if ( send_cookie && cookie ) {
                 ber_printf( ber, "{eOON}",                  ber_printf( ber, "{eOON}",
                         entry_sync_state, &entryuuid_bv, cookie );                          entry_sync_state, &entryuuid_bv, cookie );
Line 406  syncprov_findbase( Operation *op, fbase_ Line 409  syncprov_findbase( Operation *op, fbase_
         SlapReply frs = { REP_RESULT };          SlapReply frs = { REP_RESULT };
         int rc;          int rc;
   
         fop = *op;          /* Use basic parameters from syncrepl search, but use
            * current op's threadctx / tmpmemctx
            */
           fop = *fc->fss->s_op;
   
           fop.o_hdr = op->o_hdr;
           fop.o_bd = op->o_bd;
           fop.o_time = op->o_time;
           fop.o_tincr = op->o_tincr;
   
         cb.sc_response = findbase_cb;          cb.sc_response = findbase_cb;
         cb.sc_private = fc;          cb.sc_private = fc;
   
         fop.o_sync_mode &= SLAP_CONTROL_MASK;   /* turn off sync mode */          fop.o_sync_mode = 0;    /* turn off sync mode */
         fop.o_managedsait = SLAP_CONTROL_CRITICAL;          fop.o_managedsait = SLAP_CONTROL_CRITICAL;
         fop.o_callback = &cb;          fop.o_callback = &cb;
         fop.o_tag = LDAP_REQ_SEARCH;          fop.o_tag = LDAP_REQ_SEARCH;
         fop.ors_scope = LDAP_SCOPE_BASE;          fop.ors_scope = LDAP_SCOPE_BASE;
         fop.ors_deref = fc->fss->s_op->ors_deref;  
         fop.ors_limit = NULL;          fop.ors_limit = NULL;
         fop.ors_slimit = 1;          fop.ors_slimit = 1;
         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 = fc->fss->s_op->ors_filter;  
         fop.ors_filterstr = fc->fss->s_op->ors_filterstr;  
   
         fop.o_req_ndn = fc->fss->s_op->o_req_ndn;  
   
         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 778  syncprov_sendresp( Operation *op, opcook Line 784  syncprov_sendresp( Operation *op, opcook
         sop.o_bd = op->o_bd;          sop.o_bd = op->o_bd;
         sop.o_controls = op->o_controls;          sop.o_controls = op->o_controls;
         sop.o_private = op->o_private;          sop.o_private = op->o_private;
           sop.o_callback = NULL;
   
         /* If queueing is allowed */          /* If queueing is allowed */
         if ( queue ) {          if ( queue ) {
Line 1044  syncprov_matchops( Operation *op, opcook Line 1051  syncprov_matchops( Operation *op, opcook
                                 "search base has changed" );                                  "search base has changed" );
                         sprev->s_next = snext;                          sprev->s_next = snext;
                         syncprov_drop_psearch( ss, 1 );                          syncprov_drop_psearch( ss, 1 );
                           ss = sprev;
                         continue;                          continue;
                 }                  }
   
Line 1691  syncprov_detach_op( Operation *op, synco Line 1699  syncprov_detach_op( Operation *op, synco
                 g2->ga_next = op2->o_groups;                  g2->ga_next = op2->o_groups;
                 op2->o_groups = g2;                  op2->o_groups = g2;
         }          }
           /* Don't allow any further group caching */
           op2->o_do_not_cache = 1;
   
         /* Add op2 to conn so abandon will find us */          /* Add op2 to conn so abandon will find us */
         ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );          ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
Line 1784  syncprov_op_search( Operation *op, SlapR Line 1794  syncprov_op_search( Operation *op, SlapR
         slap_overinst           *on = (slap_overinst *)op->o_bd->bd_info;          slap_overinst           *on = (slap_overinst *)op->o_bd->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;
         slap_callback   *cb;          slap_callback   *cb;
         int gotstate = 0, nochange = 0, do_present = 1;          int gotstate = 0, nochange = 0, do_present;
         syncops *sop = NULL;          syncops *sop = NULL;
         searchstate *ss;          searchstate *ss;
         sync_control *srs;          sync_control *srs;
Line 1798  syncprov_op_search( Operation *op, SlapR Line 1808  syncprov_op_search( Operation *op, SlapR
                 return rs->sr_err;                  return rs->sr_err;
         }          }
   
           do_present = si->si_nopres ? 0 : 1;
   
         srs = op->o_controls[slap_cids.sc_LDAPsync];          srs = op->o_controls[slap_cids.sc_LDAPsync];
         op->o_managedsait = SLAP_CONTROL_NONCRITICAL;          op->o_managedsait = SLAP_CONTROL_NONCRITICAL;
   
Line 2008  syncprov_operational( Line 2020  syncprov_operational(
   
 enum {  enum {
         SP_CHKPT = 1,          SP_CHKPT = 1,
         SP_SESSL          SP_SESSL,
           SP_NOPRES
 };  };
   
 static ConfigDriver sp_cf_gen;  static ConfigDriver sp_cf_gen;
Line 2022  static ConfigTable spcfg[] = { Line 2035  static ConfigTable spcfg[] = {
                 sp_cf_gen, "( OLcfgOvAt:1.2 NAME 'olcSpSessionlog' "                  sp_cf_gen, "( OLcfgOvAt:1.2 NAME 'olcSpSessionlog' "
                         "DESC 'Session log size in ops' "                          "DESC 'Session log size in ops' "
                         "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
           { "syncprov-nopresent", NULL, 2, 2, 0, ARG_ON_OFF|ARG_MAGIC|SP_NOPRES,
                   sp_cf_gen, "( OLcfgOvAt:1.3 NAME 'olcSpNoPresent' "
                           "DESC 'Omit Present phase processing' "
                           "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
         { NULL, NULL, 0, 0, 0, ARG_IGNORED }          { NULL, NULL, 0, 0, 0, ARG_IGNORED }
 };  };
   
Line 2030  static ConfigOCs spocs[] = { Line 2047  static ConfigOCs spocs[] = {
                 "NAME 'olcSyncProvConfig' "                  "NAME 'olcSyncProvConfig' "
                 "DESC 'SyncRepl Provider configuration' "                  "DESC 'SyncRepl Provider configuration' "
                 "SUP olcOverlayConfig "                  "SUP olcOverlayConfig "
                 "MAY ( olcSpCheckpoint $ olcSpSessionlog ) )",                  "MAY ( olcSpCheckpoint $ olcSpSessionlog $ olcSpNoPresent ) )",
                         Cft_Overlay, spcfg },                          Cft_Overlay, spcfg },
         { NULL, 0, NULL }          { NULL, 0, NULL }
 };  };
Line 2062  sp_cf_gen(ConfigArgs *c) Line 2079  sp_cf_gen(ConfigArgs *c)
                                 rc = 1;                                  rc = 1;
                         }                          }
                         break;                          break;
                   case SP_NOPRES:
                           if ( si->si_nopres ) {
                                   c->value_int = 1;
                           } else {
                                   rc = 1;
                           }
                           break;
                 }                  }
                 return rc;                  return rc;
         } else if ( c->op == LDAP_MOD_DELETE ) {          } else if ( c->op == LDAP_MOD_DELETE ) {
Line 2076  sp_cf_gen(ConfigArgs *c) Line 2100  sp_cf_gen(ConfigArgs *c)
                         else                          else
                                 rc = LDAP_NO_SUCH_ATTRIBUTE;                                  rc = LDAP_NO_SUCH_ATTRIBUTE;
                         break;                          break;
                   case SP_NOPRES:
                           if ( si->si_nopres )
                                   si->si_nopres = 0;
                           else
                                   rc = LDAP_NO_SUCH_ATTRIBUTE;
                           break;
                 }                  }
                 return rc;                  return rc;
         }          }
Line 2107  sp_cf_gen(ConfigArgs *c) Line 2137  sp_cf_gen(ConfigArgs *c)
                 sl->sl_size = size;                  sl->sl_size = size;
                 }                  }
                 break;                  break;
           case SP_NOPRES:
                   si->si_nopres = c->value_int;
                   break;
         }          }
         return rc;          return rc;
 }  }
   
 /* Cheating - we have no thread pool context for these functions,  
  * so make one.  
  */  
   
 static void *syncprov_thrctx;  
   
 /* ITS#3456 we cannot run this search on the main thread, must use a  /* 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.   * child thread in order to insure we have a big enough stack.
  */   */
Line 2148  syncprov_db_open( Line 2175  syncprov_db_open(
         Entry *e;          Entry *e;
         Attribute *a;          Attribute *a;
         int rc;          int rc;
           void *thrctx = NULL;
   
         if ( slapMode & SLAP_TOOL_MODE ) {          if ( slapMode & SLAP_TOOL_MODE ) {
                 return 0;                  return 0;
Line 2158  syncprov_db_open( Line 2186  syncprov_db_open(
                 return rc;                  return rc;
         }          }
   
         syncprov_thrctx = ldap_pvt_thread_pool_fake_context_init();          thrctx = ldap_pvt_thread_pool_context();
         connection_fake_init( &conn, op, syncprov_thrctx );          connection_fake_init( &conn, op, thrctx );
         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 2212  syncprov_db_open( Line 2240  syncprov_db_open(
   
 out:  out:
         op->o_bd->bd_info = (BackendInfo *)on;          op->o_bd->bd_info = (BackendInfo *)on;
           ldap_pvt_thread_pool_context_reset( thrctx );
         return 0;          return 0;
 }  }
   
Line 2224  syncprov_db_close( Line 2253  syncprov_db_close(
 {  {
     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;
         int i;  
   
         if ( slapMode & SLAP_TOOL_MODE ) {          if ( slapMode & SLAP_TOOL_MODE ) {
                 return 0;                  return 0;
Line 2234  syncprov_db_close( Line 2262  syncprov_db_close(
                 char opbuf[OPERATION_BUFFER_SIZE];                  char opbuf[OPERATION_BUFFER_SIZE];
                 Operation *op = (Operation *)opbuf;                  Operation *op = (Operation *)opbuf;
                 SlapReply rs = {REP_RESULT};                  SlapReply rs = {REP_RESULT};
                   void *thrctx;
   
                 connection_fake_init( &conn, op, syncprov_thrctx );                  thrctx = ldap_pvt_thread_pool_context();
                   connection_fake_init( &conn, op, thrctx );
                 op->o_bd = be;                  op->o_bd = be;
                 op->o_dn = be->be_rootdn;                  op->o_dn = be->be_rootdn;
                 op->o_ndn = be->be_rootndn;                  op->o_ndn = be->be_rootndn;
                 syncprov_checkpoint( op, &rs, on );                  syncprov_checkpoint( op, &rs, on );
                   ldap_pvt_thread_pool_context_reset( thrctx );
         }          }
         ldap_pvt_thread_pool_fake_context_destroy( syncprov_thrctx );  
         syncprov_thrctx = NULL;  
   
     return 0;      return 0;
 }  }
Line 2264  syncprov_db_init( Line 2293  syncprov_db_init(
   
         csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN;          csn_anlist[0].an_desc = slap_schema.si_ad_entryCSN;
         csn_anlist[0].an_name = slap_schema.si_ad_entryCSN->ad_cname;          csn_anlist[0].an_name = slap_schema.si_ad_entryCSN->ad_cname;
           csn_anlist[1].an_desc = slap_schema.si_ad_entryUUID;
           csn_anlist[1].an_name = slap_schema.si_ad_entryUUID->ad_cname;
   
         uuid_anlist[0].an_desc = slap_schema.si_ad_entryUUID;          uuid_anlist[0].an_desc = slap_schema.si_ad_entryUUID;
         uuid_anlist[0].an_name = slap_schema.si_ad_entryUUID->ad_cname;          uuid_anlist[0].an_name = slap_schema.si_ad_entryUUID->ad_cname;

Removed from v.1.99  
changed lines
  Added in v.1.106


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