|
@@ -236,8 +236,8 @@ public class DecayRpcScheduler implements RpcScheduler,
|
|
|
DecayTask task = new DecayTask(this, timer);
|
|
|
timer.scheduleAtFixedRate(task, decayPeriodMillis, decayPeriodMillis);
|
|
|
|
|
|
- metricsProxy = MetricsProxy.getInstance(ns, numLevels);
|
|
|
- metricsProxy.setDelegate(this);
|
|
|
+ metricsProxy = MetricsProxy.getInstance(ns, numLevels, this);
|
|
|
+ recomputeScheduleCache();
|
|
|
}
|
|
|
|
|
|
// Load configs
|
|
@@ -680,21 +680,26 @@ public class DecayRpcScheduler implements RpcScheduler,
|
|
|
private long[] callCountInLastWindowDefault;
|
|
|
private ObjectName decayRpcSchedulerInfoBeanName;
|
|
|
|
|
|
- private MetricsProxy(String namespace, int numLevels) {
|
|
|
+ private MetricsProxy(String namespace, int numLevels,
|
|
|
+ DecayRpcScheduler drs) {
|
|
|
averageResponseTimeDefault = new double[numLevels];
|
|
|
callCountInLastWindowDefault = new long[numLevels];
|
|
|
+ setDelegate(drs);
|
|
|
decayRpcSchedulerInfoBeanName =
|
|
|
MBeans.register(namespace, "DecayRpcScheduler", this);
|
|
|
this.registerMetrics2Source(namespace);
|
|
|
}
|
|
|
|
|
|
public static synchronized MetricsProxy getInstance(String namespace,
|
|
|
- int numLevels) {
|
|
|
+ int numLevels, DecayRpcScheduler drs) {
|
|
|
MetricsProxy mp = INSTANCES.get(namespace);
|
|
|
if (mp == null) {
|
|
|
// We must create one
|
|
|
- mp = new MetricsProxy(namespace, numLevels);
|
|
|
+ mp = new MetricsProxy(namespace, numLevels, drs);
|
|
|
INSTANCES.put(namespace, mp);
|
|
|
+ } else if (drs != mp.delegate.get()){
|
|
|
+ // in case of delegate is reclaimed, we should set it again
|
|
|
+ mp.setDelegate(drs);
|
|
|
}
|
|
|
return mp;
|
|
|
}
|