Diff for /servers/slapd/overlays/syncprov.c between versions 1.206 and 1.212

version 1.206, 2007/10/08 16:13:29 version 1.212, 2007/12/22 04:00:38
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.205 2007/10/08 11:59:33 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.211 2007/12/08 16:45:10 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 1607  syncprov_op_response( Operation *op, Sla Line 1607  syncprov_op_response( Operation *op, Sla
                         }                          }
                         if ( si->si_chktime &&                          if ( si->si_chktime &&
                                 (op->o_time - si->si_chklast >= si->si_chktime )) {                                  (op->o_time - si->si_chklast >= si->si_chktime )) {
                                 do_check = 1;                                  if ( si->si_chklast ) {
                                 si->si_chklast = op->o_time;                                          do_check = 1;
                                           si->si_chklast = op->o_time;
                                   } else {
                                           si->si_chklast = 1;
                                   }
                         }                          }
                 }                  }
                 ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );                  ldap_pvt_thread_rdwr_wunlock( &si->si_csn_rwlock );
Line 1820  typedef struct searchstate { Line 1824  typedef struct searchstate {
         BerVarray ss_ctxcsn;          BerVarray ss_ctxcsn;
         int *ss_sids;          int *ss_sids;
         int ss_numcsns;          int ss_numcsns;
         int ss_present;  #define SS_PRESENT      0x01
   #define SS_CHANGED      0x02
           int ss_flags;
 } searchstate;  } searchstate;
   
 static int  static int
Line 2009  syncprov_search_response( Operation *op, Line 2015  syncprov_search_response( Operation *op,
         } else if ( rs->sr_type == REP_RESULT && rs->sr_err == LDAP_SUCCESS ) {          } else if ( rs->sr_type == REP_RESULT && rs->sr_err == LDAP_SUCCESS ) {
                 struct berval cookie;                  struct berval cookie;
   
                 slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,                  if ( ss->ss_flags & SS_CHANGED ) {
                         srs->sr_state.rid, srs->sr_state.sid );                          slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,
                                   srs->sr_state.rid, srs->sr_state.sid );
   
                 Debug( LDAP_DEBUG_SYNC, "syncprov_search_response: cookie=%s\n", cookie.bv_val, 0, 0 );                          Debug( LDAP_DEBUG_SYNC, "syncprov_search_response: cookie=%s\n", cookie.bv_val, 0, 0 );
                   }
   
                 /* Is this a regular refresh? */                  /* Is this a regular refresh?
                    * Note: refresh never gets here if there were no changes
                    */
                 if ( !ss->ss_so ) {                  if ( !ss->ss_so ) {
                         rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2,                          rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2,
                                 op->o_tmpmemctx );                                  op->o_tmpmemctx );
                         rs->sr_ctrls[1] = NULL;                          rs->sr_ctrls[1] = NULL;
                         rs->sr_err = syncprov_done_ctrl( op, rs, rs->sr_ctrls,                          rs->sr_err = syncprov_done_ctrl( op, rs, rs->sr_ctrls,
                                 0, 1, &cookie, ss->ss_present ?  LDAP_SYNC_REFRESH_PRESENTS :                                  0, 1, &cookie, ( ss->ss_flags & SS_PRESENT ) ?  LDAP_SYNC_REFRESH_PRESENTS :
                                         LDAP_SYNC_REFRESH_DELETES );                                          LDAP_SYNC_REFRESH_DELETES );
                         op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );                          op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
                 } else {                  } else {
                 /* It's RefreshAndPersist, transition to Persist phase */                  /* It's RefreshAndPersist, transition to Persist phase */
                         syncprov_sendinfo( op, rs, ss->ss_present ?                          syncprov_sendinfo( op, rs, ( ss->ss_flags & SS_PRESENT ) ?
                                 LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE,                                  LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE,
                                 &cookie, 1, NULL, 0 );                                  ( ss->ss_flags & SS_CHANGED ) ? &cookie : NULL,
                         op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );                                  1, NULL, 0 );
                           if ( ss->ss_flags & SS_CHANGED )
                                   op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
   
                         /* Detach this Op from frontend control */                          /* Detach this Op from frontend control */
                         ldap_pvt_thread_mutex_lock( &ss->ss_so->s_mutex );                          ldap_pvt_thread_mutex_lock( &ss->ss_so->s_mutex );
