You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ct...@apache.org on 2014/04/09 19:58:22 UTC
[51/64] [abbrv] git commit: Merge branch '1.4.6-SNAPSHOT' into
1.5.2-SNAPSHOT
Merge branch '1.4.6-SNAPSHOT' into 1.5.2-SNAPSHOT
Conflicts:
core/src/main/java/org/apache/accumulo/core/client/admin/TableOperations.java
core/src/main/java/org/apache/accumulo/core/client/admin/TableOperationsImpl.java
core/src/main/java/org/apache/accumulo/core/client/impl/ConnectorImpl.java
core/src/main/java/org/apache/accumulo/core/client/mock/MockInstanceOperations.java
core/src/main/java/org/apache/accumulo/core/iterators/FirstEntryInRowIterator.java
core/src/main/java/org/apache/accumulo/core/iterators/IteratorUtil.java
core/src/main/java/org/apache/accumulo/core/iterators/user/IntersectingIterator.java
core/src/main/java/org/apache/accumulo/core/security/ColumnVisibility.java
core/src/test/java/org/apache/accumulo/core/iterators/user/CombinerTest.java
examples/simple/src/main/java/org/apache/accumulo/examples/simple/shard/Query.java
minicluster/src/main/java/org/apache/accumulo/minicluster/MiniAccumuloCluster.java
server/src/main/java/org/apache/accumulo/server/master/balancer/TabletBalancer.java
server/src/main/java/org/apache/accumulo/server/util/AddFilesWithMissingEntries.java
server/src/main/java/org/apache/accumulo/server/util/DumpZookeeper.java
server/src/main/java/org/apache/accumulo/server/util/FindOfflineTablets.java
server/src/main/java/org/apache/accumulo/server/util/MetadataTable.java
server/src/main/java/org/apache/accumulo/server/util/RestoreZookeeper.java
server/src/main/java/org/apache/accumulo/server/util/SendLogToChainsaw.java
server/src/main/java/org/apache/accumulo/server/util/TableDiskUsage.java
server/src/main/java/org/apache/accumulo/server/util/TabletServerLocks.java
src/core/src/main/java/org/apache/accumulo/core/client/mapreduce/InputFormatBase.java
src/core/src/main/java/org/apache/accumulo/core/file/map/MapFileUtil.java
src/server/src/main/java/org/apache/accumulo/server/util/DumpMapFile.java
src/server/src/main/java/org/apache/accumulo/server/util/DumpTabletsOnServer.java
test/src/main/java/org/apache/accumulo/test/continuous/ContinuousMoru.java
test/src/main/java/org/apache/accumulo/test/randomwalk/concurrent/CheckBalance.java
trace/src/main/java/org/apache/accumulo/trace/instrument/receivers/ZooSpanClient.java
Project: http://git-wip-us.apache.org/repos/asf/accumulo/repo
Commit: http://git-wip-us.apache.org/repos/asf/accumulo/commit/92613388
Tree: http://git-wip-us.apache.org/repos/asf/accumulo/tree/92613388
Diff: http://git-wip-us.apache.org/repos/asf/accumulo/diff/92613388
Branch: refs/heads/master
Commit: 92613388919b6fc138e829382cc1cbb6647faa31
Parents: 5363d78 c8e165a
Author: Christopher Tubbs <ct...@apache.org>
Authored: Wed Apr 9 13:14:57 2014 -0400
Committer: Christopher Tubbs <ct...@apache.org>
Committed: Wed Apr 9 13:14:57 2014 -0400
----------------------------------------------------------------------
.../org/apache/accumulo/core/Constants.java | 1 -
.../core/client/ClientSideIteratorScanner.java | 2 -
.../apache/accumulo/core/client/Connector.java | 2 -
.../accumulo/core/client/IteratorSetting.java | 4 -
.../accumulo/core/client/RowIterator.java | 4 -
.../accumulo/core/client/ScannerBase.java | 2 +-
.../accumulo/core/client/ZooKeeperInstance.java | 2 -
.../core/client/admin/ActiveCompaction.java | 1 -
.../core/client/admin/InstanceOperations.java | 12 -
.../client/admin/InstanceOperationsImpl.java | 33 --
.../core/client/admin/TableOperations.java | 32 --
.../core/client/admin/TableOperationsImpl.java | 4 -
.../core/client/impl/OfflineScanner.java | 6 -
.../core/client/impl/ThriftTransportPool.java | 16 +-
.../client/mapred/AccumuloOutputFormat.java | 1 -
.../core/client/mapred/InputFormatBase.java | 1 -
.../client/mapreduce/AccumuloOutputFormat.java | 1 -
.../core/client/mapreduce/InputFormatBase.java | 1 -
.../mapreduce/lib/util/ConfiguratorBase.java | 1 -
.../core/client/mock/MockBatchDeleter.java | 4 -
.../client/mock/MockInstanceOperations.java | 43 ---
.../apache/accumulo/core/data/ColumnUpdate.java | 1 -
.../java/org/apache/accumulo/core/data/Key.java | 7 +-
.../apache/accumulo/core/data/KeyExtent.java | 6 +-
.../org/apache/accumulo/core/data/Range.java | 17 +-
.../accumulo/core/file/rfile/BlockIndex.java | 5 -
.../accumulo/core/file/rfile/bcfile/BCFile.java | 14 +-
.../core/file/rfile/bcfile/ByteArray.java | 2 -
.../accumulo/core/file/rfile/bcfile/Chunk.java | 2 -
.../accumulo/core/file/rfile/bcfile/TFile.java | 44 ---
.../core/file/rfile/bcfile/TFileDumper.java | 1 -
.../accumulo/core/file/rfile/bcfile/Utils.java | 11 -
.../core/iterators/TypedValueCombiner.java | 6 -
.../core/iterators/ValueFormatException.java | 6 -
.../core/iterators/system/MapFileIterator.java | 8 +-
.../core/iterators/user/GrepIterator.java | 3 -
.../iterators/user/IntersectingIterator.java | 10 -
.../accumulo/core/iterators/user/RowFilter.java | 1 -
.../iterators/user/TransformingIterator.java | 166 +++++-----
.../core/iterators/user/VersioningIterator.java | 3 -
.../accumulo/core/security/SecurityUtil.java | 1 -
.../core/security/crypto/CryptoModule.java | 2 -
.../security/crypto/CryptoModuleFactory.java | 1 -
.../core/client/impl/ScannerOptionsTest.java | 2 -
.../client/mapred/AccumuloInputFormatTest.java | 4 -
.../mapreduce/AccumuloInputFormatTest.java | 6 -
.../shell/command/FormatterCommandTest.java | 15 +-
.../simple/client/RandomBatchScanner.java | 5 -
.../simple/client/RandomBatchWriter.java | 4 -
.../simple/client/SequentialBatchWriter.java | 5 -
.../simple/client/TraceDumpExample.java | 9 +-
.../examples/simple/dirlist/QueryUtil.java | 3 -
.../examples/simple/mapreduce/NGramIngest.java | 3 -
.../examples/simple/mapreduce/TableToFile.java | 1 -
.../accumulo/examples/simple/shard/Query.java | 3 -
.../minicluster/MiniAccumuloCluster.java | 10 -
.../accumulo/proxy/TestProxyReadWrite.java | 10 -
.../accumulo/server/conf/ConfigSanityCheck.java | 3 -
.../accumulo/server/logger/LogReader.java | 1 -
.../master/balancer/ChaoticLoadBalancer.java | 8 -
.../server/master/balancer/TabletBalancer.java | 2 -
.../server/master/state/TabletStateStore.java | 8 +-
.../server/master/tableOps/TraceRepo.java | 25 --
.../server/metanalysis/LogFileOutputFormat.java | 4 -
.../server/metanalysis/PrintEvents.java | 5 +-
.../server/metrics/AbstractMetricsImpl.java | 4 -
.../security/handler/InsecurePermHandler.java | 42 ---
.../server/security/handler/ZKAuthorizor.java | 7 +-
.../server/security/handler/ZKPermHandler.java | 6 +-
.../accumulo/server/tabletserver/MemValue.java | 4 +-
.../server/tabletserver/TabletServer.java | 8 +-
.../server/util/AddFilesWithMissingEntries.java | 1 -
.../accumulo/server/util/DumpZookeeper.java | 3 -
.../server/util/FindOfflineTablets.java | 3 -
.../accumulo/server/util/LoginProperties.java | 3 -
.../accumulo/server/util/MetadataTable.java | 305 +++++++++----------
.../accumulo/server/util/RestoreZookeeper.java | 4 -
.../accumulo/server/util/SendLogToChainsaw.java | 1 -
.../accumulo/server/util/TServerUtils.java | 7 +-
.../accumulo/server/util/TableDiskUsage.java | 3 -
.../accumulo/server/util/TabletServerLocks.java | 3 -
.../start/classloader/AccumuloClassLoader.java | 3 -
.../start/classloader/vfs/ContextManager.java | 2 -
.../vfs/PostDelegatingVFSClassLoader.java | 7 +-
.../vfs/providers/HdfsFileSystem.java | 5 -
.../apache/accumulo/test/GetMasterStats.java | 9 -
.../accumulo/test/NativeMapPerformanceTest.java | 3 -
.../accumulo/test/NativeMapStressTest.java | 3 -
.../test/continuous/ContinuousMoru.java | 1 -
.../test/continuous/ContinuousVerify.java | 1 -
.../test/functional/CacheTestClean.java | 3 -
.../accumulo/test/functional/RunTests.java | 4 -
.../metadata/MetadataBatchScanTest.java | 3 -
.../test/performance/thrift/NullTserver.java | 8 +-
.../accumulo/test/randomwalk/Framework.java | 3 -
.../apache/accumulo/test/randomwalk/Node.java | 1 -
.../randomwalk/concurrent/CheckBalance.java | 5 +-
.../instrument/receivers/ZooSpanClient.java | 10 -
98 files changed, 284 insertions(+), 817 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/Constants.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/Constants.java
index 095319e,0000000..66c4034
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/Constants.java
+++ b/core/src/main/java/org/apache/accumulo/core/Constants.java
@@@ -1,213 -1,0 +1,212 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core;
+
+import java.nio.charset.Charset;
+
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
+import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.KeyExtent;
+import org.apache.accumulo.core.data.PartialKey;
+import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.accumulo.core.util.ColumnFQ;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.Text;
+
+public class Constants {
+ public static final Charset UTF8 = Charset.forName("UTF-8");
+ public static final String VERSION = FilteredConstants.VERSION;
+
+ // versions should never be negative
+ public static final Integer WIRE_VERSION = 2;
+ public static final int DATA_VERSION = 5;
+ public static final int PREV_DATA_VERSION = 4;
+
+ // Zookeeper locations
+ public static final String ZROOT = "/accumulo";
+ public static final String ZINSTANCES = "/instances";
+
+ public static final String ZTABLES = "/tables";
+ public static final byte[] ZTABLES_INITIAL_ID = new byte[] {'0'};
+ public static final String ZTABLE_NAME = "/name";
+ public static final String ZTABLE_CONF = "/conf";
+ public static final String ZTABLE_STATE = "/state";
+ public static final String ZTABLE_FLUSH_ID = "/flush-id";
+ public static final String ZTABLE_COMPACT_ID = "/compact-id";
+ public static final String ZTABLE_COMPACT_CANCEL_ID = "/compact-cancel-id";
+
+ public static final String ZROOT_TABLET = "/root_tablet";
+ public static final String ZROOT_TABLET_LOCATION = ZROOT_TABLET + "/location";
+ public static final String ZROOT_TABLET_FUTURE_LOCATION = ZROOT_TABLET + "/future_location";
+ public static final String ZROOT_TABLET_LAST_LOCATION = ZROOT_TABLET + "/lastlocation";
+ public static final String ZROOT_TABLET_WALOGS = ZROOT_TABLET + "/walogs";
+
+ public static final String ZMASTERS = "/masters";
+ public static final String ZMASTER_LOCK = ZMASTERS + "/lock";
+ public static final String ZMASTER_GOAL_STATE = ZMASTERS + "/goal_state";
+ public static final String ZGC = "/gc";
+ public static final String ZGC_LOCK = ZGC + "/lock";
+
+ public static final String ZMONITOR = "/monitor";
+ public static final String ZMONITOR_LOCK = ZMONITOR + "/lock";
+ public static final String ZMONITOR_HTTP_ADDR = ZMONITOR + "/http_addr";
+ public static final String ZMONITOR_LOG4J_ADDR = ZMONITOR + "/log4j_addr";
+
+ public static final String ZCONFIG = "/config";
+
+ public static final String ZTSERVERS = "/tservers";
+
+ public static final String ZDEAD = "/dead";
+ public static final String ZDEADTSERVERS = "/dead/tservers";
+
+ public static final String ZTRACERS = "/tracers";
+
+ public static final String ZPROBLEMS = "/problems";
+ public static final String ZUSERS = "/users";
+
+ public static final String BULK_ARBITRATOR_TYPE = "bulkTx";
+
+ public static final String ZFATE = "/fate";
+
+ public static final String ZNEXT_FILE = "/next_file";
+
+ public static final String ZBULK_FAILED_COPYQ = "/bulk_failed_copyq";
+
+ public static final String ZHDFS_RESERVATIONS = "/hdfs_reservations";
+ public static final String ZRECOVERY = "/recovery";
+
+ public static final String METADATA_TABLE_ID = "!0";
+ public static final String METADATA_TABLE_NAME = "!METADATA";
+ public static final String DEFAULT_TABLET_LOCATION = "/default_tablet";
+ public static final String TABLE_TABLET_LOCATION = "/table_info";
+ public static final String ZTABLE_LOCKS = "/table_locks";
+
+ // reserved keyspace is any row that begins with a tilde '~' character
+ public static final Key METADATA_RESERVED_KEYSPACE_START_KEY = new Key(new Text(new byte[] {'~'}));
+ public static final Key METADATA_RESERVED_KEYSPACE_STOP_KEY = new Key(new Text(new byte[] {'~' + 1}));
+ public static final Range METADATA_RESERVED_KEYSPACE = new Range(METADATA_RESERVED_KEYSPACE_START_KEY, true, METADATA_RESERVED_KEYSPACE_STOP_KEY, false);
+ public static final String METADATA_DELETE_FLAG_PREFIX = "~del";
+ public static final String METADATA_DELETE_FLAG_FOR_METADATA_PREFIX = "!!" + METADATA_DELETE_FLAG_PREFIX;
+ public static final Range METADATA_DELETES_KEYSPACE = new Range(new Key(new Text(METADATA_DELETE_FLAG_PREFIX)), true, new Key(new Text("~dem")), false);
+ public static final Range METADATA_DELETES_FOR_METADATA_KEYSPACE = new Range(new Key(new Text(METADATA_DELETE_FLAG_FOR_METADATA_PREFIX)), true, new Key(new Text("!!~dem")), false);
+ public static final String METADATA_BLIP_FLAG_PREFIX = "~blip"; // BLIP = bulk load in progress
+ public static final Range METADATA_BLIP_KEYSPACE = new Range(new Key(new Text(METADATA_BLIP_FLAG_PREFIX)), true, new Key(new Text("~bliq")), false);
+
+ public static final Text METADATA_SERVER_COLUMN_FAMILY = new Text("srv");
+ public static final Text METADATA_TABLET_COLUMN_FAMILY = new Text("~tab"); // this needs to sort after all other column families for that tablet
+ public static final Text METADATA_CURRENT_LOCATION_COLUMN_FAMILY = new Text("loc");
+ public static final Text METADATA_FUTURE_LOCATION_COLUMN_FAMILY = new Text("future");
+ public static final Text METADATA_LAST_LOCATION_COLUMN_FAMILY = new Text("last");
+ public static final Text METADATA_BULKFILE_COLUMN_FAMILY = new Text("loaded"); // temporary marker that indicates a tablet loaded a bulk file
+ public static final Text METADATA_CLONED_COLUMN_FAMILY = new Text("!cloned"); // temporary marker that indicates a tablet was successfully cloned
+
+ // README : very important that prevRow sort last to avoid race conditions between
+ // garbage collector and split
+ public static final ColumnFQ METADATA_PREV_ROW_COLUMN = new ColumnFQ(METADATA_TABLET_COLUMN_FAMILY, new Text("~pr")); // this needs to sort after everything
+ // else for that tablet
+ public static final ColumnFQ METADATA_OLD_PREV_ROW_COLUMN = new ColumnFQ(METADATA_TABLET_COLUMN_FAMILY, new Text("oldprevrow"));
+ public static final ColumnFQ METADATA_DIRECTORY_COLUMN = new ColumnFQ(METADATA_SERVER_COLUMN_FAMILY, new Text("dir"));
+ public static final ColumnFQ METADATA_TIME_COLUMN = new ColumnFQ(METADATA_SERVER_COLUMN_FAMILY, new Text("time"));
+ public static final ColumnFQ METADATA_FLUSH_COLUMN = new ColumnFQ(METADATA_SERVER_COLUMN_FAMILY, new Text("flush"));
+ public static final ColumnFQ METADATA_COMPACT_COLUMN = new ColumnFQ(METADATA_SERVER_COLUMN_FAMILY, new Text("compact"));
+ public static final ColumnFQ METADATA_SPLIT_RATIO_COLUMN = new ColumnFQ(METADATA_TABLET_COLUMN_FAMILY, new Text("splitRatio"));
+ public static final ColumnFQ METADATA_LOCK_COLUMN = new ColumnFQ(METADATA_SERVER_COLUMN_FAMILY, new Text("lock"));
+
+ public static final Text METADATA_DATAFILE_COLUMN_FAMILY = new Text("file");
+ public static final Text METADATA_SCANFILE_COLUMN_FAMILY = new Text("scan");
+ public static final Text METADATA_LOG_COLUMN_FAMILY = new Text("log");
+ public static final Text METADATA_CHOPPED_COLUMN_FAMILY = new Text("chopped");
+ public static final ColumnFQ METADATA_CHOPPED_COLUMN = new ColumnFQ(METADATA_CHOPPED_COLUMN_FAMILY, new Text("chopped"));
+
+ public static final Range NON_ROOT_METADATA_KEYSPACE = new Range(
+ new Key(KeyExtent.getMetadataEntry(new Text(METADATA_TABLE_ID), null)).followingKey(PartialKey.ROW), true, METADATA_RESERVED_KEYSPACE_START_KEY, false);
+ public static final Range METADATA_KEYSPACE = new Range(new Key(new Text(METADATA_TABLE_ID)), true, METADATA_RESERVED_KEYSPACE_START_KEY, false);
+
+ public static final KeyExtent ROOT_TABLET_EXTENT = new KeyExtent(new Text(METADATA_TABLE_ID), KeyExtent.getMetadataEntry(new Text(METADATA_TABLE_ID), null),
+ null);
+ public static final Range METADATA_ROOT_TABLET_KEYSPACE = new Range(ROOT_TABLET_EXTENT.getMetadataEntry(), false, KeyExtent.getMetadataEntry(new Text(
+ METADATA_TABLE_ID), null), true);
+
+ public static final String VALUE_ENCODING = "UTF-8";
+
+ public static final String BULK_PREFIX = "b-";
+ public static final String OLD_BULK_PREFIX = "bulk_";
+
+ // note: all times are in milliseconds
+
+ public static final int SCAN_BATCH_SIZE = 1000; // this affects the table client caching of metadata
+
+ public static final long MIN_MASTER_LOOP_TIME = 1000;
+ public static final int MASTER_TABLETSERVER_CONNECTION_TIMEOUT = 3000;
+ public static final long CLIENT_SLEEP_BEFORE_RECONNECT = 1000;
+
+ // Security configuration
+ public static final String PW_HASH_ALGORITHM = "SHA-256";
+
+ // Representation of an empty set of authorizations
+ // (used throughout the code, because scans of metadata table and many tests do not set record-level visibility)
+ public static final Authorizations NO_AUTHS = new Authorizations();
+
+ public static final int DEFAULT_MINOR_COMPACTION_MAX_SLEEP_TIME = 60 * 3; // in seconds
+
+ public static final int MAX_DATA_TO_PRINT = 64;
+ public static final int CLIENT_RETRIES = 5;
+ public static final int TSERV_MINC_MAXCONCURRENT_NUMWAITING_MULTIPLIER = 2;
+ public static final String CORE_PACKAGE_NAME = "org.apache.accumulo.core";
+ public static final String OLD_PACKAGE_NAME = "cloudbase";
+ public static final String VALID_TABLE_NAME_REGEX = "^\\w+$";
+ public static final String MAPFILE_EXTENSION = "map";
+ public static final String GENERATED_TABLET_DIRECTORY_PREFIX = "t-";
+
+ public static final String EXPORT_METADATA_FILE = "metadata.bin";
+ public static final String EXPORT_TABLE_CONFIG_FILE = "table_config.txt";
+ public static final String EXPORT_FILE = "exportMetadata.zip";
+ public static final String EXPORT_INFO_FILE = "accumulo_export_info.txt";
+
+ public static String getBaseDir(final AccumuloConfiguration conf) {
+ return conf.get(Property.INSTANCE_DFS_DIR);
+ }
+
+ public static String getTablesDir(final AccumuloConfiguration conf) {
+ return getBaseDir(conf) + "/tables";
+ }
+
+ public static String getRecoveryDir(final AccumuloConfiguration conf) {
+ return getBaseDir(conf) + "/recovery";
+ }
+
+ public static Path getDataVersionLocation(final AccumuloConfiguration conf) {
+ return new Path(getBaseDir(conf) + "/version");
+ }
+
+ public static String getMetadataTableDir(final AccumuloConfiguration conf) {
+ return getTablesDir(conf) + "/" + METADATA_TABLE_ID;
+ }
+
+ public static String getRootTabletDir(final AccumuloConfiguration conf) {
+ return getMetadataTableDir(conf) + ZROOT_TABLET;
+ }
+
+ /**
- * @param conf
+ * @return The write-ahead log directory.
+ */
+ public static String getWalDirectory(final AccumuloConfiguration conf) {
+ return getBaseDir(conf) + "/wal";
+ }
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java
index 3085f56,0000000..fbf8670
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/ClientSideIteratorScanner.java
@@@ -1,257 -1,0 +1,255 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.TreeSet;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.accumulo.core.client.impl.ScannerOptions;
+import org.apache.accumulo.core.client.mock.IteratorAdapter;
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
+import org.apache.accumulo.core.data.ArrayByteSequence;
+import org.apache.accumulo.core.data.ByteSequence;
+import org.apache.accumulo.core.data.Column;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.data.thrift.IterInfo;
+import org.apache.accumulo.core.iterators.IteratorEnvironment;
+import org.apache.accumulo.core.iterators.IteratorUtil;
+import org.apache.accumulo.core.iterators.IteratorUtil.IteratorScope;
+import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
+import org.apache.hadoop.io.Text;
+
+/**
+ * A scanner that instantiates iterators on the client side instead of on the tablet server. This can be useful for testing iterators or in cases where you
+ * don't want iterators affecting the performance of tablet servers.<br>
+ * <br>
+ * Suggested usage:<br>
+ * <code>Scanner scanner = new ClientSideIteratorScanner(connector.createScanner(tableName, authorizations));</code><br>
+ * <br>
+ * Iterators added to this scanner will be run in the client JVM. Separate scan iterators can be run on the server side and client side by adding iterators to
+ * the source scanner (which will execute server side) and to the client side scanner (which will execute client side).
+ */
+public class ClientSideIteratorScanner extends ScannerOptions implements Scanner {
+ private int size;
+
+ private Range range;
+ private boolean isolated = false;
+
+ /**
+ * A class that wraps a Scanner in a SortedKeyValueIterator so that other accumulo iterators can use it as a source.
+ */
+ public class ScannerTranslator implements SortedKeyValueIterator<Key,Value> {
+ protected Scanner scanner;
+ Iterator<Entry<Key,Value>> iter;
+ Entry<Key,Value> top = null;
+
+ /**
+ * Constructs an accumulo iterator from a scanner.
+ *
+ * @param scanner
+ * the scanner to iterate over
+ */
+ public ScannerTranslator(final Scanner scanner) {
+ this.scanner = scanner;
+ }
+
+ @Override
+ public void init(final SortedKeyValueIterator<Key,Value> source, final Map<String,String> options, final IteratorEnvironment env) throws IOException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public boolean hasTop() {
+ return top != null;
+ }
+
+ @Override
+ public void next() throws IOException {
+ if (iter.hasNext())
+ top = iter.next();
+ else
+ top = null;
+ }
+
+ @Override
+ public void seek(final Range range, final Collection<ByteSequence> columnFamilies, final boolean inclusive) throws IOException {
+ if (!inclusive && columnFamilies.size() > 0) {
+ throw new IllegalArgumentException();
+ }
+ scanner.setRange(range);
+ scanner.clearColumns();
+ for (ByteSequence colf : columnFamilies) {
+ scanner.fetchColumnFamily(new Text(colf.toArray()));
+ }
+ iter = scanner.iterator();
+ next();
+ }
+
+ @Override
+ public Key getTopKey() {
+ return top.getKey();
+ }
+
+ @Override
+ public Value getTopValue() {
+ return top.getValue();
+ }
+
+ @Override
+ public SortedKeyValueIterator<Key,Value> deepCopy(final IteratorEnvironment env) {
+ return new ScannerTranslator(scanner);
+ }
+ }
+
+ private ScannerTranslator smi;
+
+ /**
+ * Constructs a scanner that can execute client-side iterators.
+ *
+ * @param scanner
+ * the source scanner
+ */
+ public ClientSideIteratorScanner(final Scanner scanner) {
+ smi = new ScannerTranslator(scanner);
+ this.range = scanner.getRange();
+ this.size = scanner.getBatchSize();
+ this.timeOut = scanner.getTimeout(TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * Sets the source Scanner.
- *
- * @param scanner
+ */
+ public void setSource(final Scanner scanner) {
+ smi = new ScannerTranslator(scanner);
+ }
+
+ @Override
+ public Iterator<Entry<Key,Value>> iterator() {
+ smi.scanner.setBatchSize(size);
+ smi.scanner.setTimeout(timeOut, TimeUnit.MILLISECONDS);
+ if (isolated)
+ smi.scanner.enableIsolation();
+ else
+ smi.scanner.disableIsolation();
+
+ final TreeMap<Integer,IterInfo> tm = new TreeMap<Integer,IterInfo>();
+
+ for (IterInfo iterInfo : serverSideIteratorList) {
+ tm.put(iterInfo.getPriority(), iterInfo);
+ }
+
+ SortedKeyValueIterator<Key,Value> skvi;
+ try {
+ skvi = IteratorUtil.loadIterators(smi, tm.values(), serverSideIteratorOptions, new IteratorEnvironment() {
+ @Override
+ public SortedKeyValueIterator<Key,Value> reserveMapFileReader(final String mapFileName) throws IOException {
+ return null;
+ }
+
+ @Override
+ public AccumuloConfiguration getConfig() {
+ return null;
+ }
+
+ @Override
+ public IteratorScope getIteratorScope() {
+ return null;
+ }
+
+ @Override
+ public boolean isFullMajorCompaction() {
+ return false;
+ }
+
+ @Override
+ public void registerSideChannel(final SortedKeyValueIterator<Key,Value> iter) {}
+ }, false, null);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ final Set<ByteSequence> colfs = new TreeSet<ByteSequence>();
+ for (Column c : this.getFetchedColumns()) {
+ colfs.add(new ArrayByteSequence(c.getColumnFamily()));
+ }
+
+ try {
+ skvi.seek(range, colfs, true);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ return new IteratorAdapter(skvi);
+ }
+
+ @Deprecated
+ @Override
+ public void setTimeOut(int timeOut) {
+ if (timeOut == Integer.MAX_VALUE)
+ setTimeout(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
+ else
+ setTimeout(timeOut, TimeUnit.SECONDS);
+ }
+
+ @Deprecated
+ @Override
+ public int getTimeOut() {
+ long timeout = getTimeout(TimeUnit.SECONDS);
+ if (timeout >= Integer.MAX_VALUE)
+ return Integer.MAX_VALUE;
+ return (int) timeout;
+ }
+
+ @Override
+ public void setRange(final Range range) {
+ this.range = range;
+ }
+
+ @Override
+ public Range getRange() {
+ return range;
+ }
+
+ @Override
+ public void setBatchSize(final int size) {
+ this.size = size;
+ }
+
+ @Override
+ public int getBatchSize() {
+ return size;
+ }
+
+ @Override
+ public void enableIsolation() {
+ this.isolated = true;
+ }
+
+ @Override
+ public void disableIsolation() {
+ this.isolated = false;
+ }
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/Connector.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/Connector.java
index d2e7321,0000000..3189d44
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/Connector.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/Connector.java
@@@ -1,210 -1,0 +1,208 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client;
+
+import org.apache.accumulo.core.client.admin.InstanceOperations;
+import org.apache.accumulo.core.client.admin.SecurityOperations;
+import org.apache.accumulo.core.client.admin.TableOperations;
+import org.apache.accumulo.core.security.Authorizations;
+
+/**
+ * Connector connects to an Accumulo instance and allows the user to request readers and writers for the instance as well as various objects that permit
+ * administrative operations.
+ *
+ * The Connector enforces security on the client side by forcing all API calls to be accompanied by user credentials.
+ */
+public abstract class Connector {
+
+ /**
+ * Factory method to create a BatchScanner connected to Accumulo.
+ *
+ * @param tableName
+ * the name of the table to query
+ * @param authorizations
+ * A set of authorization labels that will be checked against the column visibility of each key in order to filter data. The authorizations passed in
+ * must be a subset of the accumulo user's set of authorizations. If the accumulo user has authorizations (A1, A2) and authorizations (A2, A3) are
+ * passed, then an exception will be thrown.
+ * @param numQueryThreads
+ * the number of concurrent threads to spawn for querying
+ *
+ * @return BatchScanner object for configuring and querying
+ * @throws TableNotFoundException
+ * when the specified table doesn't exist
+ */
+ public abstract BatchScanner createBatchScanner(String tableName, Authorizations authorizations, int numQueryThreads) throws TableNotFoundException;
+
+ /**
+ * Factory method to create a BatchDeleter connected to Accumulo.
+ *
+ * @param tableName
+ * the name of the table to query and delete from
+ * @param authorizations
+ * A set of authorization labels that will be checked against the column visibility of each key in order to filter data. The authorizations passed in
+ * must be a subset of the accumulo user's set of authorizations. If the accumulo user has authorizations (A1, A2) and authorizations (A2, A3) are
+ * passed, then an exception will be thrown.
+ * @param numQueryThreads
+ * the number of concurrent threads to spawn for querying
+ * @param maxMemory
+ * size in bytes of the maximum memory to batch before writing
+ * @param maxLatency
+ * size in milliseconds; set to 0 or Long.MAX_VALUE to allow the maximum time to hold a batch before writing
+ * @param maxWriteThreads
+ * the maximum number of threads to use for writing data to the tablet servers
+ *
+ * @return BatchDeleter object for configuring and deleting
+ * @throws TableNotFoundException
+ * when the specified table doesn't exist
+ * @deprecated since 1.5.0; Use {@link #createBatchDeleter(String, Authorizations, int, BatchWriterConfig)} instead.
+ */
+ @Deprecated
+ public abstract BatchDeleter createBatchDeleter(String tableName, Authorizations authorizations, int numQueryThreads, long maxMemory, long maxLatency,
+ int maxWriteThreads) throws TableNotFoundException;
+
+ /**
+ *
+ * @param tableName
+ * the name of the table to query and delete from
+ * @param authorizations
+ * A set of authorization labels that will be checked against the column visibility of each key in order to filter data. The authorizations passed in
+ * must be a subset of the accumulo user's set of authorizations. If the accumulo user has authorizations (A1, A2) and authorizations (A2, A3) are
+ * passed, then an exception will be thrown.
+ * @param numQueryThreads
+ * the number of concurrent threads to spawn for querying
+ * @param config
+ * configuration used to create batch writer
+ * @return BatchDeleter object for configuring and deleting
- * @throws TableNotFoundException
+ * @since 1.5.0
+ */
+
+ public abstract BatchDeleter createBatchDeleter(String tableName, Authorizations authorizations, int numQueryThreads, BatchWriterConfig config)
+ throws TableNotFoundException;
+
+ /**
+ * Factory method to create a BatchWriter connected to Accumulo.
+ *
+ * @param tableName
+ * the name of the table to insert data into
+ * @param maxMemory
+ * size in bytes of the maximum memory to batch before writing
+ * @param maxLatency
+ * time in milliseconds; set to 0 or Long.MAX_VALUE to allow the maximum time to hold a batch before writing
+ * @param maxWriteThreads
+ * the maximum number of threads to use for writing data to the tablet servers
+ *
+ * @return BatchWriter object for configuring and writing data to
+ * @throws TableNotFoundException
+ * when the specified table doesn't exist
+ * @deprecated since 1.5.0; Use {@link #createBatchWriter(String, BatchWriterConfig)} instead.
+ */
+ @Deprecated
+ public abstract BatchWriter createBatchWriter(String tableName, long maxMemory, long maxLatency, int maxWriteThreads) throws TableNotFoundException;
+
+ /**
+ * Factory method to create a BatchWriter connected to Accumulo.
+ *
+ * @param tableName
+ * the name of the table to insert data into
+ * @param config
+ * configuration used to create batch writer
+ * @return BatchWriter object for configuring and writing data to
- * @throws TableNotFoundException
+ * @since 1.5.0
+ */
+
+ public abstract BatchWriter createBatchWriter(String tableName, BatchWriterConfig config) throws TableNotFoundException;
+
+ /**
+ * Factory method to create a Multi-Table BatchWriter connected to Accumulo. Multi-table batch writers can queue data for multiple tables, which is good for
+ * ingesting data into multiple tables from the same source
+ *
+ * @param maxMemory
+ * size in bytes of the maximum memory to batch before writing
+ * @param maxLatency
+ * size in milliseconds; set to 0 or Long.MAX_VALUE to allow the maximum time to hold a batch before writing
+ * @param maxWriteThreads
+ * the maximum number of threads to use for writing data to the tablet servers
+ *
+ * @return MultiTableBatchWriter object for configuring and writing data to
+ * @deprecated since 1.5.0; Use {@link #createMultiTableBatchWriter(BatchWriterConfig)} instead.
+ */
+ @Deprecated
+ public abstract MultiTableBatchWriter createMultiTableBatchWriter(long maxMemory, long maxLatency, int maxWriteThreads);
+
+ /**
+ * Factory method to create a Multi-Table BatchWriter connected to Accumulo. Multi-table batch writers can queue data for multiple tables. Also data for
+ * multiple tables can be sent to a server in a single batch. Its an efficient way to ingest data into multiple tables from a single process.
+ *
+ * @param config
+ * configuration used to create multi-table batch writer
+ * @return MultiTableBatchWriter object for configuring and writing data to
+ * @since 1.5.0
+ */
+
+ public abstract MultiTableBatchWriter createMultiTableBatchWriter(BatchWriterConfig config);
+
+ /**
+ * Factory method to create a Scanner connected to Accumulo.
+ *
+ * @param tableName
+ * the name of the table to query data from
+ * @param authorizations
+ * A set of authorization labels that will be checked against the column visibility of each key in order to filter data. The authorizations passed in
+ * must be a subset of the accumulo user's set of authorizations. If the accumulo user has authorizations (A1, A2) and authorizations (A2, A3) are
+ * passed, then an exception will be thrown.
+ *
+ * @return Scanner object for configuring and querying data with
+ * @throws TableNotFoundException
+ * when the specified table doesn't exist
+ */
+ public abstract Scanner createScanner(String tableName, Authorizations authorizations) throws TableNotFoundException;
+
+ /**
+ * Accessor method for internal instance object.
+ *
+ * @return the internal instance object
+ */
+ public abstract Instance getInstance();
+
+ /**
+ * Get the current user for this connector
+ *
+ * @return the user name
+ */
+ public abstract String whoami();
+
+ /**
+ * Retrieves a TableOperations object to perform table functions, such as create and delete.
+ *
+ * @return an object to manipulate tables
+ */
+ public abstract TableOperations tableOperations();
+
+ /**
+ * Retrieves a SecurityOperations object to perform user security operations, such as creating users.
+ *
+ * @return an object to modify users and permissions
+ */
+ public abstract SecurityOperations securityOperations();
+
+ /**
+ * Retrieves an InstanceOperations object to modify instance configuration.
+ *
+ * @return an object to modify instance configuration
+ */
+ public abstract InstanceOperations instanceOperations();
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
index 85e996a,0000000..e58a1be
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/IteratorSetting.java
@@@ -1,387 -1,0 +1,383 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.iterators.SortedKeyValueIterator;
+import org.apache.accumulo.core.util.ArgumentChecker;
+import org.apache.accumulo.core.util.Pair;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.io.Writable;
+import org.apache.hadoop.io.WritableUtils;
+
+/**
+ * Configure an iterator for minc, majc, and/or scan. By default, IteratorSetting will be configured for scan.
+ *
+ * Every iterator has a priority, a name, a class, a set of scopes, and configuration parameters.
+ *
+ * A typical use case configured for scan:
+ *
+ * <pre>
+ * IteratorSetting cfg = new IteratorSetting(priority, "myIter", MyIterator.class);
+ * MyIterator.addOption(cfg, 42);
+ * scanner.addScanIterator(cfg);
+ * </pre>
+ */
+public class IteratorSetting implements Writable {
+ private int priority;
+ private String name;
+ private String iteratorClass;
+ private Map<String,String> properties;
+
+ /**
+ * Get layer at which this iterator applies. See {@link #setPriority(int)} for how the priority is used.
+ *
+ * @return the priority of this Iterator
+ */
+ public int getPriority() {
+ return priority;
+ }
+
+ /**
+ * Set layer at which this iterator applies.
+ *
+ * @param priority
+ * determines the order in which iterators are applied (system iterators are always applied first, then user-configured iterators, lowest priority
+ * first)
+ */
+ public void setPriority(int priority) {
+ ArgumentChecker.strictlyPositive(priority);
+ this.priority = priority;
+ }
+
+ /**
+ * Get the iterator's name.
+ *
+ * @return the name of the iterator
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set the iterator's name. Must be a simple alphanumeric identifier.
- *
- * @param name
+ */
+ public void setName(String name) {
+ ArgumentChecker.notNull(name);
+ this.name = name;
+ }
+
+ /**
+ * Get the name of the class that implements the iterator.
+ *
+ * @return the iterator's class name
+ */
+ public String getIteratorClass() {
+ return iteratorClass;
+ }
+
+ /**
+ * Set the name of the class that implements the iterator. The class does not have to be present on the client, but it must be available to all tablet
+ * servers.
- *
- * @param iteratorClass
+ */
+ public void setIteratorClass(String iteratorClass) {
+ ArgumentChecker.notNull(iteratorClass);
+ this.iteratorClass = iteratorClass;
+ }
+
+ /**
+ * Constructs an iterator setting configured for the scan scope with no parameters. (Parameters can be added later.)
+ *
+ * @param priority
+ * the priority for the iterator (see {@link #setPriority(int)})
+ * @param name
+ * the distinguishing name for the iterator
+ * @param iteratorClass
+ * the fully qualified class name for the iterator
+ */
+ public IteratorSetting(int priority, String name, String iteratorClass) {
+ this(priority, name, iteratorClass, new HashMap<String,String>());
+ }
+
+ /**
+ * Constructs an iterator setting configured for the specified scopes with the specified parameters.
+ *
+ * @param priority
+ * the priority for the iterator (see {@link #setPriority(int)})
+ * @param name
+ * the distinguishing name for the iterator
+ * @param iteratorClass
+ * the fully qualified class name for the iterator
+ * @param properties
+ * any properties for the iterator
+ */
+ public IteratorSetting(int priority, String name, String iteratorClass, Map<String,String> properties) {
+ setPriority(priority);
+ setName(name);
+ setIteratorClass(iteratorClass);
+ this.properties = new HashMap<String,String>();
+ addOptions(properties);
+ }
+
+ /**
+ * Constructs an iterator setting using the given class's SimpleName for the iterator name. The iterator setting will be configured for the scan scope with no
+ * parameters.
+ *
+ * @param priority
+ * the priority for the iterator (see {@link #setPriority(int)})
+ * @param iteratorClass
+ * the class for the iterator
+ */
+ public IteratorSetting(int priority, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass) {
+ this(priority, iteratorClass.getSimpleName(), iteratorClass.getName());
+ }
+
+ /**
+ *
+ * Constructs an iterator setting using the given class's SimpleName for the iterator name and configured for the specified scopes with the specified
+ * parameters.
+ *
+ * @param priority
+ * the priority for the iterator (see {@link #setPriority(int)})
+ * @param iteratorClass
+ * the class for the iterator
+ * @param properties
+ * any properties for the iterator
+ */
+ public IteratorSetting(int priority, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass, Map<String,String> properties) {
+ this(priority, iteratorClass.getSimpleName(), iteratorClass.getName(), properties);
+ }
+
+ /**
+ * Constructs an iterator setting configured for the scan scope with no parameters.
+ *
+ * @param priority
+ * the priority for the iterator (see {@link #setPriority(int)})
+ * @param name
+ * the distinguishing name for the iterator
+ * @param iteratorClass
+ * the class for the iterator
+ */
+ public IteratorSetting(int priority, String name, Class<? extends SortedKeyValueIterator<Key,Value>> iteratorClass) {
+ this(priority, name, iteratorClass.getName());
+ }
+
+ /**
+ * @since 1.5.0
+ */
+ public IteratorSetting(DataInput din) throws IOException {
+ this.properties = new HashMap<String,String>();
+ this.readFields(din);
+ }
+
+ /**
+ * Add another option to the iterator.
+ *
+ * @param option
+ * the name of the option
+ * @param value
+ * the value of the option
+ */
+ public void addOption(String option, String value) {
+ ArgumentChecker.notNull(option, value);
+ properties.put(option, value);
+ }
+
+ /**
+ * Remove an option from the iterator.
+ *
+ * @param option
+ * the name of the option
+ * @return the value previously associated with the option, or null if no such option existed
+ */
+ public String removeOption(String option) {
+ ArgumentChecker.notNull(option);
+ return properties.remove(option);
+ }
+
+ /**
+ * Add many options to the iterator.
+ *
+ * @param propertyEntries
+ * a set of entries to add to the options
+ */
+ public void addOptions(Set<Entry<String,String>> propertyEntries) {
+ ArgumentChecker.notNull(propertyEntries);
+ for (Entry<String,String> keyValue : propertyEntries) {
+ addOption(keyValue.getKey(), keyValue.getValue());
+ }
+ }
+
+ /**
+ * Add many options to the iterator.
+ *
+ * @param properties
+ * a map of entries to add to the options
+ */
+ public void addOptions(Map<String,String> properties) {
+ ArgumentChecker.notNull(properties);
+ addOptions(properties.entrySet());
+ }
+
+ /**
+ * Get the configuration parameters for this iterator.
+ *
+ * @return the properties
+ */
+ public Map<String,String> getOptions() {
+ return Collections.unmodifiableMap(properties);
+ }
+
+ /**
+ * Remove all options from the iterator.
+ */
+ public void clearOptions() {
+ properties.clear();
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+ final int prime = 31;
+ int result = 1;
+ result = prime * result + ((iteratorClass == null) ? 0 : iteratorClass.hashCode());
+ result = prime * result + ((name == null) ? 0 : name.hashCode());
+ result = prime * result + priority;
+ result = prime * result + ((properties == null) ? 0 : properties.hashCode());
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj)
+ return true;
+ if (obj == null)
+ return false;
+ if (!(obj instanceof IteratorSetting))
+ return false;
+ IteratorSetting other = (IteratorSetting) obj;
+ if (iteratorClass == null) {
+ if (other.iteratorClass != null)
+ return false;
+ } else if (!iteratorClass.equals(other.iteratorClass))
+ return false;
+ if (name == null) {
+ if (other.name != null)
+ return false;
+ } else if (!name.equals(other.name))
+ return false;
+ if (priority != other.priority)
+ return false;
+ if (properties == null) {
+ if (other.properties != null)
+ return false;
+ } else if (!properties.equals(other.properties))
+ return false;
+ return true;
+ }
+
+ /**
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append("name:");
+ sb.append(name);
+ sb.append(", priority:");
+ sb.append(Integer.toString(priority));
+ sb.append(", class:");
+ sb.append(iteratorClass);
+ sb.append(", properties:");
+ sb.append(properties);
+ return sb.toString();
+ }
+
+ /**
+ * A convenience class for passing column family and column qualifiers to iterator configuration methods.
+ */
+ public static class Column extends Pair<Text,Text> {
+
+ public Column(Text columnFamily, Text columnQualifier) {
+ super(columnFamily, columnQualifier);
+ }
+
+ public Column(Text columnFamily) {
+ super(columnFamily, null);
+ }
+
+ public Column(String columnFamily, String columnQualifier) {
+ super(new Text(columnFamily), new Text(columnQualifier));
+ }
+
+ public Column(String columnFamily) {
+ super(new Text(columnFamily), null);
+ }
+
+ public Text getColumnFamily() {
+ return getFirst();
+ }
+
+ public Text getColumnQualifier() {
+ return getSecond();
+ }
+
+ }
+
+ /**
+ * @since 1.5.0
+ */
+ @Override
+ public void readFields(DataInput din) throws IOException {
+ priority = WritableUtils.readVInt(din);
+ name = WritableUtils.readString(din);
+ iteratorClass = WritableUtils.readString(din);
+ properties.clear();
+ int size = WritableUtils.readVInt(din);
+ while (size > 0) {
+ properties.put(WritableUtils.readString(din), WritableUtils.readString(din));
+ size--;
+ }
+ }
+
+ /**
+ * @since 1.5.0
+ */
+ @Override
+ public void write(DataOutput dout) throws IOException {
+ WritableUtils.writeVInt(dout, priority);
+ WritableUtils.writeString(dout, name);
+ WritableUtils.writeString(dout, iteratorClass);
+ WritableUtils.writeVInt(dout, properties.size());
+ for (Entry<String,String> e : properties.entrySet()) {
+ WritableUtils.writeString(dout, e.getKey());
+ WritableUtils.writeString(dout, e.getValue());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/RowIterator.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/RowIterator.java
index 005f697,0000000..f5e9547
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/RowIterator.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/RowIterator.java
@@@ -1,164 -1,0 +1,160 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client;
+
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.NoSuchElementException;
+
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.util.PeekingIterator;
+import org.apache.hadoop.io.Text;
+
+/**
+ * Group Key/Value pairs into Iterators over rows. Suggested usage:
+ *
+ * <pre>
+ * RowIterator rowIterator = new RowIterator(connector.createScanner(tableName, authorizations));
+ * </pre>
+ */
+public class RowIterator implements Iterator<Iterator<Entry<Key,Value>>> {
+
+ /**
+ * Iterate over entries in a single row.
+ */
+ private static class SingleRowIter implements Iterator<Entry<Key,Value>> {
+ private PeekingIterator<Entry<Key,Value>> source;
+ private Text currentRow = null;
+ private long count = 0;
+ private boolean disabled = false;
+
+ /**
+ * SingleRowIter must be passed a PeekingIterator so that it can peek at the next entry to see if it belongs in the current row or not.
+ */
+ public SingleRowIter(PeekingIterator<Entry<Key,Value>> source) {
+ this.source = source;
+ if (source.hasNext())
+ currentRow = source.peek().getKey().getRow();
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (disabled)
+ throw new IllegalStateException("SingleRowIter no longer valid");
+ return currentRow != null;
+ }
+
+ @Override
+ public Entry<Key,Value> next() {
+ if (disabled)
+ throw new IllegalStateException("SingleRowIter no longer valid");
+ return _next();
+ }
+
+ private Entry<Key,Value> _next() {
+ if (currentRow == null)
+ throw new NoSuchElementException();
+ count++;
+ Entry<Key,Value> kv = source.next();
+ if (!source.hasNext() || !source.peek().getKey().getRow().equals(currentRow)) {
+ currentRow = null;
+ }
+ return kv;
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Get a count of entries read from the row (only equals the number of entries in the row when the row has been read fully).
+ */
+ public long getCount() {
+ return count;
+ }
+
+ /**
+ * Consume the rest of the row. Disables the iterator from future use.
+ */
+ public void consume() {
+ disabled = true;
+ while (currentRow != null)
+ _next();
+ }
+ }
+
+ private final PeekingIterator<Entry<Key,Value>> iter;
+ private long count = 0;
+ private SingleRowIter lastIter = null;
+
+ /**
+ * Create an iterator from an (ordered) sequence of KeyValue pairs.
- *
- * @param iterator
+ */
+ public RowIterator(Iterator<Entry<Key,Value>> iterator) {
+ this.iter = new PeekingIterator<Entry<Key,Value>>(iterator);
+ }
+
+ /**
+ * Create an iterator from an Iterable.
- *
- * @param iterable
+ */
+ public RowIterator(Iterable<Entry<Key,Value>> iterable) {
+ this(iterable.iterator());
+ }
+
+ /**
+ * Returns true if there is at least one more row to get.
+ *
+ * If the last row hasn't been fully read, this method will read through the end of the last row so it can determine if the underlying iterator has a next
+ * row. The last row is disabled from future use.
+ */
+ @Override
+ public boolean hasNext() {
+ if (lastIter != null) {
+ lastIter.consume();
+ count += lastIter.getCount();
+ lastIter = null;
+ }
+ return iter.hasNext();
+ }
+
+ /**
+ * Fetch the next row.
+ */
+ @Override
+ public Iterator<Entry<Key,Value>> next() {
+ if (!hasNext())
+ throw new NoSuchElementException();
+ return lastIter = new SingleRowIter(iter);
+ }
+
+ /**
+ * Unsupported.
+ */
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException();
+ }
+
+ /**
+ * Get a count of the total number of entries in all rows read so far.
+ */
+ public long getKVCount() {
+ return count;
+ }
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/ScannerBase.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/ScannerBase.java
index 873a3ad,0000000..7c61d57
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/ScannerBase.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/ScannerBase.java
@@@ -1,130 -1,0 +1,130 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client;
+
+import java.util.Iterator;
+import java.util.Map.Entry;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.hadoop.io.Text;
+
+/**
+ * This class hosts configuration methods that are shared between different types of scanners.
+ *
+ */
+public interface ScannerBase extends Iterable<Entry<Key,Value>> {
+
+ /**
+ * Add a server-side scan iterator.
+ *
+ * @param cfg
+ * fully specified scan-time iterator, including all options for the iterator. Any changes to the iterator setting after this call are not propagated
+ * to the stored iterator.
+ * @throws IllegalArgumentException
+ * if the setting conflicts with existing iterators
+ */
+ public void addScanIterator(IteratorSetting cfg);
+
+ /**
+ * Remove an iterator from the list of iterators.
+ *
+ * @param iteratorName
+ * nickname used for the iterator
+ */
+ public void removeScanIterator(String iteratorName);
+
+ /**
+ * Update the options for an iterator. Note that this does <b>not</b> change the iterator options during a scan, it just replaces the given option on a
+ * configured iterator before a scan is started.
+ *
+ * @param iteratorName
+ * the name of the iterator to change
+ * @param key
+ * the name of the option
+ * @param value
+ * the new value for the named option
+ */
+ public void updateScanIteratorOption(String iteratorName, String key, String value);
+
+ /**
+ * Adds a column family to the list of columns that will be fetched by this scanner. By default when no columns have been added the scanner fetches all
+ * columns.
+ *
+ * @param col
+ * the column family to be fetched
+ */
+ public void fetchColumnFamily(Text col);
+
+ /**
+ * Adds a column to the list of columns that will be fetched by this scanner. The column is identified by family and qualifier. By default when no columns
+ * have been added the scanner fetches all columns.
+ *
+ * @param colFam
+ * the column family of the column to be fetched
+ * @param colQual
+ * the column qualifier of the column to be fetched
+ */
+ public void fetchColumn(Text colFam, Text colQual);
+
+ /**
+ * Clears the columns to be fetched (useful for resetting the scanner for reuse). Once cleared, the scanner will fetch all columns.
+ */
+ public void clearColumns();
+
+ /**
+ * Clears scan iterators prior to returning a scanner to the pool.
+ */
+ public void clearScanIterators();
+
+ /**
+ * Returns an iterator over an accumulo table. This iterator uses the options that are currently set for its lifetime, so setting options will have no effect
+ * on existing iterators.
+ *
+ * Keys returned by the iterator are not guaranteed to be in sorted order.
+ *
+ * @return an iterator over Key,Value pairs which meet the restrictions set on the scanner
+ */
++ @Override
+ public Iterator<Entry<Key,Value>> iterator();
+
+ /**
+ * This setting determines how long a scanner will automatically retry when a failure occurs. By default a scanner will retry forever.
+ *
+ * Setting to zero or Long.MAX_VALUE and TimeUnit.MILLISECONDS means to retry forever.
+ *
- * @param timeOut
+ * @param timeUnit
+ * determines how timeout is interpreted
+ * @since 1.5.0
+ */
+ public void setTimeout(long timeOut, TimeUnit timeUnit);
+
+ /**
+ * Returns the setting for how long a scanner will automatically retry when a failure occurs.
+ *
+ * @return the timeout configured for this scanner
+ * @since 1.5.0
+ */
+ public long getTimeout(TimeUnit timeUnit);
+
+ /**
+ * Closes any underlying connections on the scanner
+ * @since 1.5.0
+ */
+ public void close();
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/ZooKeeperInstance.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/ZooKeeperInstance.java
index 5197262,0000000..795ce9f
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/ZooKeeperInstance.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/ZooKeeperInstance.java
@@@ -1,320 -1,0 +1,318 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.client.impl.ConnectorImpl;
+import org.apache.accumulo.core.client.security.tokens.AuthenticationToken;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.accumulo.core.conf.AccumuloConfiguration;
+import org.apache.accumulo.core.conf.Property;
+import org.apache.accumulo.core.file.FileUtil;
+import org.apache.accumulo.core.security.CredentialHelper;
+import org.apache.accumulo.core.security.thrift.TCredentials;
+import org.apache.accumulo.core.util.ArgumentChecker;
+import org.apache.accumulo.core.util.ByteBufferUtil;
+import org.apache.accumulo.core.util.CachedConfiguration;
+import org.apache.accumulo.core.util.OpTimer;
+import org.apache.accumulo.core.util.TextUtil;
+import org.apache.accumulo.core.zookeeper.ZooUtil;
+import org.apache.accumulo.fate.zookeeper.ZooCache;
+import org.apache.hadoop.fs.FileStatus;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.io.Text;
+import org.apache.log4j.Level;
+import org.apache.log4j.Logger;
+
+/**
+ * <p>
+ * An implementation of instance that looks in zookeeper to find information needed to connect to an instance of accumulo.
+ *
+ * <p>
+ * The advantage of using zookeeper to obtain information about accumulo is that zookeeper is highly available, very responsive, and supports caching.
+ *
+ * <p>
+ * Because it is possible for multiple instances of accumulo to share a single set of zookeeper servers, all constructors require an accumulo instance name.
+ *
+ * If you do not know the instance names then run accumulo org.apache.accumulo.server.util.ListInstances on an accumulo server.
+ *
+ */
+
+public class ZooKeeperInstance implements Instance {
+
+ private static final Logger log = Logger.getLogger(ZooKeeperInstance.class);
+
+ private String instanceId = null;
+ private String instanceName = null;
+
+ private final ZooCache zooCache;
+
+ private final String zooKeepers;
+
+ private final int zooKeepersSessionTimeOut;
+
+ /**
+ *
+ * @param instanceName
+ * The name of specific accumulo instance. This is set at initialization time.
+ * @param zooKeepers
+ * A comma separated list of zoo keeper server locations. Each location can contain an optional port, of the format host:port.
+ */
+
+ public ZooKeeperInstance(String instanceName, String zooKeepers) {
+ this(instanceName, zooKeepers, (int) AccumuloConfiguration.getDefaultConfiguration().getTimeInMillis(Property.INSTANCE_ZK_TIMEOUT));
+ }
+
+ /**
+ *
+ * @param instanceName
+ * The name of specific accumulo instance. This is set at initialization time.
+ * @param zooKeepers
+ * A comma separated list of zoo keeper server locations. Each location can contain an optional port, of the format host:port.
+ * @param sessionTimeout
+ * zoo keeper session time out in milliseconds.
+ */
+
+ public ZooKeeperInstance(String instanceName, String zooKeepers, int sessionTimeout) {
+ ArgumentChecker.notNull(instanceName, zooKeepers);
+ this.instanceName = instanceName;
+ this.zooKeepers = zooKeepers;
+ this.zooKeepersSessionTimeOut = sessionTimeout;
+ zooCache = ZooCache.getInstance(zooKeepers, sessionTimeout);
+ getInstanceID();
+ }
+
+ /**
+ *
+ * @param instanceId
+ * The UUID that identifies the accumulo instance you want to connect to.
+ * @param zooKeepers
+ * A comma separated list of zoo keeper server locations. Each location can contain an optional port, of the format host:port.
+ */
+
+ public ZooKeeperInstance(UUID instanceId, String zooKeepers) {
+ this(instanceId, zooKeepers, (int) AccumuloConfiguration.getDefaultConfiguration().getTimeInMillis(Property.INSTANCE_ZK_TIMEOUT));
+ }
+
+ /**
+ *
+ * @param instanceId
+ * The UUID that identifies the accumulo instance you want to connect to.
+ * @param zooKeepers
+ * A comma separated list of zoo keeper server locations. Each location can contain an optional port, of the format host:port.
+ * @param sessionTimeout
+ * zoo keeper session time out in milliseconds.
+ */
+
+ public ZooKeeperInstance(UUID instanceId, String zooKeepers, int sessionTimeout) {
+ ArgumentChecker.notNull(instanceId, zooKeepers);
+ this.instanceId = instanceId.toString();
+ this.zooKeepers = zooKeepers;
+ this.zooKeepersSessionTimeOut = sessionTimeout;
+ zooCache = ZooCache.getInstance(zooKeepers, sessionTimeout);
+ }
+
+ @Override
+ public String getInstanceID() {
+ if (instanceId == null) {
+ // want the instance id to be stable for the life of this instance object,
+ // so only get it once
+ String instanceNamePath = Constants.ZROOT + Constants.ZINSTANCES + "/" + instanceName;
+ byte[] iidb = zooCache.get(instanceNamePath);
+ if (iidb == null) {
+ throw new RuntimeException("Instance name " + instanceName
+ + " does not exist in zookeeper. Run \"accumulo org.apache.accumulo.server.util.ListInstances\" to see a list.");
+ }
+ instanceId = new String(iidb, Constants.UTF8);
+ }
+
+ if (zooCache.get(Constants.ZROOT + "/" + instanceId) == null) {
+ if (instanceName == null)
+ throw new RuntimeException("Instance id " + instanceId + " does not exist in zookeeper");
+ throw new RuntimeException("Instance id " + instanceId + " pointed to by the name " + instanceName + " does not exist in zookeeper");
+ }
+
+ return instanceId;
+ }
+
+ @Override
+ public List<String> getMasterLocations() {
+ String masterLocPath = ZooUtil.getRoot(this) + Constants.ZMASTER_LOCK;
+
+ OpTimer opTimer = new OpTimer(log, Level.TRACE).start("Looking up master location in zoocache.");
+ byte[] loc = ZooUtil.getLockData(zooCache, masterLocPath);
+ opTimer.stop("Found master at " + (loc == null ? null : new String(loc, Constants.UTF8)) + " in %DURATION%");
+
+ if (loc == null) {
+ return Collections.emptyList();
+ }
+
+ return Collections.singletonList(new String(loc, Constants.UTF8));
+ }
+
+ @Override
+ public String getRootTabletLocation() {
+ String zRootLocPath = ZooUtil.getRoot(this) + Constants.ZROOT_TABLET_LOCATION;
+
+ OpTimer opTimer = new OpTimer(log, Level.TRACE).start("Looking up root tablet location in zookeeper.");
+ byte[] loc = zooCache.get(zRootLocPath);
+ opTimer.stop("Found root tablet at " + (loc == null ? null : new String(loc, Constants.UTF8)) + " in %DURATION%");
+
+ if (loc == null) {
+ return null;
+ }
+
+ return new String(loc, Constants.UTF8).split("\\|")[0];
+ }
+
+ @Override
+ public String getInstanceName() {
+ if (instanceName == null)
+ instanceName = lookupInstanceName(zooCache, UUID.fromString(getInstanceID()));
+
+ return instanceName;
+ }
+
+ @Override
+ public String getZooKeepers() {
+ return zooKeepers;
+ }
+
+ @Override
+ public int getZooKeepersSessionTimeOut() {
+ return zooKeepersSessionTimeOut;
+ }
+
+ @Override
+ @Deprecated
+ public Connector getConnector(String user, CharSequence pass) throws AccumuloException, AccumuloSecurityException {
+ return getConnector(user, TextUtil.getBytes(new Text(pass.toString())));
+ }
+
+ @Override
+ @Deprecated
+ public Connector getConnector(String user, ByteBuffer pass) throws AccumuloException, AccumuloSecurityException {
+ return getConnector(user, ByteBufferUtil.toBytes(pass));
+ }
+
+ @Override
+ public Connector getConnector(String principal, AuthenticationToken token) throws AccumuloException, AccumuloSecurityException {
+ return getConnector(CredentialHelper.create(principal, token, getInstanceID()));
+ }
+
+ @SuppressWarnings("deprecation")
+ private Connector getConnector(TCredentials credential) throws AccumuloException, AccumuloSecurityException {
+ return new ConnectorImpl(this, credential);
+ }
+
+ @Override
+ @Deprecated
+ public Connector getConnector(String principal, byte[] pass) throws AccumuloException, AccumuloSecurityException {
+ return getConnector(principal, new PasswordToken(pass));
+ }
+
+ private AccumuloConfiguration conf = null;
+
+ @Override
+ public AccumuloConfiguration getConfiguration() {
+ if (conf == null)
+ conf = AccumuloConfiguration.getDefaultConfiguration();
+ return conf;
+ }
+
+ @Override
+ public void setConfiguration(AccumuloConfiguration conf) {
+ this.conf = conf;
+ }
+
+ /**
+ * @deprecated Use {@link #lookupInstanceName(org.apache.accumulo.fate.zookeeper.ZooCache, UUID)} instead
+ */
+ @Deprecated
+ public static String lookupInstanceName(org.apache.accumulo.core.zookeeper.ZooCache zooCache, UUID instanceId) {
+ return lookupInstanceName((ZooCache) zooCache, instanceId);
+ }
+
+ /**
+ * Given a zooCache and instanceId, look up the instance name.
+ *
- * @param zooCache
- * @param instanceId
+ * @return the instance name
+ */
+ public static String lookupInstanceName(ZooCache zooCache, UUID instanceId) {
+ ArgumentChecker.notNull(zooCache, instanceId);
+ for (String name : zooCache.getChildren(Constants.ZROOT + Constants.ZINSTANCES)) {
+ String instanceNamePath = Constants.ZROOT + Constants.ZINSTANCES + "/" + name;
+ byte[] bytes = zooCache.get(instanceNamePath);
+ UUID iid = UUID.fromString(new String(bytes, Constants.UTF8));
+ if (iid.equals(instanceId)) {
+ return name;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * To be moved to server code. Only lives here to support certain client side utilities to minimize command-line options.
+ */
+ @Deprecated
+ public static String getInstanceIDFromHdfs(Path instanceDirectory) {
+ try {
+ FileSystem fs = FileUtil.getFileSystem(CachedConfiguration.getInstance(), AccumuloConfiguration.getSiteConfiguration());
+ FileStatus[] files = null;
+ try {
+ files = fs.listStatus(instanceDirectory);
+ } catch (FileNotFoundException ex) {
+ // ignored
+ }
+ log.debug("Trying to read instance id from " + instanceDirectory);
+ if (files == null || files.length == 0) {
+ log.error("unable obtain instance id at " + instanceDirectory);
+ throw new RuntimeException("Accumulo not initialized, there is no instance id at " + instanceDirectory);
+ } else if (files.length != 1) {
+ log.error("multiple potential instances in " + instanceDirectory);
+ throw new RuntimeException("Accumulo found multiple possible instance ids in " + instanceDirectory);
+ } else {
+ String result = files[0].getPath().getName();
+ return result;
+ }
+ } catch (IOException e) {
+ log.error("Problem reading instance id out of hdfs at " + instanceDirectory, e);
+ throw new RuntimeException("Can't tell if Accumulo is initialized; can't read instance id at " + instanceDirectory, e);
+ } catch (IllegalArgumentException exception) {
+ /* HDFS throws this when there's a UnknownHostException due to DNS troubles. */
+ if (exception.getCause() instanceof UnknownHostException) {
+ log.error("Problem reading instance id out of hdfs at " + instanceDirectory, exception);
+ }
+ throw exception;
+ }
+ }
+
+ @Deprecated
+ @Override
+ public Connector getConnector(org.apache.accumulo.core.security.thrift.AuthInfo auth) throws AccumuloException, AccumuloSecurityException {
+ return getConnector(auth.user, auth.password);
+ }
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/admin/ActiveCompaction.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/admin/ActiveCompaction.java
index f2876b2,0000000..9c39ea6
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/admin/ActiveCompaction.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/admin/ActiveCompaction.java
@@@ -1,185 -1,0 +1,184 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client.admin;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.client.TableNotFoundException;
+import org.apache.accumulo.core.client.impl.Tables;
+import org.apache.accumulo.core.data.KeyExtent;
+import org.apache.accumulo.core.data.thrift.IterInfo;
+
+
+/**
+ *
+ * @since 1.5.0
+ */
+public class ActiveCompaction {
+
+ private org.apache.accumulo.core.tabletserver.thrift.ActiveCompaction tac;
+ private Instance instance;
+
+ ActiveCompaction(Instance instance, org.apache.accumulo.core.tabletserver.thrift.ActiveCompaction tac) {
+ this.tac = tac;
+ this.instance = instance;
+ }
+
+ public static enum CompactionType {
+ /**
+ * compaction to flush a tablets memory
+ */
+ MINOR,
+ /**
+ * compaction to flush a tablets memory and merge it with the tablets smallest file. This type compaction is done when a tablet has too many files
+ */
+ MERGE,
+ /**
+ * compaction that merges a subset of a tablets files into one file
+ */
+ MAJOR,
+ /**
+ * compaction that merges all of a tablets files into one file
+ */
+ FULL
+ };
+
+ public static enum CompactionReason {
+ /**
+ * compaction initiated by user
+ */
+ USER,
+ /**
+ * Compaction initiated by system
+ */
+ SYSTEM,
+ /**
+ * Compaction initiated by merge operation
+ */
+ CHOP,
+ /**
+ * idle compaction
+ */
+ IDLE,
+ /**
+ * Compaction initiated to close a unload a tablet
+ */
+ CLOSE
+ };
+
+ /**
+ *
+ * @return name of the table the compaction is running against
- * @throws TableNotFoundException
+ */
+
+ public String getTable() throws TableNotFoundException {
+ return Tables.getTableName(instance, getExtent().getTableId().toString());
+ }
+
+ /**
+ * @return tablet thats is compacting
+ */
+
+ public KeyExtent getExtent() {
+ return new KeyExtent(tac.getExtent());
+ }
+
+ /**
+ * @return how long the compaction has been running in milliseconds
+ */
+
+ public long getAge() {
+ return tac.getAge();
+ }
+
+ /**
+ * @return the files the compaction is reading from
+ */
+
+ public List<String> getInputFiles() {
+ return tac.getInputFiles();
+ }
+
+ /**
+ * @return file compactions is writing too
+ */
+
+ public String getOutputFile() {
+ return tac.getOutputFile();
+ }
+
+ /**
+ * @return the type of compaction
+ */
+ public CompactionType getType() {
+ return CompactionType.valueOf(tac.getType().name());
+ }
+
+ /**
+ * @return the reason the compaction was started
+ */
+
+ public CompactionReason getReason() {
+ return CompactionReason.valueOf(tac.getReason().name());
+ }
+
+ /**
+ * @return the locality group that is compacting
+ */
+
+ public String getLocalityGroup() {
+ return tac.getLocalityGroup();
+ }
+
+ /**
+ * @return the number of key/values read by the compaction
+ */
+
+ public long getEntriesRead() {
+ return tac.getEntriesRead();
+ }
+
+ /**
+ * @return the number of key/values written by the compaction
+ */
+
+ public long getEntriesWritten() {
+ return tac.getEntriesWritten();
+ }
+
+ /**
+ * @return the per compaction iterators configured
+ */
+
+ public List<IteratorSetting> getIterators() {
+ ArrayList<IteratorSetting> ret = new ArrayList<IteratorSetting>();
+
+ for (IterInfo ii : tac.getSsiList()) {
+ IteratorSetting settings = new IteratorSetting(ii.getPriority(), ii.getIterName(), ii.getClassName());
+ Map<String,String> options = tac.getSsio().get(ii.getIterName());
+ settings.addOptions(options);
+
+ ret.add(settings);
+ }
+
+ return ret;
+ }
+}
http://git-wip-us.apache.org/repos/asf/accumulo/blob/92613388/core/src/main/java/org/apache/accumulo/core/client/admin/InstanceOperations.java
----------------------------------------------------------------------
diff --cc core/src/main/java/org/apache/accumulo/core/client/admin/InstanceOperations.java
index fce0716,0000000..29ff2a6
mode 100644,000000..100644
--- a/core/src/main/java/org/apache/accumulo/core/client/admin/InstanceOperations.java
+++ b/core/src/main/java/org/apache/accumulo/core/client/admin/InstanceOperations.java
@@@ -1,131 -1,0 +1,119 @@@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.accumulo.core.client.admin;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+
+/**
+ *
+ */
+public interface InstanceOperations {
+
+ /**
+ * Sets an system property in zookeeper. Tablet servers will pull this setting and override the equivalent setting in accumulo-site.xml. Changes can be seen
+ * using {@link #getSystemConfiguration()}
+ *
+ * @param property
+ * the name of a per-table property
+ * @param value
+ * the value to set a per-table property to
+ * @throws AccumuloException
+ * if a general error occurs
+ * @throws AccumuloSecurityException
+ * if the user does not have permission
+ */
+ public void setProperty(final String property, final String value) throws AccumuloException, AccumuloSecurityException;
+
+ /**
+ * Removes a system property from zookeeper. Changes can be seen using {@link #getSystemConfiguration()}
+ *
+ * @param property
+ * the name of a per-table property
+ * @throws AccumuloException
+ * if a general error occurs
+ * @throws AccumuloSecurityException
+ * if the user does not have permission
+ */
+ public void removeProperty(final String property) throws AccumuloException, AccumuloSecurityException;
+
+ /**
+ *
+ * @return A map of system properties set in zookeeper. If a property is not set in zookeeper, then it will return the value set in accumulo-site.xml on some
+ * server. If nothing is set in an accumulo-site.xml file it will return the default value for each property.
- * @throws AccumuloException
- * @throws AccumuloSecurityException
+ */
+
+ public Map<String,String> getSystemConfiguration() throws AccumuloException, AccumuloSecurityException;
+
+ /**
+ *
+ * @return A map of system properties set in accumulo-site.xml on some server. If nothing is set in an accumulo-site.xml file it will return the default value
+ * for each property.
- * @throws AccumuloException
- * @throws AccumuloSecurityException
+ */
+
+ public Map<String,String> getSiteConfiguration() throws AccumuloException, AccumuloSecurityException;
+
+ /**
+ * List the currently active tablet servers participating in the accumulo instance
+ *
+ * @return A list of currently active tablet servers.
+ */
+
+ public List<String> getTabletServers();
+
+ /**
+ * List the active scans on tablet server.
+ *
+ * @param tserver
+ * The tablet server address should be of the form <ip address>:<port>
+ * @return A list of active scans on tablet server.
- * @throws AccumuloException
- * @throws AccumuloSecurityException
+ */
+
+ public List<ActiveScan> getActiveScans(String tserver) throws AccumuloException, AccumuloSecurityException;
+
+ /**
+ * List the active compaction running on a tablet server
+ *
+ * @param tserver
+ * The tablet server address should be of the form <ip address>:<port>
+ * @return the list of active compactions
- * @throws AccumuloException
- * @throws AccumuloSecurityException
+ * @since 1.5.0
+ */
+
+ public List<ActiveCompaction> getActiveCompactions(String tserver) throws AccumuloException, AccumuloSecurityException;
+
+ /**
+ * Throws an exception if a tablet server can not be contacted.
+ *
+ * @param tserver
+ * The tablet server address should be of the form <ip address>:<port>
- * @throws AccumuloException
+ * @since 1.5.0
+ */
+ public void ping(String tserver) throws AccumuloException;
+
+ /**
+ * Test to see if the instance can load the given class as the given type. This check does not consider per table classpaths, see
+ * {@link TableOperations#testClassLoad(String, String, String)}
+ *
- * @param className
- * @param asTypeName
+ * @return true if the instance can load the given class as the given type, false otherwise
- * @throws AccumuloException
+ */
+ public boolean testClassLoad(final String className, final String asTypeName) throws AccumuloException, AccumuloSecurityException;
+
+}