コード例 #1
0
SharedRefPtr<Host> LatencyAwarePolicy::LatencyAwareQueryPlan::compute_next() {
    int64_t min = policy_->min_average_.load();
    const Settings& settings = policy_->settings_;
    uint64_t now = uv_hrtime();

    SharedRefPtr<Host> host;
    while ((host = child_plan_->compute_next())) {
        TimestampedAverage latency = host->get_current_average();

        if (min < 0 ||
                latency.average < 0 ||
                latency.num_measured < settings.min_measured ||
                (now - latency.timestamp) > settings.retry_period_ns) {
            return host;
        }

        if (latency.average <= static_cast<int64_t>(settings.exclusion_threshold * min)) {
            return host;
        }

        skipped_.push_back(host);
    }

    if (skipped_index_ < skipped_.size()) {
        return skipped_[skipped_index_++];
    }

    return SharedRefPtr<Host>();
}