diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-14 09:16:46 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-14 09:17:14 +0200 |
commit | 7b3242d789ba40b854130706a010f26af125328f (patch) | |
tree | 758fdec6285944b0ab2453358856075b92ef00da /config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java | |
parent | a72175250295f12c1b7d8c77ce8174096ca6b551 (diff) |
Make the LargeConstants usable concurrently from many threads
Diffstat (limited to 'config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java')
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java b/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java index 8ccc0ef429e..3d19cba78b6 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java @@ -6,8 +6,9 @@ import com.yahoo.vespa.model.AbstractService; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; /** * Constant values for ranking/model execution tied to a search definition, or globally to an application @@ -17,7 +18,7 @@ import java.util.Map; */ public class RankingConstants { - private final Map<String, RankingConstant> constants = new HashMap<>(); + private final Map<String, RankingConstant> constants = new ConcurrentHashMap<>(); private final FileRegistry fileRegistry; public RankingConstants(FileRegistry fileRegistry) { @@ -28,9 +29,23 @@ public class RankingConstants { constant.validate(); constant.register(fileRegistry); String name = constant.getName(); - if (constants.containsKey(name)) + RankingConstant prev = constants.putIfAbsent(name, constant); + if ( prev != null ) throw new IllegalArgumentException("Ranking constant '" + name + "' defined twice"); - constants.put(name, constant); + } + public void putIfAbsent(RankingConstant constant) { + constant.validate(); + constant.register(fileRegistry); + String name = constant.getName(); + constants.putIfAbsent(name, constant); + } + public void computeIfAbsent(String name, Function<? super String, ? extends RankingConstant> createConstant) { + constants.computeIfAbsent(name, key -> { + RankingConstant constant = createConstant.apply(key); + constant.validate(); + constant.register(fileRegistry); + return constant; + }); } /** Returns the ranking constant with the given name, or null if not present */ |