void QueryOptimizerCursorImpl::recoverFromTouchingEarlierIterate() { if ( _takeover ) { _takeover->recoverFromTouchingEarlierIterate(); } else if ( _currRunner ) { if ( _mps->currentNPlans() == 1 ) { _currRunner->recoverFromTouchingEarlierIterate(); } else { recoverFromYield(); } } }
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(); } } } }
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 ); } } } } }