Browse Source

fix: skip cookie validation for EC volume deletion when SkipCookieCheck is set (#7608)

fix: EC volume deletion issues

Fixes #7489

1. Skip cookie check for EC volume deletion when SkipCookieCheck is set
   When batch deleting files from EC volumes with SkipCookieCheck=true
   (e.g., orphan file cleanup), the cookie is not available. The deletion
   was failing with 'unexpected cookie 0' because DeleteEcShardNeedle
   always validated the cookie.

2. Optimize doDeleteNeedleFromAtLeastOneRemoteEcShards to return early
   Return immediately when a deletion succeeds, instead of continuing
   to try all parity shards unnecessarily.

3. Remove useless log message that always logged nil error
   The log at V(1) was logging err after checking it was nil.

Regression introduced in commit 7bdae5172 (Jan 3, 2023) when EC batch
delete support was added.
pull/7610/head
Chris Lu 1 day ago
committed by GitHub
parent
commit
51841a2e04
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 17
      weed/storage/store_ec_delete.go

17
weed/storage/store_ec_delete.go

@ -3,6 +3,7 @@ package storage
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/seaweedfs/seaweedfs/weed/pb" "github.com/seaweedfs/seaweedfs/weed/pb"
"github.com/seaweedfs/seaweedfs/weed/glog" "github.com/seaweedfs/seaweedfs/weed/glog"
@ -21,7 +22,8 @@ func (s *Store) DeleteEcShardNeedle(ecVolume *erasure_coding.EcVolume, n *needle
return 0, err return 0, err
} }
if cookie != n.Cookie {
// cookie == 0 indicates SkipCookieCheck was requested (e.g., orphan cleanup)
if cookie != 0 && cookie != n.Cookie {
return 0, fmt.Errorf("unexpected cookie %x", cookie) return 0, fmt.Errorf("unexpected cookie %x", cookie)
} }
@ -45,22 +47,17 @@ func (s *Store) doDeleteNeedleFromAtLeastOneRemoteEcShards(ecVolume *erasure_cod
shardId, _ := intervals[0].ToShardIdAndOffset(erasure_coding.ErasureCodingLargeBlockSize, erasure_coding.ErasureCodingSmallBlockSize) shardId, _ := intervals[0].ToShardIdAndOffset(erasure_coding.ErasureCodingLargeBlockSize, erasure_coding.ErasureCodingSmallBlockSize)
hasDeletionSuccess := false
err = s.doDeleteNeedleFromRemoteEcShardServers(shardId, ecVolume, needleId) err = s.doDeleteNeedleFromRemoteEcShardServers(shardId, ecVolume, needleId)
if err == nil { if err == nil {
hasDeletionSuccess = true
return nil
} }
for shardId = erasure_coding.DataShardsCount; shardId < erasure_coding.TotalShardsCount; shardId++ { for shardId = erasure_coding.DataShardsCount; shardId < erasure_coding.TotalShardsCount; shardId++ {
if parityDeletionError := s.doDeleteNeedleFromRemoteEcShardServers(shardId, ecVolume, needleId); parityDeletionError == nil { if parityDeletionError := s.doDeleteNeedleFromRemoteEcShardServers(shardId, ecVolume, needleId); parityDeletionError == nil {
hasDeletionSuccess = true
return nil
} }
} }
if hasDeletionSuccess {
return nil
}
return err return err
} }
@ -77,11 +74,9 @@ func (s *Store) doDeleteNeedleFromRemoteEcShardServers(shardId erasure_coding.Sh
for _, sourceDataNode := range sourceDataNodes { for _, sourceDataNode := range sourceDataNodes {
glog.V(4).Infof("delete from remote ec shard %d.%d from %s", ecVolume.VolumeId, shardId, sourceDataNode) glog.V(4).Infof("delete from remote ec shard %d.%d from %s", ecVolume.VolumeId, shardId, sourceDataNode)
err := s.doDeleteNeedleFromRemoteEcShard(sourceDataNode, ecVolume.VolumeId, ecVolume.Collection, ecVolume.Version, needleId)
if err != nil {
if err := s.doDeleteNeedleFromRemoteEcShard(sourceDataNode, ecVolume.VolumeId, ecVolume.Collection, ecVolume.Version, needleId); err != nil {
return err return err
} }
glog.V(1).Infof("delete from remote ec shard %d.%d from %s: %v", ecVolume.VolumeId, shardId, sourceDataNode, err)
} }
return nil return nil

Loading…
Cancel
Save