diff --git a/.gitignore b/.gitignore index 989ab5feca253aa4d8ab1d9d9f9abf78fd76aad4..60025b240f87900a55909eb6e61ef7d1683243a2 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ output* .project .classpath .settings +.checkstyle diff --git a/bin/ycsb b/bin/ycsb index c19f100002df8a41a4b1141a65a7a479eab39655..51989ffc66e4b4c3861bddcde5302a574916fbb1 100755 --- a/bin/ycsb +++ b/bin/ycsb @@ -40,6 +40,7 @@ DATABASES = { "hbase" : "com.yahoo.ycsb.db.HBaseClient", "hbase-10" : "com.yahoo.ycsb.db.HBaseClient10", "hypertable" : "com.yahoo.ycsb.db.HypertableClient", + "infinispan-cs": "com.yahoo.ycsb.db.InfinispanRemoteClient", "infinispan" : "com.yahoo.ycsb.db.InfinispanClient", "jdbc" : "com.yahoo.ycsb.db.JdbcDBClient", "mapkeeper" : "com.yahoo.ycsb.db.MapKeeperClient", diff --git a/infinispan/pom.xml b/infinispan/pom.xml index 8ce1064707ff130150a7c4cb286c9238aedcecf8..aaf4a4125e505a70f47ca10a1716b70fabe75cca 100644 --- a/infinispan/pom.xml +++ b/infinispan/pom.xml @@ -14,8 +14,13 @@ <dependencies> <dependency> - <groupId>org.jboss.as</groupId> - <artifactId>jboss-as-clustering-infinispan</artifactId> + <groupId>org.infinispan</groupId> + <artifactId>infinispan-client-hotrod</artifactId> + <version>${infinispan.version}</version> + </dependency> + <dependency> + <groupId>org.infinispan</groupId> + <artifactId>infinispan-core</artifactId> <version>${infinispan.version}</version> </dependency> <dependency> diff --git a/infinispan/src/main/conf/remote-cache.properties b/infinispan/src/main/conf/remote-cache.properties new file mode 100644 index 0000000000000000000000000000000000000000..04e50054dab7267c0bfeea1f4b662cfb7cbe31c3 --- /dev/null +++ b/infinispan/src/main/conf/remote-cache.properties @@ -0,0 +1,9 @@ +infinispan.client.hotrod.server_list=192.168.101.17:11222 +infinispan.client.hotrod.force_return_values=false + +maxActive=-1 +maxIdle=-1 +minIdle=1 +maxTotal=-1 + +whenExhaustedAction=1 diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java b/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java new file mode 100644 index 0000000000000000000000000000000000000000..f670357ad014534d69c5b451c321b8a58ff4462e --- /dev/null +++ b/infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java @@ -0,0 +1,128 @@ +package com.yahoo.ycsb.db; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.Vector; + +import org.infinispan.client.hotrod.RemoteCache; +import org.infinispan.client.hotrod.RemoteCacheManager; +import org.infinispan.util.logging.Log; +import org.infinispan.util.logging.LogFactory; + +import com.yahoo.ycsb.ByteIterator; +import com.yahoo.ycsb.DB; +import com.yahoo.ycsb.DBException; +import com.yahoo.ycsb.StringByteIterator; + +/** + * This is a client implementation for Infinispan 5.x in client-server mode. + * + * @author mylesjao + * + */ +public class InfinispanRemoteClient extends DB { + + private RemoteCacheManager remoteIspnManager; + + private String cacheName = null; + + private static final Log logger = LogFactory.getLog(InfinispanRemoteClient.class); + + public InfinispanRemoteClient() { + + } + + @Override + public void init() throws DBException { + remoteIspnManager = RemoteCacheManagerHolder.getInstance(getProperties()); + cacheName = getProperties().getProperty("cache"); + } + + @Override + public void cleanup() { + remoteIspnManager.stop(); + remoteIspnManager = null; + } + + @Override + public int insert(String table, String recordKey, HashMap<String, ByteIterator> values) { + String compositKey = createKey(table, recordKey); + Map<String, String> stringValues = new HashMap<String,String>(); + StringByteIterator.putAllAsStrings(stringValues, values); + try { + cache().put(compositKey, stringValues); + return Status.OK; + } catch (Exception e) { + return Status.ERROR; + } + } + + @Override + public int read(String table, String recordKey, Set<String> fields, HashMap<String, ByteIterator> result) { + String compositKey = createKey(table, recordKey); + try { + Map<String, String> values = cache().get(compositKey); + + if(values == null || values.isEmpty()){ + return Status.NOT_FOUND; + } + + if(fields == null){ //get all field/value pairs + StringByteIterator.putAllAsByteIterators(result, values); + }else{ + for(String field: fields){ + String value = values.get(field); + if(value != null){ + result.put(field, new StringByteIterator(value) ); + } + } + } + + return Status.OK; + } catch (Exception e) { + return Status.ERROR; + } + } + + @Override + public int scan(String table, String startkey, int recordcount, Set<String> fields, Vector<HashMap<String, ByteIterator>> result) { + logger.warn("Infinispan does not support scan semantics"); + return Status.NOT_SUPPORT; + } + + @Override + public int update(String table, String recordKey, HashMap<String, ByteIterator> values) { + String compositKey = createKey(table, recordKey); + try { + Map<String, String> stringValues = new HashMap<String, String>(); + StringByteIterator.putAllAsStrings(stringValues, values); + cache().put(compositKey, stringValues); + return Status.OK; + } catch (Exception e) { + return Status.ERROR; + } + } + @Override + public int delete(String table, String recordKey) { + String compositKey = createKey(table, recordKey); + try { + cache().remove(compositKey); + return Status.OK; + } catch (Exception e) { + return Status.ERROR; + } + } + + private RemoteCache<String, Map<String,String>> cache(){ + if(this.cacheName != null){ + return remoteIspnManager.getCache(cacheName); + }else{ + return remoteIspnManager.getCache(); + } + } + + private String createKey(String table, String recordKey){ + return table + "-" + recordKey; + } +} diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java b/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java new file mode 100644 index 0000000000000000000000000000000000000000..899d7d535754c59da6c3af994928708cf0fb5624 --- /dev/null +++ b/infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java @@ -0,0 +1,21 @@ +package com.yahoo.ycsb.db; + +import java.util.Properties; + +import org.infinispan.client.hotrod.RemoteCacheManager; + +public class RemoteCacheManagerHolder { + + private static RemoteCacheManager cacheManager = null; + + private RemoteCacheManagerHolder() {} + + public static RemoteCacheManager getInstance(Properties props){ + if(cacheManager == null){ + synchronized (RemoteCacheManager.class) { + cacheManager = new RemoteCacheManager(props); + } + } + return cacheManager; + } +} diff --git a/infinispan/src/main/java/com/yahoo/ycsb/db/Status.java b/infinispan/src/main/java/com/yahoo/ycsb/db/Status.java new file mode 100644 index 0000000000000000000000000000000000000000..661dc72376e9a27ab41adeaae680ef7a15f289e2 --- /dev/null +++ b/infinispan/src/main/java/com/yahoo/ycsb/db/Status.java @@ -0,0 +1,9 @@ +package com.yahoo.ycsb.db; + +public class Status { + public static final int OK = 0; + public static final int ERROR = 1; + public static final int NOT_FOUND = 2; + public static final int CONFLICT = 3; + public static final int NOT_SUPPORT = 4; +}