diff --git a/bin/ycsb b/bin/ycsb
index 3e954c88b4..b36b54eb6c 100755
--- a/bin/ycsb
+++ b/bin/ycsb
@@ -76,6 +76,7 @@ DATABASES = {
"geode" : "com.yahoo.ycsb.db.GeodeClient",
"googlebigtable" : "com.yahoo.ycsb.db.GoogleBigtableClient",
"googledatastore" : "com.yahoo.ycsb.db.GoogleDatastoreClient",
+ "griddb" : "com.yahoo.ycsb.db.griddb.GridDBClient",
"hbase098" : "com.yahoo.ycsb.db.HBaseClient",
"hbase10" : "com.yahoo.ycsb.db.HBaseClient10",
"hbase12" : "com.yahoo.ycsb.db.hbase12.HBaseClient12",
diff --git a/distribution/pom.xml b/distribution/pom.xml
index ad825869b5..bb0827803f 100644
--- a/distribution/pom.xml
+++ b/distribution/pom.xml
@@ -134,6 +134,11 @@ LICENSE file.
googlebigtable-binding
${project.version}
+
+ com.yahoo.ycsb
+ griddb-binding
+ ${project.version}
+
com.yahoo.ycsb
hbase098-binding
diff --git a/griddb/README.md b/griddb/README.md
new file mode 100644
index 0000000000..4f96a65256
--- /dev/null
+++ b/griddb/README.md
@@ -0,0 +1,81 @@
+
+
+## Overview
+
+GridDB (https://github.com/griddb/griddb_nosql) is a highly scalable NoSQL database best suited for IoT and Big Data.
+
+This is GridDB Binding for YCSB.
+
+## Environment
+Library building and program execution have been checked in the following environment.
+
+ OS: CentOS 6.9(x64).
+ Java: JDK 1.8.0_191
+ Maven: 3.5.4
+ Python: 2.6.6
+
+## Quick start
+
+### Preparations
+
+Clone the YCSB source code from git repository:
+
+ git clone https://github.com/brianfrankcooper/YCSB.git
+ cd YCSB
+
+### Build
+
+Run following command
+
+ $ mvn -pl com.yahoo.ycsb:griddb-binding -am clean package
+
+Then, some jar files are created in:
+
+ griddb/target
+
+### GridDB setup
+
+Please set the number of cpu core as /dataStore/concurrency in gs_node.json and "32KB" as /dataStore/storeBlockSize in gs_cluster.json.
+
+### Run YCSB
+
+GridDB needs to be started in advance.
+Please execute our program with fieldcount=10 and fieldlength=100.
+First, load the data:
+
+ ./bin/ycsb load griddb -P workloads/workloada
+ -p notificationAddress=
+ -p notificationPort=
+ -p clusterName=
+ -p userName=
+ -p password=
+ -p fieldcount=10
+ -p fieldlength=100
+
+Then, run the workload:
+
+ ./bin/ycsb run griddb -P workloads/workloada
+ -p notificationAddress=
+ -p notificationPort=
+ -p clusterName=
+ -p userName=
+ -p password=
+ -p fieldcount=10
+ -p fieldlength=100
+
diff --git a/griddb/pom.xml b/griddb/pom.xml
new file mode 100644
index 0000000000..7a8d476b8a
--- /dev/null
+++ b/griddb/pom.xml
@@ -0,0 +1,52 @@
+
+
+
+
+ 4.0.0
+
+ com.yahoo.ycsb
+ binding-parent
+ 0.16.0-SNAPSHOT
+ ../binding-parent
+
+
+ griddb-binding
+ GridDB Binding
+ jar
+
+
+
+ com.yahoo.ycsb
+ core
+ ${project.version}
+ provided
+
+
+ com.github.griddb
+ gridstore
+ ${griddb.version}
+
+
+ junit
+ junit
+ 4.12
+ test
+
+
+
diff --git a/griddb/src/main/java/com/yahoo/ycsb/db/griddb/GridDBClient.java b/griddb/src/main/java/com/yahoo/ycsb/db/griddb/GridDBClient.java
new file mode 100644
index 0000000000..511b2a69ec
--- /dev/null
+++ b/griddb/src/main/java/com/yahoo/ycsb/db/griddb/GridDBClient.java
@@ -0,0 +1,333 @@
+/**
+ * Copyright (c) 2018 TOSHIBA Digital Solutions Corporation.
+ * Copyright (c) 2018 YCSB contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you
+ * may not use this file except in compliance with the License. You
+ * may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ * implied. See the License for the specific language governing
+ * permissions and limitations under the License. See accompanying
+ * LICENSE file.
+ */
+
+package com.yahoo.ycsb.db.griddb;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Vector;
+import java.util.logging.Logger;
+
+import com.toshiba.mwcloud.gs.ColumnInfo;
+import com.toshiba.mwcloud.gs.Container;
+import com.toshiba.mwcloud.gs.ContainerInfo;
+import com.toshiba.mwcloud.gs.ContainerType;
+import com.toshiba.mwcloud.gs.GSException;
+import com.toshiba.mwcloud.gs.GSType;
+import com.toshiba.mwcloud.gs.GridStore;
+import com.toshiba.mwcloud.gs.GridStoreFactory;
+import com.toshiba.mwcloud.gs.PartitionController;
+import com.toshiba.mwcloud.gs.Row;
+import com.yahoo.ycsb.ByteArrayByteIterator;
+import com.yahoo.ycsb.ByteIterator;
+import com.yahoo.ycsb.DBException;
+import com.yahoo.ycsb.Status;
+
+/**
+ * A class representing GridDBClient.
+ *
+ */
+public class GridDBClient extends com.yahoo.ycsb.DB {
+ //(A)multicast method
+ private String notificationAddress = ""; // "239.0.0.1"
+ private String notificationPort = ""; // "31999"
+ //(B)fixed list method
+ private String notificationMember = ""; // "10.0.0.12:10001,10.0.0.13:10001,10.0.0.14:10001"
+
+ private String userName = ""; //
+ private String password = ""; //
+ private String clusterName = ""; // "ycsbCluster"
+
+
+ public static final String VALUE_COLUMN_NAME_PREFIX= "field";
+ public static final int ROW_KEY_COLUMN_POS = 0;
+
+ private String containerPrefix = "";
+
+ public static final int DEFAULT_CACHE_CONTAINER_NUM = 1000;
+ public static final int FIELD_NUM = 10;
+
+ private int numContainer = 0; // Sets PartitionNum
+ public static final GSType SCHEMA_TYPE = GSType.STRING;
+
+ private GridStore store;
+ private ContainerInfo containerInfo = null;
+ private static final Logger LOGGER = Logger.getLogger(GridDBClient.class.getName());
+
+ class RowComparator implements Comparator {
+ public int compare(Row row1, Row row2) throws NullPointerException {
+ int result = 0;
+ try {
+ Object val1 = row1.getValue(0);
+ Object val2 = row2.getValue(0);
+ result = ((String)val1).compareTo((String)val2);
+ } catch (GSException e) {
+ LOGGER.severe("There is a exception: " + e.getMessage());
+ throw new NullPointerException();
+ }
+ return result;
+ }
+ }
+
+ public void init() throws DBException {
+ LOGGER.info("GridDBClient");
+
+ final Properties props = getProperties();
+ notificationAddress = props.getProperty("notificationAddress");
+ notificationPort = props.getProperty("notificationPort");
+ notificationMember = props.getProperty("notificationMember");
+ clusterName = props.getProperty("clusterName");
+ userName = props.getProperty("userName");
+ password = props.getProperty("password");
+ containerPrefix = props.getProperty("table", "usertable") + "@";
+ String fieldcount = props.getProperty("fieldcount");
+ String fieldlength = props.getProperty("fieldlength");
+
+ LOGGER.info("notificationAddress=" + notificationAddress + " notificationPort=" + notificationPort +
+ " notificationMember=" + notificationMember);
+ LOGGER.info("clusterName=" + clusterName + " userName=" + userName);
+ LOGGER.info("fieldcount=" + fieldcount + " fieldlength=" + fieldlength);
+
+
+ final Properties gridstoreProp = new Properties();
+ if (clusterName == null || userName == null || password == null) {
+ LOGGER.severe("[ERROR] clusterName or userName or password argument not specified");
+ throw new DBException();
+ }
+ if (fieldcount == null || fieldlength == null) {
+ LOGGER.severe("[ERROR] fieldcount or fieldlength argument not specified");
+ throw new DBException();
+ } else {
+ if (!fieldcount.equals(String.valueOf(FIELD_NUM)) || !fieldlength.equals("100")) {
+ LOGGER.severe("[ERROR] Invalid argment: fieldcount or fieldlength");
+ throw new DBException();
+ }
+ }
+ if (notificationAddress != null) {
+ if (notificationPort == null) {
+ LOGGER.severe("[ERROR] notificationPort argument not specified");
+ throw new DBException();
+ }
+ //(A)multicast method
+ gridstoreProp.setProperty("notificationAddress", notificationAddress);
+ gridstoreProp.setProperty("notificationPort", notificationPort);
+ } else if (notificationMember != null) {
+ //(B)fixed list method
+ gridstoreProp.setProperty("notificationMember", notificationMember);
+ } else {
+ LOGGER.severe("[ERROR] notificationAddress and notificationMember argument not specified");
+ throw new DBException();
+ }
+ gridstoreProp.setProperty("clusterName", clusterName);
+ gridstoreProp.setProperty("user", userName);
+ gridstoreProp.setProperty("password", password);
+
+ gridstoreProp.setProperty("containerCacheSize", String.valueOf(DEFAULT_CACHE_CONTAINER_NUM));
+
+ List columnInfoList = new ArrayList();
+ ColumnInfo keyInfo = new ColumnInfo("key", SCHEMA_TYPE);
+ columnInfoList.add(keyInfo);
+ for (int i = 0; i < FIELD_NUM; i++) {
+ String columnName = String.format(VALUE_COLUMN_NAME_PREFIX + "%d", i);
+ ColumnInfo info = new ColumnInfo(columnName, SCHEMA_TYPE);
+ columnInfoList.add(info);
+ }
+ containerInfo = new ContainerInfo(null, ContainerType.COLLECTION, columnInfoList, true);
+
+ try {
+ GridStoreFactory.getInstance().setProperties(gridstoreProp);
+ store = GridStoreFactory.getInstance().getGridStore(gridstoreProp);
+ PartitionController controller = store.getPartitionController();
+ numContainer = controller.getPartitionCount();
+
+ for(int k = 0; k < numContainer; k++) {
+ String name = containerPrefix + k;
+ store.putContainer(name, containerInfo, false);
+ }
+ } catch (GSException e) {
+ LOGGER.severe("Exception: " + e.getMessage());
+ throw new DBException();
+ }
+
+ LOGGER.info("numContainer=" + numContainer + " containerCasheSize=" +
+ String.valueOf(DEFAULT_CACHE_CONTAINER_NUM));
+
+ }
+
+ public void cleanup() throws DBException {
+ try {
+ store.close();
+ } catch (GSException e) {
+ LOGGER.severe("Exception when close." + e.getMessage());
+ throw new DBException();
+ }
+ }
+
+ public Status read(String table, String key, Set fields, Map result) {
+ try {
+
+ Object rowKey = makeRowKey(key);
+ String containerKey = makeContainerKey(key);
+
+ final Container