add support for connection migration (#4960)

This commit is contained in:
Marten Seemann
2025-03-12 12:11:11 +07:00
committed by GitHub
parent 0a2c2f0a82
commit 24acc54ef1
14 changed files with 782 additions and 36 deletions

View File

@@ -15,7 +15,7 @@ type connRunnerCallbacks struct {
ReplaceWithClosed func([]protocol.ConnectionID, []byte)
}
type connRunners []connRunnerCallbacks
type connRunners map[transportID]connRunnerCallbacks
func (cr connRunners) AddConnectionID(id protocol.ConnectionID) {
for _, c := range cr {
@@ -55,6 +55,7 @@ type connIDGenerator struct {
}
func newConnIDGenerator(
tID transportID,
initialConnectionID protocol.ConnectionID,
initialClientDestConnID *protocol.ConnectionID, // nil for the client
statelessResetter *statelessResetter,
@@ -66,7 +67,7 @@ func newConnIDGenerator(
generator: generator,
activeSrcConnIDs: make(map[uint64]protocol.ConnectionID),
statelessResetter: statelessResetter,
connRunners: []connRunnerCallbacks{connRunner},
connRunners: map[transportID]connRunnerCallbacks{tID: connRunner},
queueControlFrame: queueControlFrame,
}
m.activeSrcConnIDs[0] = initialConnectionID
@@ -162,12 +163,17 @@ func (m *connIDGenerator) ReplaceWithClosed(connClose []byte) {
m.connRunners.ReplaceWithClosed(connIDs, connClose)
}
func (m *connIDGenerator) AddConnRunner(r connRunnerCallbacks) {
func (m *connIDGenerator) AddConnRunner(id transportID, r connRunnerCallbacks) {
// The transport might have already been added earlier.
// This happens if the application migrates back to and old path.
if _, ok := m.connRunners[id]; ok {
return
}
m.connRunners[id] = r
if m.initialClientDestConnID != nil {
r.AddConnectionID(*m.initialClientDestConnID)
}
for _, connID := range m.activeSrcConnIDs {
r.AddConnectionID(connID)
}
m.connRunners = append(m.connRunners, r)
}