Try to remove files before marking for deletion

You know, it might just work...
This commit is contained in:
Reynir Björnsson 2023-02-08 16:29:55 +01:00
parent 1a6c6b8f9d
commit 8c7e71127f

View file

@ -465,14 +465,26 @@ module Make
Ok () Ok ()
| Error e -> Error (`Write_error e) | Error e -> Error (`Write_error e)
else else
let dest = to_delete_key (hash, csum) in (* if the checksums mismatch we want to delete the file. We are only
(* if the checksums mismatch we need to mark the file for deletion *) able to do so if it was the latest created file, so we expect and
KV.rename t.dev ~source ~dest >|= function error. Ideally, we want to match for `Append_only or other errors *)
| Ok () -> Error (`Bad_checksum (hash, csum)) KV.remove t.dev source >>= function
| Ok () ->
Logs.info (fun m -> m "Removed %a" Mirage_kv.Key.pp source);
Lwt_result.fail (`Bad_checksum (hash, csum))
| Error e -> | Error e ->
Logs.warn (fun m -> m "Error renaming file %a -> %a: %a" Logs.debug (fun m -> m "Failed to remove %a: %a"
Mirage_kv.Key.pp source Mirage_kv.Key.pp dest KV.pp_write_error e); Mirage_kv.Key.pp source KV.pp_write_error e);
Error (`Bad_checksum (hash, csum)) (* we failed to delete the file so we mark it for deletion *)
let dest = to_delete_key (hash, csum) in
Logs.warn (fun m -> m "Failed to remove %a: %a. Moving it to %a"
Mirage_kv.Key.pp source KV.pp_write_error e Mirage_kv.Key.pp dest);
KV.rename t.dev ~source ~dest >|= function
| Ok () -> Error (`Bad_checksum (hash, csum))
| Error e ->
Logs.warn (fun m -> m "Error renaming file %a -> %a: %a"
Mirage_kv.Key.pp source Mirage_kv.Key.pp dest KV.pp_write_error e);
Error (`Bad_checksum (hash, csum))
(* on disk, we use a flat file system where the filename is the sha256 of the data *) (* on disk, we use a flat file system where the filename is the sha256 of the data *)