Refactor flow rule store to resolve missing flows with old masters following mastership reassignment
Change-Id: I7b7e639c84cbd23fe9ab1f12080f865cdfc7f7f9
diff --git a/utils/misc/src/main/java/org/onlab/util/Tools.java b/utils/misc/src/main/java/org/onlab/util/Tools.java
index caac1c1..1246ec9 100644
--- a/utils/misc/src/main/java/org/onlab/util/Tools.java
+++ b/utils/misc/src/main/java/org/onlab/util/Tools.java
@@ -755,6 +755,31 @@
}
/**
+ * Returns a new CompletableFuture completed with the first result from a list of futures. If no future
+ * is completed successfully, the returned future will be completed with the first exception.
+ *
+ * @param futures the input futures
+ * @param <T> future result type
+ * @return a new CompletableFuture
+ */
+ public static <T> CompletableFuture<T> firstOf(List<CompletableFuture<T>> futures) {
+ CompletableFuture<T> resultFuture = new CompletableFuture<>();
+ CompletableFuture.allOf(futures.stream()
+ .map(future -> future.thenAccept(r -> resultFuture.complete(r)))
+ .toArray(CompletableFuture[]::new))
+ .whenComplete((r, e) -> {
+ if (!resultFuture.isDone()) {
+ if (e != null) {
+ resultFuture.completeExceptionally(e);
+ } else {
+ resultFuture.complete(null);
+ }
+ }
+ });
+ return resultFuture;
+ }
+
+ /**
* Returns a new CompletableFuture completed by with the first positive result from a list of
* input CompletableFutures.
*