From 9d39235cc84407b662f509f72aa2ff64f779f676 Mon Sep 17 00:00:00 2001 From: Christopher Baines Date: Thu, 10 Dec 2020 09:43:04 +0000 Subject: Avoid race conditions in call-with-duration-metric --- prometheus.scm | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/prometheus.scm b/prometheus.scm index e0f58f6..bae0695 100644 --- a/prometheus.scm +++ b/prometheus.scm @@ -372,13 +372,18 @@ The metric with the name @var{metric-name} is fetched from the " (let* ((metric (or (metrics-registry-fetch-metric registry metric-name) - (make-histogram-metric - registry - metric-name - #:buckets buckets - #:docstring docstring - #:labels labels - #:label-preset-values label-preset-values))) + (monitor + ;; Check once more in case another thread has created + ;; the metric while this thread was waiting for the + ;; mutex + (or (metrics-registry-fetch-metric registry metric-name) + (make-histogram-metric + registry + metric-name + #:buckets buckets + #:docstring docstring + #:labels labels + #:label-preset-values label-preset-values))))) (start-time (get-internal-real-time))) (call-with-values thunk -- cgit v1.2.3