Skip to content

Commit da4160b

Browse files
committed
fix: Use non-buffered IO for transmission
1 parent 409496b commit da4160b

File tree

1 file changed

+23
-3
lines changed

1 file changed

+23
-3
lines changed

pkg/server/nbd.go

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ import (
1212
)
1313

1414
var (
15-
ErrInvalidMagic = errors.New("invalid magic")
15+
ErrInvalidMagic = errors.New("invalid magic")
16+
ErrInvalidBlocksize = errors.New("invalid blocksize")
1617
)
1718

1819
type Export struct {
@@ -311,6 +312,7 @@ n:
311312
}
312313

313314
// Transmission
315+
b := make([]byte, options.MaximumBlockSize)
314316
for {
315317
var requestHeader protocol.TransmissionRequestHeader
316318
if err := binary.Read(conn, binary.BigEndian, &requestHeader); err != nil {
@@ -331,7 +333,16 @@ n:
331333
return err
332334
}
333335

334-
if _, err := io.CopyN(conn, io.NewSectionReader(export.Backend, int64(requestHeader.Offset), int64(requestHeader.Length)), int64(requestHeader.Length)); err != nil {
336+
if len(b) <= int(requestHeader.Length) {
337+
return ErrInvalidBlocksize
338+
}
339+
340+
n, err := export.Backend.ReadAt(b[:requestHeader.Length], int64(requestHeader.Offset))
341+
if err != nil {
342+
return err
343+
}
344+
345+
if _, err := conn.Write(b[:n]); err != nil {
335346
return err
336347
}
337348
case protocol.TRANSMISSION_TYPE_REQUEST_WRITE:
@@ -352,7 +363,16 @@ n:
352363
break
353364
}
354365

355-
if _, err := io.CopyN(io.NewOffsetWriter(export.Backend, int64(requestHeader.Offset)), conn, int64(requestHeader.Length)); err != nil {
366+
if len(b) <= int(requestHeader.Length) {
367+
return ErrInvalidBlocksize
368+
}
369+
370+
n, err := conn.Read(b[:requestHeader.Length])
371+
if err != nil {
372+
return err
373+
}
374+
375+
if _, err := export.Backend.WriteAt(b[:n], int64(requestHeader.Offset)); err != nil {
356376
return err
357377
}
358378

0 commit comments

Comments
 (0)