diff --git a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/metrics/HoodieLockMetrics.java b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/metrics/HoodieLockMetrics.java index 6ea7a1ae141ca..c33a86bfbe79d 100644 --- a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/metrics/HoodieLockMetrics.java +++ b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/client/transaction/lock/metrics/HoodieLockMetrics.java @@ -18,15 +18,15 @@ package org.apache.hudi.client.transaction.lock.metrics; -import org.apache.hudi.common.util.HoodieTimer; -import org.apache.hudi.config.HoodieWriteConfig; -import org.apache.hudi.metrics.Metrics; - import com.codahale.metrics.Counter; import com.codahale.metrics.MetricRegistry; import com.codahale.metrics.SlidingWindowReservoir; import com.codahale.metrics.Timer; +import org.apache.hudi.common.util.HoodieTimer; +import org.apache.hudi.config.HoodieWriteConfig; +import org.apache.hudi.metrics.Metrics; + import java.util.concurrent.TimeUnit; public class HoodieLockMetrics { @@ -46,6 +46,7 @@ public class HoodieLockMetrics { private transient Counter failedLockAttempts; private transient Timer lockDuration; private transient Timer lockApiRequestDuration; + private static final Object REGISTRY_LOCK = new Object(); public HoodieLockMetrics(HoodieWriteConfig writeConfig) { this.isMetricsEnabled = writeConfig.isLockingMetricsEnabled(); @@ -69,10 +70,12 @@ private String getMetricsName(String metric) { private Timer createTimerForMetrics(MetricRegistry registry, String metric) { String metricName = getMetricsName(metric); - if (registry.getMetrics().get(metricName) == null) { - lockDuration = new Timer(new SlidingWindowReservoir(keepLastNtimes)); - registry.register(metricName, lockDuration); - return lockDuration; + synchronized (REGISTRY_LOCK) { + if (registry.getMetrics().get(metricName) == null) { + lockDuration = new Timer(new SlidingWindowReservoir(keepLastNtimes)); + registry.register(metricName, lockDuration); + return lockDuration; + } } return (Timer) registry.getMetrics().get(metricName); }