implement garbage collection of closed streams in streamsMap

ref #256
This commit is contained in:
Marten Seemann
2016-08-24 13:04:28 +07:00
committed by Lucas Clemente
parent 543ce21a5a
commit 15352e9591
2 changed files with 50 additions and 0 deletions

View File

@@ -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()
}

View File

@@ -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())
})
})
})