This is an automated email from the ASF dual-hosted git repository.

szetszwo pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/ratis.git

commit d42b54ae540f0c4a3f284171f7a63c294aaaa1fb
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Tue Nov 29 04:20:15 2022 -0800

    RATIS-1745. Improve performance of AwaitForSignal by reducing amount of 
exceptions created. (#787)
---
 .../java/org/apache/ratis/util/AwaitForSignal.java | 41 +++++++++++++---------
 1 file changed, 25 insertions(+), 16 deletions(-)

diff --git 
a/ratis-common/src/main/java/org/apache/ratis/util/AwaitForSignal.java 
b/ratis-common/src/main/java/org/apache/ratis/util/AwaitForSignal.java
index 5294818f2..88808c52b 100644
--- a/ratis-common/src/main/java/org/apache/ratis/util/AwaitForSignal.java
+++ b/ratis-common/src/main/java/org/apache/ratis/util/AwaitForSignal.java
@@ -17,22 +17,24 @@
  */
 package org.apache.ratis.util;
 
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 /**
  * This class is a partial implementation of {@link 
java.util.concurrent.locks.Condition}.
  * Only some of the await and signal methods are implemented.
- *
+ * <p>
  * This class is threadsafe.
  */
 public class AwaitForSignal {
   private final String name;
-
-  private final AtomicReference<CompletableFuture<Void>> future = new 
AtomicReference<>(new CompletableFuture<>());
+  private final Lock lock = new ReentrantLock();
+  private final Condition condition = lock.newCondition();
+  private final AtomicReference<AtomicBoolean> signaled = new 
AtomicReference<>(new AtomicBoolean());
 
   public AwaitForSignal(Object name) {
     this.name = name + "-" + JavaUtils.getClassSimpleName(getClass());
@@ -40,10 +42,13 @@ public class AwaitForSignal {
 
   /** The same as {@link java.util.concurrent.locks.Condition#await()} */
   public void await() throws InterruptedException {
+    lock.lock();
     try {
-      future.get().get();
-    } catch (ExecutionException e) {
-      throw new IllegalStateException(e);
+      for (final AtomicBoolean s = signaled.get(); !s.get(); ) {
+        condition.await();
+      }
+    } finally {
+      lock.unlock();
     }
   }
 
@@ -52,19 +57,23 @@ public class AwaitForSignal {
     if (time <= 0) {
       return false;
     }
+    lock.lock();
     try {
-      future.get().get(time, unit);
-    } catch (ExecutionException e) {
-      throw new IllegalStateException(e);
-    } catch (TimeoutException ignored) {
-      return false;
+      return condition.await(time, unit);
+    } finally {
+      lock.unlock();
     }
-    return true;
   }
 
   /** The same as {@link java.util.concurrent.locks.Condition#signal()} */
   public void signal() {
-    future.getAndSet(new CompletableFuture<>()).complete(null);
+    lock.lock();
+    try {
+      signaled.getAndSet(new AtomicBoolean()).set(true);
+      condition.signalAll();
+    } finally {
+      lock.unlock();
+    }
   }
 
   @Override

Reply via email to