Diff for /servers/slapd/overlays/syncprov.c between versions 1.304 and 1.314

version 1.304, 2009/11/22 03:43:34 version 1.314, 2010/07/01 09:51:43
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.303 2009/11/22 03:42:00 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.313 2010/06/23 14:34:25 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-2009 The OpenLDAP Foundation.   * Copyright 2004-2010 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 783  syncprov_free_syncop( syncops *so ) Line 783  syncprov_free_syncop( syncops *so )
         GroupAssertion *ga, *gnext;          GroupAssertion *ga, *gnext;
   
         ldap_pvt_thread_mutex_lock( &so->s_mutex );          ldap_pvt_thread_mutex_lock( &so->s_mutex );
         if ( --so->s_inuse > 0 ) {          /* already being freed, or still in use */
           if ( !so->s_inuse || --so->s_inuse > 0 ) {
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  ldap_pvt_thread_mutex_unlock( &so->s_mutex );
                 return;                  return;
         }          }
Line 853  syncprov_sendresp( Operation *op, opcook Line 854  syncprov_sendresp( Operation *op, opcook
         }          }
   
         rs.sr_ctrls = ctrls;          rs.sr_ctrls = ctrls;
           rs.sr_entry = &e_uuid;
           if ( mode == LDAP_SYNC_ADD || mode == LDAP_SYNC_MODIFY ) {
                   e_uuid = *opc->se;
                   e_uuid.e_private = NULL;
           }
   
         switch( mode ) {          switch( mode ) {
         case LDAP_SYNC_ADD:          case LDAP_SYNC_ADD:
                 rs.sr_entry = opc->se;  
                 if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {                  if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {
                         rs.sr_ref = get_entry_referrals( op, rs.sr_entry );                          rs.sr_ref = get_entry_referrals( op, rs.sr_entry );
                         rs.sr_err = send_search_reference( op, &rs );                          rs.sr_err = send_search_reference( op, &rs );
Line 864  syncprov_sendresp( Operation *op, opcook Line 870  syncprov_sendresp( Operation *op, opcook
                 }                  }
                 /* fallthru */                  /* fallthru */
         case LDAP_SYNC_MODIFY:          case LDAP_SYNC_MODIFY:
                 rs.sr_entry = opc->se;  
                 rs.sr_attrs = op->ors_attrs;                  rs.sr_attrs = op->ors_attrs;
                 rs.sr_err = send_search_entry( op, &rs );                  rs.sr_err = send_search_entry( op, &rs );
                 break;                  break;
Line 872  syncprov_sendresp( Operation *op, opcook Line 877  syncprov_sendresp( Operation *op, opcook
                 e_uuid.e_attrs = NULL;                  e_uuid.e_attrs = NULL;
                 e_uuid.e_name = opc->sdn;                  e_uuid.e_name = opc->sdn;
                 e_uuid.e_nname = opc->sndn;                  e_uuid.e_nname = opc->sndn;
                 rs.sr_entry = &e_uuid;  
                 if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {                  if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {
                         struct berval bv = BER_BVNULL;                          struct berval bv = BER_BVNULL;
                         rs.sr_ref = &bv;                          rs.sr_ref = &bv;
Line 928  syncprov_qplay( Operation *op, syncops * Line 932  syncprov_qplay( Operation *op, syncops *
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  ldap_pvt_thread_mutex_unlock( &so->s_mutex );
   
                 if ( sr->s_mode == LDAP_SYNC_NEW_COOKIE ) {                  if ( sr->s_mode == LDAP_SYNC_NEW_COOKIE ) {
                     SlapReply rs = { REP_INTERMEDIATE };                          SlapReply rs = { REP_INTERMEDIATE };
   
                     rc = syncprov_sendinfo( op, &rs, LDAP_TAG_SYNC_NEW_COOKIE,                          rc = syncprov_sendinfo( op, &rs, LDAP_TAG_SYNC_NEW_COOKIE,
                                 &sr->s_csn, 0, NULL, 0 );                                  &sr->s_csn, 0, NULL, 0 );
                 } else {                  } else {
                         opc.sdn = sr->s_dn;                          opc.sdn = sr->s_dn;
Line 942  syncprov_qplay( Operation *op, syncops * Line 946  syncprov_qplay( Operation *op, syncops *
   
                         rc = syncprov_sendresp( op, &opc, so, sr->s_mode );                          rc = syncprov_sendresp( op, &opc, so, sr->s_mode );
   
                         if ( opc.se ) {                  }
                                 if ( !dec_mutexint( opc.se->e_private )) {                  if ( sr->s_e ) {
                                         opc.se->e_private = NULL;                          if ( !dec_mutexint( sr->s_e->e_private )) {
                                         entry_free ( opc.se );                                  sr->s_e->e_private = NULL;
                                 }                                  entry_free ( sr->s_e );
                         }                          }
                 }                  }
   
Line 981  syncprov_qtask( void *ctx, void *arg ) Line 985  syncprov_qtask( void *ctx, void *arg )
         Operation *op;          Operation *op;
         BackendDB be;          BackendDB be;
         int rc;          int rc;
         OpExtra oex;  
   
         op = &opbuf.ob_op;          op = &opbuf.ob_op;
         *op = *so->s_op;          *op = *so->s_op;
Line 1000  syncprov_qtask( void *ctx, void *arg ) Line 1003  syncprov_qtask( void *ctx, void *arg )
         be.be_flags |= SLAP_DBFLAG_OVERLAY;          be.be_flags |= SLAP_DBFLAG_OVERLAY;
         op->o_bd = &be;          op->o_bd = &be;
         LDAP_SLIST_FIRST(&op->o_extra) = NULL;          LDAP_SLIST_FIRST(&op->o_extra) = NULL;
   
         /* Let syncprov_operational know it's us */  
         oex.oe_key = (void *)syncprov_qtask;  
         LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex, oe_next);  
   
         op->o_callback = NULL;          op->o_callback = NULL;
   
         rc = syncprov_qplay( op, so );          rc = syncprov_qplay( op, so );
Line 1304  syncprov_matchops( Operation *op, opcook Line 1302  syncprov_matchops( Operation *op, opcook
                         op2.o_hdr = &oh;                          op2.o_hdr = &oh;
                         op2.o_extra = op->o_extra;                          op2.o_extra = op->o_extra;
                         op2.o_callback = NULL;                          op2.o_callback = NULL;
                         rc = test_filter( &op2, e, ss->s_op->ors_filter );                          ldap_pvt_thread_mutex_lock( &ss->s_mutex );
                           if (ss->s_flags & PS_FIX_FILTER) {
                                   /* Skip the AND/GE clause that we stuck on in front. We
                                      would lose deletes/mods that happen during the refresh
                                      phase otherwise (ITS#6555) */
                                   op2.ors_filter = ss->s_op->ors_filter->f_and->f_next;
                           }
                           ldap_pvt_thread_mutex_unlock( &ss->s_mutex );
                           rc = test_filter( &op2, e, op2.ors_filter );
                 }                  }
   
                 Debug( LDAP_DEBUG_TRACE, "syncprov_matchops: sid %03x fscope %d rc %d\n",                  Debug( LDAP_DEBUG_TRACE, "syncprov_matchops: sid %03x fscope %d rc %d\n",
Line 1416  syncprov_checkpoint( Operation *op, Slap Line 1422  syncprov_checkpoint( Operation *op, Slap
         SlapReply rsm = { 0 };          SlapReply rsm = { 0 };
         slap_callback cb = {0};          slap_callback cb = {0};
         BackendDB be;          BackendDB be;
           BackendInfo *bi;
   
 #ifdef CHECK_CSN  #ifdef CHECK_CSN
         Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;          Syntax *syn = slap_schema.si_ad_contextCSN->ad_type->sat_syntax;
Line 1445  syncprov_checkpoint( Operation *op, Slap Line 1452  syncprov_checkpoint( Operation *op, Slap
         }          }
         opm.o_req_dn = si->si_contextdn;          opm.o_req_dn = si->si_contextdn;
         opm.o_req_ndn = si->si_contextdn;          opm.o_req_ndn = si->si_contextdn;
           bi = opm.o_bd->bd_info;
         opm.o_bd->bd_info = on->on_info->oi_orig;          opm.o_bd->bd_info = on->on_info->oi_orig;
         opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;          opm.o_managedsait = SLAP_CONTROL_NONCRITICAL;
         opm.o_no_schema_check = 1;          opm.o_no_schema_check = 1;
Line 1462  syncprov_checkpoint( Operation *op, Slap Line 1470  syncprov_checkpoint( Operation *op, Slap
                 if ( e == opm.ora_e )                  if ( e == opm.ora_e )
                         be_entry_release_w( &opm, opm.ora_e );                          be_entry_release_w( &opm, opm.ora_e );
         }          }
           opm.o_bd->bd_info = bi;
   
         if ( mod.sml_next != NULL ) {          if ( mod.sml_next != NULL ) {
                 slap_mods_free( mod.sml_next, 1 );                  slap_mods_free( mod.sml_next, 1 );
Line 2476  syncprov_op_search( Operation *op, SlapR Line 2485  syncprov_op_search( Operation *op, SlapR
                                                 changed = SS_CHANGED;                                                  changed = SS_CHANGED;
                                         else if ( newer > 0 ) {                                          else if ( newer > 0 ) {
                                         /* our state is older, tell consumer nothing */                                          /* our state is older, tell consumer nothing */
                                                   rs->sr_err = LDAP_SUCCESS;
   bailout:
                                                 if ( sop ) {                                                  if ( sop ) {
                                                         syncops **sp = &si->si_ops;                                                          syncops **sp = &si->si_ops;
                                                                                                                   
Line 2486  syncprov_op_search( Operation *op, SlapR Line 2497  syncprov_op_search( Operation *op, SlapR
                                                         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );                                                          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
                                                         ch_free( sop );                                                          ch_free( sop );
                                                 }                                                  }
                                                 rs->sr_err = LDAP_SUCCESS;  
                                                 rs->sr_ctrls = NULL;                                                  rs->sr_ctrls = NULL;
                                                 send_ldap_result( op, rs );                                                  send_ldap_result( op, rs );
                                                 return rs->sr_err;                                                  return rs->sr_err;
Line 2541  no_change:  if ( !(op->o_sync_mode & SLA Line 2551  no_change:  if ( !(op->o_sync_mode & SLA
                                         ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );                                          ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 if ( sids )                                  if ( sids )
                                         op->o_tmpfree( sids, op->o_tmpmemctx );                                          op->o_tmpfree( sids, op->o_tmpmemctx );
                                 send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );                                  rs->sr_err = LDAP_SYNC_REFRESH_REQUIRED;
                                 return rs->sr_err;                                  rs->sr_text = "sync cookie is stale";
                                   goto bailout;
                         }                          }
                         if ( srs->sr_state.ctxcsn ) {                          if ( srs->sr_state.ctxcsn ) {
                                 ber_bvarray_free_x( srs->sr_state.ctxcsn, op->o_tmpmemctx );                                  ber_bvarray_free_x( srs->sr_state.ctxcsn, op->o_tmpmemctx );
Line 2562  no_change:  if ( !(op->o_sync_mode & SLA Line 2573  no_change:  if ( !(op->o_sync_mode & SLA
                                         ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );                                          ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
                                 if ( sids )                                  if ( sids )
                                         op->o_tmpfree( sids, op->o_tmpmemctx );                                          op->o_tmpfree( sids, op->o_tmpmemctx );
                                 send_ldap_result( op, rs );                                  goto bailout;
                                 return rs->sr_err;  
                         }                          }
                 }                  }
         } else {          } else {
Line 2637  syncprov_operational( Line 2647  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;
         OpExtra         *oex;  
   
         /* short-circuit, don't want backends handling this */  
         LDAP_SLIST_FOREACH(oex, &op->o_extra, oe_next) {  
                 if ( oex->oe_key == (void *)syncprov_qtask )  
                         return LDAP_SUCCESS;  
         }  
   
         /* This prevents generating unnecessarily; frontend will strip          /* This prevents generating unnecessarily; frontend will strip
          * any statically stored copy.           * any statically stored copy.
Line 3012  syncprov_db_close( Line 3015  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;
   #ifdef SLAP_CONFIG_DELETE
           syncops *so, *sonext;
   #endif /* SLAP_CONFIG_DELETE */
   
         if ( slapMode & SLAP_TOOL_MODE ) {          if ( slapMode & SLAP_TOOL_MODE ) {
                 return 0;                  return 0;
Line 3032  syncprov_db_close( Line 3038  syncprov_db_close(
                 syncprov_checkpoint( op, &rs, on );                  syncprov_checkpoint( op, &rs, on );
         }          }
   
   #ifdef SLAP_CONFIG_DELETE
           ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
           for ( so=si->si_ops, sonext=so;  so; so=sonext  ) {
                   SlapReply rs = {REP_RESULT};
                   rs.sr_err = LDAP_UNAVAILABLE;
                   send_ldap_result( so->s_op, &rs );
                   sonext=so->s_next;
                   syncprov_drop_psearch( so, 0);
           }
           si->si_ops=NULL;
           ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
           overlay_unregister_control( be, LDAP_CONTROL_SYNC );
   #endif /* SLAP_CONFIG_DELETE */
   
     return 0;      return 0;
 }  }
   

Removed from v.1.304  
changed lines
  Added in v.1.314


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