Skip to content

Commit 184321a

Browse files
committed
refactor: Only allocate new buffer for requests if the requested length exceeds the old buffer
1 parent de4e1be commit 184321a

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

pkg/server/nbd.go

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,8 @@ import (
1212
)
1313

1414
var (
15-
ErrInvalidMagic = errors.New("invalid magic")
16-
ErrInvalidBlocksize = errors.New("invalid blocksize")
17-
ErrInvalidRequestSize = errors.New("invalid request size")
15+
ErrInvalidMagic = errors.New("invalid magic")
16+
ErrInvalidBlocksize = errors.New("invalid blocksize")
1817
)
1918

2019
const (
@@ -331,6 +330,10 @@ n:
331330
}
332331

333332
// Transmission
333+
var (
334+
b = []byte{}
335+
maxObservedLength = uint32(0)
336+
)
334337
for {
335338
var requestHeader protocol.TransmissionRequestHeader
336339
if err := binary.Read(conn, binary.BigEndian, &requestHeader); err != nil {
@@ -343,10 +346,14 @@ n:
343346

344347
length := requestHeader.Length
345348
if length > defaultMaximumRequestSize {
346-
return ErrInvalidRequestSize
349+
return ErrInvalidBlocksize
347350
}
348351

349-
b := make([]byte, length)
352+
if length > maxObservedLength {
353+
b = make([]byte, length)
354+
355+
maxObservedLength = length
356+
}
350357

351358
switch requestHeader.Type {
352359
case protocol.TRANSMISSION_TYPE_REQUEST_READ:
@@ -358,11 +365,7 @@ n:
358365
return err
359366
}
360367

361-
if len(b) < int(requestHeader.Length) {
362-
return ErrInvalidBlocksize
363-
}
364-
365-
n, err := export.Backend.ReadAt(b, int64(requestHeader.Offset))
368+
n, err := export.Backend.ReadAt(b[:length], int64(requestHeader.Offset))
366369
if err != nil {
367370
return err
368371
}
@@ -388,10 +391,6 @@ n:
388391
break
389392
}
390393

391-
if len(b) < int(requestHeader.Length) {
392-
return ErrInvalidBlocksize
393-
}
394-
395394
n, err := io.ReadAtLeast(conn, b, int(requestHeader.Length))
396395
if err != nil {
397396
return err

0 commit comments

Comments
 (0)