Skip to content

Commit

Permalink
Synchronizing the creation of in memory cache so we don't endup with …
Browse files Browse the repository at this point in the history
…duplicates
  • Loading branch information
smadappa committed Mar 11, 2017
1 parent 77e49e2 commit 12016dd
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.CacheStats;
import com.google.common.cache.LoadingCache;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListenableFutureTask;
Expand Down Expand Up @@ -165,18 +166,23 @@ public ListenableFuture<T> reload(final String key, T prev) {
ListenableFutureTask<T> task = ListenableFutureTask.create(new Callable<T>() {
public T call() {
try {
final T t = load(key);
if(t == null) {
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-NotFound");
} else {
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-Success");
}
return t;
} catch (EVCacheException e) {
log.error("EVCacheException while reloading key -> "+ key, e);
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-Fail");
return prev;
}
T t = load(key);
if(t != null && t.equals(prev)) {
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-UsePrevious");
t = prev;
}
if(t == null) {
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-NotFound");
return prev;
} else {
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-Success");
}
return t;
} catch (EVCacheException e) {
log.error("EVCacheException while reloading key -> "+ key, e);
EVCacheMetricsFactory.increment(appName, null, null, "EVCacheInMemoryCache" + "-" + appName + "-Reload-Fail");
return prev;
}
}
});
pool.execute(task);
Expand All @@ -195,12 +201,21 @@ public T call() {
}
}

private LoadingCache<String, T> getCache() {
return cache;
}

private CacheStats getStats() {
return cache.stats();
}

private void setupMonitoring(final String appName) {
final StepCounter sizeCounter = new StepCounter(getMonitorConfig(appName, "size", DataSourceType.GAUGE)) {
@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Long.valueOf(cache.size());
if (getCache() == null) return Long.valueOf(0);
log.debug("Current size is : " + getCache().size());
return Long.valueOf(getCache().size());
}

@Override
Expand All @@ -219,8 +234,8 @@ public Number getValue(int pollerIndex) {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Long.valueOf(cache.stats().requestCount());
if (getCache() == null) return Long.valueOf(0);
return Long.valueOf(getStats().requestCount());
}

@Override
Expand All @@ -237,8 +252,8 @@ public MonitorConfig getConfig() {
final StepCounter hitrateCounter = new StepCounter(getMonitorConfig(appName, "hitrate", DataSourceType.GAUGE)) {
@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().hitRate());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().hitRate());
}

@Override
Expand All @@ -257,8 +272,8 @@ public Number getValue(int pollerIndex) {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().hitCount());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().hitCount());
}

@Override
Expand All @@ -281,8 +296,8 @@ public MonitorConfig getConfig() {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().missCount());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().missCount());
}

@Override
Expand All @@ -305,8 +320,8 @@ public MonitorConfig getConfig() {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().evictionCount());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().evictionCount());
}

@Override
Expand All @@ -329,8 +344,8 @@ public MonitorConfig getConfig() {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().loadExceptionCount());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().loadExceptionCount());
}

@Override
Expand All @@ -353,8 +368,8 @@ public MonitorConfig getConfig() {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().loadCount());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().loadCount());
}

@Override
Expand All @@ -377,8 +392,8 @@ public MonitorConfig getConfig() {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().loadSuccessCount());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().loadSuccessCount());
}

@Override
Expand All @@ -401,8 +416,8 @@ public MonitorConfig getConfig() {

@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().totalLoadTime()/1000000);
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().totalLoadTime()/1000000);
}

@Override
Expand All @@ -419,8 +434,8 @@ public MonitorConfig getConfig() {
final StepCounter loadExceptionRate = new StepCounter(getMonitorConfig(appName, "loadExceptionRate", DataSourceType.GAUGE)) {
@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().loadExceptionRate());
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().loadExceptionRate());
}

@Override
Expand All @@ -433,8 +448,8 @@ public Number getValue(int pollerIndex) {
final StepCounter averageLoadTime = new StepCounter(getMonitorConfig(appName, "averageLoadTime-ms", DataSourceType.GAUGE)) {
@Override
public Number getValue() {
if (cache == null) return Long.valueOf(0);
return Double.valueOf(cache.stats().averageLoadPenalty()/1000000);
if (getCache() == null) return Long.valueOf(0);
return Double.valueOf(getStats().averageLoadPenalty()/1000000);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
Expand Down Expand Up @@ -263,12 +265,17 @@ private String getAppName(String _app) {
return app;
}

private WriteLock writeLock = new ReentrantReadWriteLock().writeLock();
private final Map<String, EVCacheInMemoryCache<?>> inMemoryMap = new ConcurrentHashMap<String, EVCacheInMemoryCache<?>>();
public <T> EVCacheInMemoryCache<T> createInMemoryCache(String appName, Transcoder<T> tc, EVCacheImpl impl) {
EVCacheInMemoryCache<T> cache = (EVCacheInMemoryCache<T>) inMemoryMap.get(appName);
if(cache == null) {
cache = new EVCacheInMemoryCache<T>(appName, tc, impl);
inMemoryMap.put(appName, cache);
writeLock.lock();
if((cache = getInMemoryCache(appName)) == null) {
cache = new EVCacheInMemoryCache<T>(appName, tc, impl);
inMemoryMap.put(appName, cache);
}
writeLock.unlock();
}
return cache;
}
Expand Down

0 comments on commit 12016dd

Please sign in to comment.