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

Tsz-wo Sze commented on RATIS-1942:
-----------------------------------

{code}
  public void transition(final State to) {
    final State from = current.getAndSet(to);
    State.validate(name, from, to);
  }
{code}
[~adoroszlai], I see the problem now -- the transition method above changes the 
state even if validate fails later on.  Let's use updateAndGet then?
{code}
@@ -160,8 +160,10 @@ public class LifeCycle {
 
   /** Transition from the current state to the given state. */
   public void transition(final State to) {
-    final State from = current.getAndSet(to);
-    State.validate(name, from, to);
+    current.updateAndGet(from -> {
+      State.validate(name, from, to);
+      return to;
+    });
   }
{code}


> GrpcLogAppender has ILLEGAL TRANSITION: STARTING -> STARTING
> ------------------------------------------------------------
>
>                 Key: RATIS-1942
>                 URL: https://issues.apache.org/jira/browse/RATIS-1942
>             Project: Ratis
>          Issue Type: Bug
>          Components: gRPC, test
>            Reporter: Tsz-wo Sze
>            Assignee: Attila Doroszlai
>            Priority: Major
>          Time Spent: 10m
>  Remaining Estimate: 0h
>
> TestRetryCacheWithGrpc has the following exception (although the test may 
> pass):
> {code}
> 2023-11-27 11:19:57,509 
> [s3@group-F810F08D0B98->s4-GrpcLogAppender-LogAppenderDaemon] WARN  
> leader.LogAppenderDaemon (LogAppenderDaemon.java:run(89)) - 
> s3@group-F810F08D0B98->s4-GrpcLogAppender-LogAppenderDaemon failed
> java.lang.IllegalStateException: ILLEGAL TRANSITION: In s4, STARTING -> 
> STARTING
>       at org.apache.ratis.util.Preconditions.assertTrue(Preconditions.java:61)
>       at org.apache.ratis.util.LifeCycle$State.validate(LifeCycle.java:121)
>       at org.apache.ratis.util.LifeCycle.transition(LifeCycle.java:164)
>       at 
> org.apache.ratis.util.LifeCycle.startAndTransition(LifeCycle.java:268)
>       at 
> org.apache.ratis.util.PeerProxyMap$PeerAndProxy.getProxy(PeerProxyMap.java:63)
>       at org.apache.ratis.util.PeerProxyMap.getProxy(PeerProxyMap.java:110)
>       at 
> org.apache.ratis.grpc.server.GrpcLogAppender.getClient(GrpcLogAppender.java:121)
>       at 
> org.apache.ratis.grpc.server.GrpcLogAppender.appendLog(GrpcLogAppender.java:313)
>       at 
> org.apache.ratis.grpc.server.GrpcLogAppender.run(GrpcLogAppender.java:181)
>       at 
> org.apache.ratis.server.leader.LogAppenderDaemon.run(LogAppenderDaemon.java:80)
>       at java.lang.Thread.run(Thread.java:750)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to