diff options
| author | chrislu <chris.lu@gmail.com> | 2025-11-05 22:19:52 -0800 |
|---|---|---|
| committer | chrislu <chris.lu@gmail.com> | 2025-11-05 22:19:52 -0800 |
| commit | 4b12262431b9a6921a6c803e20c168a1a9735c25 (patch) | |
| tree | 5c78b8374110dff92e9fafcb57520bc44c76c2f0 | |
| parent | eec179ef02060e244b00a09165605bb0aed7fdb6 (diff) | |
| download | seaweedfs-4b12262431b9a6921a6c803e20c168a1a9735c25.tar.xz seaweedfs-4b12262431b9a6921a6c803e20c168a1a9735c25.zip | |
Avoids unnecessary directory emptiness checks and potential race conditions when the entry was never deleted in the first place.
| -rw-r--r-- | weed/filer/filer.go | 8 | ||||
| -rw-r--r-- | weed/server/filer_grpc_server.go | 9 |
2 files changed, 13 insertions, 4 deletions
diff --git a/weed/filer/filer.go b/weed/filer/filer.go index 23a7d71e5..cc7f6a336 100644 --- a/weed/filer/filer.go +++ b/weed/filer/filer.go @@ -355,11 +355,17 @@ func (f *Filer) FindEntry(ctx context.Context, p util.FullPath) (entry *Entry, e if entry.GetS3ExpireTime().Before(time.Now()) && !entry.IsS3Versioning() { if delErr := f.doDeleteEntryMetaAndData(ctx, entry, true, false, nil); delErr != nil { glog.ErrorfCtx(ctx, "FindEntry doDeleteEntryMetaAndData %s failed: %v", entry.FullPath, delErr) + // Deletion failed - return entry as still existing rather than claiming it's gone + return entry, nil } return nil, filer_pb.ErrNotFound } } else if entry.Crtime.Add(time.Duration(entry.TtlSec) * time.Second).Before(time.Now()) { - f.Store.DeleteOneEntry(ctx, entry) + if delErr := f.Store.DeleteOneEntry(ctx, entry); delErr != nil { + glog.ErrorfCtx(ctx, "FindEntry DeleteOneEntry %s failed: %v", entry.FullPath, delErr) + // Deletion failed - return entry as still existing rather than claiming it's gone + return entry, nil + } return nil, filer_pb.ErrNotFound } } diff --git a/weed/server/filer_grpc_server.go b/weed/server/filer_grpc_server.go index 8b61379f9..6a2a3d28f 100644 --- a/weed/server/filer_grpc_server.go +++ b/weed/server/filer_grpc_server.go @@ -293,12 +293,15 @@ func (fs *FilerServer) DeleteEntry(ctx context.Context, req *filer_pb.DeleteEntr err = fs.filer.DeleteEntryMetaAndData(ctx, util.JoinPath(req.Directory, req.Name), req.IsRecursive, req.IgnoreRecursiveError, req.IsDeleteData, req.IsFromOtherCluster, req.Signatures, req.IfNotModifiedAfter) resp = &filer_pb.DeleteEntryResponse{} - if err != nil && err != filer_pb.ErrNotFound { - resp.Error = err.Error() + if err != nil { + if err != filer_pb.ErrNotFound { + resp.Error = err.Error() + } + // Return early: either a real error or entry not found (nothing deleted, so no cleanup needed) return resp, nil } - // Optional cleanup of empty parent directories + // Optional cleanup of empty parent directories (only if deletion succeeded) if req.DeleteEmptyParentDirectories { stopAtPath := util.FullPath(req.DeleteEmptyParentDirectoriesStopPath) if stopAtPath == "" { |
