Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.10 and 1.147.2.11

version 1.147.2.10, 2007/09/29 09:55:22 version 1.147.2.11, 2007/10/18 01:35:12
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.9 2007/09/27 21:38:26 ralf Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.10 2007/09/29 09:55:22 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 770  syncprov_sendresp( Operation *op, opcook Line 770  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 974  static int Line 976  static int
 syncprov_qresp( opcookie *opc, syncops *so, int mode )  syncprov_qresp( opcookie *opc, syncops *so, int mode )
 {  {
         syncres *sr;          syncres *sr;
         int sid;          int sid, srsize;
   
         /* 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;
   
         sr = ch_malloc(sizeof(syncres) + opc->suuid.bv_len + 1 +          srsize = sizeof(syncres) + opc->suuid.bv_len + 1 +
                 opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );                  opc->sdn.bv_len + 1 + opc->sndn.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 995  syncprov_qresp( opcookie *opc, syncops * Line 1000  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 );
         sr->s_csn.bv_val = sr->s_uuid.bv_val + sr->s_uuid.bv_len + 1;          if ( opc->sctxcsn.bv_len ) {
                   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 1527  syncprov_playlog( Operation *op, SlapRep Line 1536  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 1546  syncprov_op_response( Operation *op, Sla Line 1558  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;                  int do_check = 0, have_psearches;
   
                 /* Update our context CSN */                  /* Update our context CSN */
                 cbuf[0] = '\0';                  cbuf[0] = '\0';
Line 1605  syncprov_op_response( Operation *op, Sla Line 1617  syncprov_op_response( Operation *op, Sla
                 opc->sctxcsn.bv_val = cbuf;                  opc->sctxcsn.bv_val = cbuf;
   
                 /* Handle any persistent searches */                  /* Handle any persistent searches */
                 if ( si->si_ops ) {                  ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
                   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 1708  syncprov_op_mod( Operation *op, SlapRepl Line 1723  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 );
   
         slap_callback *cb = op->o_tmpcalloc(1, sizeof(slap_callback)+          cb = op->o_tmpcalloc(1, cbsize, op->o_tmpmemctx);
                 sizeof(opcookie) +          opc = (opcookie *)(cb+1);
                 (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 1724  syncprov_op_mod( Operation *op, SlapRepl Line 1746  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 ( si->si_ops ) {          if ( have_psearches ) {
                 modtarget *mt, mtdummy;                  modtarget *mt, mtdummy;
                 modinst *mi;                  modinst *mi;
   
Line 1771  syncprov_op_mod( Operation *op, SlapRepl Line 1793  syncprov_op_mod( Operation *op, SlapRepl
                 }                  }
         }          }
   
         if (( si->si_ops || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )          if (( have_psearches || 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 1940  syncprov_search_response( Operation *op, Line 1962  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 */  
                         for ( i=0; i<ss->ss_numcsns; i++ ) {                          /* If not a persistent search */
                                 if ( sid == ss->ss_sids[i] && ber_bvcmp( &a->a_nvals[0],                          if ( !ss->ss_so ) {
                                         &ss->ss_ctxcsn[i] ) > 0 ) {                                  /* Make sure entry is less than the snapshot'd contextCSN */
                                         Debug( LDAP_DEBUG_SYNC,                                  for ( i=0; i<ss->ss_numcsns; i++ ) {
                                                 "Entry %s CSN %s greater than snapshot %s\n",                                          if ( sid == ss->ss_sids[i] && ber_bvcmp( &a->a_nvals[0],
                                                 rs->sr_entry->e_name.bv_val,                                                  &ss->ss_ctxcsn[i] ) > 0 ) {
                                                 a->a_nvals[0].bv_val,                                                  Debug( LDAP_DEBUG_SYNC,
                                                 ss->ss_ctxcsn[i].bv_val );                                                          "Entry %s CSN %s greater than snapshot %s\n",
                                         return LDAP_SUCCESS;                                                          rs->sr_entry->e_name.bv_val,
                                                           a->a_nvals[0].bv_val,
                                                           ss->ss_ctxcsn[i].bv_val );
                                                   return LDAP_SUCCESS;
                                           }
                                 }                                  }
                         }                          }
   
Line 1980  syncprov_search_response( Operation *op, Line 2006  syncprov_search_response( Operation *op,
                 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? */
                 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,
Line 2188  no_change:  nochange = 1; Line 2216  no_change:  nochange = 1;
                         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 2198  no_change:  nochange = 1; Line 2228  no_change:  nochange = 1;
                                 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;
                         }                          }

Removed from v.1.147.2.10  
changed lines
  Added in v.1.147.2.11


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