replace short fragments by longer fragments in the frame sorter

This commit is contained in:
Marten Seemann
2019-09-03 13:08:24 +07:00
parent d1489e5045
commit 326ec9e16e
2 changed files with 10 additions and 11 deletions

View File

@@ -37,14 +37,11 @@ func (s *frameSorter) push(data []byte, offset protocol.ByteCount) error {
return nil
}
var wasCut bool
if oldData, ok := s.queue[offset]; ok {
if len(data) <= len(oldData) {
return errDuplicateStreamData
}
data = data[len(oldData):]
offset += protocol.ByteCount(len(oldData))
wasCut = true
s.queue[offset] = data
}
start := offset
@@ -66,6 +63,7 @@ func (s *frameSorter) push(data []byte, offset protocol.ByteCount) error {
return errors.New("StreamFrameSorter BUG: no gap found")
}
var wasCut bool
if start < gap.Value.Start {
add := gap.Value.Start - start
offset += add

View File

@@ -9,14 +9,14 @@ import (
. "github.com/onsi/gomega"
)
var _ = Describe("STREAM frame sorter", func() {
var _ = Describe("frame sorter", func() {
var s *frameSorter
checkGaps := func(expectedGaps []utils.ByteInterval) {
Expect(s.gaps.Len()).To(Equal(len(expectedGaps)))
ExpectWithOffset(1, s.gaps.Len()).To(Equal(len(expectedGaps)))
var i int
for gap := s.gaps.Front(); gap != nil; gap = gap.Next() {
Expect(gap.Value).To(Equal(expectedGaps[i]))
ExpectWithOffset(1, gap.Value).To(Equal(expectedGaps[i]))
i++
}
}
@@ -231,6 +231,7 @@ var _ = Describe("STREAM frame sorter", func() {
Expect(s.Push([]byte("123456789012345"), 2)).To(Succeed())
Expect(s.queue).ToNot(HaveKey(protocol.ByteCount(5)))
Expect(s.queue).To(HaveKey(protocol.ByteCount(2)))
Expect(s.queue).To(HaveKey(protocol.ByteCount(15)))
Expect(s.queue[2]).To(Equal([]byte("1234567890123")))
Expect(s.queue[2]).To(HaveCap(13))
checkGaps([]utils.ByteInterval{
@@ -244,8 +245,8 @@ var _ = Describe("STREAM frame sorter", func() {
// 5 to 22
Expect(s.Push([]byte("12345678901234567"), 5)).To(Succeed())
Expect(s.queue).To(HaveKey(protocol.ByteCount(5)))
Expect(s.queue).ToNot(HaveKey(protocol.ByteCount(10)))
Expect(s.queue).ToNot(HaveKey(protocol.ByteCount(15)))
Expect(s.queue[10]).To(Equal([]byte("678901234567")))
checkGaps([]utils.ByteInterval{
{Start: 0, End: 5},
{Start: 22, End: 25},
@@ -272,11 +273,11 @@ var _ = Describe("STREAM frame sorter", func() {
// 5 to 27
Expect(s.Push(bytes.Repeat([]byte{'d'}, 22), 5)).To(Succeed())
Expect(s.queue).To(HaveKey(protocol.ByteCount(5)))
Expect(s.queue).ToNot(HaveKey(protocol.ByteCount(10)))
Expect(s.queue).ToNot(HaveKey(protocol.ByteCount(15)))
Expect(s.queue).To(HaveKey(protocol.ByteCount(25)))
Expect(s.queue).To(HaveKey(protocol.ByteCount(10)))
Expect(s.queue[10]).To(Equal(bytes.Repeat([]byte{'d'}, 15)))
Expect(s.queue[10]).To(HaveCap(15))
Expect(s.queue[5]).To(Equal(bytes.Repeat([]byte{'d'}, 20)))
Expect(s.queue[5]).To(HaveCap(20))
checkGaps([]utils.ByteInterval{
{Start: 0, End: 5},
{Start: 30, End: protocol.MaxByteCount},