Keith Turner created ACCUMULO-4837: -------------------------------------- Summary: Allow short service names in addition to class names. Key: ACCUMULO-4837 URL: https://issues.apache.org/jira/browse/ACCUMULO-4837 Project: Accumulo Issue Type: Improvement Reporter: Keith Turner
In 2.0.0-SNAPSHOT the cache implementation was made configurable. Currently to configure it, you set a property like the following. {noformat} tserver.cache.manager.class=org.apache.accumulo.core.file.blockfile.cache.tinylfu.TinyLfuBlockCacheManager {noformat} I would much rather be able to provide a short service name like the following when configuring the cache. However I do not want the list to be predefined, I will want the user to be able to provide implementations. {noformat} tserver.cache.implementation=tinylfu {noformat} What is a good way to do this? Is there a good reason not do this and just stick with class names only? I was also thinking it may be nice to have a shell command for listing services, but this could be done independently. One way I thought of doing this is having an interface like the the following that services (balancer, compaction strategy, cache, etc) could implement. {code:java} public interface AccumuloService { /** * A human readable, short, unique identification that can be specified in configuration to identify a service implementation. */ public String getName(); public static <C extends AccumuloService> C load(String configId, Class<C> serviceType, ClassLoader classLoader) { ServiceLoader<C> services = ServiceLoader.load(serviceType, classLoader); for (C service : services) { if(service.getName().equals(configId) || service.getClass().getName().equals(configId)) { return service; } } return null; } } {code} Then the cache implementation could provide a name {code:java} //assume BlockCacheManager implements AccumuloService public class TinyLfuBlockCacheManager extends BlockCacheManager { private static final Logger LOG = LoggerFactory.getLogger(TinyLfuBlockCacheManager.class); @Override protected TinyLfuBlockCache createCache(Configuration conf, CacheType type) { LOG.info("Creating {} cache with configuration {}", type, conf); return new TinyLfuBlockCache(conf, type); } @Override public String getName() { return "tinylfu"; } } {code} The code to load a block cache impl would look like the following : {code:java} String impl = conf.get(Property.TSERV_CACHE_MANAGER_IMPL); BlockCacheManager bcm = AccumuloService.load(impl, BlockCacheManager.class, AccumuloVFSClassLoader.getClassLoader()); {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)