diff options
Diffstat (limited to 'service-monitor/src/main/java/com/yahoo/vespa/service/model/ServiceModelCache.java')
-rw-r--r-- | service-monitor/src/main/java/com/yahoo/vespa/service/model/ServiceModelCache.java | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/model/ServiceModelCache.java b/service-monitor/src/main/java/com/yahoo/vespa/service/model/ServiceModelCache.java new file mode 100644 index 00000000000..7a6f37b2c94 --- /dev/null +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/model/ServiceModelCache.java @@ -0,0 +1,67 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +package com.yahoo.vespa.service.model; + +import com.yahoo.jdisc.Timer; +import com.yahoo.vespa.service.monitor.ServiceModel; + +import java.util.function.Supplier; + +/** + * Adds caching of a supplier of ServiceModel. + * + * @author hakonhall + */ +public class ServiceModelCache implements Supplier<ServiceModel> { + public static final long EXPIRY_MILLIS = 10000; + + private final Supplier<ServiceModel> expensiveSupplier; + private final Timer timer; + + private volatile ServiceModel snapshot; + private boolean updatePossiblyInProgress = false; + + private final Object updateMonitor = new Object(); + private long snapshotMillis; + + public ServiceModelCache(Supplier<ServiceModel> expensiveSupplier, Timer timer) { + this.expensiveSupplier = expensiveSupplier; + this.timer = timer; + } + + @Override + public ServiceModel get() { + if (snapshot == null) { + synchronized (updateMonitor) { + if (snapshot == null) { + takeSnapshot(); + } + } + } else if (expired()) { + synchronized (updateMonitor) { + if (updatePossiblyInProgress) { + return snapshot; + } + + updatePossiblyInProgress = true; + } + + takeSnapshot(); + + synchronized (updateMonitor) { + updatePossiblyInProgress = false; + } + } + + return snapshot; + } + + private void takeSnapshot() { + snapshot = expensiveSupplier.get(); + snapshotMillis = timer.currentTimeMillis(); + } + + private boolean expired() { + return timer.currentTimeMillis() - snapshotMillis >= EXPIRY_MILLIS; + } +} |