void QueryOptimizerCursorImpl::recoverFromTouchingEarlierIterate() {
     if ( _takeover ) {
         _takeover->recoverFromTouchingEarlierIterate();
     }
     else if ( _currRunner ) {
         if ( _mps->currentNPlans() == 1 ) {
             _currRunner->recoverFromTouchingEarlierIterate();
         }
         else {
             recoverFromYield();
         }
     }
 }
Ejemplo n.º 2
0
 void QueryPlanSet::Runner::mayYield() {
     if ( _plans._mayYield ) {
         if ( _plans._yieldSometimesTracker.ping() ) {
             int micros = ClientCursor::yieldSuggest();
             if ( micros > 0 ) {
                 if ( !prepareToYield() ) {
                     return;   
                 }
                 ClientCursor::staticYield( micros , _plans._ns );
                 recoverFromYield();
             }
         }
     }
 }
Ejemplo n.º 3
0
 void QueryPlanSet::Runner::mayYield( const vector< shared_ptr< QueryOp > > &ops ) {
     if ( _plans._mayYield ) {
         if ( _plans._yieldSometimesTracker.ping() ) {
             int micros = ClientCursor::yieldSuggest();
             if ( micros > 0 ) {
                 for( vector<shared_ptr<QueryOp> >::const_iterator i = ops.begin(); i != ops.end(); ++i ) {
                     if ( !prepareToYield( **i ) ) {
                         return;
                     }
                 }
                 ClientCursor::staticYield( micros , _plans._ns );
                 for( vector<shared_ptr<QueryOp> >::const_iterator i = ops.begin(); i != ops.end(); ++i ) {
                     recoverFromYield( **i );
                 }
             }
         }
     }
 }