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