1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.hadoop.metrics2.impl;
19
20 import java.util.concurrent.ScheduledFuture;
21 import java.util.concurrent.TimeUnit;
22 import java.util.concurrent.atomic.AtomicReference;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogFactory;
26 import org.apache.hadoop.hbase.classification.InterfaceAudience;
27 import org.apache.hadoop.metrics2.MetricsExecutor;
28 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
29 import org.apache.hadoop.metrics2.lib.MetricsExecutorImpl;
30
31
32
33
34
35
36
37
38
39 @InterfaceAudience.Private
40 public class JmxCacheBuster {
41 private static final Log LOG = LogFactory.getLog(JmxCacheBuster.class);
42 private static AtomicReference<ScheduledFuture> fut = new AtomicReference<>(null);
43 private static MetricsExecutor executor = new MetricsExecutorImpl();
44
45 private JmxCacheBuster() {
46
47 }
48
49
50
51
52 public static void clearJmxCache() {
53
54 ScheduledFuture future = fut.get();
55 if ((future != null && (!future.isDone() && future.getDelay(TimeUnit.MILLISECONDS) > 100))) {
56
57 return;
58 }
59 future = executor.getExecutor().schedule(new JmxCacheBusterRunnable(), 5, TimeUnit.SECONDS);
60 fut.set(future);
61 }
62
63 final static class JmxCacheBusterRunnable implements Runnable {
64 @Override
65 public void run() {
66 if (LOG.isTraceEnabled()) {
67 LOG.trace("Clearing JMX mbean cache.");
68 }
69
70
71
72 try {
73 if (DefaultMetricsSystem.instance() != null) {
74 DefaultMetricsSystem.instance().stop();
75
76
77 Thread.sleep(500);
78 DefaultMetricsSystem.instance().start();
79 }
80 } catch (Exception exception) {
81 LOG.debug("error clearing the jmx it appears the metrics system hasn't been started",
82 exception);
83 }
84 }
85 }
86 }