You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by gu...@apache.org on 2021/11/04 01:44:04 UTC

[dubbo] branch 3.0 updated: [3.0-Triple] Fix bad state error when method not found (#9198)

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

guohao pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new eaf2b3d  [3.0-Triple] Fix bad state error when method not found (#9198)
eaf2b3d is described below

commit eaf2b3d9fe44ad2966caad3dbe1dc5a3406700d7
Author: GuoHao <gu...@gmail.com>
AuthorDate: Thu Nov 4 09:42:48 2021 +0800

    [3.0-Triple] Fix bad state error when method not found (#9198)
    
    * Fix bad state error when method not found
    
    * Fix ut
    
    * Fix ut
    
    * Fix ut
---
 .../org/apache/dubbo/rpc/protocol/tri/OutboundTransportObserver.java   | 3 +++
 .../main/java/org/apache/dubbo/rpc/protocol/tri/TransportState.java    | 3 +--
 .../java/org/apache/dubbo/rpc/protocol/tri/TransportStateTest.java     | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/OutboundTransportObserver.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/OutboundTransportObserver.java
index 0a99ab5..bd7a570 100644
--- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/OutboundTransportObserver.java
+++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/OutboundTransportObserver.java
@@ -37,11 +37,14 @@ public abstract class OutboundTransportObserver implements TransportObserver {
 
     protected void checkSendMeta(Object metadata, boolean endStream) {
         if (endStream) {
+            // trailers-only or metadata + trailers
             if (!state.allowSendEndStream()) {
                 throw new IllegalStateException("Metadata endStream already sent to peer, send " + metadata + " failed!");
             }
+            state.setMetaSend();
             state.setEndStreamSend();
         } else {
+            // metadata
             if (!state.allowSendMeta()) {
                 throw new IllegalStateException("Metadata already sent to peer, send " + metadata + " failed!");
             }
diff --git a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TransportState.java b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TransportState.java
index 4f922d3..f4b9357 100644
--- a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TransportState.java
+++ b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/TransportState.java
@@ -30,7 +30,6 @@ public class TransportState {
     private static final int SERVER_SEND_STREAM_RECEIVED = 0b00000000000000000000000000001000;
     private static final int ALLOW_META_SEND = 0b00000000000000000000000000000000;
     private static final int ALLOW_DATA_SEND = META_SEND;
-    private static final int ALLOW_END_STREAM_SEND = META_SEND;
     private volatile int state = 0;
 
     public void setMetaSend() {
@@ -66,7 +65,7 @@ public class TransportState {
     }
 
     public boolean allowSendEndStream() {
-        return this.state == ALLOW_END_STREAM_SEND;
+        return allowSendReset() && (this.state & END_STREAM_SEND) != END_STREAM_SEND;
     }
 
 }
diff --git a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TransportStateTest.java b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TransportStateTest.java
index 78a0038..11baf77 100644
--- a/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TransportStateTest.java
+++ b/dubbo-rpc/dubbo-rpc-triple/src/test/java/org/apache/dubbo/rpc/protocol/tri/TransportStateTest.java
@@ -76,7 +76,7 @@ class TransportStateTest {
     @Test
     void allowSendEndStream() {
         TransportState transportState = new TransportState();
-        Assertions.assertFalse(transportState.allowSendEndStream());
+        Assertions.assertTrue(transportState.allowSendEndStream());
 
         transportState = new TransportState();
         transportState.setResetSend();