Reduce big message RPC allocations (#19390)

Use `ODirectPoolSmall` buffers for inline data in PutObject.

Add a separate call for inline data that will fetch a buffer for the inline data before unmarshal.
This commit is contained in:
Klaus Post
2024-04-01 16:42:09 -07:00
committed by GitHub
parent 06929258bc
commit b435806d91
15 changed files with 366 additions and 65 deletions

View File

@@ -550,10 +550,9 @@ func (c *Connection) queueMsg(msg message, payload sender) error {
// This cannot encode subroute.
msg.Flags.Clear(FlagSubroute)
if payload != nil {
if cap(msg.Payload) < payload.Msgsize() {
old := msg.Payload
msg.Payload = GetByteBuffer()[:0]
PutByteBuffer(old)
if sz := payload.Msgsize(); cap(msg.Payload) < sz {
PutByteBuffer(msg.Payload)
msg.Payload = GetByteBufferCap(sz)
}
var err error
msg.Payload, err = payload.MarshalMsg(msg.Payload[:0])
@@ -563,7 +562,7 @@ func (c *Connection) queueMsg(msg message, payload sender) error {
}
}
defer PutByteBuffer(msg.Payload)
dst := GetByteBuffer()[:0]
dst := GetByteBufferCap(msg.Msgsize())
dst, err := msg.MarshalMsg(dst)
if err != nil {
return err
@@ -578,9 +577,9 @@ func (c *Connection) queueMsg(msg message, payload sender) error {
// sendMsg will send
func (c *Connection) sendMsg(conn net.Conn, msg message, payload msgp.MarshalSizer) error {
if payload != nil {
if cap(msg.Payload) < payload.Msgsize() {
if sz := payload.Msgsize(); cap(msg.Payload) < sz {
PutByteBuffer(msg.Payload)
msg.Payload = GetByteBuffer()[:0]
msg.Payload = GetByteBufferCap(sz)[:0]
}
var err error
msg.Payload, err = payload.MarshalMsg(msg.Payload)
@@ -589,7 +588,7 @@ func (c *Connection) sendMsg(conn net.Conn, msg message, payload msgp.MarshalSiz
}
defer PutByteBuffer(msg.Payload)
}
dst := GetByteBuffer()[:0]
dst := GetByteBufferCap(msg.Msgsize())
dst, err := msg.MarshalMsg(dst)
if err != nil {
return err