diff --git a/nosqldb/pom.xml b/nosqldb/pom.xml index ead23596..f6e803e9 100644 --- a/nosqldb/pom.xml +++ b/nosqldb/pom.xml @@ -1,45 +1,69 @@ 4.0.0 com.yahoo.ycsb binding-parent 0.6.0-SNAPSHOT ../binding-parent nosqldb-binding Oracle NoSQL Database Binding jar com.oracle.kv oracle-nosql-client 3.0.5 com.yahoo.ycsb core ${project.version} provided + + + + org.apache.maven.plugins + maven-checkstyle-plugin + 2.15 + + true + ../checkstyle.xml + true + true + + + + validate + validate + + checkstyle + + + + + + diff --git a/nosqldb/src/main/java/com/yahoo/ycsb/db/NoSqlDbClient.java b/nosqldb/src/main/java/com/yahoo/ycsb/db/NoSqlDbClient.java index a78672d2..82820620 100644 --- a/nosqldb/src/main/java/com/yahoo/ycsb/db/NoSqlDbClient.java +++ b/nosqldb/src/main/java/com/yahoo/ycsb/db/NoSqlDbClient.java @@ -1,236 +1,250 @@ /** * Copyright (c) 2012 YCSB contributors. All rights reserved. * * 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; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.SortedMap; import java.util.Vector; import java.util.concurrent.TimeUnit; import oracle.kv.Consistency; import oracle.kv.Durability; import oracle.kv.FaultException; import oracle.kv.KVStore; import oracle.kv.KVStoreConfig; import oracle.kv.KVStoreFactory; import oracle.kv.Key; import oracle.kv.RequestLimitConfig; import oracle.kv.Value; import oracle.kv.ValueVersion; import com.yahoo.ycsb.ByteArrayByteIterator; import com.yahoo.ycsb.ByteIterator; import com.yahoo.ycsb.DB; import com.yahoo.ycsb.DBException; import com.yahoo.ycsb.Status; /** * A database interface layer for Oracle NoSQL Database. */ public class NoSqlDbClient extends DB { - - KVStore store; - - private int getPropertyInt(Properties properties, String key, int defaultValue) throws DBException { - String p = properties.getProperty(key); - int i = defaultValue; - if (p != null) { - try { - i = Integer.parseInt(p); - } catch (NumberFormatException e) { - throw new DBException("Illegal number format in " + key + " property"); - } - } - return i; - } - - @Override - public void init() throws DBException { - Properties properties = getProperties(); - - /* Mandatory properties */ - String storeName = properties.getProperty("storeName", "kvstore"); - String[] helperHosts = properties.getProperty("helperHost", "localhost:5000").split(","); - - KVStoreConfig config = new KVStoreConfig(storeName, helperHosts); - - /* Optional properties */ - String p; - - p = properties.getProperty("consistency"); - if (p != null) { - if (p.equalsIgnoreCase("ABSOLUTE")) { - config.setConsistency(Consistency.ABSOLUTE); - } else if (p.equalsIgnoreCase("NONE_REQUIRED")) { - config.setConsistency(Consistency.NONE_REQUIRED); - } else { - throw new DBException("Illegal value in consistency property"); - } - } - - p = properties.getProperty("durability"); - if (p != null) { - if (p.equalsIgnoreCase("COMMIT_NO_SYNC")) { - config.setDurability(Durability.COMMIT_NO_SYNC); - } else if (p.equalsIgnoreCase("COMMIT_SYNC")) { - config.setDurability(Durability.COMMIT_SYNC); - } else if (p.equalsIgnoreCase("COMMIT_WRITE_NO_SYNC")) { - config.setDurability(Durability.COMMIT_WRITE_NO_SYNC); - } else { - throw new DBException("Illegal value in durability property"); - } - } - - int maxActiveRequests = getPropertyInt(properties, - "requestLimit.maxActiveRequests", RequestLimitConfig.DEFAULT_MAX_ACTIVE_REQUESTS); - int requestThresholdPercent = getPropertyInt(properties, - "requestLimit.requestThresholdPercent", RequestLimitConfig.DEFAULT_REQUEST_THRESHOLD_PERCENT); - int nodeLimitPercent = getPropertyInt(properties, - "requestLimit.nodeLimitPercent", RequestLimitConfig.DEFAULT_NODE_LIMIT_PERCENT); - RequestLimitConfig requestLimitConfig; - /* It is said that the constructor could throw NodeRequestLimitException in Javadoc, the exception is not provided */ -// try { - requestLimitConfig = new RequestLimitConfig(maxActiveRequests, requestThresholdPercent, nodeLimitPercent); -// } catch (NodeRequestLimitException e) { -// throw new DBException(e); -// } - config.setRequestLimit(requestLimitConfig); - - p = properties.getProperty("requestTimeout"); - if (p != null) { - long timeout = 1; - try { - timeout = Long.parseLong(p); - } catch (NumberFormatException e) { - throw new DBException("Illegal number format in requestTimeout property"); - } - try { - // TODO Support other TimeUnit - config.setRequestTimeout(timeout, TimeUnit.SECONDS); - } catch (IllegalArgumentException e) { - throw new DBException(e); - } - } - - try { - store = KVStoreFactory.getStore(config); - } catch (FaultException e) { - throw new DBException(e); - } - } - - @Override - public void cleanup() throws DBException { - store.close(); - } - - /** - * Create a key object. - * We map "table" and (YCSB's) "key" to a major component of the oracle.kv.Key, - * and "field" to a minor component. - * - * @return An oracle.kv.Key object. - */ - private static Key createKey(String table, String key, String field) { - List majorPath = new ArrayList(); - majorPath.add(table); - majorPath.add(key); - if (field == null) { - return Key.createKey(majorPath); - } - - return Key.createKey(majorPath, field); - } - - private static Key createKey(String table, String key) { - return createKey(table, key, null); - } - - private static String getFieldFromKey(Key key) { - return key.getMinorPath().get(0); - } - - @Override - public Status read(String table, String key, Set fields, HashMap result) { - Key kvKey = createKey(table, key); - SortedMap kvResult; - try { - kvResult = store.multiGet(kvKey, null, null); - } catch (FaultException e) { - System.err.println(e); - return Status.ERROR; - } - - for (Map.Entry entry : kvResult.entrySet()) { - /* If fields is null, read all fields */ - String field = getFieldFromKey(entry.getKey()); - if (fields != null && !fields.contains(field)) { - continue; - } - result.put(field, new ByteArrayByteIterator(entry.getValue().getValue().getValue())); - } - - return Status.OK; - } - - @Override - public Status scan(String table, String startkey, int recordcount, Set fields, Vector> result) { - System.err.println("Oracle NoSQL Database does not support Scan semantics"); - return Status.ERROR; - } - - @Override - public Status update(String table, String key, HashMap values) { - for (Map.Entry entry : values.entrySet()) { - Key kvKey = createKey(table, key, entry.getKey()); - Value kvValue = Value.createValue(entry.getValue().toArray()); - try { - store.put(kvKey, kvValue); - } catch (FaultException e) { - System.err.println(e); - return Status.ERROR; - } - } - - return Status.OK; - } - - @Override - public Status insert(String table, String key, HashMap values) { - return update(table, key, values); - } - - @Override - public Status delete(String table, String key) { - Key kvKey = createKey(table, key); - try { - store.multiDelete(kvKey, null, null); - } catch (FaultException e) { - System.err.println(e); - return Status.ERROR; - } - - return Status.OK; - } + + private KVStore store; + + private int getPropertyInt(Properties properties, String key, + int defaultValue) throws DBException { + String p = properties.getProperty(key); + int i = defaultValue; + if (p != null) { + try { + i = Integer.parseInt(p); + } catch (NumberFormatException e) { + throw new DBException("Illegal number format in " + key + " property"); + } + } + return i; + } + + @Override + public void init() throws DBException { + Properties properties = getProperties(); + + /* Mandatory properties */ + String storeName = properties.getProperty("storeName", "kvstore"); + String[] helperHosts = + properties.getProperty("helperHost", "localhost:5000").split(","); + + KVStoreConfig config = new KVStoreConfig(storeName, helperHosts); + + /* Optional properties */ + String p; + + p = properties.getProperty("consistency"); + if (p != null) { + if (p.equalsIgnoreCase("ABSOLUTE")) { + config.setConsistency(Consistency.ABSOLUTE); + } else if (p.equalsIgnoreCase("NONE_REQUIRED")) { + config.setConsistency(Consistency.NONE_REQUIRED); + } else { + throw new DBException("Illegal value in consistency property"); + } + } + + p = properties.getProperty("durability"); + if (p != null) { + if (p.equalsIgnoreCase("COMMIT_NO_SYNC")) { + config.setDurability(Durability.COMMIT_NO_SYNC); + } else if (p.equalsIgnoreCase("COMMIT_SYNC")) { + config.setDurability(Durability.COMMIT_SYNC); + } else if (p.equalsIgnoreCase("COMMIT_WRITE_NO_SYNC")) { + config.setDurability(Durability.COMMIT_WRITE_NO_SYNC); + } else { + throw new DBException("Illegal value in durability property"); + } + } + + int maxActiveRequests = + getPropertyInt(properties, "requestLimit.maxActiveRequests", + RequestLimitConfig.DEFAULT_MAX_ACTIVE_REQUESTS); + int requestThresholdPercent = + getPropertyInt(properties, "requestLimit.requestThresholdPercent", + RequestLimitConfig.DEFAULT_REQUEST_THRESHOLD_PERCENT); + int nodeLimitPercent = + getPropertyInt(properties, "requestLimit.nodeLimitPercent", + RequestLimitConfig.DEFAULT_NODE_LIMIT_PERCENT); + RequestLimitConfig requestLimitConfig; + /* + * It is said that the constructor could throw NodeRequestLimitException in + * Javadoc, the exception is not provided + */ + // try { + requestLimitConfig = new RequestLimitConfig(maxActiveRequests, + requestThresholdPercent, nodeLimitPercent); + // } catch (NodeRequestLimitException e) { + // throw new DBException(e); + // } + config.setRequestLimit(requestLimitConfig); + + p = properties.getProperty("requestTimeout"); + if (p != null) { + long timeout = 1; + try { + timeout = Long.parseLong(p); + } catch (NumberFormatException e) { + throw new DBException( + "Illegal number format in requestTimeout property"); + } + try { + // TODO Support other TimeUnit + config.setRequestTimeout(timeout, TimeUnit.SECONDS); + } catch (IllegalArgumentException e) { + throw new DBException(e); + } + } + + try { + store = KVStoreFactory.getStore(config); + } catch (FaultException e) { + throw new DBException(e); + } + } + + @Override + public void cleanup() throws DBException { + store.close(); + } + + /** + * Create a key object. We map "table" and (YCSB's) "key" to a major component + * of the oracle.kv.Key, and "field" to a minor component. + * + * @return An oracle.kv.Key object. + */ + private static Key createKey(String table, String key, String field) { + List majorPath = new ArrayList(); + majorPath.add(table); + majorPath.add(key); + if (field == null) { + return Key.createKey(majorPath); + } + + return Key.createKey(majorPath, field); + } + + private static Key createKey(String table, String key) { + return createKey(table, key, null); + } + + private static String getFieldFromKey(Key key) { + return key.getMinorPath().get(0); + } + + @Override + public Status read(String table, String key, Set fields, + HashMap result) { + Key kvKey = createKey(table, key); + SortedMap kvResult; + try { + kvResult = store.multiGet(kvKey, null, null); + } catch (FaultException e) { + System.err.println(e); + return Status.ERROR; + } + + for (Map.Entry entry : kvResult.entrySet()) { + /* If fields is null, read all fields */ + String field = getFieldFromKey(entry.getKey()); + if (fields != null && !fields.contains(field)) { + continue; + } + result.put(field, + new ByteArrayByteIterator(entry.getValue().getValue().getValue())); + } + + return Status.OK; + } + + @Override + public Status scan(String table, String startkey, int recordcount, + Set fields, Vector> result) { + System.err.println("Oracle NoSQL Database does not support Scan semantics"); + return Status.ERROR; + } + + @Override + public Status update(String table, String key, + HashMap values) { + for (Map.Entry entry : values.entrySet()) { + Key kvKey = createKey(table, key, entry.getKey()); + Value kvValue = Value.createValue(entry.getValue().toArray()); + try { + store.put(kvKey, kvValue); + } catch (FaultException e) { + System.err.println(e); + return Status.ERROR; + } + } + + return Status.OK; + } + + @Override + public Status insert(String table, String key, + HashMap values) { + return update(table, key, values); + } + + @Override + public Status delete(String table, String key) { + Key kvKey = createKey(table, key); + try { + store.multiDelete(kvKey, null, null); + } catch (FaultException e) { + System.err.println(e); + return Status.ERROR; + } + + return Status.OK; + } } diff --git a/nosqldb/src/main/java/com/yahoo/ycsb/db/package-info.java b/nosqldb/src/main/java/com/yahoo/ycsb/db/package-info.java new file mode 100644 index 00000000..2e8b9c5a --- /dev/null +++ b/nosqldb/src/main/java/com/yahoo/ycsb/db/package-info.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2014, Yahoo!, Inc. All rights reserved. + * + * 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. + */ + +/** + * The YCSB binding for Oracle + * 's NoSQL DB. + */ +package com.yahoo.ycsb.db;