From 9d39235cc84407b662f509f72aa2ff64f779f676 Mon Sep 17 00:00:00 2001
From: Christopher Baines <mail@cbaines.net>
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