Skip to content

Commit 42fe2e7

Browse files
committed
TUN-3208: Add benchmark for large response write
1 parent 44e3be2 commit 42fe2e7

File tree

1 file changed

+107
-1
lines changed

1 file changed

+107
-1
lines changed

h2mux/h2mux_test.go

Lines changed: 107 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@ import (
1515
"testing"
1616
"time"
1717

18-
"github.com/cloudflare/cloudflared/logger"
1918
"github.com/pkg/errors"
2019
"github.com/stretchr/testify/assert"
2120
"golang.org/x/sync/errgroup"
21+
22+
"github.com/cloudflare/cloudflared/logger"
2223
)
2324

2425
const (
@@ -1032,3 +1033,108 @@ func openStreams(b *testing.B, muxPair *DefaultMuxerPair, n int) {
10321033
}
10331034
assert.NoError(b, errGroup.Wait())
10341035
}
1036+
1037+
func BenchmarkSingleStreamLargeResponseBody(b *testing.B) {
1038+
const bodySize = 1 << 24
1039+
1040+
const writeBufferSize = 16 << 10
1041+
const writeN = bodySize / writeBufferSize
1042+
payload := make([]byte, writeBufferSize)
1043+
for i := range payload {
1044+
payload[i] = byte(i % 256)
1045+
}
1046+
1047+
const readBufferSize = 16 << 10
1048+
const readN = bodySize / readBufferSize
1049+
responseBody := make([]byte, readBufferSize)
1050+
1051+
f := MuxedStreamFunc(func(stream *MuxedStream) error {
1052+
if len(stream.Headers) != 1 {
1053+
b.Fatalf("expected %d headers, got %d", 1, len(stream.Headers))
1054+
}
1055+
if stream.Headers[0].Name != "test-header" {
1056+
b.Fatalf("expected header name %s, got %s", "test-header", stream.Headers[0].Name)
1057+
}
1058+
if stream.Headers[0].Value != "headerValue" {
1059+
b.Fatalf("expected header value %s, got %s", "headerValue", stream.Headers[0].Value)
1060+
}
1061+
stream.WriteHeaders([]Header{
1062+
{Name: "response-header", Value: "responseValue"},
1063+
})
1064+
for i := 0; i < writeN; i++ {
1065+
n, err := stream.Write(payload)
1066+
if err != nil {
1067+
b.Fatalf("origin write error: %s", err)
1068+
}
1069+
if n != len(payload) {
1070+
b.Fatalf("origin short write: %d/%d bytes", n, len(payload))
1071+
}
1072+
}
1073+
1074+
return nil
1075+
})
1076+
1077+
name := fmt.Sprintf("%s_%d", b.Name(), rand.Int())
1078+
origin, edge := net.Pipe()
1079+
1080+
muxPair := &DefaultMuxerPair{
1081+
OriginMuxConfig: MuxerConfig{
1082+
Timeout: testHandshakeTimeout,
1083+
Handler: f,
1084+
IsClient: true,
1085+
Name: "origin",
1086+
Logger: logger.NewOutputWriter(logger.NewMockWriteManager()),
1087+
DefaultWindowSize: defaultWindowSize,
1088+
MaxWindowSize: maxWindowSize,
1089+
StreamWriteBufferMaxLen: defaultWriteBufferMaxLen,
1090+
HeartbeatInterval: defaultTimeout,
1091+
MaxHeartbeats: defaultRetries,
1092+
},
1093+
OriginConn: origin,
1094+
EdgeMuxConfig: MuxerConfig{
1095+
Timeout: testHandshakeTimeout,
1096+
IsClient: false,
1097+
Name: "edge",
1098+
Logger: logger.NewOutputWriter(logger.NewMockWriteManager()),
1099+
DefaultWindowSize: defaultWindowSize,
1100+
MaxWindowSize: maxWindowSize,
1101+
StreamWriteBufferMaxLen: defaultWriteBufferMaxLen,
1102+
HeartbeatInterval: defaultTimeout,
1103+
MaxHeartbeats: defaultRetries,
1104+
},
1105+
EdgeConn: edge,
1106+
doneC: make(chan struct{}),
1107+
}
1108+
assert.NoError(b, muxPair.Handshake(name))
1109+
muxPair.Serve(b)
1110+
1111+
b.ReportAllocs()
1112+
for i := 0; i < b.N; i++ {
1113+
stream, err := muxPair.OpenEdgeMuxStream(
1114+
[]Header{{Name: "test-header", Value: "headerValue"}},
1115+
nil,
1116+
)
1117+
if err != nil {
1118+
b.Fatalf("error in OpenStream: %s", err)
1119+
}
1120+
if len(stream.Headers) != 1 {
1121+
b.Fatalf("expected %d headers, got %d", 1, len(stream.Headers))
1122+
}
1123+
if stream.Headers[0].Name != "response-header" {
1124+
b.Fatalf("expected header name %s, got %s", "response-header", stream.Headers[0].Name)
1125+
}
1126+
if stream.Headers[0].Value != "responseValue" {
1127+
b.Fatalf("expected header value %s, got %s", "responseValue", stream.Headers[0].Value)
1128+
}
1129+
1130+
for k := 0; k < readN; k++ {
1131+
n, err := io.ReadFull(stream, responseBody)
1132+
if err != nil {
1133+
b.Fatalf("error from (*MuxedStream).Read: %s", err)
1134+
}
1135+
if n != len(responseBody) {
1136+
b.Fatalf("expected response body to have %d bytes, got %d", len(responseBody), n)
1137+
}
1138+
}
1139+
}
1140+
}

0 commit comments

Comments
 (0)