aboutsummaryrefslogtreecommitdiffstats
path: root/config-model
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-16 13:10:39 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-09-16 13:10:39 +0200
commit1cb32962e700c998ee67ca9a90ef2a411fd5fd4d (patch)
tree5864a16c31fee39e97c306fbae692ad0744ed3dd /config-model
parent20dc2c895ab6cbefb9a02c9d1fdb8a2b543f1867 (diff)
Make LargeRankExpressions thread safe.
Diffstat (limited to 'config-model')
-rw-r--r--config-model/src/main/java/com/yahoo/searchdefinition/LargeRankExpressions.java23
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);