[ 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)