aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2019-05-15 10:39:34 +0200
committerMartin Polden <mpolden@mpolden.no>2019-05-15 14:41:23 +0200
commit018b97d17a6f47a9105df1a5e61ba10413f3d740 (patch)
tree4421784812313db6df84153203687cb4e6fc0dd2 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java
parent3906d228fc5204b34e105b91aa5aad68b8d813ce (diff)
Add LockedNodeList
A LockedNodeList indicates that the entire node repository is locked, and that no nodes in the list will change while the lock held.
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java39
1 files changed, 39 insertions, 0 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java
new file mode 100644
index 00000000000..b90906f8974
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java
@@ -0,0 +1,39 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.provision;
+
+import com.yahoo.transaction.Mutex;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import static java.util.stream.Collectors.collectingAndThen;
+
+/**
+ * A type-safe wrapper for {@link NodeList}. Callers that have a reference to this can safely be assumed to holding the
+ * write lock for the node repository.
+ *
+ * This is typically used in situations where modifying a node object depends on inspecting a consistent state of other
+ * nodes in the repository.
+ *
+ * @author mpolden
+ */
+public class LockedNodeList extends NodeList {
+
+ private final Mutex lock;
+
+ public LockedNodeList(List<Node> nodes, Mutex lock) {
+ super(nodes);
+ this.lock = Objects.requireNonNull(lock, "lock must be non-null");
+ }
+
+ @Override
+ public LockedNodeList filter(Predicate<Node> predicate) {
+ return asList().stream()
+ .filter(predicate)
+ .collect(collectingAndThen(Collectors.toList(),
+ (nodes) -> new LockedNodeList(nodes, lock)));
+ }
+
+}