From 90ca0b6e6084e4a25524bfef781c371b1159e72e Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Wed, 28 May 2025 15:26:18 +1000 Subject: [PATCH] Reorder exclusive rename operations in file storage --- storage/file-piece.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/storage/file-piece.go b/storage/file-piece.go index f4ab77a1..2dc17233 100644 --- a/storage/file-piece.go +++ b/storage/file-piece.go @@ -199,20 +199,28 @@ func (me *filePieceImpl) promotePartFile(f file) (err error) { // Rename from if exists, and if so, to must not exist. func (me *filePieceImpl) exclRenameIfExists(from, to string) (err error) { - _, err = os.Stat(from) - if errors.Is(err, fs.ErrNotExist) { - return nil - } // We don't want anyone reading or writing to this until the rename completes. f, err := os.OpenFile(to, os.O_CREATE|os.O_EXCL, 0) + if errors.Is(err, fs.ErrExist) { + _, err = os.Stat(from) + if errors.Is(err, fs.ErrNotExist) { + return nil + } + if err != nil { + return + } + return errors.New("source and destination files both exist") + } if err != nil { - return fmt.Errorf("error creating destination file: %w", err) + return } f.Close() err = os.Rename(from, to) - if err == nil { - me.logger().Debug("renamed file", "from", from, "to", to) + if err != nil { + os.Remove(to) + return } + me.logger().Debug("renamed file", "from", from, "to", to) return } -- 2.51.0