Browse Source

Use the correct constant when computing the offset in SearchNeedleFromSortedIndex (#6771)

NeedleHeaderSize happen to have the same size as NeedleMapEntrySize, except when running the 5 bytes offset variant of Seaweedfs, because it does not contain OffsetSize. This causes ECX corruption on deletes, due to the drifting offset computation (offset is always computed on a basis of 16 bytes per record instead of 17 bytes)

Signed-off-by: Quentin Devos <4972091+Okhoshi@users.noreply.github.com>
pull/6777/head
Quentin D. 4 days ago
committed by GitHub
parent
commit
2ae5b480a6
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 7
      weed/storage/erasure_coding/ec_volume.go

7
weed/storage/erasure_coding/ec_volume.go

@ -3,14 +3,13 @@ package erasure_coding
import (
"errors"
"fmt"
"github.com/seaweedfs/seaweedfs/weed/glog"
"math"
"os"
"slices"
"sync"
"time"
"slices"
"github.com/seaweedfs/seaweedfs/weed/glog"
"github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
"github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb"
@ -263,7 +262,7 @@ func SearchNeedleFromSortedIndex(ecxFile *os.File, ecxFileSize int64, needleId t
key, offset, size = idx.IdxFileEntry(buf)
if key == needleId {
if processNeedleFn != nil {
err = processNeedleFn(ecxFile, m*types.NeedleHeaderSize)
err = processNeedleFn(ecxFile, m*types.NeedleMapEntrySize)
}
return
}

Loading…
Cancel
Save