Skip to content

Commit eb9f3ae

Browse files
[AMBARI-26135] Upgrade net.sf.ehcache to 3.10.0
1 parent 7f5b225 commit eb9f3ae

File tree

5 files changed

+59
-263
lines changed

5 files changed

+59
-263
lines changed

ambari-metrics-timelineservice/pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -835,9 +835,9 @@
835835
<version>2.1.0</version>
836836
</dependency>
837837
<dependency>
838-
<groupId>net.sf.ehcache</groupId>
838+
<groupId>org.ehcache</groupId>
839839
<artifactId>ehcache</artifactId>
840-
<version>2.10.0</version>
840+
<version>3.10.0</version>
841841
</dependency>
842842
<dependency>
843843
<groupId>com.fasterxml.jackson.core</groupId>

ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/TimelineMetricConfiguration.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -317,8 +317,7 @@ public class TimelineMetricConfiguration {
317317

318318
public static final String TIMELINE_METRICS_COLLECTOR_IGNITE_BACKUPS = "timeline.metrics.collector.ignite.nodes.backups";
319319

320-
public static final String INTERNAL_CACHE_HEAP_PERCENT =
321-
"timeline.metrics.internal.cache.%s.heap.percent";
320+
public static final String INTERNAL_CACHE_ENTRY_COUNT = "timeline.metrics.internal.cache.%s.entry.count";
322321

323322
public static final String EXTERNAL_SINK_INTERVAL =
324323
"timeline.metrics.external.sink.%s.%s.interval";
@@ -628,12 +627,12 @@ public List<ExternalSinkProvider> getExternalSinkProviderList() {
628627
return providerList;
629628
}
630629

631-
public String getInternalCacheHeapPercent(String instanceName) {
632-
String heapPercent = metricsConf.get(String.format(INTERNAL_CACHE_HEAP_PERCENT, instanceName));
633-
if (StringUtils.isEmpty(heapPercent)) {
634-
return "5%";
630+
public Integer getInternalCacheSize(String instanceName) {
631+
String cacheEntryCount = metricsConf.get(String.format(INTERNAL_CACHE_ENTRY_COUNT, instanceName));
632+
if(StringUtils.isEmpty(cacheEntryCount)) {
633+
return 500;
635634
} else {
636-
return heapPercent.endsWith("%") ? heapPercent : heapPercent + "%";
635+
return Integer.parseInt(cacheEntryCount);
637636
}
638637
}
639638

ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/source/cache/InternalMetricsCache.java

+50-105
Original file line numberDiff line numberDiff line change
@@ -24,36 +24,39 @@
2424
import java.util.concurrent.TimeUnit;
2525
import java.util.concurrent.locks.Lock;
2626
import java.util.concurrent.locks.ReentrantLock;
27+
import java.util.EnumSet;
28+
import java.util.Iterator;
2729

2830
import org.apache.commons.logging.Log;
2931
import org.apache.commons.logging.LogFactory;
3032
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetric;
3133
import org.apache.hadoop.metrics2.sink.timeline.TimelineMetrics;
32-
33-
import net.sf.ehcache.Cache;
34-
import net.sf.ehcache.CacheException;
35-
import net.sf.ehcache.CacheManager;
36-
import net.sf.ehcache.Ehcache;
37-
import net.sf.ehcache.Element;
38-
import net.sf.ehcache.config.CacheConfiguration;
39-
import net.sf.ehcache.config.PersistenceConfiguration;
40-
import net.sf.ehcache.config.SizeOfPolicyConfiguration;
41-
import net.sf.ehcache.event.CacheEventListener;
42-
import net.sf.ehcache.store.MemoryStoreEvictionPolicy;
34+
import org.ehcache.Cache;
35+
import org.ehcache.CacheManager;
36+
import org.ehcache.config.CacheConfiguration;
37+
import org.ehcache.config.builders.CacheConfigurationBuilder;
38+
import org.ehcache.config.builders.CacheManagerBuilder;
39+
import org.ehcache.config.builders.ResourcePoolsBuilder;
40+
import org.ehcache.config.units.EntryUnit;
41+
import org.ehcache.event.CacheEvent;
42+
import org.ehcache.event.CacheEventListener;
43+
import org.ehcache.event.EventType;
44+
import org.ehcache.event.EventFiring;
45+
import org.ehcache.event.EventOrdering;
46+
import org.ehcache.expiry.Expirations;
4347

4448
public class InternalMetricsCache {
4549
private static final Log LOG = LogFactory.getLog(InternalMetricsCache.class);
4650
private final String instanceName;
47-
private final String maxHeapPercent;
51+
private final Integer internalCacheEntryCount;
4852
private volatile boolean isCacheInitialized = false;
49-
private Cache cache;
50-
static final String TIMELINE_METRIC_CACHE_MANAGER_NAME = "internalMetricsCacheManager";
53+
private Cache<InternalMetricCacheKey, InternalMetricCacheValue> cache;
5154
private final Lock lock = new ReentrantLock();
5255
private static final int LOCK_TIMEOUT_SECONDS = 2;
5356

54-
public InternalMetricsCache(String instanceName, String maxHeapPercent) {
57+
public InternalMetricsCache(String instanceName, Integer internalCacheEntryCount) {
5558
this.instanceName = instanceName;
56-
this.maxHeapPercent = maxHeapPercent;
59+
this.internalCacheEntryCount = internalCacheEntryCount;
5760
initialize();
5861
}
5962

@@ -63,71 +66,49 @@ private void initialize() {
6366
throw new RuntimeException("Cannot initialize internal cache twice");
6467
}
6568

66-
System.setProperty("net.sf.ehcache.skipUpdateCheck", "true");
67-
System.setProperty("net.sf.ehcache.sizeofengine." + TIMELINE_METRIC_CACHE_MANAGER_NAME,
68-
"org.apache.ambari.metrics.core.timeline.source.cache.InternalMetricsCacheSizeOfEngine");
69-
70-
net.sf.ehcache.config.Configuration managerConfig =
71-
new net.sf.ehcache.config.Configuration();
72-
managerConfig.setName(TIMELINE_METRIC_CACHE_MANAGER_NAME);
73-
74-
// Set max heap available to the cache manager
75-
managerConfig.setMaxBytesLocalHeap(maxHeapPercent);
76-
77-
//Create a singleton CacheManager using defaults
78-
CacheManager manager = CacheManager.create(managerConfig);
79-
80-
LOG.info("Creating Metrics Cache with maxHeapPercent => " + maxHeapPercent);
69+
CacheManager manager = CacheManagerBuilder.newCacheManagerBuilder()
70+
.build(true);
8171

8272
// Create a Cache specifying its configuration.
83-
CacheConfiguration cacheConfiguration = new CacheConfiguration()
84-
.name(instanceName)
85-
.memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LRU)
86-
.sizeOfPolicy(new SizeOfPolicyConfiguration() // Set sizeOf policy to continue on max depth reached - avoid OOM
87-
.maxDepth(10000)
88-
.maxDepthExceededBehavior(SizeOfPolicyConfiguration.MaxDepthExceededBehavior.CONTINUE))
89-
.eternal(true) // infinite time until eviction
90-
.persistence(new PersistenceConfiguration()
91-
.strategy(PersistenceConfiguration.Strategy.NONE.name()));
92-
93-
cache = new Cache(cacheConfiguration);
94-
cache.getCacheEventNotificationService().registerListener(new InternalCacheEvictionListener());
73+
CacheConfiguration<InternalMetricCacheKey, InternalMetricCacheValue> cacheConfig =
74+
CacheConfigurationBuilder.newCacheConfigurationBuilder(
75+
InternalMetricCacheKey.class, InternalMetricCacheValue.class,
76+
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(internalCacheEntryCount, EntryUnit.ENTRIES)
77+
).withExpiry(Expirations.noExpiration()).build();
9578

96-
LOG.info("Registering internal metrics cache with provider: name = " +
97-
cache.getName() + ", guid: " + cache.getGuid());
79+
cache = manager.createCache(instanceName, cacheConfig);
80+
cache.getRuntimeConfiguration().registerCacheEventListener(new InternalCacheEvictionListener(), EventOrdering.ORDERED, EventFiring.SYNCHRONOUS, EnumSet.of(EventType.EVICTED));
9881

99-
manager.addCache(cache);
82+
LOG.info("Registering internal metrics cache with provider: name = " +
83+
instanceName);
10084

10185
isCacheInitialized = true;
10286
}
10387

10488
public InternalMetricCacheValue getInternalMetricCacheValue(InternalMetricCacheKey key) {
105-
Element ele = cache.get(key);
106-
if (ele != null) {
107-
return (InternalMetricCacheValue) ele.getObjectValue();
108-
}
109-
return null;
89+
return cache.get(key);
11090
}
11191

11292
public Collection<TimelineMetrics> evictAll() {
11393
TimelineMetrics metrics = new TimelineMetrics();
11494
try {
11595
if (lock.tryLock(LOCK_TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
116-
try{
117-
List keys = cache.getKeys();
118-
for (Object obj : keys) {
96+
try {
97+
Iterator<Cache.Entry<InternalMetricCacheKey, InternalMetricCacheValue>> iterator = cache.iterator();
98+
while (iterator.hasNext()) {
99+
Cache.Entry<InternalMetricCacheKey, InternalMetricCacheValue> entry = iterator.next();
119100
TimelineMetric metric = new TimelineMetric();
120-
InternalMetricCacheKey key = (InternalMetricCacheKey) obj;
101+
InternalMetricCacheKey key = entry.getKey();
121102
metric.setMetricName(key.getMetricName());
122103
metric.setAppId(key.getAppId());
123104
metric.setInstanceId(key.getInstanceId());
124105
metric.setHostName(key.getHostname());
125106
metric.setStartTime(key.getStartTime());
126-
Element ele = cache.get(key);
127-
metric.setMetricValues(((InternalMetricCacheValue) ele.getObjectValue()).getMetricValues());
107+
InternalMetricCacheValue value = cache.get(key);
108+
metric.setMetricValues(value.getMetricValues());
128109
metrics.getMetrics().add(metric);
110+
iterator.remove();
129111
}
130-
cache.removeAll();
131112
} finally {
132113
lock.unlock();
133114
}
@@ -157,14 +138,13 @@ public void putAll(Collection<TimelineMetrics> metrics) {
157138
timelineMetric.getStartTime()
158139
);
159140

160-
Element ele = cache.get(key);
161-
if (ele != null) {
162-
InternalMetricCacheValue value = (InternalMetricCacheValue) ele.getObjectValue();
141+
InternalMetricCacheValue value = cache.get(key);
142+
if (value != null) {
163143
value.addMetricValues(timelineMetric.getMetricValues());
164144
} else {
165-
InternalMetricCacheValue value = new InternalMetricCacheValue();
145+
value = new InternalMetricCacheValue();
166146
value.setMetricValues(timelineMetric.getMetricValues());
167-
cache.put(new Element(key, value));
147+
cache.put(key, value);
168148
}
169149
}
170150
}
@@ -181,49 +161,14 @@ public void putAll(Collection<TimelineMetrics> metrics) {
181161
}
182162
}
183163

184-
class InternalCacheEvictionListener implements CacheEventListener {
185-
186-
@Override
187-
public void notifyElementRemoved(Ehcache cache, Element element) throws CacheException {
188-
// expected
189-
}
190-
191-
@Override
192-
public void notifyElementPut(Ehcache cache, Element element) throws CacheException {
193-
// do nothing
194-
}
195-
164+
class InternalCacheEvictionListener implements CacheEventListener<InternalMetricCacheKey, InternalMetricCacheValue> {
196165
@Override
197-
public void notifyElementUpdated(Ehcache cache, Element element) throws CacheException {
198-
// do nothing
199-
}
200-
201-
@Override
202-
public void notifyElementExpired(Ehcache cache, Element element) {
203-
// do nothing
204-
}
205-
206-
@Override
207-
public void notifyElementEvicted(Ehcache cache, Element element) {
208-
// Bad - Remote endpoint cannot keep up resulting in flooding
209-
InternalMetricCacheKey key = (InternalMetricCacheKey) element.getObjectKey();
210-
LOG.warn("Evicting element from internal metrics cache, metric => " + key
211-
.getMetricName() + ", startTime = " + new Date(key.getStartTime()));
212-
}
213-
214-
@Override
215-
public void notifyRemoveAll(Ehcache cache) {
216-
// expected
217-
}
218-
219-
@Override
220-
public Object clone() throws CloneNotSupportedException {
221-
return null;
222-
}
223-
224-
@Override
225-
public void dispose() {
226-
// do nothing
166+
public void onEvent(CacheEvent<? extends InternalMetricCacheKey, ? extends InternalMetricCacheValue> event) {
167+
if (event.getType() == EventType.EVICTED) {
168+
InternalMetricCacheKey key = event.getKey();
169+
LOG.warn("Evicting element from internal metrics cache, metric => " + key
170+
.getMetricName() + ", startTime = " + new Date(key.getStartTime()));
171+
}
227172
}
228173
}
229174
}

ambari-metrics-timelineservice/src/main/java/org/apache/ambari/metrics/core/timeline/source/cache/InternalMetricsCacheProvider.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public InternalMetricsCache getCacheInstance(String instanceName) {
3939
} else {
4040
TimelineMetricConfiguration conf = TimelineMetricConfiguration.getInstance();
4141
InternalMetricsCache cache = new InternalMetricsCache(instanceName,
42-
conf.getInternalCacheHeapPercent(instanceName));
42+
conf.getInternalCacheSize(instanceName));
4343

4444
metricsCacheMap.put(instanceName, cache);
4545
return cache;

0 commit comments

Comments
 (0)