Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.18 and 1.194

version 1.147.2.18, 2008/02/12 00:50:44 version 1.194, 2007/08/03 10:02:09
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.17 2008/02/12 00:43:33 quanah Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.193 2007/07/25 15:21:06 ralf 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-2008 The OpenLDAP Foundation.   * Copyright 2004-2007 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 585  syncprov_findcsn( Operation *op, find_cs Line 585  syncprov_findcsn( Operation *op, find_cs
         char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];          char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
         struct berval maxcsn;          struct berval maxcsn;
         Filter cf;          Filter cf;
         AttributeAssertion eq = ATTRIBUTEASSERTION_INIT;  #ifdef LDAP_COMP_MATCH
           AttributeAssertion eq = { NULL, BER_BVNULL, NULL };
   #else
           AttributeAssertion eq = { NULL, BER_BVNULL };
   #endif
         fpres_cookie pcookie;          fpres_cookie pcookie;
         sync_control *srs = NULL;          sync_control *srs = NULL;
         struct slap_limits_set fc_limits;          struct slap_limits_set fc_limits;
Line 624  again: Line 628  again:
                                 maxid = i;                                  maxid = i;
                         }                          }
                 }                  }
                 fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),                  fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN>=%s)",
                         "(entryCSN>=%s)", cf.f_av_value.bv_val );                          cf.f_av_value.bv_val );
                 if ( fop.ors_filterstr.bv_len < 0 || fop.ors_filterstr.bv_len >= sizeof( buf ) ) {  
                         return LDAP_OTHER;  
                 }  
                 fop.ors_attrsonly = 0;                  fop.ors_attrsonly = 0;
                 fop.ors_attrs = csn_anlist;                  fop.ors_attrs = csn_anlist;
                 fop.ors_slimit = SLAP_NO_LIMIT;                  fop.ors_slimit = SLAP_NO_LIMIT;
Line 652  again: Line 653  again:
                 /* Look for exact match the first time */                  /* Look for exact match the first time */
                 if ( findcsn_retry ) {                  if ( findcsn_retry ) {
                         cf.f_choice = LDAP_FILTER_EQUALITY;                          cf.f_choice = LDAP_FILTER_EQUALITY;
                         fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),                          fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN=%s)",
                                 "(entryCSN=%s)", cf.f_av_value.bv_val );                                  cf.f_av_value.bv_val );
                 /* 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;                          fop.ors_limit = &fc_limits;
                         memset( &fc_limits, 0, sizeof( fc_limits ));                          memset( &fc_limits, 0, sizeof( fc_limits ));
                         fc_limits.lms_s_unchecked = 1;                          fc_limits.lms_s_unchecked = 1;
                         fop.ors_filterstr.bv_len = snprintf( buf, sizeof( buf ),                          fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)",
                                 "(entryCSN<=%s)", cf.f_av_value.bv_val );                                  cf.f_av_value.bv_val );
                 }  
                 if ( fop.ors_filterstr.bv_len < 0 || fop.ors_filterstr.bv_len >= sizeof( buf ) ) {  
                         return LDAP_OTHER;  
                 }                  }
                 fop.ors_attrsonly = 1;                  fop.ors_attrsonly = 1;
                 fop.ors_attrs = slap_anlist_no_attrs;                  fop.ors_attrs = slap_anlist_no_attrs;
Line 776  syncprov_sendresp( Operation *op, opcook Line 774  syncprov_sendresp( Operation *op, opcook
         BER_BVZERO( &csns[1] );          BER_BVZERO( &csns[1] );
         slap_compose_sync_cookie( op, &cookie, csns, so->s_rid, so->s_sid );          slap_compose_sync_cookie( op, &cookie, csns, so->s_rid, so->s_sid );
   
         Debug( LDAP_DEBUG_SYNC, "syncprov_sendresp: cookie=%s\n", cookie.bv_val, 0, 0 );  
   
         e_uuid.e_attrs = &a_uuid;          e_uuid.e_attrs = &a_uuid;
         a_uuid.a_desc = slap_schema.si_ad_entryUUID;          a_uuid.a_desc = slap_schema.si_ad_entryUUID;
         a_uuid.a_nvals = &opc->suuid;          a_uuid.a_nvals = &opc->suuid;
Line 982  static int Line 978  static int
 syncprov_qresp( opcookie *opc, syncops *so, int mode )  syncprov_qresp( opcookie *opc, syncops *so, int mode )
 {  {
         syncres *sr;          syncres *sr;
         int sid, srsize;          int sid;
   
         /* Don't send changes back to their originator */          /* Don't send changes back to their originator */
         sid = slap_parse_csn_sid( &opc->sctxcsn );          sid = slap_parse_csn_sid( &opc->sctxcsn );
         if ( sid >= 0 && sid == so->s_sid )          if ( sid >= 0 && sid == so->s_sid )
                 return LDAP_SUCCESS;                  return LDAP_SUCCESS;
   
         srsize = sizeof(syncres) + opc->suuid.bv_len + 1 +          sr = ch_malloc(sizeof(syncres) + opc->suuid.bv_len + 1 +
                 opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1;                  opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );
         if ( opc->sctxcsn.bv_len )  
                 srsize += opc->sctxcsn.bv_len + 1;  
         sr = ch_malloc( srsize );  
         sr->s_next = NULL;          sr->s_next = NULL;
         sr->s_dn.bv_val = (char *)(sr + 1);          sr->s_dn.bv_val = (char *)(sr + 1);
         sr->s_dn.bv_len = opc->sdn.bv_len;          sr->s_dn.bv_len = opc->sdn.bv_len;
