mirror of
https://github.com/refraction-networking/uquic.git
synced 2025-04-04 20:57:36 +03:00
introduce a buffer pool for large buffers (20k)
This commit is contained in:
parent
bef0f3d31a
commit
7d8db149b6
5 changed files with 35 additions and 15 deletions
|
@ -56,13 +56,18 @@ func (b *packetBuffer) Len() protocol.ByteCount {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *packetBuffer) putBack() {
|
func (b *packetBuffer) putBack() {
|
||||||
if cap(b.Data) != int(protocol.MaxPacketBufferSize) {
|
if cap(b.Data) == protocol.MaxPacketBufferSize {
|
||||||
panic("putPacketBuffer called with packet of wrong size!")
|
bufferPool.Put(b)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
bufferPool.Put(b)
|
if cap(b.Data) == protocol.MaxLargePacketBufferSize {
|
||||||
|
largeBufferPool.Put(b)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
panic("putPacketBuffer called with packet of wrong size!")
|
||||||
}
|
}
|
||||||
|
|
||||||
var bufferPool sync.Pool
|
var bufferPool, largeBufferPool sync.Pool
|
||||||
|
|
||||||
func getPacketBuffer() *packetBuffer {
|
func getPacketBuffer() *packetBuffer {
|
||||||
buf := bufferPool.Get().(*packetBuffer)
|
buf := bufferPool.Get().(*packetBuffer)
|
||||||
|
@ -71,10 +76,18 @@ func getPacketBuffer() *packetBuffer {
|
||||||
return buf
|
return buf
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getLargePacketBuffer() *packetBuffer {
|
||||||
|
buf := largeBufferPool.Get().(*packetBuffer)
|
||||||
|
buf.refCount = 1
|
||||||
|
buf.Data = buf.Data[:0]
|
||||||
|
return buf
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
bufferPool.New = func() interface{} {
|
bufferPool.New = func() any {
|
||||||
return &packetBuffer{
|
return &packetBuffer{Data: make([]byte, 0, protocol.MaxPacketBufferSize)}
|
||||||
Data: make([]byte, 0, protocol.MaxPacketBufferSize),
|
}
|
||||||
}
|
largeBufferPool.New = func() any {
|
||||||
|
return &packetBuffer{Data: make([]byte, 0, protocol.MaxLargePacketBufferSize)}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,13 +9,17 @@ import (
|
||||||
|
|
||||||
var _ = Describe("Buffer Pool", func() {
|
var _ = Describe("Buffer Pool", func() {
|
||||||
It("returns buffers of cap", func() {
|
It("returns buffers of cap", func() {
|
||||||
buf := getPacketBuffer()
|
buf1 := getPacketBuffer()
|
||||||
Expect(buf.Data).To(HaveCap(int(protocol.MaxPacketBufferSize)))
|
Expect(buf1.Data).To(HaveCap(protocol.MaxPacketBufferSize))
|
||||||
|
buf2 := getLargePacketBuffer()
|
||||||
|
Expect(buf2.Data).To(HaveCap(protocol.MaxLargePacketBufferSize))
|
||||||
})
|
})
|
||||||
|
|
||||||
It("releases buffers", func() {
|
It("releases buffers", func() {
|
||||||
buf := getPacketBuffer()
|
buf1 := getPacketBuffer()
|
||||||
buf.Release()
|
buf1.Release()
|
||||||
|
buf2 := getLargePacketBuffer()
|
||||||
|
buf2.Release()
|
||||||
})
|
})
|
||||||
|
|
||||||
It("gets the length", func() {
|
It("gets the length", func() {
|
||||||
|
|
|
@ -59,7 +59,10 @@ type StatelessResetToken [16]byte
|
||||||
// ethernet's max size, minus the IP and UDP headers. IPv6 has a 40 byte header,
|
// ethernet's max size, minus the IP and UDP headers. IPv6 has a 40 byte header,
|
||||||
// UDP adds an additional 8 bytes. This is a total overhead of 48 bytes.
|
// UDP adds an additional 8 bytes. This is a total overhead of 48 bytes.
|
||||||
// Ethernet's max packet size is 1500 bytes, 1500 - 48 = 1452.
|
// Ethernet's max packet size is 1500 bytes, 1500 - 48 = 1452.
|
||||||
const MaxPacketBufferSize ByteCount = 1452
|
const MaxPacketBufferSize = 1452
|
||||||
|
|
||||||
|
// MaxLargePacketBufferSize is used when using GSO
|
||||||
|
const MaxLargePacketBufferSize = 20 * 1024
|
||||||
|
|
||||||
// MinInitialPacketSize is the minimum size an Initial packet is required to have.
|
// MinInitialPacketSize is the minimum size an Initial packet is required to have.
|
||||||
const MinInitialPacketSize = 1200
|
const MinInitialPacketSize = 1200
|
||||||
|
|
|
@ -216,7 +216,7 @@ var _ = Describe("OOB Conn Test", func() {
|
||||||
Expect(ms).To(HaveLen(batchSize))
|
Expect(ms).To(HaveLen(batchSize))
|
||||||
for i := 0; i < numMsgRead; i++ {
|
for i := 0; i < numMsgRead; i++ {
|
||||||
Expect(ms[i].Buffers).To(HaveLen(1))
|
Expect(ms[i].Buffers).To(HaveLen(1))
|
||||||
Expect(ms[i].Buffers[0]).To(HaveLen(int(protocol.MaxPacketBufferSize)))
|
Expect(ms[i].Buffers[0]).To(HaveLen(protocol.MaxPacketBufferSize))
|
||||||
data := []byte(fmt.Sprintf("message %d", counter))
|
data := []byte(fmt.Sprintf("message %d", counter))
|
||||||
counter++
|
counter++
|
||||||
ms[i].Buffers[0] = data
|
ms[i].Buffers[0] = data
|
||||||
|
|
|
@ -18,7 +18,7 @@ var _ = Describe("Basic Conn Test", func() {
|
||||||
addr := &net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 1234}
|
addr := &net.UDPAddr{IP: net.IPv4(1, 2, 3, 4), Port: 1234}
|
||||||
c.EXPECT().ReadFrom(gomock.Any()).DoAndReturn(func(b []byte) (int, net.Addr, error) {
|
c.EXPECT().ReadFrom(gomock.Any()).DoAndReturn(func(b []byte) (int, net.Addr, error) {
|
||||||
data := []byte("foobar")
|
data := []byte("foobar")
|
||||||
Expect(b).To(HaveLen(int(protocol.MaxPacketBufferSize)))
|
Expect(b).To(HaveLen(protocol.MaxPacketBufferSize))
|
||||||
return copy(b, data), addr, nil
|
return copy(b, data), addr, nil
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue