diff --git a/kudu/pom.xml b/kudu/pom.xml index 1eead10b55f92fa7caf17e2518c4b0f34d144db5..5ee69c15aa4e7485428ba1b8a8bca14d68e61ece 100644 --- a/kudu/pom.xml +++ b/kudu/pom.xml @@ -42,6 +42,30 @@ LICENSE file. <scope>provided</scope> </dependency> </dependencies> + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-checkstyle-plugin</artifactId> + <version>2.15</version> + <configuration> + <consoleOutput>true</consoleOutput> + <configLocation>../checkstyle.xml</configLocation> + <failOnViolation>true</failOnViolation> + <failsOnError>true</failsOnError> + </configuration> + <executions> + <execution> + <id>validate</id> + <phase>validate</phase> + <goals> + <goal>checkstyle</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> <repositories> <repository> <releases> diff --git a/kudu/src/main/java/com/yahoo/ycsb/db/KuduYCSBClient.java b/kudu/src/main/java/com/yahoo/ycsb/db/KuduYCSBClient.java index d823ff465de5920f7be667ff3a6888abc48da47d..f063ed7d768caa3f1736dcce2756f81cfc500efd 100644 --- a/kudu/src/main/java/com/yahoo/ycsb/db/KuduYCSBClient.java +++ b/kudu/src/main/java/com/yahoo/ycsb/db/KuduYCSBClient.java @@ -37,27 +37,40 @@ import java.util.Vector; import static org.kududb.Type.STRING; /** - * Kudu client for YCSB framework - * Example to load: - * $ ./bin/ycsb load kudu -P workloads/workloada -threads 5 - * Example to run: + * Kudu client for YCSB framework. Example to load: <blockquote> + * + * <pre> + * <code> + * $ ./bin/ycsb load kudu -P workloads/workloada -threads 5 + * </code> + * </pre> + * + * </blockquote> Example to run: <blockquote> + * + * <pre> + * <code> * ./bin/ycsb run kudu -P workloads/workloada -p kudu_sync_ops=true -threads 5 - * + * </code> + * </pre> + * + * </blockquote> */ public class KuduYCSBClient extends com.yahoo.ycsb.DB { public static final String KEY = "key"; - public static final Status TIMEOUT = new Status("TIMEOUT", "The operation timed out."); + public static final Status TIMEOUT = + new Status("TIMEOUT", "The operation timed out."); public static final int MAX_TABLETS = 9000; public static final long DEFAULT_SLEEP = 60000; private static final String SYNC_OPS_OPT = "kudu_sync_ops"; private static final String DEBUG_OPT = "kudu_debug"; private static final String PRINT_ROW_ERRORS_OPT = "kudu_print_row_errors"; - private static final String PRE_SPLIT_NUM_TABLETS_OPT = "kudu_pre_split_num_tablets"; + private static final String PRE_SPLIT_NUM_TABLETS_OPT = + "kudu_pre_split_num_tablets"; private static final String TABLE_NUM_REPLICAS = "kudu_table_num_replicas"; private static final String BLOCK_SIZE_OPT = "kudu_block_size"; private static final String MASTER_ADDRESSES_OPT = "kudu_master_addresses"; private static final int BLOCK_SIZE_DEFAULT = 4096; - private static final List<String> columnNames = new ArrayList<String>(); + private static final List<String> COLUMN_NAMES = new ArrayList<String>(); private static KuduClient client; private static Schema schema; private static int fieldCount; @@ -65,7 +78,7 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { private boolean printErrors = false; private String tableName; private KuduSession session; - private KuduTable table; + private KuduTable kuduTable; @Override public void init() throws DBException { @@ -73,16 +86,18 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { this.debug = getProperties().getProperty(DEBUG_OPT).equals("true"); } if (getProperties().getProperty(PRINT_ROW_ERRORS_OPT) != null) { - this.printErrors = getProperties().getProperty(PRINT_ROW_ERRORS_OPT).equals("true"); + this.printErrors = + getProperties().getProperty(PRINT_ROW_ERRORS_OPT).equals("true"); } if (getProperties().getProperty(PRINT_ROW_ERRORS_OPT) != null) { - this.printErrors = getProperties().getProperty(PRINT_ROW_ERRORS_OPT).equals("true"); + this.printErrors = + getProperties().getProperty(PRINT_ROW_ERRORS_OPT).equals("true"); } this.tableName = com.yahoo.ycsb.workloads.CoreWorkload.table; initClient(debug, tableName, getProperties()); this.session = client.newSession(); - if (getProperties().getProperty(SYNC_OPS_OPT) != null && - getProperties().getProperty(SYNC_OPS_OPT).equals("false")) { + if (getProperties().getProperty(SYNC_OPS_OPT) != null + && getProperties().getProperty(SYNC_OPS_OPT).equals("false")) { this.session.setFlushMode(KuduSession.FlushMode.AUTO_FLUSH_BACKGROUND); this.session.setMutationBufferSpace(100); } else { @@ -90,15 +105,17 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { } try { - this.table = client.openTable(tableName); + this.kuduTable = client.openTable(tableName); } catch (Exception e) { throw new DBException("Could not open a table because of:", e); } } - private synchronized static void initClient(boolean debug, String tableName, Properties prop) - throws DBException { - if (client != null) return; + private static synchronized void initClient(boolean debug, String tableName, + Properties prop) throws DBException { + if (client != null) { + return; + } String masterAddresses = prop.getProperty(MASTER_ADDRESSES_OPT); if (masterAddresses == null) { @@ -107,8 +124,8 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { int numTablets = getIntFromProp(prop, PRE_SPLIT_NUM_TABLETS_OPT, 4); if (numTablets > MAX_TABLETS) { - throw new DBException("Specified number of tablets (" + numTablets + ") must be equal " + - "or below " + MAX_TABLETS); + throw new DBException("Specified number of tablets (" + numTablets + + ") must be equal " + "or below " + MAX_TABLETS); } int numReplicas = getIntFromProp(prop, TABLE_NUM_REPLICAS, 3); @@ -117,8 +134,7 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { client = new KuduClient.KuduClientBuilder(masterAddresses) .defaultSocketReadTimeoutMs(DEFAULT_SLEEP) - .defaultOperationTimeoutMs(DEFAULT_SLEEP) - .build(); + .defaultOperationTimeoutMs(DEFAULT_SLEEP).build(); if (debug) { System.out.println("Connecting to the masters at " + masterAddresses); } @@ -129,17 +145,14 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { List<ColumnSchema> columns = new ArrayList<ColumnSchema>(fieldCount + 1); ColumnSchema keyColumn = new ColumnSchema.ColumnSchemaBuilder(KEY, STRING) - .key(true) - .desiredBlockSize(blockSize) - .build(); + .key(true).desiredBlockSize(blockSize).build(); columns.add(keyColumn); - columnNames.add(KEY); + COLUMN_NAMES.add(KEY); for (int i = 0; i < fieldCount; i++) { String name = "field" + i; - columnNames.add(name); + COLUMN_NAMES.add(name); columns.add(new ColumnSchema.ColumnSchemaBuilder(name, STRING) - .desiredBlockSize(blockSize) - .build()); + .desiredBlockSize(blockSize).build()); } schema = new Schema(columns); @@ -164,8 +177,8 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { } } - private static int getIntFromProp(Properties prop, String propName, int defaultValue) - throws DBException { + private static int getIntFromProp(Properties prop, String propName, + int defaultValue) throws DBException { String intStr = prop.getProperty(propName); if (intStr == null) { return defaultValue; @@ -173,7 +186,8 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { try { return Integer.valueOf(intStr); } catch (NumberFormatException ex) { - throw new DBException("Provided number for " + propName + " isn't a valid integer"); + throw new DBException( + "Provided number for " + propName + " isn't a valid integer"); } } } @@ -189,23 +203,29 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { @Override public Status read(String table, String key, Set<String> fields, - HashMap<String,ByteIterator> result) { - Vector<HashMap<String, ByteIterator>> results = new Vector<HashMap<String, ByteIterator>>(); + HashMap<String, ByteIterator> result) { + Vector<HashMap<String, ByteIterator>> results = + new Vector<HashMap<String, ByteIterator>>(); final Status status = scan(table, key, 1, fields, results); - if (!status.equals(Status.OK)) return status; - if (results.size() != 1) return Status.NOT_FOUND; + if (!status.equals(Status.OK)) { + return status; + } + if (results.size() != 1) { + return Status.NOT_FOUND; + } result.putAll(results.firstElement()); return Status.OK; } @Override - public Status scan(String table, String startkey, int recordcount, Set<String> fields, - Vector<HashMap<String, ByteIterator>> result) { + public Status scan(String table, String startkey, int recordcount, + Set<String> fields, Vector<HashMap<String, ByteIterator>> result) { try { - KuduScanner.KuduScannerBuilder scannerBuilder = client.newScannerBuilder(this.table); + KuduScanner.KuduScannerBuilder scannerBuilder = + client.newScannerBuilder(this.kuduTable); List<String> querySchema; if (fields == null) { - querySchema = columnNames; + querySchema = COLUMN_NAMES; // No need to set the projected columns with the whole schema. } else { querySchema = new ArrayList<String>(fields); @@ -222,20 +242,22 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { scannerBuilder.exclusiveUpperBound(upperBound); } - KuduScanner scanner = scannerBuilder - .limit(recordcount) // currently noop + KuduScanner scanner = scannerBuilder.limit(recordcount) // currently noop .build(); while (scanner.hasMoreRows()) { RowResultIterator data = scanner.nextRows(); addAllRowsToResult(data, recordcount, querySchema, result); - if (recordcount == result.size()) break; + if (recordcount == result.size()) { + break; + } } RowResultIterator closer = scanner.close(); addAllRowsToResult(closer, recordcount, querySchema, result); } catch (TimeoutException te) { if (printErrors) { - System.err.println("Waited too long for a scan operation with start key=" + startkey); + System.err.println( + "Waited too long for a scan operation with start key=" + startkey); } return TIMEOUT; } catch (Exception e) { @@ -247,14 +269,18 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { } private void addAllRowsToResult(RowResultIterator it, int recordcount, - List<String> querySchema, - Vector<HashMap<String, ByteIterator>> result) - throws Exception { + List<String> querySchema, Vector<HashMap<String, ByteIterator>> result) + throws Exception { RowResult row; - HashMap<String, ByteIterator> rowResult = new HashMap<String, ByteIterator>(querySchema.size()); - if (it == null) return; + HashMap<String, ByteIterator> rowResult = + new HashMap<String, ByteIterator>(querySchema.size()); + if (it == null) { + return; + } while (it.hasNext()) { - if (result.size() == recordcount) return; + if (result.size() == recordcount) { + return; + } row = it.next(); int colIdx = 0; for (String col : querySchema) { @@ -266,8 +292,9 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { } @Override - public Status update(String table, String key, HashMap<String, ByteIterator> values) { - Update update = this.table.newUpdate(); + public Status update(String table, String key, + HashMap<String, ByteIterator> values) { + Update update = this.kuduTable.newUpdate(); PartialRow row = update.getRow(); row.addString(KEY, key); for (int i = 1; i < schema.getColumnCount(); i++) { @@ -282,12 +309,14 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { } @Override - public Status insert(String table, String key, HashMap<String, ByteIterator> values) { - Insert insert = this.table.newInsert(); + public Status insert(String table, String key, + HashMap<String, ByteIterator> values) { + Insert insert = this.kuduTable.newInsert(); PartialRow row = insert.getRow(); row.addString(KEY, key); for (int i = 1; i < schema.getColumnCount(); i++) { - row.addString(i, new String(values.get(schema.getColumnByIndex(i).getName()).toArray())); + row.addString(i, new String( + values.get(schema.getColumnByIndex(i).getName()).toArray())); } apply(insert); return Status.OK; @@ -295,7 +324,7 @@ public class KuduYCSBClient extends com.yahoo.ycsb.DB { @Override public Status delete(String table, String key) { - Delete delete = this.table.newDelete(); + Delete delete = this.kuduTable.newDelete(); PartialRow row = delete.getRow(); row.addString(KEY, key); apply(delete); diff --git a/kudu/src/main/java/com/yahoo/ycsb/db/package-info.java b/kudu/src/main/java/com/yahoo/ycsb/db/package-info.java new file mode 100644 index 0000000000000000000000000000000000000000..5d6c49613dea051f5b251960bc5a9ad8f9f2347c --- /dev/null +++ b/kudu/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 <a href="http://getkudu.io/">Kudu</a>. + */ +package com.yahoo.ycsb.db; +