summaryrefslogtreecommitdiff
path: root/internal/clients/handlers
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-13 20:52:54 +0200
committerPaul Buetow <paul@buetow.org>2026-03-13 20:52:54 +0200
commit1b34e1f2501b8def0a0fb4eae28bf6c19a8adde2 (patch)
tree4898ab4ff4a7dd4ea102726a845e3935c39ee320 /internal/clients/handlers
parent07d654f76e1002b6ac18a43aab3c64797dcd2a32 (diff)
Fix serverless output draining regressions
Diffstat (limited to 'internal/clients/handlers')
-rw-r--r--internal/clients/handlers/basehandler.go4
-rw-r--r--internal/clients/handlers/basehandler_test.go32
2 files changed, 35 insertions, 1 deletions
diff --git a/internal/clients/handlers/basehandler.go b/internal/clients/handlers/basehandler.go
index 8da4556..2979091 100644
--- a/internal/clients/handlers/basehandler.go
+++ b/internal/clients/handlers/basehandler.go
@@ -192,7 +192,9 @@ func (h *baseHandler) handleHiddenMessage(message string) {
strings.HasPrefix(message, protocol.HiddenSessionErrorPrefix):
h.handleSessionAckMessage(message)
case strings.HasPrefix(message, ".syn close connection"):
- go h.SendMessage(".ack close connection")
+ if err := h.SendMessage(".ack close connection"); err != nil {
+ dlog.Client.Debug(h.server, "Unable to acknowledge close connection", err)
+ }
h.Shutdown()
}
}
diff --git a/internal/clients/handlers/basehandler_test.go b/internal/clients/handlers/basehandler_test.go
index 7db2bb8..3e8aaa1 100644
--- a/internal/clients/handlers/basehandler_test.go
+++ b/internal/clients/handlers/basehandler_test.go
@@ -6,6 +6,7 @@ import (
"time"
"github.com/mimecast/dtail/internal"
+ "github.com/mimecast/dtail/internal/io/dlog"
"github.com/mimecast/dtail/internal/protocol"
)
@@ -172,3 +173,34 @@ func TestHandleSessionAckMessage(t *testing.T) {
t.Fatalf("unexpected session ack: %#v", ack)
}
}
+
+func TestHandleCloseConnectionAcknowledgesBeforeShutdown(t *testing.T) {
+ originalLogger := dlog.Client
+ dlog.Client = &dlog.DLog{}
+ t.Cleanup(func() {
+ dlog.Client = originalLogger
+ })
+
+ handler := baseHandler{
+ done: internal.NewDone(),
+ server: "server-under-test",
+ commands: make(chan string, 1),
+ }
+
+ handler.handleHiddenMessage(".syn close connection")
+
+ select {
+ case command := <-handler.commands:
+ if command == "" {
+ t.Fatal("expected close acknowledgement command")
+ }
+ case <-time.After(10 * time.Millisecond):
+ t.Fatal("expected close acknowledgement command to be queued")
+ }
+
+ select {
+ case <-handler.Done():
+ default:
+ t.Fatal("expected handler to be shut down after close acknowledgement")
+ }
+}