From 914baaff2931c232246a5ed9a61b9f70cdf41e38 Mon Sep 17 00:00:00 2001 From: Carine Morel Date: Mon, 29 Sep 2025 12:16:45 +0200 Subject: [PATCH 1/3] Replace global value of stats by a DLS.key. --- src/stats.ml | 47 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/src/stats.ml b/src/stats.ml index 195a7f43..f7f707be 100644 --- a/src/stats.ml +++ b/src/stats.ml @@ -31,10 +31,12 @@ let fresh_stats () = lru_misses = 0; } -let stats = fresh_stats () -let get () = stats +let fresh_stats () = Domain.DLS.new_key (fun () -> fresh_stats ()) +let kstats = fresh_stats () +let get () = Domain.DLS.get kstats let reset_stats () = + let stats = Domain.DLS.get kstats in stats.bytes_read <- 0; stats.nb_reads <- 0; stats.bytes_written <- 0; @@ -48,23 +50,35 @@ let reset_stats () = stats.lru_hits <- 0; stats.lru_misses <- 0 -let incr_bytes_read n = stats.bytes_read <- stats.bytes_read + n -let incr_bytes_written n = stats.bytes_written <- stats.bytes_written + n -let incr_nb_reads () = stats.nb_reads <- succ stats.nb_reads -let incr_nb_writes () = stats.nb_writes <- succ stats.nb_writes -let incr_nb_merge () = stats.nb_merge <- succ stats.nb_merge -let incr_nb_replace () = stats.nb_replace <- succ stats.nb_replace -let incr_nb_sync () = stats.nb_sync <- succ stats.nb_sync -let incr_nb_lru_hits () = stats.lru_hits <- succ stats.lru_hits -let incr_nb_lru_misses () = stats.lru_misses <- succ stats.lru_misses +let incr_nb_merge () = + let stats = Domain.DLS.get kstats in + stats.nb_merge <- succ stats.nb_merge + +let incr_nb_replace () = + let stats = Domain.DLS.get kstats in + stats.nb_replace <- succ stats.nb_replace + +let incr_nb_sync () = + let stats = Domain.DLS.get kstats in + stats.nb_sync <- succ stats.nb_sync + +let incr_nb_lru_hits () = + let stats = Domain.DLS.get kstats in + stats.lru_hits <- succ stats.lru_hits + +let incr_nb_lru_misses () = + let stats = Domain.DLS.get kstats in + stats.lru_misses <- succ stats.lru_misses let add_read n = - incr_bytes_read n; - incr_nb_reads () + let stats = Domain.DLS.get kstats in + stats.bytes_read <- stats.bytes_read + n; + stats.nb_reads <- succ stats.nb_reads let add_write n = - incr_bytes_written n; - incr_nb_writes () + let stats = Domain.DLS.get kstats in + stats.bytes_written <- stats.bytes_written + n; + stats.nb_writes <- succ stats.nb_writes module Make (Clock : Platform.CLOCK) = struct let replace_timer = ref (Clock.counter ()) @@ -78,6 +92,7 @@ module Make (Clock : Platform.CLOCK) = struct if !nb_replace = sampling_interval then ( let span = Clock.count !replace_timer in let average = Mtime.span_to_us span /. float_of_int !nb_replace in + let stats = Domain.DLS.get kstats in stats.replace_durations <- average :: stats.replace_durations; replace_timer := Clock.counter (); nb_replace := 0) @@ -86,11 +101,13 @@ module Make (Clock : Platform.CLOCK) = struct let timer = Clock.counter () in f (); let span = Clock.count timer in + let stats = Domain.DLS.get kstats in stats.time_sync <- Mtime.span_to_us span let drop_head l = if List.length l >= 10 then List.tl l else l let add_merge_duration span = let span = Mtime.span_to_us span in + let stats = Domain.DLS.get kstats in stats.merge_durations <- drop_head stats.merge_durations @ [ span ] end From 5f13f7d1d1f675c53937e4fc22e14152ab8ae503 Mon Sep 17 00:00:00 2001 From: Carine Morel Date: Mon, 29 Sep 2025 12:47:56 +0200 Subject: [PATCH 2/3] Add merge functions. --- src/stats.ml | 35 +++++++++++++++++++++++++++++++++-- src/stats.mli | 2 ++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/stats.ml b/src/stats.ml index f7f707be..39f8d9c7 100644 --- a/src/stats.ml +++ b/src/stats.ml @@ -31,8 +31,8 @@ let fresh_stats () = lru_misses = 0; } -let fresh_stats () = Domain.DLS.new_key (fun () -> fresh_stats ()) -let kstats = fresh_stats () +let fresh_stats_dls () = Domain.DLS.new_key (fun () -> fresh_stats ()) +let kstats = fresh_stats_dls () let get () = Domain.DLS.get kstats let reset_stats () = @@ -80,6 +80,37 @@ let add_write n = stats.bytes_written <- stats.bytes_written + n; stats.nb_writes <- succ stats.nb_writes +let merge s1 s2 = + { + bytes_read = s1.bytes_read + s2.bytes_read; + nb_reads = s1.nb_reads + s2.nb_reads; + bytes_written = s1.bytes_written + s2.bytes_written; + nb_writes = s1.nb_writes + s2.nb_writes; + nb_merge = s1.nb_merge + s2.nb_merge; + merge_durations = s1.merge_durations @ s2.merge_durations; + nb_replace = s1.nb_replace + s2.nb_replace; + replace_durations = s1.replace_durations @ s2.replace_durations; + nb_sync = s1.nb_sync + s2.nb_sync; + time_sync = s1.time_sync +. s2.time_sync; + lru_hits = s1.lru_hits + s2.lru_hits; + lru_misses = s1.lru_misses + s2.lru_misses; + } + +let merge_in s2 = + let s1 = Domain.DLS.get kstats in + s1.bytes_read <- s1.bytes_read + s2.bytes_read; + s1.nb_reads <- s1.nb_reads + s2.nb_reads; + s1.bytes_written <- s1.bytes_written + s2.bytes_written; + s1.nb_writes <- s1.nb_writes + s2.nb_writes; + s1.nb_merge <- s1.nb_merge + s2.nb_merge; + s1.merge_durations <- s1.merge_durations @ s2.merge_durations; + s1.nb_replace <- s1.nb_replace + s2.nb_replace; + s1.replace_durations <- s1.replace_durations @ s2.replace_durations; + s1.nb_sync <- s1.nb_sync + s2.nb_sync; + s1.time_sync <- s1.time_sync +. s2.time_sync; + s1.lru_hits <- s1.lru_hits + s2.lru_hits; + s1.lru_misses <- s1.lru_misses + s2.lru_misses + module Make (Clock : Platform.CLOCK) = struct let replace_timer = ref (Clock.counter ()) let nb_replace = ref 0 diff --git a/src/stats.mli b/src/stats.mli index a1d3ead3..0e8d18cf 100644 --- a/src/stats.mli +++ b/src/stats.mli @@ -38,6 +38,8 @@ val incr_nb_replace : unit -> unit val incr_nb_sync : unit -> unit val incr_nb_lru_hits : unit -> unit val incr_nb_lru_misses : unit -> unit +val merge : t -> t -> t +val merge_in : t -> unit module Make (_ : Platform.CLOCK) : sig val start_replace : unit -> unit From 16064b797002e0a4a8199cc15e660dfd7da5713c Mon Sep 17 00:00:00 2001 From: gwenaelle Date: Mon, 29 Sep 2025 19:00:11 +0200 Subject: [PATCH 3/3] Fix CI, bench & changes.md --- CHANGES.md | 1 + bench.Dockerfile | 11 +++++++++++ index-bench.opam | 2 +- index.opam | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 bench.Dockerfile diff --git a/CHANGES.md b/CHANGES.md index 8dd8636a..48e0507b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,6 +2,7 @@ ## Changed +- Replace global value of Stats by a DLS.key (#404, @lyrm) - Lock files are now opened with O_CLOEXEC flag (#394, @vect0r-vicall) - Update to cmdliner.1.1.0 (#382, @MisterDA) - Mirage support: optional dependency to unix (#396, @art-w) diff --git a/bench.Dockerfile b/bench.Dockerfile new file mode 100644 index 00000000..40e5b8b3 --- /dev/null +++ b/bench.Dockerfile @@ -0,0 +1,11 @@ +FROM ocaml/opam:debian-ocaml-5.3 +RUN sudo ln -sf /usr/bin/opam-2.1 /usr/bin/opam +RUN mkdir bench-dir && chown opam:opam bench-dir +WORKDIR bench-dir +RUN sudo chown opam . +COPY *.opam ./ +RUN opam remote add origin https://github.com/ocaml/opam-repository.git && opam update +RUN opam pin -yn --with-version=dev . +RUN opam install -y --deps-only --with-test . +COPY . ./ +ENTRYPOINT opam exec -- make bench \ No newline at end of file diff --git a/index-bench.opam b/index-bench.opam index 76b0b39e..f59f83f7 100644 --- a/index-bench.opam +++ b/index-bench.opam @@ -6,7 +6,7 @@ license: "MIT" homepage: "https://github.com/mirage/index" bug-reports: "https://github.com/mirage/index/issues" depends: [ - "ocaml" {>= "4.03.0"} + "ocaml" {>= "5.0.0"} "cmdliner" {>= "1.1.0"} "dune" {>= "2.7.0"} "fmt" diff --git a/index.opam b/index.opam index 47a6a8dc..63716c03 100644 --- a/index.opam +++ b/index.opam @@ -19,7 +19,7 @@ build: [ ] depends: [ - "ocaml" {>= "4.08.0"} + "ocaml" {>= "5.0.0"} "dune" {>= "2.7.0"} "optint" {>= "0.1.0"} "repr" {>= "0.6.0"}