From a72d1cc9412b06bb12a3b49da4f7600ac10b25bd Mon Sep 17 00:00:00 2001 From: Martin Sumner Date: Tue, 5 Jun 2018 15:36:39 +0100 Subject: [PATCH] Validate current manifest was written Then delete a previous maniafest (from 5 manifests ago, if it is still there). --- src/leveled_pmanifest.erl | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/leveled_pmanifest.erl b/src/leveled_pmanifest.erl index 64699c8..fba14da 100644 --- a/src/leveled_pmanifest.erl +++ b/src/leveled_pmanifest.erl @@ -57,6 +57,7 @@ -define(TREE_TYPE, idxt). -define(TREE_WIDTH, 8). -define(PHANTOM_PID, r2d_fail). +-define(MANIFESTS_TO_RETAIN, 5). -record(manifest, {levels, % an array of lists or trees representing the manifest @@ -199,7 +200,21 @@ save_manifest(Manifest, RootPath) -> min_snapshot_sqn = 0, blooms = dict:new()}), CRC = erlang:crc32(ManBin), - ok = file:write_file(FP, <>). + ok = file:write_file(FP, <>), + {ok, <>} = file:read_file(FP), + GC_SQN = Manifest#manifest.manifest_sqn - ?MANIFESTS_TO_RETAIN, + % If a manifest is corrupted the previous one will be tried, so don't + % delete the previous one straight away. Retain until enough have been + % kept to make the probability of all being independently corrupted + % through separate events negligible + LFP = filepath(RootPath, GC_SQN, current_manifest), + ok = + case filelib:is_file(LFP) of + true -> + file:delete(LFP); + _ -> + ok + end. -spec replace_manifest_entry(manifest(), integer(), integer(), list()|manifest_entry(),