diff --git a/weed/storage/needle/needle_write.go b/weed/storage/needle/needle_write.go index 5fe9f6a79..0ed2d292a 100644 --- a/weed/storage/needle/needle_write.go +++ b/weed/storage/needle/needle_write.go @@ -34,15 +34,24 @@ func (n *Needle) Append(w backend.BackendStorageFile, version Version) (offset u switch version { case Version1: - return writeNeedleV1(w, n, offset, bytesBuffer) + size, actualSize, err = writeNeedleV1(n, offset, bytesBuffer) case Version2: - return writeNeedleV2(w, n, offset, bytesBuffer) + size, actualSize, err = writeNeedleV2(n, offset, bytesBuffer) case Version3: - return writeNeedleV3(w, n, offset, bytesBuffer) + size, actualSize, err = writeNeedleV3(n, offset, bytesBuffer) default: err = fmt.Errorf("unsupported version: %d", version) return } + + if err == nil { + _, err = w.WriteAt(bytesBuffer.Bytes(), int64(offset)) + if err != nil { + err = fmt.Errorf("failed to write %d bytes to %s at offset %d: %w", actualSize, w.Name(), offset, err) + } + } + + return offset, size, actualSize, err } func WriteNeedleBlob(w backend.BackendStorageFile, dataSlice []byte, size Size, appendAtNs uint64, version Version) (offset uint64, err error) { diff --git a/weed/storage/needle/needle_write_test.go b/weed/storage/needle/needle_write_test.go index 713acbe02..5ddc040fb 100644 --- a/weed/storage/needle/needle_write_test.go +++ b/weed/storage/needle/needle_write_test.go @@ -107,14 +107,13 @@ func TestWriteNeedle_CompatibilityWithLegacy(t *testing.T) { // New newBuf := &bytes.Buffer{} offset := uint64(0) - dummyWriter := &mockBackendWriter{buf: &bytes.Buffer{}} // not used for actual output switch version { case Version1: - _, _, _, err = writeNeedleV1(dummyWriter, n, offset, newBuf) + _, _, err = writeNeedleV1(n, offset, newBuf) case Version2: - _, _, _, err = writeNeedleV2(dummyWriter, n, offset, newBuf) + _, _, err = writeNeedleV2(n, offset, newBuf) case Version3: - _, _, _, err = writeNeedleV3(dummyWriter, n, offset, newBuf) + _, _, err = writeNeedleV3(n, offset, newBuf) } if err != nil { t.Fatalf("writeNeedleV%d failed: %v", version, err) diff --git a/weed/storage/needle/needle_write_v1.go b/weed/storage/needle/needle_write_v1.go index db912ee0f..67ebae4c3 100644 --- a/weed/storage/needle/needle_write_v1.go +++ b/weed/storage/needle/needle_write_v1.go @@ -2,14 +2,12 @@ package needle import ( "bytes" - "fmt" - "github.com/seaweedfs/seaweedfs/weed/storage/backend" . "github.com/seaweedfs/seaweedfs/weed/storage/types" "github.com/seaweedfs/seaweedfs/weed/util" ) -func writeNeedleV1(w backend.BackendStorageFile, n *Needle, offset uint64, bytesBuffer *bytes.Buffer) (offsetOut uint64, size Size, actualSize int64, err error) { +func writeNeedleV1(n *Needle, offset uint64, bytesBuffer *bytes.Buffer) (size Size, actualSize int64, err error) { bytesBuffer.Reset() header := make([]byte, NeedleHeaderSize) CookieToBytes(header[0:CookieSize], n.Cookie) @@ -24,10 +22,5 @@ func writeNeedleV1(w backend.BackendStorageFile, n *Needle, offset uint64, bytes util.Uint32toBytes(header[0:NeedleChecksumSize], uint32(n.Checksum)) bytesBuffer.Write(header[0 : NeedleChecksumSize+padding]) - _, err = w.WriteAt(bytesBuffer.Bytes(), int64(offset)) - if err != nil { - err = fmt.Errorf("failed to write %d bytes to %s at offset %d: %w", actualSize, w.Name(), offset, err) - } - - return offset, size, actualSize, err + return size, actualSize, nil } diff --git a/weed/storage/needle/needle_write_v2.go b/weed/storage/needle/needle_write_v2.go index d332bc1c2..82cb50e88 100644 --- a/weed/storage/needle/needle_write_v2.go +++ b/weed/storage/needle/needle_write_v2.go @@ -2,15 +2,13 @@ package needle import ( "bytes" - "fmt" "math" - "github.com/seaweedfs/seaweedfs/weed/storage/backend" . "github.com/seaweedfs/seaweedfs/weed/storage/types" "github.com/seaweedfs/seaweedfs/weed/util" ) -func writeNeedleV2(w backend.BackendStorageFile, n *Needle, offset uint64, bytesBuffer *bytes.Buffer) (offsetOut uint64, size Size, actualSize int64, err error) { +func writeNeedleV2(n *Needle, offset uint64, bytesBuffer *bytes.Buffer) (size Size, actualSize int64, err error) { bytesBuffer.Reset() header := make([]byte, NeedleHeaderSize+TimestampSize) CookieToBytes(header[0:CookieSize], n.Cookie) @@ -79,10 +77,5 @@ func writeNeedleV2(w backend.BackendStorageFile, n *Needle, offset uint64, bytes size = Size(n.DataSize) actualSize = GetActualSize(n.Size, Version2) - _, err = w.WriteAt(bytesBuffer.Bytes(), int64(offset)) - if err != nil { - err = fmt.Errorf("failed to write %d bytes to %s at offset %d: %w", actualSize, w.Name(), offset, err) - } - - return offset, size, actualSize, err + return size, actualSize, nil } diff --git a/weed/storage/needle/needle_write_v3.go b/weed/storage/needle/needle_write_v3.go index 6927a1431..20a6256cc 100644 --- a/weed/storage/needle/needle_write_v3.go +++ b/weed/storage/needle/needle_write_v3.go @@ -2,15 +2,13 @@ package needle import ( "bytes" - "fmt" "math" - "github.com/seaweedfs/seaweedfs/weed/storage/backend" . "github.com/seaweedfs/seaweedfs/weed/storage/types" "github.com/seaweedfs/seaweedfs/weed/util" ) -func writeNeedleV3(w backend.BackendStorageFile, n *Needle, offset uint64, bytesBuffer *bytes.Buffer) (offsetOut uint64, size Size, actualSize int64, err error) { +func writeNeedleV3(n *Needle, offset uint64, bytesBuffer *bytes.Buffer) (size Size, actualSize int64, err error) { bytesBuffer.Reset() header := make([]byte, NeedleHeaderSize+TimestampSize) CookieToBytes(header[0:CookieSize], n.Cookie) @@ -80,10 +78,5 @@ func writeNeedleV3(w backend.BackendStorageFile, n *Needle, offset uint64, bytes size = Size(n.DataSize) actualSize = GetActualSize(n.Size, Version3) - _, err = w.WriteAt(bytesBuffer.Bytes(), int64(offset)) - if err != nil { - err = fmt.Errorf("failed to write %d bytes to %s at offset %d: %w", actualSize, w.Name(), offset, err) - } - - return offset, size, actualSize, err + return size, actualSize, nil }