Diff for /servers/slapd/overlays/syncprov.c between versions 1.85 and 1.91

version 1.85, 2005/06/04 07:44:39 version 1.91, 2005/08/02 06:43:27
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.84 2005/05/09 08:33:01 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.90 2005/07/18 04:22:36 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 159  syncprov_state_ctrl( Line 159  syncprov_state_ctrl(
 {  {
         Attribute* a;          Attribute* a;
         int ret;          int ret;
         int res;  
         const char *text = NULL;  
   
         BerElementBuffer berbuf;          BerElementBuffer berbuf;
         BerElement *ber = (BerElement *)&berbuf;          BerElement *ber = (BerElement *)&berbuf;
Line 402  syncprov_findbase( Operation *op, fbase_ Line 400  syncprov_findbase( Operation *op, fbase_
 {  {
         opcookie *opc = op->o_callback->sc_private;          opcookie *opc = op->o_callback->sc_private;
         slap_overinst *on = opc->son;          slap_overinst *on = opc->son;
         syncprov_info_t         *si = on->on_bi.bi_private;  
   
         slap_callback cb = {0};          slap_callback cb = {0};
         Operation fop;          Operation fop;
Line 548  syncprov_findcsn( Operation *op, int mod Line 545  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 572  syncprov_findcsn( Operation *op, int mod Line 569  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 581  syncprov_findcsn( Operation *op, int mod Line 577  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 601  syncprov_findcsn( Operation *op, int mod Line 597  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 747  static int Line 743  static int
 syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode, int queue )  syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry **e, int mode, int queue )
 {  {
         slap_overinst *on = opc->son;          slap_overinst *on = opc->son;
         syncprov_info_t *si = on->on_bi.bi_private;  
   
         SlapReply rs = { REP_SEARCH };          SlapReply rs = { REP_SEARCH };
         LDAPControl *ctrls[2];          LDAPControl *ctrls[2];
Line 1075  syncprov_matchops( Operation *op, opcook Line 1070  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 1185  syncprov_add_slog( Operation *op, struct Line 1180  syncprov_add_slog( Operation *op, struct
                 se->se_tag = op->o_tag;                  se->se_tag = op->o_tag;
   
                 se->se_uuid.bv_val = (char *)(se+1);                  se->se_uuid.bv_val = (char *)(se+1);
                 se->se_csn.bv_val = se->se_uuid.bv_val + opc->suuid.bv_len + 1;  
                 AC_MEMCPY( se->se_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len );                  AC_MEMCPY( se->se_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len );
                 se->se_uuid.bv_len = opc->suuid.bv_len;                  se->se_uuid.bv_len = opc->suuid.bv_len;
   
                   se->se_csn.bv_val = se->se_uuid.bv_val + opc->suuid.bv_len;
                 AC_MEMCPY( se->se_csn.bv_val, csn->bv_val, csn->bv_len );                  AC_MEMCPY( se->se_csn.bv_val, csn->bv_val, csn->bv_len );
                 se->se_csn.bv_val[csn->bv_len] = '\0';                  se->se_csn.bv_val[csn->bv_len] = '\0';
                 se->se_csn.bv_len = csn->bv_len;                  se->se_csn.bv_len = csn->bv_len;
Line 1232  syncprov_playlog( Operation *op, SlapRep Line 1227  syncprov_playlog( Operation *op, SlapRep
         struct berval *oldcsn, struct berval *ctxcsn )          struct berval *oldcsn, struct berval *ctxcsn )
 {  {
         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;  
         slog_entry *se;          slog_entry *se;
         int i, j, ndel, num, nmods, mmods;          int i, j, ndel, num, nmods, mmods;
         BerVarray uuids;          BerVarray uuids;
Line 1693  syncprov_search_response( Operation *op, Line 1687  syncprov_search_response( Operation *op,
 {  {
         searchstate *ss = op->o_callback->sc_private;          searchstate *ss = op->o_callback->sc_private;
         slap_overinst *on = ss->ss_on;          slap_overinst *on = ss->ss_on;
         syncprov_info_t         *si = on->on_bi.bi_private;  
         sync_control *srs = op->o_controls[slap_cids.sc_LDAPsync];          sync_control *srs = op->o_controls[slap_cids.sc_LDAPsync];
   
         if ( rs->sr_type == REP_SEARCH || rs->sr_type == REP_SEARCHREF ) {          if ( rs->sr_type == REP_SEARCH || rs->sr_type == REP_SEARCHREF ) {
                 int i;  
                 /* If we got a referral without a referral object, there's                  /* If we got a referral without a referral object, there's
                  * something missing that we cannot replicate. Just ignore it.                   * something missing that we cannot replicate. Just ignore it.
                  * The consumer will abort because we didn't send the expected                   * The consumer will abort because we didn't send the expected
                  * control.                   * control.
                  */                   */
                 if ( !rs->sr_entry ) {                  if ( !rs->sr_entry ) {
                         assert( rs->sr_entry );                          assert( rs->sr_entry != NULL );
                         Debug( LDAP_DEBUG_ANY, "bogus referral in context\n",0,0,0 );                          Debug( LDAP_DEBUG_ANY, "bogus referral in context\n",0,0,0 );
                         return SLAP_CB_CONTINUE;                          return SLAP_CB_CONTINUE;
                 }                  }
Line 2114  typedef struct thread_keys { Line 2106  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 2155  syncprov_db_open( Line 2159  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 2170  syncprov_db_open( Line 2176  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 2185  syncprov_db_open( Line 2192  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:

Removed from v.1.85  
changed lines
  Added in v.1.91


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