Diff for /servers/slapd/overlays/syncprov.c between versions 1.107 and 1.108

version 1.107, 2005/10/02 01:58:00 version 1.108, 2005/10/02 03:01:45
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.106 2005/09/14 13:25:52 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.107 2005/10/02 01:58:00 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 61  typedef struct syncops { Line 61  typedef struct syncops {
         int             s_rid;          int             s_rid;
         struct berval s_filterstr;          struct berval s_filterstr;
         int             s_flags;        /* search status */          int             s_flags;        /* search status */
   #define PS_IS_REFRESHING        0x01
   #define PS_IS_DETACHED          0x02
   #define PS_WROTE_BASE           0x04
   #define PS_FIND_BASE            0x08
   
         int             s_inuse;        /* reference count */          int             s_inuse;        /* reference count */
         struct syncres *s_res;          struct syncres *s_res;
         struct syncres *s_restail;          struct syncres *s_restail;
Line 85  typedef struct sync_control { Line 90  typedef struct sync_control {
 #define SLAP_SYNC_PERSIST                               (LDAP_SYNC_RESERVED<<SLAP_CONTROL_SHIFT)  #define SLAP_SYNC_PERSIST                               (LDAP_SYNC_RESERVED<<SLAP_CONTROL_SHIFT)
 #define SLAP_SYNC_REFRESH_AND_PERSIST   (LDAP_SYNC_REFRESH_AND_PERSIST<<SLAP_CONTROL_SHIFT)  #define SLAP_SYNC_REFRESH_AND_PERSIST   (LDAP_SYNC_REFRESH_AND_PERSIST<<SLAP_CONTROL_SHIFT)
   
 #define PS_IS_REFRESHING        0x01  
 #define PS_IS_DETACHED          0x02  
   
 /* Record of which searches matched at premodify step */  /* Record of which searches matched at premodify step */
 typedef struct syncmatches {  typedef struct syncmatches {
         struct syncmatches *sm_next;          struct syncmatches *sm_next;
Line 362  findbase_cb( Operation *op, SlapReply *r Line 364  findbase_cb( Operation *op, SlapReply *r
                  * Just store whatever we got.                   * Just store whatever we got.
                  */                   */
                 if ( fc->fss->s_eid == NOID ) {                  if ( fc->fss->s_eid == NOID ) {
                         fc->fbase = 1;                          fc->fbase = 2;
                         fc->fss->s_eid = rs->sr_entry->e_id;                          fc->fss->s_eid = rs->sr_entry->e_id;
                         ber_dupbv( &fc->fss->s_base, &rs->sr_entry->e_nname );                          ber_dupbv( &fc->fss->s_base, &rs->sr_entry->e_nname );
   
                 } else if ( rs->sr_entry->e_id == fc->fss->s_eid &&                  } else if ( rs->sr_entry->e_id == fc->fss->s_eid &&
                         dn_match( &rs->sr_entry->e_nname, &fc->fss->s_base )) {                          dn_match( &rs->sr_entry->e_nname, &fc->fss->s_base )) {
   
                 /* OK, the DN is the same and the entryID is the same. Now                  /* OK, the DN is the same and the entryID is the same. */
                  * see if the fdn resides in the scope.  
                  */  
                         fc->fbase = 1;                          fc->fbase = 1;
                         switch ( fc->fss->s_op->ors_scope ) {  
                         case LDAP_SCOPE_BASE:  
                                 fc->fscope = dn_match( fc->fdn, &rs->sr_entry->e_nname );  
                                 break;  
                         case LDAP_SCOPE_ONELEVEL: {  
                                 struct berval pdn;  
                                 dnParent( fc->fdn, &pdn );  
                                 fc->fscope = dn_match( &pdn, &rs->sr_entry->e_nname );  
                                 break; }  
                         case LDAP_SCOPE_SUBTREE:  
                                 fc->fscope = dnIsSuffix( fc->fdn, &rs->sr_entry->e_nname );  
                                 break;  
 #ifdef LDAP_SCOPE_SUBORDINATE  
                         case LDAP_SCOPE_SUBORDINATE:  
                                 fc->fscope = dnIsSuffix( fc->fdn, &rs->sr_entry->e_nname ) &&  
                                         !dn_match( fc->fdn, &rs->sr_entry->e_nname );  
                                 break;  
 #endif  
                         }  
                 }                  }
         }          }
         if ( rs->sr_err != LDAP_SUCCESS ) {          if ( rs->sr_err != LDAP_SUCCESS ) {
Line 406  syncprov_findbase( Operation *op, fbase_ Line 387  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;
   
         slap_callback cb = {0};  
         Operation fop;  
         SlapReply frs = { REP_RESULT };  
         int rc;  
   
         /* Use basic parameters from syncrepl search, but use          /* Use basic parameters from syncrepl search, but use
          * current op's threadctx / tmpmemctx           * current op's threadctx / tmpmemctx
          */           */
         fop = *fc->fss->s_op;          ldap_pvt_thread_mutex_lock( &fc->fss->s_mutex );
           if ( fc->fss->s_flags & PS_FIND_BASE ) {
                   slap_callback cb = {0};
                   Operation fop;
                   SlapReply frs = { REP_RESULT };
                   int rc;
   
         fop.o_hdr = op->o_hdr;                  fc->fss->s_flags ^= PS_FIND_BASE;
         fop.o_bd = op->o_bd;                  ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex );
         fop.o_time = op->o_time;  
         fop.o_tincr = op->o_tincr;  
   
         cb.sc_response = findbase_cb;                  fop = *fc->fss->s_op;
         cb.sc_private = fc;  
   
         fop.o_sync_mode = 0;    /* turn off sync mode */                  fop.o_hdr = op->o_hdr;
         fop.o_managedsait = SLAP_CONTROL_CRITICAL;                  fop.o_bd = op->o_bd;
         fop.o_callback = &cb;                  fop.o_time = op->o_time;
         fop.o_tag = LDAP_REQ_SEARCH;                  fop.o_tincr = op->o_tincr;
         fop.ors_scope = LDAP_SCOPE_BASE;  
         fop.ors_limit = NULL;  
         fop.ors_slimit = 1;  
         fop.ors_tlimit = SLAP_NO_LIMIT;  
         fop.ors_attrs = slap_anlist_no_attrs;  
         fop.ors_attrsonly = 1;  
   
         fop.o_bd->bd_info = on->on_info->oi_orig;                  cb.sc_response = findbase_cb;
         rc = fop.o_bd->be_search( &fop, &frs );                  cb.sc_private = fc;
         fop.o_bd->bd_info = (BackendInfo *)on;  
   
         if ( fc->fbase ) return LDAP_SUCCESS;                  fop.o_sync_mode = 0;    /* turn off sync mode */
                   fop.o_managedsait = SLAP_CONTROL_CRITICAL;
                   fop.o_callback = &cb;
                   fop.o_tag = LDAP_REQ_SEARCH;
                   fop.ors_scope = LDAP_SCOPE_BASE;
                   fop.ors_limit = NULL;
                   fop.ors_slimit = 1;
                   fop.ors_tlimit = SLAP_NO_LIMIT;
                   fop.ors_attrs = slap_anlist_no_attrs;
                   fop.ors_attrsonly = 1;
   
                   fop.o_bd->bd_info = on->on_info->oi_orig;
                   rc = fop.o_bd->be_search( &fop, &frs );
                   fop.o_bd->bd_info = (BackendInfo *)on;
           } else {
                   ldap_pvt_thread_mutex_unlock( &fc->fss->s_mutex );
                   fc->fbase = 1;
           }
   
           /* After the first call, see if the fdn resides in the scope */
           if ( fc->fbase == 1 ) {
                   switch ( fc->fss->s_op->ors_scope ) {
                   case LDAP_SCOPE_BASE:
                           fc->fscope = dn_match( fc->fdn, &fc->fss->s_base );
                           break;
                   case LDAP_SCOPE_ONELEVEL: {
                           struct berval pdn;
                           dnParent( fc->fdn, &pdn );
                           fc->fscope = dn_match( &pdn, &fc->fss->s_base );
                           break; }
                   case LDAP_SCOPE_SUBTREE:
                           fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base );
                           break;
   #ifdef LDAP_SCOPE_SUBORDINATE
                   case LDAP_SCOPE_SUBORDINATE:
                           fc->fscope = dnIsSuffix( fc->fdn, &fc->fss->s_base ) &&
                                   !dn_match( fc->fdn, &fc->fss->s_base );
                           break;
   #endif
                   }
           }
   
           if ( fc->fbase )
                   return LDAP_SUCCESS;
   
         /* If entryID has changed, then the base of this search has          /* If entryID has changed, then the base of this search has
          * changed. Invalidate the psearch.           * changed. Invalidate the psearch.
Line 853  syncprov_qresp( opcookie *opc, syncops * Line 867  syncprov_qresp( opcookie *opc, syncops *
 {  {
         syncres *sr;          syncres *sr;
   
         ldap_pvt_thread_mutex_lock( &so->s_mutex );  
         sr = ch_malloc(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->sctxcsn.bv_len + 1 );                  opc->sdn.bv_len + 1 + opc->sndn.bv_len + 1 + opc->sctxcsn.bv_len + 1 );
         sr->s_next = NULL;          sr->s_next = NULL;
Line 871  syncprov_qresp( opcookie *opc, syncops * Line 884  syncprov_qresp( opcookie *opc, syncops *
         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 );          strcpy( sr->s_csn.bv_val, opc->sctxcsn.bv_val );
   
           ldap_pvt_thread_mutex_lock( &so->s_mutex );
         if ( !so->s_res ) {          if ( !so->s_res ) {
                 so->s_res = sr;                  so->s_res = sr;
         } else {          } else {
                 so->s_restail->s_next = sr;                  so->s_restail->s_next = sr;
         }          }
         so->s_restail = sr;          so->s_restail = sr;
   
           /* If the base of the psearch was modified, check it next time round */
           if ( so->s_flags & PS_WROTE_BASE ) {
                   so->s_flags ^= PS_WROTE_BASE;
                   so->s_flags |= PS_FIND_BASE;
           }
         if ( so->s_flags & PS_IS_DETACHED ) {          if ( so->s_flags & PS_IS_DETACHED ) {
                 ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );                  ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
                 if ( !so->s_qtask ) {                  if ( !so->s_qtask ) {
Line 1064  syncprov_matchops( Operation *op, opcook Line 1084  syncprov_matchops( Operation *op, opcook
                         continue;                          continue;
                 }                  }
   
   
                 /* If we're sending results now, look for this op in old matches */                  /* If we're sending results now, look for this op in old matches */
                 if ( !saveit ) {                  if ( !saveit ) {
                         syncmatches *old;                          syncmatches *old;
   
                           /* Did we modify the search base? */
                           if ( dn_match( &op->o_req_ndn, &ss->s_base )) {
                                   ldap_pvt_thread_mutex_lock( &ss->s_mutex );
                                   ss->s_flags |= PS_WROTE_BASE;
                                   ldap_pvt_thread_mutex_unlock( &ss->s_mutex );
                           }
   
                         for ( sm=opc->smatches, old=(syncmatches *)&opc->smatches; sm;                          for ( sm=opc->smatches, old=(syncmatches *)&opc->smatches; sm;
                                 old=sm, sm=sm->sm_next ) {                                  old=sm, sm=sm->sm_next ) {
                                 if ( sm->sm_op == ss ) {                                  if ( sm->sm_op == ss ) {
Line 1090  syncprov_matchops( Operation *op, opcook Line 1119  syncprov_matchops( Operation *op, opcook
                         } else {                          } else {
                                 /* if found send UPDATE else send ADD */                                  /* if found send UPDATE else send ADD */
                                 ss->s_inuse++;                                  ss->s_inuse++;
                                 ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );  
                                 syncprov_qresp( opc, ss,                                  syncprov_qresp( opc, ss,
                                         found ? LDAP_SYNC_MODIFY : LDAP_SYNC_ADD );                                          found ? LDAP_SYNC_MODIFY : LDAP_SYNC_ADD );
                                 ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );  
                                 ss->s_inuse--;                                  ss->s_inuse--;
                         }                          }
                 } else if ( !saveit && found ) {                  } else if ( !saveit && found ) {
                         /* send DELETE */                          /* send DELETE */
                         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );  
                         syncprov_qresp( opc, ss, LDAP_SYNC_DELETE );                          syncprov_qresp( opc, ss, LDAP_SYNC_DELETE );
                         ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );  
                 }                  }
         }          }
         ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );          ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
Line 1831  syncprov_op_search( Operation *op, SlapR Line 1856  syncprov_op_search( Operation *op, SlapR
                 fc.fbase = 0;                  fc.fbase = 0;
                 so.s_eid = NOID;                  so.s_eid = NOID;
                 so.s_op = op;                  so.s_op = op;
                 so.s_flags = PS_IS_REFRESHING;                  so.s_flags = PS_IS_REFRESHING | PS_FIND_BASE;
                 /* syncprov_findbase expects to be called as a callback... */                  /* syncprov_findbase expects to be called as a callback... */
                 sc.sc_private = &opc;                  sc.sc_private = &opc;
                 opc.son = on;                  opc.son = on;

Removed from v.1.107  
changed lines
  Added in v.1.108


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