From 1c8903f249731b4da964d766ff2174d68ddd991e Mon Sep 17 00:00:00 2001 From: Andy Wang Date: Mon, 20 Apr 2020 23:54:41 +0100 Subject: [PATCH] Log repeat stream closing on Debug level --- internal/multiplex/session.go | 3 ++- internal/multiplex/stream.go | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/internal/multiplex/session.go b/internal/multiplex/session.go index 62c2517..cf85b7c 100644 --- a/internal/multiplex/session.go +++ b/internal/multiplex/session.go @@ -20,6 +20,7 @@ const ( var ErrBrokenSession = errors.New("broken session") var errRepeatSessionClosing = errors.New("trying to close a closed session") +var errRepeatStreamClosing = errors.New("trying to close a closed stream") type switchboardStrategy int @@ -145,7 +146,7 @@ func (sesh *Session) Accept() (net.Conn, error) { func (sesh *Session) closeStream(s *Stream, active bool) error { if atomic.SwapUint32(&s.closed, 1) == 1 { - return fmt.Errorf("stream %v is already closed", s.id) + return fmt.Errorf("closing stream %v: %w", s.id, errRepeatStreamClosing) } _ = s.recvBuf.Close() // both datagramBuffer and streamBuffer won't return err on Close() diff --git a/internal/multiplex/stream.go b/internal/multiplex/stream.go index 253cb2b..1e2810b 100644 --- a/internal/multiplex/stream.go +++ b/internal/multiplex/stream.go @@ -62,7 +62,12 @@ func (s *Stream) isClosed() bool { return atomic.LoadUint32(&s.closed) == 1 } func (s *Stream) writeFrame(frame Frame) error { toBeClosed, err := s.recvBuf.Write(frame) if toBeClosed { - return s.passiveClose() + err = s.passiveClose() + if errors.Is(err, errRepeatStreamClosing) { + log.Debug(err) + return nil + } + return err } return err }