PROTON-1956: [go] server does not close transport on unexpected disconnect

Project: http://git-wip-us.apache.org/repos/asf/qpid-proton/repo
Commit: http://git-wip-us.apache.org/repos/asf/qpid-proton/commit/2a84494c
Tree: http://git-wip-us.apache.org/repos/asf/qpid-proton/tree/2a84494c
Diff: http://git-wip-us.apache.org/repos/asf/qpid-proton/diff/2a84494c

Branch: refs/heads/master
Commit: 2a84494c4befb40c674116aeba7e563e68b9537d
Parents: 84844a9
Author: Alan Conway <[email protected]>
Authored: Tue Oct 9 16:30:05 2018 -0400
Committer: Alan Conway <[email protected]>
Committed: Thu Oct 11 15:14:20 2018 -0400

----------------------------------------------------------------------
 go/src/qpid.apache.org/electron/electron_test.go |  7 ++++---
 go/src/qpid.apache.org/electron/handler.go       | 10 +++++++---
 go/src/qpid.apache.org/proton/handlers.go        |  7 +++++--
 3 files changed, 16 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2a84494c/go/src/qpid.apache.org/electron/electron_test.go
----------------------------------------------------------------------
diff --git a/go/src/qpid.apache.org/electron/electron_test.go 
b/go/src/qpid.apache.org/electron/electron_test.go
index cf881e6..a648a18 100644
--- a/go/src/qpid.apache.org/electron/electron_test.go
+++ b/go/src/qpid.apache.org/electron/electron_test.go
@@ -21,9 +21,10 @@ package electron
 
 import (
        "fmt"
-       "qpid.apache.org/amqp"
        "testing"
        "time"
+
+       "qpid.apache.org/amqp"
 )
 
 // Send a message one way with a client sender and server receiver, verify ack.
@@ -325,7 +326,7 @@ func TestHeartbeat(t *testing.T) {
 
        unfreeze <- true // Unfreeze the server
        <-p.server.Done()
-       if amqp.ResourceLimitExceeded != p.server.Error().(amqp.Error).Name {
-               t.Error("bad timeout error:", p.server.Error())
+       if p.server.Error() == nil {
+               t.Error("expected server side  time-out or connection abort 
error")
        }
 }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2a84494c/go/src/qpid.apache.org/electron/handler.go
----------------------------------------------------------------------
diff --git a/go/src/qpid.apache.org/electron/handler.go 
b/go/src/qpid.apache.org/electron/handler.go
index af1efd6..899d6a9 100644
--- a/go/src/qpid.apache.org/electron/handler.go
+++ b/go/src/qpid.apache.org/electron/handler.go
@@ -126,9 +126,13 @@ func (h *handler) HandleMessagingEvent(t 
proton.MessagingEvent, e proton.Event)
                h.shutdown(proton.EndpointError(e.Connection()))
 
        case proton.MDisconnected:
-               err := e.Transport().Condition().Error()
-               if err == nil {
-                       err = amqp.Errorf(amqp.IllegalState, "unexpected 
disconnect on %s", h.connection)
+               var err error
+               if err = e.Connection().RemoteCondition().Error(); err == nil {
+                       if err = e.Connection().Condition().Error(); err == nil 
{
+                               if err = e.Transport().Condition().Error(); err 
== nil {
+                                       err = amqp.Errorf(amqp.IllegalState, 
"unexpected disconnect on %s", h.connection)
+                               }
+                       }
                }
                h.shutdown(err)
        }

http://git-wip-us.apache.org/repos/asf/qpid-proton/blob/2a84494c/go/src/qpid.apache.org/proton/handlers.go
----------------------------------------------------------------------
diff --git a/go/src/qpid.apache.org/proton/handlers.go 
b/go/src/qpid.apache.org/proton/handlers.go
index f101548..bbb5014 100644
--- a/go/src/qpid.apache.org/proton/handlers.go
+++ b/go/src/qpid.apache.org/proton/handlers.go
@@ -25,7 +25,6 @@ import "fmt"
 type EventHandler interface {
        // HandleEvent is called with an event.
        // Typically HandleEvent() is implemented as a switch on e.Type()
-       // Returning an error will stop the Engine.
        HandleEvent(e Event)
 }
 
@@ -38,7 +37,6 @@ type EventHandler interface {
 type MessagingHandler interface {
        // HandleMessagingEvent is called with  MessagingEvent.
        // Typically HandleEvent() is implemented as a switch on e.Type()
-       // Returning an error will stop the Engine.
        HandleMessagingEvent(MessagingEvent, Event)
 }
 
@@ -351,6 +349,11 @@ func (d *MessagingAdapter) HandleEvent(e Event) {
                        d.outgoing(e)
                }
 
+       case ETransportTailClosed:
+               if !e.Connection().State().RemoteClosed() { // Unexpected 
transport closed
+                       e.Transport().CloseHead() // Complete transport close, 
no connection close expected
+               }
+
        case ETransportClosed:
                d.mhandler.HandleMessagingEvent(MDisconnected, e)
        }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to