package voldemort.cluster.failuredetector; import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; import voldemort.VoldemortException; import voldemort.cluster.Node; import voldemort.store.CompositeVoldemortRequest; import voldemort.store.Store; import voldemort.store.StoreCapabilityType; import voldemort.store.UnreachableStoreException; import voldemort.utils.ByteArray; import voldemort.versioning.Version; import voldemort.versioning.Versioned; /** * MutableStoreConnectionVerifier is used when we want to simulate a downed node * during testing. For a given Node we can update this ConnectionVerifier to * cause node availability discovery to fail (which we want to be able to * control for our tests). * */ public class MutableStoreConnectionVerifier extends BasicStoreConnectionVerifier<ByteArray, byte[], byte[]> { private Map<Integer, VoldemortException> errorStores; private MutableStoreConnectionVerifier(Map<Integer, Store<ByteArray, byte[], byte[]>> stores) { super(stores, new ByteArray((byte) 1)); errorStores = new HashMap<Integer, VoldemortException>(); } @Override public void verifyConnection(Node node) throws UnreachableStoreException, VoldemortException { VoldemortException e = errorStores.get(node.getId()); if(e == null) super.verifyConnection(node); else throw e; } public void setErrorStore(Node node, VoldemortException voldemortException) { errorStores.put(node.getId(), voldemortException); } public void addStore(Node node) { stores.put(node.getId(), createStore()); } public static MutableStoreConnectionVerifier create(Map<Integer, Store<ByteArray, byte[], byte[]>> stores) { return new MutableStoreConnectionVerifier(stores); } public static MutableStoreConnectionVerifier create(Collection<Node> nodes) { Map<Integer, Store<ByteArray, byte[], byte[]>> stores = new HashMap<Integer, Store<ByteArray, byte[], byte[]>>(); for(Node node: nodes) { stores.put(node.getId(), createStore()); } return new MutableStoreConnectionVerifier(stores); } private static Store<ByteArray, byte[], byte[]> createStore() { return new Store<ByteArray, byte[], byte[]>() { @Override public void close() throws VoldemortException {} @Override public boolean delete(ByteArray key, Version version) throws VoldemortException { return false; } @Override public List<Versioned<byte[]>> get(ByteArray key, byte[] transforms) throws VoldemortException { return null; } @Override public Map<ByteArray, List<Versioned<byte[]>>> getAll(Iterable<ByteArray> keys, Map<ByteArray, byte[]> transforms) throws VoldemortException { return null; } @Override public Object getCapability(StoreCapabilityType capability) { return null; } @Override public String getName() { return null; } @Override public List<Version> getVersions(ByteArray key) { return null; } @Override public void put(ByteArray key, Versioned<byte[]> value, byte[] transforms) throws VoldemortException {} @Override public List<Versioned<byte[]>> get(CompositeVoldemortRequest<ByteArray, byte[]> request) throws VoldemortException { return null; } @Override public Map<ByteArray, List<Versioned<byte[]>>> getAll(CompositeVoldemortRequest<ByteArray, byte[]> request) throws VoldemortException { return null; } @Override public void put(CompositeVoldemortRequest<ByteArray, byte[]> request) throws VoldemortException {} @Override public boolean delete(CompositeVoldemortRequest<ByteArray, byte[]> request) throws VoldemortException { return false; } }; } }