bool AsyncResultsMerger::ready_inlock() { if (_lifecycleState != kAlive) { return true; } if (_eofNext) { // We are ready to return boost::none due to reaching the end of a batch of results from a // tailable cursor. return true; } for (const auto& remote : _remotes) { // First check whether any of the remotes reported an error. if (!remote.status.isOK()) { _status = remote.status; return true; } // We don't return any results until we have received at least one response from each remote // node. This is necessary for versioned commands: we have to ensure that we've properly // established the shard version on each node before we can start returning results. if (!remote.cursorId) { return false; } } const bool hasSort = !_params.sort.isEmpty(); return hasSort ? readySorted_inlock() : readyUnsorted_inlock(); }
bool AsyncClusterClientCursor::ready_inlock() { if (_lifecycleState != kAlive) { return true; } // First check whether any of the remotes reported an error. for (const auto& remote : _remotes) { if (!remote.status.isOK()) { _status = remote.status; return true; } } const bool hasSort = !_params.sort.isEmpty(); return hasSort ? readySorted_inlock() : readyUnsorted_inlock(); }
bool AsyncResultsMerger::ready_inlock() { if (_lifecycleState != kAlive) { return true; } if (_eofNext) { // We are ready to return boost::none due to reaching the end of a batch of results from a // tailable cursor. return true; } for (const auto& remote : _remotes) { // First check whether any of the remotes reported an error. if (!remote.status.isOK()) { _status = remote.status; return true; } } const bool hasSort = !_params->sort.isEmpty(); return hasSort ? readySorted_inlock() : readyUnsorted_inlock(); }