[ 
https://issues.apache.org/jira/browse/CURATOR-505?focusedWorklogId=197904&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-197904
 ]

ASF GitHub Bot logged work on CURATOR-505:
------------------------------------------

                Author: ASF GitHub Bot
            Created on: 13/Feb/19 04:28
            Start Date: 13/Feb/19 04:28
    Worklog Time Spent: 10m 
      Work Description: Randgalt commented on pull request #304: [CURATOR-505] 
WIP - Circuit breaking connection state listener decorator
URL: https://github.com/apache/curator/pull/304#discussion_r256244084
 
 

 ##########
 File path: 
curator-framework/src/main/java/org/apache/curator/framework/state/CircuitBreaker.java
 ##########
 @@ -0,0 +1,79 @@
+package org.apache.curator.framework.state;
+
+import org.apache.curator.RetryPolicy;
+import org.apache.curator.RetrySleeper;
+import java.util.Objects;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+// must be guarded by sync
+class CircuitBreaker
+{
+    private final RetryPolicy retryPolicy;
+    private final ScheduledExecutorService service;
+
+    private boolean isOpen = false;
+    private int retryCount = 0;
+    private long startNanos = 0;
+
+    CircuitBreaker(RetryPolicy retryPolicy, ScheduledExecutorService service)
+    {
+        this.retryPolicy = Objects.requireNonNull(retryPolicy, "retryPolicy 
cannot be null");
+        this.service = Objects.requireNonNull(service, "service cannot be 
null");
+    }
+
+    boolean isOpen()
+    {
+        return isOpen;
+    }
+
+    int getRetryCount()
+    {
+        return retryCount;
+    }
+
+    boolean tryToOpen(Runnable completion)
+    {
+        if ( isOpen )
+        {
+            return false;
+        }
+
+        isOpen = true;
+        retryCount = 0;
+        startNanos = System.nanoTime();
+        if ( tryToRetry(completion) )
+        {
+            return true;
+        }
+        close();
+        return false;
+    }
+
+    boolean tryToRetry(Runnable completion)
+    {
+        if ( !isOpen )
+        {
+            return false;
+        }
+
+        long[] sleepTimeNanos = new long[]{0L};
+        RetrySleeper retrySleeper = (time, unit) -> sleepTimeNanos[0] = 
unit.toNanos(time);
+        if ( retryPolicy.allowRetry(retryCount, System.nanoTime() - 
startNanos, retrySleeper) )
 
 Review comment:
   Doh - I misread your comment. I see the problem now and it's fixex.
 
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Issue Time Tracking
-------------------

    Worklog Id:     (was: 197904)
    Time Spent: 1h 10m  (was: 1h)

> A circuit breaking ConnectionStateListener would be very helpful
> ----------------------------------------------------------------
>
>                 Key: CURATOR-505
>                 URL: https://issues.apache.org/jira/browse/CURATOR-505
>             Project: Apache Curator
>          Issue Type: New Feature
>          Components: Client, Framework, Recipes
>    Affects Versions: 4.1.0
>            Reporter: Jordan Zimmerman
>            Assignee: Jordan Zimmerman
>            Priority: Major
>          Time Spent: 1h 10m
>  Remaining Estimate: 0h
>
> Create a circuit breaker style {{ConnectionStateListener}}. It would proxy 
> any ConnectionStateListeners used by Curator recipe/classes such that when 
> the connection is lost the circuit would open for a period of time and, while 
> open, ignore any changes in state. After the time period expires the circuit 
> would close and send whatever the current connection state is. This way, if 
> the connection is going up/down/up/down/up/down, the application would only 
> see the first down and then N ms later hopefully the connection is repaired 
> and the application would only see the reconnection.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to