From dbd7d0ba8f629d0757074d12260ff338074ada7c Mon Sep 17 00:00:00 2001 From: mylesjao <mrlau1@gmail.com> Date: Tue, 21 Apr 2015 13:52:36 +0800 Subject: [PATCH] [infinispan] impl infinispan db with remote cache manager --- .gitignore | 1 + bin/ycsb | 1 + infinispan/pom.xml | 9 +- .../src/main/conf/remote-cache.properties | 9 ++ .../yahoo/ycsb/db/InfinispanRemoteClient.java | 128 ++++++++++++++++++ .../ycsb/db/RemoteCacheManagerHolder.java | 21 +++ .../main/java/com/yahoo/ycsb/db/Status.java | 9 ++ 7 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 infinispan/src/main/conf/remote-cache.properties create mode 100644 infinispan/src/main/java/com/yahoo/ycsb/db/InfinispanRemoteClient.java create mode 100644 infinispan/src/main/java/com/yahoo/ycsb/db/RemoteCacheManagerHolder.java create mode 100644 infinispan/src/main/java/com/yahoo/ycsb/db/Status.java diff --git a/.gitignore b/.gitignore index 989ab5fe..60025b24 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ output* .project .classpath .settings +.checkstyle diff --git a/bin/ycsb b/bin/ycsb index c19f1000..51989ffc 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 8ce10647..aaf4a412 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 00000000..04e50054 --- /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 00000000..f670357a --- /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 00000000..899d7d53 --- /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 00000000..661dc723 --- /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; +} -- GitLab