From 33cbb2cacacab23ef62d1a275df228df2a2d118d Mon Sep 17 00:00:00 2001 From: Abhishek Shroff Date: Sun, 8 Jun 2025 17:23:21 +0530 Subject: [PATCH] [server] Copy manually if os.Remove fails --- server/internal/storage/local_storage.go | 26 ++++++++++++++++++++++-- server/internal/storage/storage.go | 2 +- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/server/internal/storage/local_storage.go b/server/internal/storage/local_storage.go index 1900e8b2..f3b07e75 100644 --- a/server/internal/storage/local_storage.go +++ b/server/internal/storage/local_storage.go @@ -56,11 +56,33 @@ func (l localStorage) OpenWrite(name string) (io.WriteCloser, error) { return nil, err } return &callbackWriteCloser{dest: f, closeCallback: func(err error) error { + defer os.Remove(f.Name()) if err != nil { - os.Remove(f.Name()) return err } - return os.Rename(f.Name(), l.path(name)) + if err := os.Rename(f.Name(), l.path(name)); err != nil { + if strings.Contains(err.Error(), "cross-device link") { + in, err := os.Open(f.Name()) + if err != nil { + return err + } + defer in.Close() + + out, err := os.OpenFile(l.path(name), os.O_CREATE|os.O_WRONLY|os.O_EXCL, 0700) + if err != nil { + return err + } + _, copyErr := io.Copy(out, in) + closeErr := out.Close() + if copyErr != nil { + return copyErr + } + return closeErr + } else { + return err + } + } + return nil }}, nil } diff --git a/server/internal/storage/storage.go b/server/internal/storage/storage.go index 51c22cd1..43fb0a0f 100644 --- a/server/internal/storage/storage.go +++ b/server/internal/storage/storage.go @@ -39,7 +39,7 @@ func Initialize(db db.Handler) error { } - tempDir := Cfg.Temp + tempDir = Cfg.Temp if !strings.HasPrefix(Cfg.Temp, string(os.PathSeparator)) { tempDir = filepath.Join(Cfg.Root, tempDir) }