diff options
author | Håkon Hallingstad <hakon@oath.com> | 2019-01-26 15:04:53 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@oath.com> | 2019-01-26 15:04:53 +0100 |
commit | a4cf71ae67fe32748cc06eb338be96889c4493ee (patch) | |
tree | 69b07b0b89f38bd7e0da226331f45b988b0cd64a /configserver-flags/src/main | |
parent | 8e700d0078e1015756a23781efc461913dc87419 (diff) |
Cache flags DB
Up until now every lookup of a flag on ZooKeeperFlagSource would hit ZooKeeper.
Flags are ideal for caching: Changes seldom, little data, clients should handle
short-lived inconsistencies.
This PR will make the backing FlagsDbImpl cache the /flags/v1 ZK directory and
completes the optimization of ConfigServerFlagSource.
Diffstat (limited to 'configserver-flags/src/main')
-rw-r--r-- | configserver-flags/src/main/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImpl.java | 26 |
1 files changed, 18 insertions, 8 deletions
diff --git a/configserver-flags/src/main/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImpl.java b/configserver-flags/src/main/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImpl.java index 7b0a2f632cc..c313a47ad13 100644 --- a/configserver-flags/src/main/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImpl.java +++ b/configserver-flags/src/main/java/com/yahoo/vespa/configserver/flags/db/FlagsDbImpl.java @@ -7,10 +7,15 @@ import com.yahoo.vespa.configserver.flags.FlagsDb; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.flags.FlagId; import com.yahoo.vespa.flags.json.FlagData; +import org.apache.curator.framework.recipes.cache.ChildData; -import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.function.Function; +import java.util.stream.Collectors; /** * @author hakonhall @@ -19,15 +24,21 @@ public class FlagsDbImpl implements FlagsDb { private static final Path ROOT_PATH = Path.fromString("/flags/v1"); private final Curator curator; + private final Curator.DirectoryCache cache; @Inject public FlagsDbImpl(Curator curator) { this.curator = curator; + curator.create(ROOT_PATH); + ExecutorService executorService = Executors.newFixedThreadPool(1); + this.cache = curator.createDirectoryCache(ROOT_PATH.toString(), true, false, executorService); } @Override public Optional<FlagData> getValue(FlagId flagId) { - return curator.getData(getZkPathFor(flagId)).map(FlagData::deserializeUtf8Json); + return Optional.ofNullable(cache.getCurrentData(getZkPathFor(flagId))) + .map(ChildData::getData) + .map(FlagData::deserializeUtf8Json); } @Override @@ -37,12 +48,11 @@ public class FlagsDbImpl implements FlagsDb { @Override public Map<FlagId, FlagData> getAllFlags() { - Map<FlagId, FlagData> flags = new HashMap<>(); - for (String flagId : curator.getChildren(ROOT_PATH)) { - FlagId id = new FlagId(flagId); - getValue(id).ifPresent(data -> flags.put(id, data)); - } - return flags; + List<ChildData> dataList = cache.getCurrentData(); + return dataList.stream() + .map(ChildData::getData) + .map(FlagData::deserializeUtf8Json) + .collect(Collectors.toMap(FlagData::id, Function.identity())); } @Override |