Line 1006  syncprov_qresp( opcookie *opc, syncops * Line 999  syncprov_qresp( opcookie *opc, syncops *
                  opc->sndn.bv_val ) + 1;                   opc->sndn.bv_val ) + 1;
         sr->s_uuid.bv_len = opc->suuid.bv_len;          sr->s_uuid.bv_len = opc->suuid.bv_len;
         AC_MEMCPY( sr->s_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len );          AC_MEMCPY( sr->s_uuid.bv_val, opc->suuid.bv_val, opc->suuid.bv_len );
         if ( opc->sctxcsn.bv_len ) {          sr->s_csn.bv_val = sr->s_uuid.bv_val + sr->s_uuid.bv_len + 1;
                 sr->s_csn.bv_val = sr->s_uuid.bv_val + sr->s_uuid.bv_len + 1;  
                 strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val );  
         } else {  
                 sr->s_csn.bv_val = NULL;  
         }  
         sr->s_csn.bv_len = opc->sctxcsn.bv_len;          sr->s_csn.bv_len = opc->sctxcsn.bv_len;
           strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val );
   
         ldap_pvt_thread_mutex_lock( &so->s_mutex );          ldap_pvt_thread_mutex_lock( &so->s_mutex );
         if ( !so->s_res ) {          if ( !so->s_res ) {
Line 1302  syncprov_checkpoint( Operation *op, Slap Line 1291  syncprov_checkpoint( Operation *op, Slap
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
         slap_callback cb = {0};          slap_callback cb = {0};
   
         mod.sml_numvals = si->si_numcsns;  
         mod.sml_values = si->si_ctxcsn;          mod.sml_values = si->si_ctxcsn;
         mod.sml_nvalues = NULL;          mod.sml_nvalues = NULL;
         mod.sml_desc = slap_schema.si_ad_contextCSN;          mod.sml_desc = slap_schema.si_ad_contextCSN;
Line 1495  syncprov_playlog( Operation *op, SlapRep Line 1483  syncprov_playlog( Operation *op, SlapRep
                 SlapReply frs = { REP_RESULT };                  SlapReply frs = { REP_RESULT };
                 int rc;                  int rc;
                 Filter mf, af;                  Filter mf, af;
                 AttributeAssertion eq = ATTRIBUTEASSERTION_INIT;  #ifdef LDAP_COMP_MATCH
                   AttributeAssertion eq = { NULL, BER_BVNULL, NULL };
   #else
                   AttributeAssertion eq;
   #endif
                 slap_callback cb = {0};                  slap_callback cb = {0};
   
                 fop = *op;                  fop = *op;
Line 1542  syncprov_playlog( Operation *op, SlapRep Line 1534  syncprov_playlog( Operation *op, SlapRep
   
                 slap_compose_sync_cookie( op, &cookie, delcsn, srs->sr_state.rid,                  slap_compose_sync_cookie( op, &cookie, delcsn, srs->sr_state.rid,
                         srs->sr_state.sid );                          srs->sr_state.sid );
   
                 Debug( LDAP_DEBUG_SYNC, "syncprov_playlog: cookie=%s\n", cookie.bv_val, 0, 0 );  
   
                 uuids[ndel].bv_val = NULL;                  uuids[ndel].bv_val = NULL;
                 syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 );                  syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 );
                 op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );                  op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
Line 1564  syncprov_op_response( Operation *op, Sla Line 1553  syncprov_op_response( Operation *op, Sla
         {          {
                 struct berval maxcsn = BER_BVNULL;                  struct berval maxcsn = BER_BVNULL;
                 char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];                  char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
                 int do_check = 0, have_psearches;                  int do_check = 0;
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
Line 1607  syncprov_op_response( Operation *op, Sla Line 1596  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 )) {
                                 if ( si->si_chklast ) {                                  do_check = 1;
                                         do_check = 1;                                  si->si_chklast = op->o_time;
                                         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 1627  syncprov_op_response( Operation *op, Sla Line 1612  syncprov_op_response( Operation *op, Sla
                 opc->sctxcsn.bv_val = cbuf;                  opc->sctxcsn.bv_val = cbuf;
   
                 /* Handle any persistent searches */                  /* Handle any persistent searches */
                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );                  if ( si->si_ops ) {
                 have_psearches = ( si->si_ops != NULL );  
                 ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );  
                 if ( have_psearches ) {  
                         switch(op->o_tag) {                          switch(op->o_tag) {
                         case LDAP_REQ_ADD:                          case LDAP_REQ_ADD:
                         case LDAP_REQ_MODIFY:                          case LDAP_REQ_MODIFY:
Line 1705  syncprov_op_compare( Operation *op, Slap Line 1687  syncprov_op_compare( Operation *op, Slap
   
                 rs->sr_err = LDAP_COMPARE_FALSE;                  rs->sr_err = LDAP_COMPARE_FALSE;
   
                 if ( attr_valfind( &a,                  if ( value_find_ex( op->oq_compare.rs_ava->aa_desc,
                         SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH |                          SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH |
                                 SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH,                                  SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH,
                                 &op->oq_compare.rs_ava->aa_value, NULL, op->o_tmpmemctx ) == 0 )                                  a.a_nvals, &op->oq_compare.rs_ava->aa_value, op->o_tmpmemctx ) == 0 )
                 {                  {
                         rs->sr_err = LDAP_COMPARE_TRUE;                          rs->sr_err = LDAP_COMPARE_TRUE;
                 }                  }
Line 1733  syncprov_op_mod( Operation *op, SlapRepl Line 1715  syncprov_op_mod( Operation *op, SlapRepl
 {  {
         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;
         slap_callback *cb;  
         opcookie *opc;  
         int have_psearches, cbsize;  
   
         ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );  
         have_psearches = ( si->si_ops != NULL );  
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );  
   
         cbsize = sizeof(slap_callback) + sizeof(opcookie) +  
                 (have_psearches ? sizeof(modinst) : 0 );  
   
         cb = op->o_tmpcalloc(1, cbsize, op->o_tmpmemctx);          slap_callback *cb = op->o_tmpcalloc(1, sizeof(slap_callback)+
         opc = (opcookie *)(cb+1);                  sizeof(opcookie) +
                   (si->si_ops ? sizeof(modinst) : 0 ),
                   op->o_tmpmemctx);
           opcookie *opc = (opcookie *)(cb+1);
         opc->son = on;          opc->son = on;
         cb->sc_response = syncprov_op_response;          cb->sc_response = syncprov_op_response;
         cb->sc_cleanup = syncprov_op_cleanup;          cb->sc_cleanup = syncprov_op_cleanup;
Line 1756  syncprov_op_mod( Operation *op, SlapRepl Line 1731  syncprov_op_mod( Operation *op, SlapRepl
         /* If there are active persistent searches, lock this operation.          /* If there are active persistent searches, lock this operation.
          * See seqmod.c for the locking logic on its own.           * See seqmod.c for the locking logic on its own.
          */           */
         if ( have_psearches ) {          if ( si->si_ops ) {
                 modtarget *mt, mtdummy;                  modtarget *mt, mtdummy;
                 modinst *mi;                  modinst *mi;
   
Line 1803  syncprov_op_mod( Operation *op, SlapRepl Line 1778  syncprov_op_mod( Operation *op, SlapRepl
                 }                  }
         }          }
   
         if (( have_psearches || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )          if (( si->si_ops || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )
                 syncprov_matchops( op, opc, 1 );                  syncprov_matchops( op, opc, 1 );
   
         return SLAP_CB_CONTINUE;          return SLAP_CB_CONTINUE;
Line 1824  typedef struct searchstate { Line 1799  typedef struct searchstate {
         BerVarray ss_ctxcsn;          BerVarray ss_ctxcsn;
         int *ss_sids;          int *ss_sids;
         int ss_numcsns;          int ss_numcsns;
 #define SS_PRESENT      0x01          int ss_present;
 #define SS_CHANGED      0x02  
         int ss_flags;  
 } searchstate;  } searchstate;
   
 static int  static int
Line 1974  syncprov_search_response( Operation *op, Line 1947  syncprov_search_response( Operation *op,
                                         rs->sr_entry->e_name.bv_val, 0, 0 );                                          rs->sr_entry->e_name.bv_val, 0, 0 );
                                 return LDAP_SUCCESS;                                  return LDAP_SUCCESS;
                         }                          }
                           /* Make sure entry is less than the snapshot'd contextCSN */
                         /* If not a persistent search */                          for ( i=0; i<ss->ss_numcsns; i++ ) {
                         if ( !ss->ss_so ) {                                  if ( sid == ss->ss_sids[i] && ber_bvcmp( &a->a_nvals[0],
                                 /* Make sure entry is less than the snapshot'd contextCSN */                                          &ss->ss_ctxcsn[i] ) > 0 ) {
                                 for ( i=0; i<ss->ss_numcsns; i++ ) {                                          Debug( LDAP_DEBUG_SYNC,
                                         if ( sid == ss->ss_sids[i] && ber_bvcmp( &a->a_nvals[0],                                                  "Entry %s CSN %s greater than snapshot %s\n",
                                                 &ss->ss_ctxcsn[i] ) > 0 ) {                                                  rs->sr_entry->e_name.bv_val,
                                                 Debug( LDAP_DEBUG_SYNC,                                                  a->a_nvals[0].bv_val,
                                                         "Entry %s CSN %s greater than snapshot %s\n",                                                  ss->ss_ctxcsn[i].bv_val );
                                                         rs->sr_entry->e_name.bv_val,                                          return LDAP_SUCCESS;
                                                         a->a_nvals[0].bv_val,  
                                                         ss->ss_ctxcsn[i].bv_val );  
                                                 return LDAP_SUCCESS;  
                                         }  
                                 }                                  }
                         }                          }
   
Line 2015  syncprov_search_response( Operation *op, Line 1984  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;
   
                 if ( ss->ss_flags & SS_CHANGED ) {                  slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,
                         slap_compose_sync_cookie( op, &cookie, ss->ss_ctxcsn,                          srs->sr_state.rid, srs->sr_state.sid );
                                 srs->sr_state.rid, srs->sr_state.sid );  
   
                         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_flags & SS_PRESENT ) ?  LDAP_SYNC_REFRESH_PRESENTS :                                  0, 1, &cookie, ss->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_flags & SS_PRESENT ) ?                          syncprov_sendinfo( op, rs, ss->ss_present ?
                                 LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE,                                  LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE,
                                 ( ss->ss_flags & SS_CHANGED ) ? &cookie : NULL,                                  &cookie, 1, NULL, 0 );
                                 1, NULL, 0 );                          op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
                         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 2068  syncprov_op_search( Operation *op, SlapR Line 2029  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, changed = 0, do_present = 0;          int gotstate = 0, nochange = 0, do_present;
         syncops *sop = NULL;          syncops *sop = NULL;
         searchstate *ss;          searchstate *ss;
         sync_control *srs;          sync_control *srs;
Line 2083  syncprov_op_search( Operation *op, SlapR Line 2044  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 2150  syncprov_op_search( Operation *op, SlapR Line 2113  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 2183  syncprov_op_search( Operation *op, SlapR Line 2143  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;                          int i, j, changed = 0;
                         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 = SS_CHANGED;                                                  changed = 1;
                                         break;                                          break;
                                 }                                  }
                                 if ( changed )                                  if ( changed )
                                         break;                                          break;
                         }                          }
                         if ( !changed ) {                          if ( !changed ) {
                                 do_present = 0;  no_change:              nochange = 1;
 no_change:              if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {                                  if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {
                                         LDAPControl     *ctrls[2];                                          LDAPControl     *ctrls[2];
   
                                         ctrls[0] = NULL;                                          ctrls[0] = NULL;
Line 2235  no_change:  if ( !(op->o_sync_mode & SLA Line 2195  no_change:  if ( !(op->o_sync_mode & SLA
                         if ( si->si_usehint && srs->sr_rhint == 0 ) {                          if ( si->si_usehint && srs->sr_rhint == 0 ) {
                                 if ( ctxcsn )                                  if ( ctxcsn )
                                         ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );                                          ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 if ( sids )  
                                         op->o_tmpfree( sids, op->o_tmpmemctx );  
                                 send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );                                  send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
Line 2247  no_change:  if ( !(op->o_sync_mode & SLA Line 2205  no_change:  if ( !(op->o_sync_mode & SLA
                                 LDAP_SUCCESS ) {                                  LDAP_SUCCESS ) {
                                 if ( ctxcsn )                                  if ( ctxcsn )
                                         ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );                                          ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 if ( sids )  
                                         op->o_tmpfree( sids, op->o_tmpmemctx );  
                                 send_ldap_result( op, rs );                                  send_ldap_result( op, rs );
                                 return rs->sr_err;                                  return rs->sr_err;
                         }                          }
                 }                  }
         } else {  
                 /* No consumer state, assume something has changed */  
                 changed = SS_CHANGED;  
         }          }
   
 shortcut:  shortcut:
Line 2267  shortcut: Line 2220  shortcut:
         }          }
   
         /* If something changed, find the changes */          /* If something changed, find the changes */
         if ( gotstate && changed ) {          if ( gotstate && !nochange ) {
                 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 2294  shortcut: Line 2247  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_flags = do_present | changed;          ss->ss_present = do_present;
         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 2308  shortcut: Line 2261  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 ( !changed ) {          if ( nochange ) {
                 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 2325  syncprov_operational( Line 2278  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 2361  syncprov_operational( Line 2308  syncprov_operational(
                                                 a = attr_find( rs->sr_entry->e_attrs,                                                  a = attr_find( rs->sr_entry->e_attrs,
                                                         slap_schema.si_ad_contextCSN );                                                          slap_schema.si_ad_contextCSN );
                                         }                                          }
                                         if ( a->a_nvals != a->a_vals ) {                                          free( a->a_vals );
                                                 ber_bvarray_free( a->a_nvals );  
                                         }  
                                         a->a_nvals = NULL;  
                                         ber_bvarray_free( a->a_vals );  
                                         a->a_vals = NULL;  
                                         a->a_numvals = 0;  
                                 }                                  }
                                 attr_valadd( a, si->si_ctxcsn, si->si_ctxcsn, si->si_numcsns );                                  ber_bvarray_dup_x( &a->a_vals, si->si_ctxcsn, NULL );
                                   a->a_nvals = a->a_vals;
                         }                          }
                         ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );                          ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock );
                 }                  }
Line 2428  sp_cf_gen(ConfigArgs *c) Line 2370  sp_cf_gen(ConfigArgs *c)
                 case SP_CHKPT:                  case SP_CHKPT:
                         if ( si->si_chkops || si->si_chktime ) {                          if ( si->si_chkops || si->si_chktime ) {
                                 struct berval bv;                                  struct berval bv;
                                 bv.bv_len = snprintf( c->cr_msg, sizeof( c->cr_msg ),                                  bv.bv_len = sprintf( c->cr_msg, "%d %d",
                                         "%d %d", si->si_chkops, si->si_chktime );                                          si->si_chkops, si->si_chktime );
                                 if ( bv.bv_len < 0 || bv.bv_len >= sizeof( c->cr_msg ) ) {                                  bv.bv_val = c->cr_msg;
                                         rc = 1;                                  value_add_one( &c->rvalue_vals, &bv );
                                 } else {  
                                         bv.bv_val = c->cr_msg;  
                                         value_add_one( &c->rvalue_vals, &bv );  
                                 }  
                         } else {                          } else {
                                 rc = 1;                                  rc = 1;
                         }                          }
Line 2619  syncprov_db_open( Line 2557  syncprov_db_open(
   
                 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 ) {
                           int i;
                         ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL );                          ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL );
                         si->si_numcsns = a->a_numvals;                          for ( i = 0; !BER_BVISNULL( &a->a_vals[i] ); i++ );
                         si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, a->a_numvals, NULL );                          si->si_numcsns = i;
                           si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, i, NULL );
                 }                  }
                 overlay_entry_release_ov( op, e, 0, on );                  overlay_entry_release_ov( op, e, 0, on );
                 if ( si->si_ctxcsn ) {                  if ( si->si_ctxcsn ) {
Line 2850  static int syncprov_parseCtrl ( Line 2790  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 ) {
                         if ( sr->sr_state.ctxcsn ) {                          rs->sr_text = "Sync control : cookie parsing error";
                                 ber_bvarray_free_x( sr->sr_state.ctxcsn, op->o_tmpmemctx );                          return LDAP_PROTOCOL_ERROR;
                                 sr->sr_state.ctxcsn = NULL;  
                         }  
                         sr->sr_state.numcsns = 0;  
                 }                  }
         }          }
   

Removed from v.1.147.2.18  
changed lines
  Added in v.1.194


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