Line 2056  syncprov_op_search( Operation *op, SlapR Line 2068  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;          int gotstate = 0, changed = 0, do_present = 0;
         syncops *sop = NULL;          syncops *sop = NULL;
         searchstate *ss;          searchstate *ss;
         sync_control *srs;          sync_control *srs;
Line 2071  syncprov_op_search( Operation *op, SlapR Line 2083  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 2140  syncprov_op_search( Operation *op, SlapR Line 2150  syncprov_op_search( Operation *op, SlapR
                 if ( !numcsns )                  if ( !numcsns )
                         goto no_change;                          goto no_change;
   
                   if ( !si->si_nopres )
                           do_present = SS_PRESENT;
   
                 /* If there are SIDs we don't recognize in the cookie, drop them */                  /* If there are SIDs we don't recognize in the cookie, drop them */
                 for (i=0; i<srs->sr_state.numcsns; ) {                  for (i=0; i<srs->sr_state.numcsns; ) {
                         for (j=0; j<numcsns; j++) {                          for (j=0; j<numcsns; j++) {
Line 2170  syncprov_op_search( Operation *op, SlapR Line 2183  syncprov_op_search( Operation *op, SlapR
   
                 /* If nothing has changed, shortcut it */                  /* If nothing has changed, shortcut it */
                 if ( srs->sr_state.numcsns == numcsns ) {                  if ( srs->sr_state.numcsns == numcsns ) {
                         int i, j, changed = 0;                          int i, j;
                         for ( i=0; i<srs->sr_state.numcsns; i++ ) {                          for ( i=0; i<srs->sr_state.numcsns; i++ ) {
                                 for ( j=0; j<numcsns; j++ ) {                                  for ( j=0; j<numcsns; j++ ) {
                                         if ( srs->sr_state.sids[i] != sids[j] )                                          if ( srs->sr_state.sids[i] != sids[j] )
                                                 continue;                                                  continue;
                                         if ( !bvmatch( &srs->sr_state.ctxcsn[i], &ctxcsn[j] ))                                          if ( !bvmatch( &srs->sr_state.ctxcsn[i], &ctxcsn[j] ))
                                                 changed = 1;                                                  changed = SS_CHANGED;
                                         break;                                          break;
                                 }                                  }
                                 if ( changed )                                  if ( changed )
                                         break;                                          break;
                         }                          }
                         if ( !changed ) {                          if ( !changed ) {
 no_change:              nochange = 1;                                  do_present = 0;
                                 if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {  no_change:              if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {
                                         LDAPControl     *ctrls[2];                                          LDAPControl     *ctrls[2];
   
                                         ctrls[0] = NULL;                                          ctrls[0] = NULL;
Line 2240  no_change:  nochange = 1; Line 2253  no_change:  nochange = 1;
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
                 }                  }
           } else {
                   /* No consumer state, assume something has changed */
                   changed = SS_CHANGED;
         }          }
   
 shortcut:  shortcut:
Line 2251  shortcut: Line 2267  shortcut:
         }          }
   
         /* If something changed, find the changes */          /* If something changed, find the changes */
         if ( gotstate && !nochange ) {          if ( gotstate && changed ) {
                 Filter *fand, *fava;                  Filter *fand, *fava;
   
                 fand = op->o_tmpalloc( sizeof(Filter), op->o_tmpmemctx );                  fand = op->o_tmpalloc( sizeof(Filter), op->o_tmpmemctx );
Line 2278  shortcut: Line 2294  shortcut:
         ss = (searchstate *)(cb+1);          ss = (searchstate *)(cb+1);
         ss->ss_on = on;          ss->ss_on = on;
         ss->ss_so = sop;          ss->ss_so = sop;
         ss->ss_present = do_present;          ss->ss_flags = do_present | changed;
         ss->ss_ctxcsn = ctxcsn;          ss->ss_ctxcsn = ctxcsn;
         ss->ss_numcsns = numcsns;          ss->ss_numcsns = numcsns;
         ss->ss_sids = sids;          ss->ss_sids = sids;
Line 2292  shortcut: Line 2308  shortcut:
          * the refresh phase, just invoke the response callback to transition           * the refresh phase, just invoke the response callback to transition
          * us into persist phase           * us into persist phase
          */           */
         if ( nochange ) {          if ( !changed ) {
                 rs->sr_err = LDAP_SUCCESS;                  rs->sr_err = LDAP_SUCCESS;
                 rs->sr_nentries = 0;                  rs->sr_nentries = 0;
                 send_ldap_result( op, rs );                  send_ldap_result( op, rs );
Line 2309  syncprov_operational( Line 2325  syncprov_operational(
         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;
   
           /* This prevents generating unnecessarily; frontend will strip
            * any statically stored copy.
            */
           if ( op->o_sync != SLAP_CONTROL_NONE )
                   return SLAP_CB_CONTINUE;
   
         if ( rs->sr_entry &&          if ( rs->sr_entry &&
                 dn_match( &rs->sr_entry->e_nname, op->o_bd->be_nsuffix )) {                  dn_match( &rs->sr_entry->e_nname, op->o_bd->be_nsuffix )) {
   
Line 2828  static int syncprov_parseCtrl ( Line 2850  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 parse fails, pretend no cookie was sent */
                 if ( slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx ) ||                  if ( slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx ) ||
                         sr->sr_state.rid == -1 ) {                          sr->sr_state.rid == -1 ) {
                         rs->sr_text = "Sync control : cookie parsing error";                          if ( sr->sr_state.ctxcsn ) {
                         return LDAP_PROTOCOL_ERROR;                                  ber_bvarray_free_x( sr->sr_state.ctxcsn, op->o_tmpmemctx );
                                   sr->sr_state.ctxcsn = NULL;
                           }
                           sr->sr_state.numcsns = 0;
                 }                  }
         }          }
   

Removed from v.1.206  
changed lines
  Added in v.1.212


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