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)