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())