diff options
author | Håkon Hallingstad <hakon@oath.com> | 2019-01-04 15:34:37 +0100 |
---|---|---|
committer | Håkon Hallingstad <hakon@oath.com> | 2019-01-04 15:34:37 +0100 |
commit | 52ee60f5f805f545f44bedc54eb123fbe48e5910 (patch) | |
tree | af05d0c367c77ffdf7de3ccee40e95ad3717b53a /flags | |
parent | c943174d6d6c38876c3950730f671b8ab2b6cd8b (diff) |
Export FlagData wire format
The FlagData wire format (WireFlagData and friends) is useful with e.g. Jersey
JAX-RS client when Jackson is used as a serializer. Therefore, export it.
Also, add a bit more sanity-checking on using Flags.Replacer during tests.
Diffstat (limited to 'flags')
3 files changed, 31 insertions, 7 deletions
diff --git a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java index 50f65e5ce13..c34ee5b265b 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/Flags.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/Flags.java @@ -6,13 +6,13 @@ import com.yahoo.vespa.defaults.Defaults; import java.util.ArrayList; import java.util.List; import java.util.Optional; -import java.util.concurrent.ConcurrentHashMap; +import java.util.TreeMap; /** * @author hakonhall */ public class Flags { - private static volatile ConcurrentHashMap<FlagId, FlagDefinition> flags = new ConcurrentHashMap<>(); + private static volatile TreeMap<FlagId, FlagDefinition> flags = new TreeMap<>(); public static final UnboundBooleanFlag HEALTHMONITOR_MONITOR_INFRA = defineFeatureFlag( "healthmonitor-monitorinfra", true, @@ -156,22 +156,39 @@ public class Flags { * <p>Returns a Replacer instance to be used with e.g. a try-with-resources block. Within the block, * the flags starts out as cleared. Flags can be defined, etc. When leaving the block, the flags from * before the block is reinserted. - * */ + * + * <p>NOT thread-safe. Tests using this cannot run in parallel. + */ public static Replacer clearFlagsForTesting() { return new Replacer(); } public static class Replacer implements AutoCloseable { - private final ConcurrentHashMap<FlagId, FlagDefinition> savedFlags; + private static volatile boolean flagsCleared = false; + + private final TreeMap<FlagId, FlagDefinition> savedFlags; private Replacer() { + verifyAndSetFlagsCleared(true); this.savedFlags = Flags.flags; - Flags.flags = new ConcurrentHashMap<>(); + Flags.flags = new TreeMap<>(); } @Override public void close() { + verifyAndSetFlagsCleared(false); Flags.flags = savedFlags; } + + /** + * Used to implement a simple verification that Replacer is not used by multiple threads. + * For instance two different tests running in parallel cannot both use Replacer. + */ + private static void verifyAndSetFlagsCleared(boolean newValue) { + if (flagsCleared == newValue) { + throw new IllegalStateException("clearFlagsForTesting called while already cleared - running tests in parallell!?"); + } + flagsCleared = newValue; + } } } diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/FlagData.java b/flags/src/main/java/com/yahoo/vespa/flags/json/FlagData.java index b5bc2032bae..572ec511607 100644 --- a/flags/src/main/java/com/yahoo/vespa/flags/json/FlagData.java +++ b/flags/src/main/java/com/yahoo/vespa/flags/json/FlagData.java @@ -74,7 +74,8 @@ public class FlagData { return toWire().serializeToJsonNode(); } - private WireFlagData toWire() { + /** Can be used with Jackson. */ + public WireFlagData toWire() { WireFlagData wireFlagData = new WireFlagData(); wireFlagData.id = id.toString(); @@ -100,7 +101,8 @@ public class FlagData { return fromWire(WireFlagData.deserialize(string)); } - private static FlagData fromWire(WireFlagData wireFlagData) { + /** Can be used with Jackson. */ + public static FlagData fromWire(WireFlagData wireFlagData) { if (wireFlagData.id == null) { throw new IllegalArgumentException("Flag ID missing"); } diff --git a/flags/src/main/java/com/yahoo/vespa/flags/json/wire/package-info.java b/flags/src/main/java/com/yahoo/vespa/flags/json/wire/package-info.java new file mode 100644 index 00000000000..408908c312e --- /dev/null +++ b/flags/src/main/java/com/yahoo/vespa/flags/json/wire/package-info.java @@ -0,0 +1,5 @@ +// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +@ExportPackage +package com.yahoo.vespa.flags.json.wire; + +import com.yahoo.osgi.annotation.ExportPackage; |