forked from quic-go/quic-go
Merge pull request #2991 from lucas-clemente/qlog-restored-transport-parameters
qlog restored transport parameters
This commit is contained in:
@@ -65,6 +65,7 @@ func (t *connTracer) StartedConnection(local, remote net.Addr, version logging.V
|
||||
func (t *connTracer) ClosedConnection(logging.CloseReason) {}
|
||||
func (t *connTracer) SentTransportParameters(*logging.TransportParameters) {}
|
||||
func (t *connTracer) ReceivedTransportParameters(*logging.TransportParameters) {}
|
||||
func (t *connTracer) RestoredTransportParameters(*logging.TransportParameters) {}
|
||||
func (t *connTracer) SentPacket(hdr *logging.ExtendedHeader, size logging.ByteCount, ack *logging.AckFrame, frames []logging.Frame) {
|
||||
sentHeaders = append(sentHeaders, hdr)
|
||||
}
|
||||
|
||||
@@ -207,6 +207,18 @@ func (mr *MockConnectionTracerMockRecorder) ReceivedVersionNegotiationPacket(arg
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivedVersionNegotiationPacket", reflect.TypeOf((*MockConnectionTracer)(nil).ReceivedVersionNegotiationPacket), arg0, arg1)
|
||||
}
|
||||
|
||||
// RestoredTransportParameters mocks base method
|
||||
func (m *MockConnectionTracer) RestoredTransportParameters(arg0 *wire.TransportParameters) {
|
||||
m.ctrl.T.Helper()
|
||||
m.ctrl.Call(m, "RestoredTransportParameters", arg0)
|
||||
}
|
||||
|
||||
// RestoredTransportParameters indicates an expected call of RestoredTransportParameters
|
||||
func (mr *MockConnectionTracerMockRecorder) RestoredTransportParameters(arg0 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoredTransportParameters", reflect.TypeOf((*MockConnectionTracer)(nil).RestoredTransportParameters), arg0)
|
||||
}
|
||||
|
||||
// SentPacket mocks base method
|
||||
func (m *MockConnectionTracer) SentPacket(arg0 *wire.ExtendedHeader, arg1 protocol.ByteCount, arg2 *wire.AckFrame, arg3 []logging.Frame) {
|
||||
m.ctrl.T.Helper()
|
||||
|
||||
@@ -107,6 +107,7 @@ type ConnectionTracer interface {
|
||||
ClosedConnection(CloseReason)
|
||||
SentTransportParameters(*TransportParameters)
|
||||
ReceivedTransportParameters(*TransportParameters)
|
||||
RestoredTransportParameters(parameters *TransportParameters) // for 0-RTT
|
||||
SentPacket(hdr *ExtendedHeader, size ByteCount, ack *AckFrame, frames []Frame)
|
||||
ReceivedVersionNegotiationPacket(*Header, []VersionNumber)
|
||||
ReceivedRetry(*Header)
|
||||
|
||||
@@ -206,6 +206,18 @@ func (mr *MockConnectionTracerMockRecorder) ReceivedVersionNegotiationPacket(arg
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ReceivedVersionNegotiationPacket", reflect.TypeOf((*MockConnectionTracer)(nil).ReceivedVersionNegotiationPacket), arg0, arg1)
|
||||
}
|
||||
|
||||
// RestoredTransportParameters mocks base method
|
||||
func (m *MockConnectionTracer) RestoredTransportParameters(arg0 *wire.TransportParameters) {
|
||||
m.ctrl.T.Helper()
|
||||
m.ctrl.Call(m, "RestoredTransportParameters", arg0)
|
||||
}
|
||||
|
||||
// RestoredTransportParameters indicates an expected call of RestoredTransportParameters
|
||||
func (mr *MockConnectionTracerMockRecorder) RestoredTransportParameters(arg0 interface{}) *gomock.Call {
|
||||
mr.mock.ctrl.T.Helper()
|
||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "RestoredTransportParameters", reflect.TypeOf((*MockConnectionTracer)(nil).RestoredTransportParameters), arg0)
|
||||
}
|
||||
|
||||
// SentPacket mocks base method
|
||||
func (m *MockConnectionTracer) SentPacket(arg0 *wire.ExtendedHeader, arg1 protocol.ByteCount, arg2 *wire.AckFrame, arg3 []Frame) {
|
||||
m.ctrl.T.Helper()
|
||||
|
||||
@@ -84,6 +84,12 @@ func (m *connTracerMultiplexer) ReceivedTransportParameters(tp *TransportParamet
|
||||
}
|
||||
}
|
||||
|
||||
func (m *connTracerMultiplexer) RestoredTransportParameters(tp *TransportParameters) {
|
||||
for _, t := range m.tracers {
|
||||
t.RestoredTransportParameters(tp)
|
||||
}
|
||||
}
|
||||
|
||||
func (m *connTracerMultiplexer) SentPacket(hdr *ExtendedHeader, size ByteCount, ack *AckFrame, frames []Frame) {
|
||||
for _, t := range m.tracers {
|
||||
t.SentPacket(hdr, size, ack, frames)
|
||||
|
||||
@@ -126,6 +126,13 @@ var _ = Describe("Tracing", func() {
|
||||
tracer.ReceivedTransportParameters(tp)
|
||||
})
|
||||
|
||||
It("traces the RestoredTransportParameters event", func() {
|
||||
tp := &wire.TransportParameters{InitialMaxData: 1337}
|
||||
tr1.EXPECT().RestoredTransportParameters(tp)
|
||||
tr2.EXPECT().RestoredTransportParameters(tp)
|
||||
tracer.RestoredTransportParameters(tp)
|
||||
})
|
||||
|
||||
It("traces the SentPacket event", func() {
|
||||
hdr := &ExtendedHeader{Header: Header{DestConnectionID: ConnectionID{1, 2, 3}}}
|
||||
ack := &AckFrame{AckRanges: []AckRange{{Smallest: 1, Largest: 10}}}
|
||||
|
||||
@@ -165,6 +165,7 @@ func (t *connTracer) ClosedConnection(r logging.CloseReason) {
|
||||
}
|
||||
func (t *connTracer) SentTransportParameters(*logging.TransportParameters) {}
|
||||
func (t *connTracer) ReceivedTransportParameters(*logging.TransportParameters) {}
|
||||
func (t *connTracer) RestoredTransportParameters(*logging.TransportParameters) {}
|
||||
func (t *connTracer) SentPacket(hdr *logging.ExtendedHeader, _ logging.ByteCount, _ *logging.AckFrame, _ []logging.Frame) {
|
||||
typ := logging.PacketTypeFromHeader(&hdr.Header)
|
||||
if typ == logging.PacketType1RTT {
|
||||
|
||||
@@ -338,8 +338,9 @@ func (e eventKeyRetired) MarshalJSONObject(enc *gojay.Encoder) {
|
||||
}
|
||||
|
||||
type eventTransportParameters struct {
|
||||
Owner owner
|
||||
SentBy protocol.Perspective
|
||||
Restore bool
|
||||
Owner owner
|
||||
SentBy protocol.Perspective
|
||||
|
||||
OriginalDestinationConnectionID protocol.ConnectionID
|
||||
InitialSourceConnectionID protocol.ConnectionID
|
||||
@@ -366,21 +367,28 @@ type eventTransportParameters struct {
|
||||
}
|
||||
|
||||
func (e eventTransportParameters) Category() category { return categoryTransport }
|
||||
func (e eventTransportParameters) Name() string { return "parameters_set" }
|
||||
func (e eventTransportParameters) IsNil() bool { return false }
|
||||
func (e eventTransportParameters) Name() string {
|
||||
if e.Restore {
|
||||
return "parameters_restored"
|
||||
}
|
||||
return "parameters_set"
|
||||
}
|
||||
func (e eventTransportParameters) IsNil() bool { return false }
|
||||
|
||||
func (e eventTransportParameters) MarshalJSONObject(enc *gojay.Encoder) {
|
||||
enc.StringKey("owner", e.Owner.String())
|
||||
if e.SentBy == protocol.PerspectiveServer {
|
||||
enc.StringKey("original_destination_connection_id", connectionID(e.OriginalDestinationConnectionID).String())
|
||||
if e.StatelessResetToken != nil {
|
||||
enc.StringKey("stateless_reset_token", fmt.Sprintf("%x", e.StatelessResetToken[:]))
|
||||
}
|
||||
if e.RetrySourceConnectionID != nil {
|
||||
enc.StringKey("retry_source_connection_id", connectionID(*e.RetrySourceConnectionID).String())
|
||||
if !e.Restore {
|
||||
enc.StringKey("owner", e.Owner.String())
|
||||
if e.SentBy == protocol.PerspectiveServer {
|
||||
enc.StringKey("original_destination_connection_id", connectionID(e.OriginalDestinationConnectionID).String())
|
||||
if e.StatelessResetToken != nil {
|
||||
enc.StringKey("stateless_reset_token", fmt.Sprintf("%x", e.StatelessResetToken[:]))
|
||||
}
|
||||
if e.RetrySourceConnectionID != nil {
|
||||
enc.StringKey("retry_source_connection_id", connectionID(*e.RetrySourceConnectionID).String())
|
||||
}
|
||||
}
|
||||
enc.StringKey("initial_source_connection_id", connectionID(e.InitialSourceConnectionID).String())
|
||||
}
|
||||
enc.StringKey("initial_source_connection_id", connectionID(e.InitialSourceConnectionID).String())
|
||||
enc.BoolKey("disable_active_migration", e.DisableActiveMigration)
|
||||
enc.FloatKeyOmitEmpty("max_idle_timeout", milliseconds(e.MaxIdleTimeout))
|
||||
enc.Int64KeyNullEmpty("max_udp_payload_size", int64(e.MaxUDPPayloadSize))
|
||||
|
||||
30
qlog/qlog.go
30
qlog/qlog.go
@@ -168,11 +168,29 @@ func (t *connectionTracer) ReceivedTransportParameters(tp *wire.TransportParamet
|
||||
t.recordTransportParameters(t.perspective.Opposite(), tp)
|
||||
}
|
||||
|
||||
func (t *connectionTracer) RestoredTransportParameters(tp *wire.TransportParameters) {
|
||||
ev := t.toTransportParameters(tp)
|
||||
ev.Restore = true
|
||||
|
||||
t.mutex.Lock()
|
||||
t.recordEvent(time.Now(), ev)
|
||||
t.mutex.Unlock()
|
||||
}
|
||||
|
||||
func (t *connectionTracer) recordTransportParameters(sentBy protocol.Perspective, tp *wire.TransportParameters) {
|
||||
owner := ownerLocal
|
||||
ev := t.toTransportParameters(tp)
|
||||
ev.Owner = ownerLocal
|
||||
if sentBy != t.perspective {
|
||||
owner = ownerRemote
|
||||
ev.Owner = ownerRemote
|
||||
}
|
||||
ev.SentBy = sentBy
|
||||
|
||||
t.mutex.Lock()
|
||||
t.recordEvent(time.Now(), ev)
|
||||
t.mutex.Unlock()
|
||||
}
|
||||
|
||||
func (t *connectionTracer) toTransportParameters(tp *wire.TransportParameters) *eventTransportParameters {
|
||||
var pa *preferredAddress
|
||||
if tp.PreferredAddress != nil {
|
||||
pa = &preferredAddress{
|
||||
@@ -184,10 +202,7 @@ func (t *connectionTracer) recordTransportParameters(sentBy protocol.Perspective
|
||||
StatelessResetToken: tp.PreferredAddress.StatelessResetToken,
|
||||
}
|
||||
}
|
||||
t.mutex.Lock()
|
||||
t.recordEvent(time.Now(), &eventTransportParameters{
|
||||
Owner: owner,
|
||||
SentBy: sentBy,
|
||||
return &eventTransportParameters{
|
||||
OriginalDestinationConnectionID: tp.OriginalDestinationConnectionID,
|
||||
InitialSourceConnectionID: tp.InitialSourceConnectionID,
|
||||
RetrySourceConnectionID: tp.RetrySourceConnectionID,
|
||||
@@ -206,8 +221,7 @@ func (t *connectionTracer) recordTransportParameters(sentBy protocol.Perspective
|
||||
InitialMaxStreamsUni: int64(tp.MaxUniStreamNum),
|
||||
PreferredAddress: pa,
|
||||
MaxDatagramFrameSize: tp.MaxDatagramFrameSize,
|
||||
})
|
||||
t.mutex.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
func (t *connectionTracer) SentPacket(hdr *wire.ExtendedHeader, packetSize logging.ByteCount, ack *logging.AckFrame, frames []logging.Frame) {
|
||||
|
||||
@@ -340,6 +340,30 @@ var _ = Describe("Tracing", func() {
|
||||
Expect(ev).ToNot(HaveKey("original_destination_connection_id"))
|
||||
})
|
||||
|
||||
It("records restored transport parameters", func() {
|
||||
tracer.RestoredTransportParameters(&logging.TransportParameters{
|
||||
InitialMaxStreamDataBidiLocal: 100,
|
||||
InitialMaxStreamDataBidiRemote: 200,
|
||||
InitialMaxStreamDataUni: 300,
|
||||
InitialMaxData: 400,
|
||||
MaxIdleTimeout: 123 * time.Millisecond,
|
||||
})
|
||||
entry := exportAndParseSingle()
|
||||
Expect(entry.Time).To(BeTemporally("~", time.Now(), scaleDuration(10*time.Millisecond)))
|
||||
Expect(entry.Name).To(Equal("transport:parameters_restored"))
|
||||
ev := entry.Event
|
||||
Expect(ev).ToNot(HaveKey("owner"))
|
||||
Expect(ev).ToNot(HaveKey("original_destination_connection_id"))
|
||||
Expect(ev).ToNot(HaveKey("stateless_reset_token"))
|
||||
Expect(ev).ToNot(HaveKey("retry_source_connection_id"))
|
||||
Expect(ev).ToNot(HaveKey("initial_source_connection_id"))
|
||||
Expect(ev).To(HaveKeyWithValue("max_idle_timeout", float64(123)))
|
||||
Expect(ev).To(HaveKeyWithValue("initial_max_data", float64(400)))
|
||||
Expect(ev).To(HaveKeyWithValue("initial_max_stream_data_bidi_local", float64(100)))
|
||||
Expect(ev).To(HaveKeyWithValue("initial_max_stream_data_bidi_remote", float64(200)))
|
||||
Expect(ev).To(HaveKeyWithValue("initial_max_stream_data_uni", float64(300)))
|
||||
})
|
||||
|
||||
It("records a sent packet, without an ACK", func() {
|
||||
tracer.SentPacket(
|
||||
&logging.ExtendedHeader{
|
||||
|
||||
Reference in New Issue
Block a user