[ 
https://issues.apache.org/jira/browse/RATIS-835?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17082511#comment-17082511
 ] 

Tsz-wo Sze edited comment on RATIS-835 at 4/13/20, 5:35 PM:
------------------------------------------------------------

Thanks [~ljain].
- In RaftClientImpl.PendingClientRequest, let's rename exceptionAttemptCount to 
exceptionCounts and the corresponding methods.  Also it should use Class<?>, 
i.e.
{code}
    private final Map<Class<?>, Integer> exceptionCounts = new 
ConcurrentHashMap<>();
{code}

- In ClientRetryEvent, the exceptionAttemptCount is counting the number of 
occurrences of the cause.  So, let's rename it to causeCount and the 
corresponding methods.
-* Let's also change the order of the parameter in ClientRetryEvent(..) to
{code}
  public ClientRetryEvent(int attemptCount, RaftClientRequest request, int 
causeCount, Throwable cause) {
{code}
so that it is more clear that the attemptCount is counting the request and the 
causeCount is counting the cause.

- PendingClientRequest.incrementExceptionCount (after rename) should return the 
new value, i.e.
{code}
    int incrementExceptionCount(Throwable t) {
      return exceptionCounts.compute(t.getClass(), (k, v) -> v != null ? v + 1 
: 1);
    }
{code}
Then the code can be simplified as below:
-# OrderedAsync
{code}
        final int exceptionCount = pending.incrementExceptionCount(e);
        final ClientRetryEvent event = new ClientRetryEvent(attemptCount, 
request, exceptionCount, e);
{code}
-# RaftClientImpl 
{code}
      final int exceptionCount = ioe != null? 
pending.incrementExceptionCount(ioe): 0;
      final ClientRetryEvent event = new ClientRetryEvent(attemptCount, 
request, exceptionCount, ioe);

{code}
-# UnorderedAsync 
{code}
        final Throwable cause = replyException != null ? replyException : e;
        final int causeCount = pending.incrementExceptionCount(cause);
        final ClientRetryEvent event = new ClientRetryEvent(attemptCount, 
request, causeCount, cause)
{code}
getExceptionCount should check null.
{code}
    int getExceptionCount(Throwable t) {
      return Optional.ofNullable(exceptionCounts.get(t.getClass())).orElse(0);
    }
{code}



was (Author: szetszwo):
Thanks [~ljain].
- In RaftClientImpl.PendingClientRequest, let rename exceptionAttemptCount to 
exceptionCounts and the corresponding methods.  Also it should use <Class<?>, 
i.e.
{code}
    private final Map<Class<?>, Integer> exceptionCounts = new 
ConcurrentHashMap<>();
{code}

- In ClientRetryEvent, the exceptionAttemptCount is counting the number of 
occurance of the cause.  So, let's rename it to causeCount and the 
corresponding methods.
-* Let's also change the order of the parameter in ClientRetryEvent(..) to
{code}
  public ClientRetryEvent(int attemptCount, RaftClientRequest request, int 
causeCount, Throwable cause) {
{code}
so that it is more clear that the attemptCount is counting the request and the 
causeCount is counting the cause.

- PendingClientRequest.incrementExceptionCount (after rename) should return the 
new value, i.e.
{code}
    int incrementExceptionCount(Throwable t) {
      return exceptionCounts.compute(t.getClass(), (k, v) -> v != null ? v + 1 
: 1);
    }
{code}
Then the code can be simplified as below:
-# OrderedAsync
{code}
        final int exceptionCount = pending.incrementExceptionCount(e);
        final ClientRetryEvent event = new ClientRetryEvent(attemptCount, 
request, exceptionCount, e);
{code}
-# RaftClientImpl 
{code}
      final int exceptionCount = ioe != null? 
pending.incrementExceptionCount(ioe): 0;
      final ClientRetryEvent event = new ClientRetryEvent(attemptCount, 
request, exceptionCount, ioe);

{code}
-# UnorderedAsync 
{code}
        final Throwable cause = replyException != null ? replyException : e;
        final int causeCount = pending.incrementExceptionCount(cause);
        final ClientRetryEvent event = new ClientRetryEvent(attemptCount, 
request, causeCount, cause)
{code}
getExceptionCount should check null.
{code}
    int getExceptionCount(Throwable t) {
      return Optional.ofNullable(exceptionCounts.get(t.getClass())).orElse(0);
    }
{code}


> Include exception based attempt count in raft client request
> ------------------------------------------------------------
>
>                 Key: RATIS-835
>                 URL: https://issues.apache.org/jira/browse/RATIS-835
>             Project: Ratis
>          Issue Type: Bug
>          Components: client
>            Reporter: Lokesh Jain
>            Assignee: Lokesh Jain
>            Priority: Major
>         Attachments: RATIS-835.001.patch, RATIS-835.002.patch, 
> RATIS-835.003.patch
>
>
> Client needs to maintain exception based attempt count for using Exception 
> Dependent retry policy. Exception dependent policy helps in specifying 
> individual policies for different exception types.
> Currently policy takes number of attempts as argument. Therefore the 
> individual policies require attempt counts for the particular exception while 
> handling retry event. This is particularly important for using 
> MulipleLinearRandomRetry policy which increases sleep interval based on 
> number of attempts made by the client. Raft Client can therefore use this 
> policy for ResourceUnavailableException and increase sleep interval for 
> subsequent retries of the request on the same exception.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to