Diff for /servers/slapd/overlays/syncprov.c between versions 1.147.2.16 and 1.221

version 1.147.2.16, 2008/02/11 23:26:49 version 1.221, 2008/03/14 15:49:53
Line 1 Line 1
 /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.147.2.15 2008/02/09 00:08:02 quanah Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.220 2008/03/13 09:49:32 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 837  syncprov_sendresp( Operation *op, opcook Line 837  syncprov_sendresp( Operation *op, opcook
   
 /* Play back queued responses */  /* Play back queued responses */
 static int  static int
 syncprov_qplay( Operation *op, slap_overinst *on, syncops *so )  syncprov_qplay( Operation *op, struct re_s *rtask )
 {  {
           syncops *so = rtask->arg;
           slap_overinst *on = LDAP_SLIST_FIRST(&so->s_op->o_extra)->oe_key;
         syncres *sr;          syncres *sr;
         Entry *e;          Entry *e;
         opcookie opc;          opcookie opc;
Line 853  syncprov_qplay( Operation *op, slap_over Line 855  syncprov_qplay( Operation *op, slap_over
                         so->s_res = sr->s_next;                          so->s_res = sr->s_next;
                 if ( !so->s_res )                  if ( !so->s_res )
                         so->s_restail = NULL;                          so->s_restail = NULL;
                 ldap_pvt_thread_mutex_unlock( &so->s_mutex );                  /* Exit loop with mutex held */
   
                 if ( !sr || so->s_op->o_abandon )                  if ( !sr || so->s_op->o_abandon )
                         break;                          break;
                   ldap_pvt_thread_mutex_unlock( &so->s_mutex );
   
                 opc.sdn = sr->s_dn;                  opc.sdn = sr->s_dn;
                 opc.sndn = sr->s_ndn;                  opc.sndn = sr->s_ndn;
Line 883  syncprov_qplay( Operation *op, slap_over Line 885  syncprov_qplay( Operation *op, slap_over
   
                 ch_free( sr );                  ch_free( sr );
   
                 if ( rc )                  if ( rc ) {
                           /* Exit loop with mutex held */
                           ldap_pvt_thread_mutex_lock( &so->s_mutex );
                         break;                          break;
                   }
         }          }
   
           /* wait until we get explicitly scheduled again */
           ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
           ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
           if ( rc == 0 ) {
                   ldap_pvt_runqueue_resched( &slapd_rq, rtask, 1 );
           } else {
                   /* bail out on any error */
                   ldap_pvt_runqueue_remove( &slapd_rq, rtask );
           }
           ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
           ldap_pvt_thread_mutex_unlock( &so->s_mutex );
         return rc;          return rc;
 }  }
   
Line 895  syncprov_qtask( void *ctx, void *arg ) Line 912  syncprov_qtask( void *ctx, void *arg )
 {  {
         struct re_s *rtask = arg;          struct re_s *rtask = arg;
         syncops *so = rtask->arg;          syncops *so = rtask->arg;
         slap_overinst *on = so->s_op->o_private;  
         OperationBuffer opbuf;          OperationBuffer opbuf;
         Operation *op;          Operation *op;
         BackendDB be;          BackendDB be;
Line 917  syncprov_qtask( void *ctx, void *arg ) Line 933  syncprov_qtask( void *ctx, void *arg )
         be = *so->s_op->o_bd;          be = *so->s_op->o_bd;
         be.be_flags |= SLAP_DBFLAG_OVERLAY;          be.be_flags |= SLAP_DBFLAG_OVERLAY;
         op->o_bd = &be;          op->o_bd = &be;
         op->o_private = NULL;          LDAP_SLIST_FIRST(&op->o_extra) = NULL;
         op->o_callback = NULL;          op->o_callback = NULL;
   
         rc = syncprov_qplay( op, on, so );          rc = syncprov_qplay( op, rtask );
   
         /* decrement use count... */          /* decrement use count... */
         syncprov_free_syncop( so );          syncprov_free_syncop( so );
   
         /* wait until we get explicitly scheduled again */  
         ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );  
         ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );  
         if ( rc == 0 ) {  
                 ldap_pvt_runqueue_resched( &slapd_rq, rtask, 1 );  
         } else {  
                 /* bail out on any error */  
                 ldap_pvt_runqueue_remove( &slapd_rq, rtask );  
         }  
         ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );  
   
 #if 0   /* FIXME: connection_close isn't exported from slapd.  #if 0   /* FIXME: connection_close isn't exported from slapd.
                  * should it be?                   * should it be?
                  */                   */
Line 1209  syncprov_matchops( Operation *op, opcook Line 1214  syncprov_matchops( Operation *op, opcook
                 }                  }
   
                 /* check if current o_req_dn is in scope and matches filter */                  /* check if current o_req_dn is in scope and matches filter */
                 if ( fc.fscope && test_filter( op, e, ss->s_op->ors_filter ) ==                  if ( fc.fscope && test_filter( ss->s_op, e, ss->s_op->ors_filter ) ==
                         LDAP_COMPARE_TRUE ) {                          LDAP_COMPARE_TRUE ) {
                         if ( saveit ) {                          if ( saveit ) {
                                 sm = op->o_tmpalloc( sizeof(syncmatches), op->o_tmpmemctx );                                  sm = op->o_tmpalloc( sizeof(syncmatches), op->o_tmpmemctx );
Line 1775  syncprov_op_mod( Operation *op, SlapRepl Line 1780  syncprov_op_mod( Operation *op, SlapRepl
                         /* wait for this op to get to head of list */                          /* wait for this op to get to head of list */
                         while ( mt->mt_mods != mi ) {                          while ( mt->mt_mods != mi ) {
                                 ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );                                  ldap_pvt_thread_mutex_unlock( &mt->mt_mutex );
                                 ldap_pvt_thread_yield();                                  /* FIXME: if dynamic config can delete overlays or
                                    * databases we'll have to check for cleanup here.
                                    * Currently it's not an issue because there are
                                    * no dynamic config deletes...
                                    */
                                   if ( !ldap_pvt_thread_pool_pausecheck( &connection_pool ))
                                           ldap_pvt_thread_yield();
                                 ldap_pvt_thread_mutex_lock( &mt->mt_mutex );                                  ldap_pvt_thread_mutex_lock( &mt->mt_mutex );
   
                                 /* clean up if the caller is giving up */                                  /* clean up if the caller is giving up */
Line 1843  syncprov_search_cleanup( Operation *op, Line 1854  syncprov_search_cleanup( Operation *op,
 typedef struct SyncOperationBuffer {  typedef struct SyncOperationBuffer {
         Operation               sob_op;          Operation               sob_op;
         Opheader                sob_hdr;          Opheader                sob_hdr;
           OpExtra                 sob_oe;
         AttributeName   sob_extra;      /* not always present */          AttributeName   sob_extra;      /* not always present */
         /* Further data allocated here */          /* Further data allocated here */
 } SyncOperationBuffer;  } SyncOperationBuffer;
Line 1871  syncprov_detach_op( Operation *op, synco Line 1883  syncprov_detach_op( Operation *op, synco
         sopbuf2 = ch_calloc( 1, size );          sopbuf2 = ch_calloc( 1, size );
         op2 = &sopbuf2->sob_op;          op2 = &sopbuf2->sob_op;
         op2->o_hdr = &sopbuf2->sob_hdr;          op2->o_hdr = &sopbuf2->sob_hdr;
           LDAP_SLIST_FIRST(&op2->o_extra) = &sopbuf2->sob_oe;
   
         /* Copy the fields we care about explicitly, leave the rest alone */          /* Copy the fields we care about explicitly, leave the rest alone */
         *op2->o_hdr = *op->o_hdr;          *op2->o_hdr = *op->o_hdr;
Line 1878  syncprov_detach_op( Operation *op, synco Line 1891  syncprov_detach_op( Operation *op, synco
         op2->o_time = op->o_time;          op2->o_time = op->o_time;
         op2->o_bd = on->on_info->oi_origdb;          op2->o_bd = on->on_info->oi_origdb;
         op2->o_request = op->o_request;          op2->o_request = op->o_request;
         op2->o_private = on;          LDAP_SLIST_FIRST(&op2->o_extra)->oe_key = on;
           LDAP_SLIST_NEXT(LDAP_SLIST_FIRST(&op2->o_extra), oe_next) = NULL;
   
         ptr = (char *) sopbuf2 + offsetof( SyncOperationBuffer, sob_extra );          ptr = (char *) sopbuf2 + offsetof( SyncOperationBuffer, sob_extra );
         if ( i ) {          if ( i ) {
Line 1929  syncprov_detach_op( Operation *op, synco Line 1943  syncprov_detach_op( Operation *op, synco
         op2->o_do_not_cache = 1;          op2->o_do_not_cache = 1;
   
         /* Add op2 to conn so abandon will find us */          /* Add op2 to conn so abandon will find us */
         ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );  
         op->o_conn->c_n_ops_executing++;          op->o_conn->c_n_ops_executing++;
         op->o_conn->c_n_ops_completed--;          op->o_conn->c_n_ops_completed--;
         LDAP_STAILQ_INSERT_TAIL( &op->o_conn->c_ops, op2, o_next );          LDAP_STAILQ_INSERT_TAIL( &op->o_conn->c_ops, op2, o_next );
         so->s_flags |= PS_IS_DETACHED;          so->s_flags |= PS_IS_DETACHED;
         ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );  
   
         /* Prevent anyone else from trying to send a result for this op */          /* Prevent anyone else from trying to send a result for this op */
         op->o_abandon = 1;          op->o_abandon = 1;
Line 2044  syncprov_search_response( Operation *op, Line 2056  syncprov_search_response( Operation *op,
   
                         /* 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 );
                           ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex );
   
                         /* Turn off the refreshing flag */                          /* But not if this connection was closed along the way */
                         ss->ss_so->s_flags ^= PS_IS_REFRESHING;                          if ( op->o_abandon ) {
                                   ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
                                   ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex );
                                   syncprov_free_syncop( ss->ss_so );
                                   return SLAPD_ABANDON;
   
                         syncprov_detach_op( op, ss->ss_so, on );                          } else {
                                   /* Turn off the refreshing flag */
                                   ss->ss_so->s_flags ^= PS_IS_REFRESHING;
   
                                   syncprov_detach_op( op, ss->ss_so, on );
   
                         /* If there are queued responses, fire them off */                                  ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex );
                         if ( ss->ss_so->s_res )  
                                 syncprov_qstart( ss->ss_so );                                  /* If there are queued responses, fire them off */
                                   if ( ss->ss_so->s_res )
                                           syncprov_qstart( ss->ss_so );
                           }
                         ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex );                          ldap_pvt_thread_mutex_unlock( &ss->ss_so->s_mutex );
   
                         return LDAP_SUCCESS;                          return LDAP_SUCCESS;

Removed from v.1.147.2.16  
changed lines
  Added in v.1.221


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