From d02d02893c090fbde81029393f189165d879d378 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Wed, 18 Mar 2026 11:39:34 -0700 Subject: [PATCH] fix VolumeTierMoveDatToRemote to close local dat backend after upload Go calls v.LoadRemoteFile() after saving volume info, which closes the local DataBackend before transitioning to remote storage. Without this, the volume holds a stale file handle to the deleted local .dat file, causing reads to fail until server restart. --- seaweed-volume/src/server/grpc_server.rs | 6 +++++- seaweed-volume/src/storage/volume.rs | 6 ++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/seaweed-volume/src/server/grpc_server.rs b/seaweed-volume/src/server/grpc_server.rs index 29f8ba53c..e1df47dfe 100644 --- a/seaweed-volume/src/server/grpc_server.rs +++ b/seaweed-volume/src/server/grpc_server.rs @@ -2888,7 +2888,11 @@ impl VolumeServer for VolumeGrpcService { ))); } - // Optionally remove local .dat file + // Close local dat file handle (matches Go's v.LoadRemoteFile + // which closes DataBackend before switching to remote) + vol.close_local_dat_backend(); + + // Optionally remove local .dat file from disk if !keep_local { let dat = vol.dat_path(); let _ = std::fs::remove_file(&dat); diff --git a/seaweed-volume/src/storage/volume.rs b/seaweed-volume/src/storage/volume.rs index bf0f14d4a..26e9b6834 100644 --- a/seaweed-volume/src/storage/volume.rs +++ b/seaweed-volume/src/storage/volume.rs @@ -2084,6 +2084,12 @@ impl Volume { } } + /// Close the local .dat file handle (matches Go's v.DataBackend.Close() in LoadRemoteFile). + /// Called after tier-upload when the local file is being replaced by remote storage. + pub fn close_local_dat_backend(&mut self) { + self.dat_file = None; + } + /// Path to .vif file. fn vif_path(&self) -> String { format!("{}.vif", self.data_file_name())