summaryrefslogtreecommitdiffstats
path: root/controller-server/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server/src/main')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java21
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java20
2 files changed, 41 insertions, 0 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
index f460561df08..5496eab049f 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ResourceMeterMaintainer.java
@@ -11,14 +11,17 @@ import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeRepository;
import com.yahoo.vespa.hosted.controller.api.integration.resource.MeteringClient;
import com.yahoo.vespa.hosted.controller.api.integration.resource.ResourceSnapshot;
+import com.yahoo.vespa.hosted.controller.persistence.CuratorDb;
import com.yahoo.yolean.Exceptions;
import java.time.Clock;
import java.time.Duration;
+import java.time.Instant;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
+import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.stream.Collectors;
@@ -33,9 +36,11 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
private final Metric metric;
private final NodeRepository nodeRepository;
private final MeteringClient meteringClient;
+ private final CuratorDb curator;
private static final String METERING_LAST_REPORTED = "metering_last_reported";
private static final String METERING_TOTAL_REPORTED = "metering_total_reported";
+ private static final int METERING_REFRESH_INTERVAL_SECONDS = 1800;
@SuppressWarnings("WeakerAccess")
public ResourceMeterMaintainer(Controller controller,
@@ -47,6 +52,7 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
this.nodeRepository = controller.serviceRegistry().configServer().nodeRepository();
this.metric = metric;
this.meteringClient = meteringClient;
+ this.curator = controller.curator();
}
@Override
@@ -71,6 +77,15 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
resourceSnapshots.stream()
.mapToDouble(r -> r.getCpuCores() + r.getMemoryGb() + r.getDiskGb()).sum(),
metric.createContext(Collections.emptyMap()));
+
+ try (var lock = curator.lockMeteringRefreshTime()) {
+ if (needsRefresh(curator.readMeteringRefreshTime())) {
+ meteringClient.refresh();
+ curator.writeMeteringRefreshTime(clock.millis());
+ }
+ } catch (TimeoutException ignored) {
+ // If it's locked, it means we're currently refreshing
+ }
}
private Collection<ResourceSnapshot> getAllResourceSnapshots() {
@@ -117,4 +132,10 @@ public class ResourceMeterMaintainer extends ControllerMaintainer {
return METERABLE_NODE_STATES.contains(node.state());
}
+ private boolean needsRefresh(long lastRefreshTimestamp) {
+ return clock.instant()
+ .minusSeconds(METERING_REFRESH_INTERVAL_SECONDS)
+ .isAfter(Instant.ofEpochMilli(lastRefreshTimestamp));
+ }
+
}
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java
index eda4f713732..bc0170ee695 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/CuratorDb.java
@@ -188,6 +188,10 @@ public class CuratorDb {
return curator.lock(lockRoot.append("nameServiceQueue"), defaultLockTimeout);
}
+ public Lock lockMeteringRefreshTime() throws TimeoutException {
+ return tryLock(lockRoot.append("meteringRefreshTime"));
+ }
+
// -------------- Helpers ------------------------------------------
/** Try locking with a low timeout, meaning it is OK to fail lock acquisition.
@@ -519,6 +523,18 @@ public class CuratorDb {
return allEndpointCertificateMetadata;
}
+ // -------------- Metering view refresh times ----------------------------
+
+ public void writeMeteringRefreshTime(long timestamp) {
+ curator.set(meteringRefreshPath(), Long.toString(timestamp).getBytes());
+ }
+
+ public long readMeteringRefreshTime() {
+ return curator.getData(meteringRefreshPath())
+ .map(String::new).map(Long::parseLong)
+ .orElse(0l);
+ }
+
// -------------- Paths ---------------------------------------------------
private Path lockPath(TenantName tenant) {
@@ -640,4 +656,8 @@ public class CuratorDb {
return endpointCertificateRoot.append(id.serializedForm());
}
+ private static Path meteringRefreshPath() {
+ return root.append("meteringRefreshTime");
+ }
+
}