Skip to content

Commit 9141a4f

Browse files
committed
chore:
1 parent 243e560 commit 9141a4f

File tree

7 files changed

+145
-63
lines changed

7 files changed

+145
-63
lines changed

bytes_pool.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,23 @@ func selectIndex(n int) int {
5454
return index
5555
}
5656

57+
// getBytesWithSize 使用指定的readBufferSize来申请内存池
58+
func getBytesWithSize(n int, readBufferSize int) (rv *[]byte) {
59+
// 如果需要的大小小于等于readBufferSize,直接使用readBufferSize申请
60+
if n <= readBufferSize {
61+
if readBufferSize < minPoolSize {
62+
return getBytes(readBufferSize)
63+
}
64+
65+
rv2 := make([]byte, readBufferSize)
66+
rv2 = rv2[:n] // 调整到实际需要的长度
67+
return &rv2
68+
}
69+
70+
// 如果需要的大小大于readBufferSize,使用原来的逻辑
71+
return getBytes(n)
72+
}
73+
5774
func getBytes(n int) (rv *[]byte) {
5875

5976
index := selectIndex(n - 1)
@@ -73,6 +90,7 @@ func getBytes(n int) (rv *[]byte) {
7390
return rv
7491
}
7592

93+
// slog.Error("getBytes smallPools[index].Get().(*[]byte)", "index", index)
7694
rv = smallPools[index].Get().(*[]byte)
7795
*rv = (*rv)[:cap(*rv)]
7896
return rv
@@ -81,7 +99,9 @@ func getBytes(n int) (rv *[]byte) {
8199
func putBytes(bytes *[]byte) {
82100

83101
if bytes == nil || cap(*bytes) == 0 {
102+
84103
return
104+
85105
}
86106
if cap(*bytes) < page {
87107
return
@@ -98,6 +118,7 @@ func putBytes(bytes *[]byte) {
98118
if cap(*bytes)%page != 0 {
99119
index-- // 向前挪一格, 可以保证空间是够的
100120
}
121+
// slog.Error("putBytes smallPools[index].Put(bytes)", "index", index, "cap", cap(*bytes))
101122
smallPools[index].Put(bytes)
102123
}
103124

callback_test.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ func TestOnOpen_RealSocket(t *testing.T) {
6666
safeConns.init(1000)
6767

6868
pulseConn := &Conn{
69-
fd: int64(fd),
70-
safeConns: safeConns,
69+
fd: int64(fd),
70+
readBufferSize: 4096,
71+
safeConns: safeConns,
7172
}
7273
safeConns.Add(fd, pulseConn)
7374

@@ -128,8 +129,9 @@ func TestOnOpen_RealSocket(t *testing.T) {
128129
safeConns.init(1000)
129130

130131
pulseConn := &Conn{
131-
fd: int64(fd),
132-
safeConns: safeConns,
132+
fd: int64(fd),
133+
readBufferSize: 4096,
134+
safeConns: safeConns,
133135
}
134136
safeConns.Add(fd, pulseConn)
135137

@@ -427,8 +429,9 @@ func runClientServerTest(t *testing.T, callback Callback, scenario func(net.Conn
427429
safeConns.init(1000)
428430

429431
pulseConn := &Conn{
430-
fd: int64(fd),
431-
safeConns: safeConns,
432+
fd: int64(fd),
433+
readBufferSize: 4096,
434+
safeConns: safeConns,
432435
}
433436
safeConns.Add(fd, pulseConn)
434437

@@ -568,8 +571,9 @@ func TestCallback_RealConnectionLifecycle(t *testing.T) {
568571
safeConns.init(1000)
569572

570573
pulseConn := &Conn{
571-
fd: int64(fd),
572-
safeConns: safeConns,
574+
fd: int64(fd),
575+
readBufferSize: 4096,
576+
safeConns: safeConns,
573577
}
574578
safeConns.Add(fd, pulseConn)
575579

@@ -714,8 +718,9 @@ func TestCallback_ConcurrentRealConnections(t *testing.T) {
714718
safeConns.init(1000)
715719

716720
pulseConn := &Conn{
717-
fd: int64(fd),
718-
safeConns: safeConns,
721+
fd: int64(fd),
722+
readBufferSize: 4096,
723+
safeConns: safeConns,
719724
}
720725
safeConns.Add(fd, pulseConn)
721726

conn.go

Lines changed: 72 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package pulse
22

33
import (
44
"errors"
5-
"fmt"
65
"log/slog"
76
"net"
87
"sync"
@@ -15,15 +14,16 @@ import (
1514
)
1615

1716
type Conn struct {
18-
fd int64
19-
wbufList []*[]byte // write buffer, 为了理精细控制内存使用量
20-
mu sync.Mutex
21-
safeConns *safeConns[Conn]
22-
task driver.TaskExecutor
23-
eventLoop core.PollingApi
24-
readTimer *time.Timer
25-
writeTimer *time.Timer
26-
session any // 会话数据
17+
fd int64
18+
wbufList []*[]byte // write buffer, 为了理精细控制内存使用量
19+
mu sync.Mutex
20+
safeConns *safeConns[Conn]
21+
task driver.TaskExecutor
22+
eventLoop core.PollingApi
23+
readTimer *time.Timer
24+
writeTimer *time.Timer
25+
session any // 会话数据
26+
readBufferSize int // 读缓冲区大小
2727
}
2828

2929
func (c *Conn) SetNoDelay(nodelay bool) error {
@@ -33,7 +33,9 @@ func (c *Conn) SetNoDelay(nodelay bool) error {
3333
func (c *Conn) getFd() int {
3434
return int(atomic.LoadInt64(&c.fd))
3535
}
36-
func newConn(fd int, safeConns *safeConns[Conn], task selectTasks, taskType TaskType, eventLoop core.PollingApi) *Conn {
36+
func newConn(fd int, safeConns *safeConns[Conn],
37+
task selectTasks, taskType TaskType,
38+
eventLoop core.PollingApi, readBufferSize int) *Conn {
3739
var taskExecutor driver.TaskExecutor
3840
switch taskType {
3941
case TaskTypeInConnectionGoroutine:
@@ -47,10 +49,11 @@ func newConn(fd int, safeConns *safeConns[Conn], task selectTasks, taskType Task
4749
}
4850

4951
return &Conn{
50-
fd: int64(fd),
51-
safeConns: safeConns,
52-
task: taskExecutor,
53-
eventLoop: eventLoop,
52+
fd: int64(fd),
53+
safeConns: safeConns,
54+
task: taskExecutor,
55+
eventLoop: eventLoop,
56+
readBufferSize: readBufferSize,
5457
}
5558
}
5659

@@ -78,6 +81,7 @@ func (c *Conn) close() {
7881
oldFd := atomic.SwapInt64(&c.fd, -1)
7982
if oldFd != -1 {
8083
c.safeConns.Del(int(oldFd))
84+
8185
if err := core.Close(int(oldFd)); err != nil {
8286
// Log the error but don't panic as this is a cleanup function
8387
slog.Error("failed to close fd", "fd", oldFd, "error", err)
@@ -108,6 +112,53 @@ func (c *Conn) writeToSocket(data []byte) (int, error) {
108112

109113
}
110114

115+
// appendToWbufList 将数据添加到写缓冲区列表
116+
// 先检查最后一个缓冲区是否有足够空间,如果有就直接append
117+
// 如果没有,将部分数据append到最后一个缓冲区,剩余部分创建新的readBufferSize大小的缓冲区
118+
func (c *Conn) appendToWbufList(data []byte) {
119+
if len(data) == 0 {
120+
return
121+
}
122+
123+
// 如果wbufList为空,直接创建新的缓冲区
124+
if len(c.wbufList) == 0 {
125+
newBuf := getBytesWithSize(len(data), c.readBufferSize)
126+
copy(*newBuf, data)
127+
*newBuf = (*newBuf)[:len(data)]
128+
c.wbufList = append(c.wbufList, newBuf)
129+
return
130+
}
131+
132+
// 获取最后一个缓冲区
133+
lastBuf := c.wbufList[len(c.wbufList)-1]
134+
remainingSpace := cap(*lastBuf) - len(*lastBuf)
135+
136+
// 如果最后一个缓冲区有足够空间,直接append
137+
if remainingSpace >= len(data) {
138+
*lastBuf = append(*lastBuf, data...)
139+
return
140+
}
141+
142+
// 如果空间不够,先填满最后一个缓冲区
143+
if remainingSpace > 0 {
144+
*lastBuf = append(*lastBuf, data[:remainingSpace]...)
145+
data = data[remainingSpace:] // 剩余的数据
146+
}
147+
148+
// 为剩余数据创建新的缓冲区(使用readBufferSize大小)
149+
for len(data) > 0 {
150+
newBuf := getBytesWithSize(len(data), c.readBufferSize)
151+
copySize := len(data)
152+
if copySize > cap(*newBuf) {
153+
copySize = cap(*newBuf)
154+
}
155+
copy(*newBuf, data[:copySize])
156+
*newBuf = (*newBuf)[:copySize]
157+
c.wbufList = append(c.wbufList, newBuf)
158+
data = data[copySize:]
159+
}
160+
}
161+
111162
// handlePartialWrite 处理部分写入的情况,创建新缓冲区存储剩余数据
112163
func (c *Conn) handlePartialWrite(data []byte, n int, needAppend bool) error {
113164
if n < 0 {
@@ -119,22 +170,12 @@ func (c *Conn) handlePartialWrite(data []byte, n int, needAppend bool) error {
119170
return nil
120171
}
121172

122-
remainingSize := len(data) - n
123-
newBuf := getBytes(remainingSize)
124-
if cap(*newBuf) < remainingSize {
125-
putBytes(newBuf)
126-
return fmt.Errorf("getBytes allocated insufficient capacity: %d < %d", cap(*newBuf), remainingSize)
127-
}
128-
129-
copy(*newBuf, data[n:])
130-
*newBuf = (*newBuf)[:remainingSize]
131-
173+
remainingData := data[n:]
132174
if needAppend {
133-
c.wbufList = append(c.wbufList, newBuf)
175+
c.appendToWbufList(remainingData)
134176
}
177+
135178
if err := c.eventLoop.AddWrite(c.getFd()); err != nil {
136-
// 如果事件注册失败,释放缓冲区
137-
putBytes(newBuf)
138179
slog.Error("failed to add write event", "error", err)
139180
return err
140181
}
@@ -171,13 +212,7 @@ func (c *Conn) Write(data []byte) (int, error) {
171212
}
172213

173214
if len(data) > 0 {
174-
newBuf := getBytes(len(data))
175-
if cap(*newBuf) < len(data) {
176-
panic("newBuf cap is less than data")
177-
}
178-
copy(*newBuf, data)
179-
*newBuf = (*newBuf)[:len(data)]
180-
c.wbufList = append(c.wbufList, newBuf)
215+
c.appendToWbufList(data)
181216
}
182217

183218
i := 0
@@ -209,7 +244,7 @@ func (c *Conn) Write(data []byte) (int, error) {
209244
}
210245

211246
// 所有数据都已写入
212-
c.wbufList = nil
247+
c.wbufList = c.wbufList[:0]
213248
if err := c.eventLoop.ResetRead(c.getFd()); err != nil {
214249
slog.Error("failed to reset read event", "error", err)
215250
}
@@ -241,7 +276,7 @@ func handleData(c *Conn, options *Options, rawData []byte) {
241276
}
242277

243278
var newBytes *[]byte
244-
newBytes = getBytes(len(rawData))
279+
newBytes = getBytesWithSize(len(rawData), c.readBufferSize)
245280
copy(*newBytes, rawData)
246281
*newBytes = (*newBytes)[:len(rawData)]
247282

0 commit comments

Comments
 (0)