Github user zd-project commented on a diff in the pull request:
https://github.com/apache/storm/pull/2743#discussion_r198993307
--- Diff:
storm-server/src/main/java/org/apache/storm/metric/timed/TimerDecorated.java ---
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.
+ * See the NOTICE file distributed with this work for additional
information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
(the "License");
+ * you may not use this file except in compliance with the License. You
may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an "AS IS"
BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
limitations under the License.
+ */
+
+package org.apache.storm.metric.timed;
+
+import com.codahale.metrics.Timer;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+public interface TimerDecorated extends AutoCloseable {
+ public boolean hasStopped();
+
+ default boolean hasStopped(final AtomicReference<Timer.Context>
timing) {
+ return timing.get() == null;
+ }
+
+ public long stopTiming();
+
+ /**
+ * Stop the timer for measured object. Should be executed only once.
+ *
+ * @return Time a object is in use, or under measurement, in
nanoseconds.
+ * @throws NullPointerException this method is called more than once.
+ */
+ default long stopTiming(final AtomicReference<Timer.Context>
timingRef) throws NullPointerException {
+ Timer.Context timing = timingRef.get();
+ if (timing != null) {
+ long lapses = timing.stop();
+ timingRef.set(null);
+ return lapses;
+ }
+ throw new NullPointerException("Timer for this object has stopped
and cleared");
--- End diff --
It can be used if we need the time somewhere else, say when calculating
download rate. But the reason for not closing timer multiple time is that
Timer.stop under the hood is not idempotent. So calling it multiple time can
actually mess up the metrics.
---