Skip to content

Commit 4281d07

Browse files
committed
Add host tracker in onUp/onAdd
This avoids a race when onDown/onRemove removes the tracker, but pending requests complete after that and re-add it.
1 parent 6f16812 commit 4281d07

File tree

1 file changed

+35
-27
lines changed

1 file changed

+35
-27
lines changed

driver-core/src/main/java/com/datastax/driver/core/policies/LatencyAwarePolicy.java

Lines changed: 35 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@ private static ThreadFactory threadFactory(String nameFormat) {
178178
@Override
179179
public void init(Cluster cluster, Collection<Host> hosts) {
180180
childPolicy.init(cluster, hosts);
181+
for (Host host : hosts) {
182+
latencyTracker.addHost(host);
183+
}
181184
cluster.register(latencyTracker);
182185
metrics = cluster.getMetrics();
183186
if (metrics != null) {
@@ -303,6 +306,7 @@ public Snapshot getScoresSnapshot() {
303306
@Override
304307
public void onUp(Host host) {
305308
childPolicy.onUp(host);
309+
latencyTracker.addHost(host);
306310
}
307311

308312
@Override
@@ -314,6 +318,7 @@ public void onDown(Host host) {
314318
@Override
315319
public void onAdd(Host host) {
316320
childPolicy.onAdd(host);
321+
latencyTracker.addHost(host);
317322
}
318323

319324
@Override
@@ -423,34 +428,15 @@ private class Tracker implements LatencyTracker {
423428

424429
@Override
425430
public void update(final Host host, Statement statement, Exception exception, long newLatencyNanos) {
426-
if (shouldConsiderNewLatency(statement, exception)) {
427-
HostLatencyTracker hostTracker = latencies.get(host);
428-
if (hostTracker == null) {
429-
hostTracker = new HostLatencyTracker(scale, (30L * minMeasure) / 100L);
430-
HostLatencyTracker old = latencies.putIfAbsent(host, hostTracker);
431-
if (old != null) {
432-
hostTracker = old;
433-
} else if (hostMetricsEnabled()) {
434-
String metricName = MetricsUtil.hostMetricName("LatencyAwarePolicy.latencies.", host);
435-
if (!metrics.getRegistry().getNames().contains(metricName)) {
436-
logger.info("Adding gauge " + metricName);
437-
metrics.getRegistry().register(
438-
metricName,
439-
new Gauge<Long>() {
440-
@Override
441-
public Long getValue() {
442-
TimestampedAverage latency = latencyTracker.latencyOf(host);
443-
return (latency == null) ? -1 : latency.average;
444-
}
445-
});
446-
}
447-
}
431+
HostLatencyTracker hostTracker = latencies.get(host);
432+
if (hostTracker != null) {
433+
if (shouldConsiderNewLatency(statement, exception)) {
434+
hostTracker.add(newLatencyNanos);
435+
} else if (hostMetricsEnabled()) {
436+
metrics.getRegistry()
437+
.counter(MetricsUtil.hostMetricName("LatencyAwarePolicy.ignored-latencies.", host))
438+
.inc();
448439
}
449-
hostTracker.add(newLatencyNanos);
450-
} else if (hostMetricsEnabled()) {
451-
metrics.getRegistry()
452-
.counter(MetricsUtil.hostMetricName("LatencyAwarePolicy.ignored-latencies.", host))
453-
.inc();
454440
}
455441
}
456442

@@ -490,7 +476,29 @@ public Map<Host, TimestampedAverage> currentLatencies() {
490476
return map;
491477
}
492478

479+
public void addHost(final Host host) {
480+
logger.debug("Adding tracker for {}", host);
481+
HostLatencyTracker old = latencies.putIfAbsent(host,
482+
new HostLatencyTracker(scale, (30L * minMeasure) / 100L));
483+
if (old == null && hostMetricsEnabled()) {
484+
String metricName = MetricsUtil.hostMetricName("LatencyAwarePolicy.latencies.", host);
485+
if (!metrics.getRegistry().getNames().contains(metricName)) {
486+
logger.debug("Adding gauge " + metricName);
487+
metrics.getRegistry().register(
488+
metricName,
489+
new Gauge<Long>() {
490+
@Override
491+
public Long getValue() {
492+
TimestampedAverage latency = latencyTracker.latencyOf(host);
493+
return (latency == null) ? -1 : latency.average;
494+
}
495+
});
496+
}
497+
}
498+
}
499+
493500
public void resetHost(Host host) {
501+
logger.debug("Removing tracker for {}", host);
494502
latencies.remove(host);
495503
}
496504

0 commit comments

Comments
 (0)