diff options
author | Martin Polden <mpolden@mpolden.no> | 2019-05-15 10:39:34 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2019-05-15 14:41:23 +0200 |
commit | 018b97d17a6f47a9105df1a5e61ba10413f3d740 (patch) | |
tree | 4421784812313db6df84153203687cb4e6fc0dd2 /node-repository/src/main/java/com/yahoo/vespa/hosted/provision/LockedNodeList.java | |
parent | 3906d228fc5204b34e105b91aa5aad68b8d813ce (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.java | 39 |
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))); + } + +} |