diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-16 13:10:39 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-16 13:10:39 +0200 |
commit | 1cb32962e700c998ee67ca9a90ef2a411fd5fd4d (patch) | |
tree | 5864a16c31fee39e97c306fbae692ad0744ed3dd /config-model | |
parent | 20dc2c895ab6cbefb9a02c9d1fdb8a2b543f1867 (diff) |
Make LargeRankExpressions thread safe.
Diffstat (limited to 'config-model')
-rw-r--r-- | config-model/src/main/java/com/yahoo/searchdefinition/LargeRankExpressions.java | 23 |
1 files changed, 9 insertions, 14 deletions
diff --git a/config-model/src/main/java/com/yahoo/searchdefinition/LargeRankExpressions.java b/config-model/src/main/java/com/yahoo/searchdefinition/LargeRankExpressions.java index 90dc40e7b93..76ad7e9a4ed 100644 --- a/config-model/src/main/java/com/yahoo/searchdefinition/LargeRankExpressions.java +++ b/config-model/src/main/java/com/yahoo/searchdefinition/LargeRankExpressions.java @@ -5,11 +5,11 @@ 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; public class LargeRankExpressions { - private final Map<String, RankExpressionBody> expressions = new HashMap<>(); + private final Map<String, RankExpressionBody> expressions = new ConcurrentHashMap<>(); private final FileRegistry fileRegistry; public LargeRankExpressions(FileRegistry fileRegistry) { @@ -17,25 +17,20 @@ public class LargeRankExpressions { } public void add(RankExpressionBody expression) { - expression.validate(); - expression.register(fileRegistry); String name = expression.getName(); - if (expressions.containsKey(name)) { - if ( ! expressions.get(name).getBlob().equals(expression.getBlob())) { + RankExpressionBody prev = expressions.putIfAbsent(name, expression); + if (prev == null) { + expression.validate(); + expression.register(fileRegistry); + } else { + if ( ! prev.getBlob().equals(expression.getBlob())) { throw new IllegalArgumentException("Rank expression '" + name + - "' defined twice. Previous blob with " + expressions.get(name).getBlob().remaining() + + "' defined twice. Previous blob with " + prev.getBlob().remaining() + " bytes, while current has " + expression.getBlob().remaining() + " bytes"); } - } else { - expressions.put(name, expression); } } - /** Returns the ranking constant with the given name, or null if not present */ - public RankExpressionBody get(String name) { - return expressions.get(name); - } - /** Returns a read-only map of the ranking constants in this indexed by name */ public Map<String, RankExpressionBody> asMap() { return Collections.unmodifiableMap(expressions); |