forked from quic-go/quic-go
committed by
Lucas Clemente
parent
543ce21a5a
commit
15352e9591
@@ -180,3 +180,17 @@ func (m *streamsMap) NumberOfStreams() int {
|
||||
m.mutex.RUnlock()
|
||||
return n
|
||||
}
|
||||
|
||||
// garbageCollectClosedStreams deletes nil values in the streams if they are smaller than protocol.MaxNewStreamIDDelta than the highest stream opened by the client
|
||||
func (m *streamsMap) garbageCollectClosedStreams() {
|
||||
m.mutex.Lock()
|
||||
for id, str := range m.streams {
|
||||
if str != nil {
|
||||
continue
|
||||
}
|
||||
if id+protocol.MaxNewStreamIDDelta <= m.highestStreamOpenedByClient {
|
||||
delete(m.streams, id)
|
||||
}
|
||||
}
|
||||
m.mutex.Unlock()
|
||||
}
|
||||
|
||||
@@ -106,6 +106,42 @@ var _ = Describe("Streams Map", func() {
|
||||
_, err = m.GetOrOpenStream(13)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
})
|
||||
|
||||
It("garbage-collects closed streams", func() {
|
||||
for i := 1; i < 4*protocol.MaxNewStreamIDDelta; i += 2 {
|
||||
streamID := protocol.StreamID(i)
|
||||
_, err := m.GetOrOpenStream(streamID)
|
||||
Expect(m.highestStreamOpenedByClient).To(Equal(streamID))
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
err = m.RemoveStream(streamID)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
}
|
||||
m.garbageCollectClosedStreams()
|
||||
for i := 1; i < 3*protocol.MaxNewStreamIDDelta; i += 2 {
|
||||
Expect(m.streams).ToNot(HaveKey(protocol.StreamID(i)))
|
||||
}
|
||||
for i := 3*protocol.MaxNewStreamIDDelta + 1; i < 4*protocol.MaxNewStreamIDDelta; i += 2 {
|
||||
Expect(m.streams).To(HaveKey(protocol.StreamID(i)))
|
||||
}
|
||||
})
|
||||
|
||||
It("does not garbage-collects open streams", func() {
|
||||
for i := 1; i < 1002; i += 2 {
|
||||
streamID := protocol.StreamID(i)
|
||||
_, err := m.GetOrOpenStream(streamID)
|
||||
Expect(m.highestStreamOpenedByClient).To(Equal(streamID))
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
if streamID != 23 {
|
||||
err = m.RemoveStream(streamID)
|
||||
Expect(err).NotTo(HaveOccurred())
|
||||
}
|
||||
}
|
||||
lengthBefore := len(m.streams)
|
||||
m.garbageCollectClosedStreams()
|
||||
Expect(len(m.streams)).To(BeNumerically("<", lengthBefore))
|
||||
Expect(m.streams).To(HaveKey(protocol.StreamID(23)))
|
||||
Expect(m.streams[23]).ToNot(BeNil())
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user