#1679 - ENH: Support enabling/disabling L2 cache by "region" at runtime

This commit is contained in:
rob bygrave committed 2019-04-24 14:00:22 +12:00
1 parent 410d1a9b37
commit ae228d6b0e
17 files changed
+451 -42

No files matched your search

@@ -2,6 +2,9 @@ package io.ebeaninternal.server.cache;
import io.ebean.cache.ServerCache;
import io.ebean.cache.ServerCacheManager;
import io.ebean.cache.ServerCacheRegion;
import java.util.List;
/**
* Adapts SpiCacheManager to ServerCacheManager.
@@ -22,6 +25,26 @@ public class DefaultCacheAdapter implements ServerCacheManager {
return cacheManager.isLocalL2Caching();
}
@Override
public List<ServerCacheRegion> allRegions() {
return cacheManager.allRegions();
}
@Override
public void setEnabledRegions(String regions) {
cacheManager.setEnabledRegions(regions);
}
@Override
public ServerCacheRegion getRegion(String region) {
return cacheManager.getRegion(region);
}
@Override
public void setAllRegionsEnabled(boolean enabled) {
cacheManager.setAllRegionsEnabled(enabled);
}
@Override
public ServerCache getNaturalKeyCache(Class<?> beanType) {
return cacheManager.getNaturalKeyCache(beanType);
@@ -1,14 +1,29 @@
package io.ebeaninternal.server.cache;
import io.ebean.cache.ServerCache;
import io.ebean.cache.ServerCacheRegion;
import io.ebean.cache.ServerCacheType;
import io.ebeaninternal.api.SpiCacheRegion;
import io.ebeaninternal.server.cluster.ClusterManager;
import io.ebeaninternal.server.deploy.DCacheRegion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Manages the bean and query caches.
*/
public class DefaultServerCacheManager implements SpiCacheManager {
private static final Logger log = LoggerFactory.getLogger("io.ebean.cache.REGION");
private final Map<String, SpiCacheRegion> regionMap = new HashMap<>();
private final ClusterManager clusterManager;
private final DefaultCacheHolder cacheHolder;
@@ -39,6 +54,47 @@ public class DefaultServerCacheManager implements SpiCacheManager {
return localL2Caching;
}
@Override
public List<ServerCacheRegion> allRegions() {
return new ArrayList<>(regionMap.values());
}
@Override
public void setEnabledRegions(String regions) {
List<String> enabledRegions = Arrays.asList(regions.split(","));
List<String> disabledRegions = new ArrayList<>();
for (SpiCacheRegion region : regionMap.values()) {
if (enabledRegions.contains(region.getName())) {
if (!region.isEnabled()) {
region.setEnabled(true);
log.debug("Cache region[{}] enabled", region.getName());
}
} else {
disabledRegions.add(region.getName());
if (region.isEnabled()) {
region.setEnabled(false);
log.debug("Cache region[{}] disabled", region.getName());
}
}
}
log.info("Cache regions enabled:{} disabled:{}", enabledRegions, disabledRegions);
}
@Override
public void setAllRegionsEnabled(boolean enabled) {
log.debug("All cache regions enabled[{}]", enabled);
for (SpiCacheRegion region : regionMap.values()) {
region.setEnabled(enabled);
}
}
@Override
public SpiCacheRegion getRegion(String region) {
return regionMap.computeIfAbsent(region, DCacheRegion::new);
}
/**
* Clear all caches.
*/
@@ -1,6 +1,10 @@
package io.ebeaninternal.server.cache;
import io.ebean.cache.ServerCache;
import io.ebean.cache.ServerCacheRegion;
import io.ebeaninternal.api.SpiCacheRegion;
import java.util.List;
/**
* The cache service for server side caching of beans and query results.
@@ -16,6 +20,28 @@ public interface SpiCacheManager {
*/
boolean isLocalL2Caching();
/**
* Return all the regions.
*/
List<ServerCacheRegion> allRegions();
/**
* Set the regions that are enabled.
*
* @param regions A single region name or a comma delimited list of region names.
*/
void setEnabledRegions(String regions);
/**
* Enable or disable all cache regions.
*/
void setAllRegionsEnabled(boolean enabled);
/**
* Return the cache region. We can enable L2 caching by region.
*/
SpiCacheRegion getRegion(String region);
/**
* Return the cache for mapping natural keys to id values.
*/