aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-14 09:16:46 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2021-09-14 09:17:14 +0200
commit7b3242d789ba40b854130706a010f26af125328f (patch)
tree758fdec6285944b0ab2453358856075b92ef00da /config-model/src/main/java/com/yahoo/searchdefinition/RankingConstants.java
parenta72175250295f12c1b7d8c77ce8174096ca6b551 (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.java23
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 */