RGWRESTConn::RGWRESTConn(RGWRESTConn&& other)
: cct(other.cct),
- endpoint_round_robin_counter(other.endpoint_round_robin_counter.load()),
+ endpoint_rr_index(other.endpoint_rr_index.load()),
resolved_endpoints(std::move(other.resolved_endpoints)),
key(std::move(other.key)),
self_zone_group(std::move(other.self_zone_group)),
RGWRESTConn& RGWRESTConn::operator=(RGWRESTConn&& other)
{
cct = other.cct;
- endpoint_round_robin_counter = other.endpoint_round_robin_counter.load();
+ endpoint_rr_index = other.endpoint_rr_index.load();
resolved_endpoints = std::move(other.resolved_endpoints);
key = std::move(other.key);
self_zone_group = std::move(other.self_zone_group);
const auto ip_fail_timeout = cct->_conf->rgw_rest_conn_ip_fail_timeout_secs;
const size_t num_ips = resolved_endpoint.resolved_ips.size();
+ auto now = ceph::real_clock::now();
// Round-robin through IPs, skipping any that are marked down
for (size_t i = 0; i < num_ips; ++i) {
- size_t idx = resolved_endpoint.endpoint_ips_round_robin_counter++ % num_ips;
+ size_t idx = resolved_endpoint.ip_rr_index++ % num_ips;
ResolvedIP& ip_status = resolved_endpoint.resolved_ips[idx];
const auto& last_fail = ip_status.last_failure.load();
return;
}
- auto diff = ceph::to_seconds<double>(ceph::real_clock::now() - last_fail);
+ auto diff = ceph::to_seconds<double>(now - last_fail);
if (diff >= ip_fail_timeout) {
// Failure expired, mark IP as up and use it
ip_status.mark_up();
size_t num = 0;
size_t selected_idx = 0;
while (num < resolved_endpoints.size()) {
- int i = ++endpoint_round_robin_counter;
+ int i = ++endpoint_rr_index;
selected_idx = i % resolved_endpoints.size();
ResolvedEndpoint& res_ep = resolved_endpoints[selected_idx];
std::string host; // e.g., "s3.abc.com"
int port = -1; // e.g., 8443
std::vector<ResolvedIP> resolved_ips; // Per-IP connect_to strings with health status
- mutable size_t endpoint_ips_round_robin_counter = 0; // round-robin index for IPs
+ mutable std::atomic<size_t> ip_rr_index{0}; // round-robin index for IPs
mutable std::atomic<ceph::real_time> last_failure_time; // most recent IP failure seen on this endpoint
ResolvedEndpoint() : last_failure_time(ceph::real_clock::zero()) {}
host(std::move(other.host)),
port(other.port),
resolved_ips(std::move(other.resolved_ips)),
- endpoint_ips_round_robin_counter(other.endpoint_ips_round_robin_counter),
+ ip_rr_index(other.ip_rr_index.load()),
last_failure_time(other.last_failure_time.load())
{}
host = std::move(other.host);
port = other.port;
resolved_ips = std::move(other.resolved_ips);
- endpoint_ips_round_robin_counter = other.endpoint_ips_round_robin_counter;
+ ip_rr_index.store(other.ip_rr_index.load());
last_failure_time.store(other.last_failure_time.load());
return *this;
}
class RGWRESTConn
{
CephContext *cct;
- std::atomic<int64_t> endpoint_round_robin_counter = { 0 }; // Round-robin counter for resolved_endpoints
+ std::atomic<int64_t> endpoint_rr_index = { 0 }; // Round-robin counter for resolved_endpoints
std::vector<ResolvedEndpoint> resolved_endpoints;
RGWAccessKey key;
std::string self_zone_group;