@@ -77,15 +77,13 @@ struct
7777 let register_suffix_consumer t ~after_flush =
7878 t.suffix_consumers < - { after_flush } :: t.suffix_consumers
7979
80- let generation = function
81- | Payload. From_v1_v2_post_upgrade _ | Used_non_minimal_indexing_strategy
82- | No_gc_yet ->
83- 0
84- | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | T11 | T12 | T13 | T14
85- | T15 ->
86- (* Unreachable *)
87- assert false
88- | Gced x -> x.generation
80+ let get_gced = function Payload. Gced x -> Some x | _ -> None
81+
82+ let generation payload =
83+ match get_gced payload with Some x -> x.generation | None -> 0
84+
85+ let mapping_size payload =
86+ match get_gced payload with Some x -> x.mapping_end_poff | None -> None
8987
9088 let notify_reload_consumers consumers =
9189 List. fold_left
@@ -215,18 +213,24 @@ struct
215213
216214 module Layout = Irmin_pack.Layout. V5
217215
218- let open_prefix ~root ~generation =
216+ let open_prefix ~root ~generation ~ mapping_size =
219217 let open Result_syntax in
220218 if generation = 0 then Ok None
221219 else
222220 let mapping = Layout. mapping ~generation ~root in
223221 let data = Layout. prefix ~root ~generation in
224- let + prefix = Sparse. open_ro ~mapping ~data in
222+ let * mapping_size =
223+ match mapping_size with
224+ | Some size -> Ok size
225+ | None -> Io. size_of_path mapping
226+ in
227+ let mapping_size = Int63. to_int mapping_size in
228+ let + prefix = Sparse. open_ro ~mapping_size ~mapping ~data in
225229 Some prefix
226230
227- let reopen_prefix t ~generation =
231+ let reopen_prefix t ~generation ~ mapping_size =
228232 let open Result_syntax in
229- let * some_prefix = open_prefix ~root: t.root ~generation in
233+ let * some_prefix = open_prefix ~root: t.root ~generation ~mapping_size in
230234 match some_prefix with
231235 | None -> Ok ()
232236 | Some _ ->
@@ -310,12 +314,12 @@ struct
310314 let use_fsync = Irmin_pack.Conf. use_fsync config in
311315 let indexing_strategy = Conf. indexing_strategy config in
312316 let pl : Payload.t = Control. payload control in
313- let generation =
317+ let generation, mapping_size =
314318 match pl.status with
315319 | From_v1_v2_post_upgrade _ | No_gc_yet
316320 | Used_non_minimal_indexing_strategy ->
317- 0
318- | Gced x -> x.generation
321+ ( 0 , None )
322+ | Gced x -> ( x.generation, x.mapping_end_poff)
319323 | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | T9 | T10 | T11 | T12 | T13 | T14
320324 | T15 ->
321325 assert false
@@ -348,7 +352,7 @@ struct
348352 let cb _ = suffix_requires_a_flush_exn (get_instance () ) in
349353 make_suffix ~auto_flush_threshold ~auto_flush_procedure: (`External cb)
350354 in
351- let * prefix = open_prefix ~root ~generation in
355+ let * prefix = open_prefix ~root ~generation ~mapping_size in
352356 let * dict =
353357 let path = Layout. dict ~root in
354358 let auto_flush_threshold =
@@ -435,7 +439,10 @@ struct
435439 in
436440 (* Step 3.2. Potentially reload prefix *)
437441 let * () =
438- if gen0 = gen1 then Ok () else reopen_prefix t ~generation: gen1
442+ if gen0 = gen1 then Ok ()
443+ else
444+ reopen_prefix t ~generation: gen1
445+ ~mapping_size: (mapping_size pl1.status)
439446 in
440447 (* Step 3.3. Potentially reload lower *)
441448 if gen0 = gen1 && pl0.volume_num = pl1.volume_num then Ok ()
@@ -575,6 +582,7 @@ struct
575582 generation;
576583 latest_gc_target_offset = Int63. zero;
577584 suffix_dead_bytes = Int63. zero;
585+ mapping_end_poff = Some Int63. zero;
578586 };
579587 }
580588 in
@@ -766,7 +774,9 @@ struct
766774 Suffix. open_ro ~root ~appendable_chunk_poff ~start_idx ~chunk_num
767775 ~dead_header_size
768776 in
769- let * prefix = open_prefix ~root ~generation in
777+ let * prefix =
778+ open_prefix ~root ~generation ~mapping_size: (mapping_size status)
779+ in
770780 let * dict =
771781 let path = Layout. dict ~root in
772782 Dict. open_ro ~path ~end_poff: dict_end_poff ~dead_header_size
@@ -831,8 +841,8 @@ struct
831841 | `Unknown_major_pack_version _ ) as e ->
832842 e)
833843
834- let swap t ~generation ~suffix_start_offset ~ chunk_start_idx ~ chunk_num
835- ~suffix_dead_bytes ~latest_gc_target_offset ~volume =
844+ let swap t ~generation ~mapping_size ~ suffix_start_offset ~ chunk_start_idx
845+ ~chunk_num ~ suffix_dead_bytes ~latest_gc_target_offset ~volume =
836846 let open Result_syntax in
837847 [% log.debug
838848 " Gc in main: swap gen %d; suffix start %a; chunk start idx %d; chunk num \
@@ -843,7 +853,8 @@ struct
843853 let pl = Control. payload t.control in
844854
845855 (* Step 1. Reopen files *)
846- let * () = reopen_prefix t ~generation in
856+ let mapping_size = Some mapping_size in
857+ let * () = reopen_prefix t ~generation ~mapping_size in
847858 let * () =
848859 reopen_suffix t ~chunk_start_idx ~chunk_num
849860 ~appendable_chunk_poff: pl.appendable_chunk_poff
@@ -868,6 +879,7 @@ struct
868879 generation;
869880 latest_gc_target_offset;
870881 suffix_dead_bytes;
882+ mapping_end_poff = mapping_size;
871883 }
872884 in
873885
@@ -973,8 +985,7 @@ struct
973985 let lower = t.lower in
974986 cleanup ~root ~generation ~chunk_start_idx ~chunk_num ~lower
975987
976- let create_one_commit_store t config ~generation ~latest_gc_target_offset
977- ~suffix_start_offset commit_key =
988+ let create_one_commit_store t config gced commit_key =
978989 let open Result_syntax in
979990 let src_root = t.root in
980991 let dst_root = Irmin_pack.Conf. root config in
@@ -990,15 +1001,7 @@ struct
9901001 in
9911002 let * () = Suffix. close suffix in
9921003 (* Step 3. Create the control file and close it. *)
993- let status =
994- Payload. Gced
995- {
996- suffix_start_offset;
997- generation;
998- latest_gc_target_offset;
999- suffix_dead_bytes = Int63. zero;
1000- }
1001- in
1004+ let status = Payload. Gced gced in
10021005 let dict_end_poff = Io. size_of_path dst_dict |> Errs. raise_if_error in
10031006 let pl =
10041007 {
0 commit comments