Skip to content

Commit 36d14db

Browse files
authored
Fix binary logging bug which logs a server header on a trailers only response (#5763)
1 parent fcb8bdf commit 36d14db

File tree

4 files changed

+25
-18
lines changed

4 files changed

+25
-18
lines changed

gcp/observability/logging_test.go

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -608,9 +608,9 @@ func (s) TestBothClientAndServerRPCEvents(t *testing.T) {
608608
t.Fatalf("unexpected error: %v, expected an EOF error", err)
609609
}
610610
fle.mu.Lock()
611-
if len(fle.entries) != 17 {
611+
if len(fle.entries) != 16 {
612612
fle.mu.Unlock()
613-
t.Fatalf("Unexpected length of entries %v, want 17 (collective of client and server)", len(fle.entries))
613+
t.Fatalf("Unexpected length of entries %v, want 16 (collective of client and server)", len(fle.entries))
614614
}
615615
fle.mu.Unlock()
616616
}
@@ -936,24 +936,13 @@ func (s) TestPrecedenceOrderingInConfiguration(t *testing.T) {
936936
SequenceID: 2,
937937
Authority: ss.Address,
938938
},
939-
{
940-
Type: eventTypeServerHeader,
941-
Logger: loggerClient,
942-
ServiceName: "grpc.testing.TestService",
943-
MethodName: "FullDuplexCall",
944-
SequenceID: 3,
945-
Authority: ss.Address,
946-
Payload: payload{
947-
Metadata: map[string]string{},
948-
},
949-
},
950939
{
951940
Type: eventTypeServerTrailer,
952941
Logger: loggerClient,
953942
ServiceName: "grpc.testing.TestService",
954943
MethodName: "FullDuplexCall",
955944
Authority: ss.Address,
956-
SequenceID: 4,
945+
SequenceID: 3,
957946
Payload: payload{
958947
Metadata: map[string]string{},
959948
},

internal/transport/transport.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ import (
4343
"google.golang.org/grpc/tap"
4444
)
4545

46+
// ErrNoHeaders is used as a signal that a trailers only response was received,
47+
// and is not a real error.
48+
var ErrNoHeaders = errors.New("stream has no headers")
49+
4650
const logLevel = 2
4751

4852
type bufferPool struct {
@@ -366,9 +370,15 @@ func (s *Stream) Header() (metadata.MD, error) {
366370
return s.header.Copy(), nil
367371
}
368372
s.waitOnHeader()
373+
369374
if !s.headerValid {
370375
return nil, s.status.Err()
371376
}
377+
378+
if s.noHeaders {
379+
return nil, ErrNoHeaders
380+
}
381+
372382
return s.header.Copy(), nil
373383
}
374384

stream.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -752,17 +752,25 @@ func (cs *clientStream) withRetry(op func(a *csAttempt) error, onSuccess func())
752752

753753
func (cs *clientStream) Header() (metadata.MD, error) {
754754
var m metadata.MD
755+
noHeader := false
755756
err := cs.withRetry(func(a *csAttempt) error {
756757
var err error
757758
m, err = a.s.Header()
759+
if err == transport.ErrNoHeaders {
760+
noHeader = true
761+
return nil
762+
}
758763
return toRPCErr(err)
759764
}, cs.commitAttemptLocked)
765+
760766
if err != nil {
761767
cs.finish(err)
762768
return nil, err
763769
}
764-
if len(cs.binlogs) != 0 && !cs.serverHeaderBinlogged {
765-
// Only log if binary log is on and header has not been logged.
770+
771+
if len(cs.binlogs) != 0 && !cs.serverHeaderBinlogged && !noHeader {
772+
// Only log if binary log is on and header has not been logged, and
773+
// there is actually headers to log.
766774
logEntry := &binarylog.ServerHeader{
767775
OnClientSide: true,
768776
Header: m,

test/end2end_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8259,8 +8259,8 @@ func (s) TestGlobalBinaryLoggingOptions(t *testing.T) {
82598259
t.Fatalf("unexpected error: %v, expected an EOF error", err)
82608260
}
82618261

8262-
if csbl.mml.events != 9 {
8263-
t.Fatalf("want 9 client side binary logging events, got %v", csbl.mml.events)
8262+
if csbl.mml.events != 8 {
8263+
t.Fatalf("want 8 client side binary logging events, got %v", csbl.mml.events)
82648264
}
82658265
if ssbl.mml.events != 8 {
82668266
t.Fatalf("want 8 server side binary logging events, got %v", ssbl.mml.events)

0 commit comments

Comments
 (0)