You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2026/04/29 23:54:31 UTC

(hbase-site) branch asf-site updated: Published site at 30f7266f085980aae04625ddfae015d398e787a7.

This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 94eab49c0a6 Published site at 30f7266f085980aae04625ddfae015d398e787a7.
94eab49c0a6 is described below

commit 94eab49c0a6ee287eae6d1d8436d7aa961a0bb72
Author: HBase <de...@hbase.apache.org>
AuthorDate: Wed Apr 29 23:50:20 2026 +0000

    Published site at 30f7266f085980aae04625ddfae015d398e787a7.
---
 .../apache/hadoop/hbase/CompatibilityFactory.html  |    2 +-
 .../apache/hadoop/hbase/ExecutorStatusChore.html   |    2 +-
 .../hbase/HBaseTestingUtility.SeenRowTracker.html  | 7943 ++++++++++----------
 .../apache/hadoop/hbase/HBaseTestingUtility.html   | 7943 ++++++++++----------
 ...LogManagerCoordination.CreateAsyncCallback.html |    2 +-
 ...agerCoordination.CreateRescanAsyncCallback.html |    2 +-
 ...LogManagerCoordination.DeleteAsyncCallback.html |    2 +-
 ...ogManagerCoordination.GetDataAsyncCallback.html |    2 +-
 ...LogManagerCoordination.TaskFinisher.Status.html |    2 +-
 ...ZKSplitLogManagerCoordination.TaskFinisher.html |    2 +-
 .../ZKSplitLogManagerCoordination.html             |    2 +-
 .../coprocessor/MultiRowMutationEndpoint.html      |    2 +-
 ...leStreamGzipCodec.ReusableGzipOutputStream.html |    2 +-
 .../hbase/io/compress/ReusableStreamGzipCodec.html |    2 +-
 .../hadoop/hbase/io/hfile/HFilePreadReader.html    |    2 +-
 .../hbase/mapreduce/Import.CellImporter.html       |    2 +-
 .../hadoop/hbase/mapreduce/Import.CellReducer.html |    2 +-
 .../hbase/mapreduce/Import.CellSortImporter.html   |    2 +-
 ...lWritableComparable.CellWritableComparator.html |    2 +-
 .../mapreduce/Import.CellWritableComparable.html   |    2 +-
 .../Import.CellWritableComparablePartitioner.html  |    2 +-
 .../hadoop/hbase/mapreduce/Import.Importer.html    |    2 +-
 .../org/apache/hadoop/hbase/mapreduce/Import.html  |    2 +-
 .../hbase/metrics/MetricRegistriesLoader.html      |    2 +-
 .../hbase/thrift/HThreadedSelectorServerArgs.html  |    2 +-
 books/apache-hbase-reference-guide-dark-mode.pdf   |  Bin 38886598 -> 38886598 bytes
 books/apache-hbase-reference-guide.pdf             |  Bin 38776474 -> 38776474 bytes
 checkstyle-aggregate.html                          |   66 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/index-all.html                          |   10 +-
 devapidocs/member-search-index.js                  |    2 +-
 ...tingUtility.FsDatasetAsyncDiskServiceFixer.html |   12 +-
 .../hbase/HBaseTestingUtility.SeenRowTracker.html  |   20 +-
 .../apache/hadoop/hbase/HBaseTestingUtility.html   |  544 +-
 .../hadoop/metrics2/class-use/MetricsExecutor.html |    4 +-
 .../JmxCacheBuster.JmxCacheBusterRunnable.html     |    6 +-
 .../hadoop/metrics2/impl/JmxCacheBuster.html       |   32 +-
 .../apache/hadoop/hbase/CompatibilityFactory.html  |    2 +-
 .../apache/hadoop/hbase/ExecutorStatusChore.html   |    2 +-
 ...tingUtility.FsDatasetAsyncDiskServiceFixer.html | 7943 ++++++++++----------
 .../hbase/HBaseTestingUtility.SeenRowTracker.html  | 7943 ++++++++++----------
 .../apache/hadoop/hbase/HBaseTestingUtility.html   | 7943 ++++++++++----------
 ...seAdmin.AddColumnFamilyProcedureBiConsumer.html |    2 +-
 .../client/RawAsyncHBaseAdmin.AdminRpcCall.html    |    2 +-
 .../hbase/client/RawAsyncHBaseAdmin.Converter.html |    2 +-
 ...seAdmin.CreateNamespaceProcedureBiConsumer.html |    2 +-
 ...cHBaseAdmin.CreateTableProcedureBiConsumer.html |    2 +-
 ...dmin.DeleteColumnFamilyProcedureBiConsumer.html |    2 +-
 ...seAdmin.DeleteNamespaceProcedureBiConsumer.html |    2 +-
 ...cHBaseAdmin.DeleteTableProcedureBiConsumer.html |    2 +-
 ...HBaseAdmin.DisableTableProcedureBiConsumer.html |    2 +-
 ...cHBaseAdmin.EnableTableProcedureBiConsumer.html |    2 +-
 ...ncHBaseAdmin.FlushTableProcedureBiConsumer.html |    2 +-
 .../client/RawAsyncHBaseAdmin.MasterRpcCall.html   |    2 +-
 ...eAdmin.MergeTableRegionProcedureBiConsumer.html |    2 +-
 ...dmin.ModifyColumnFamilyProcedureBiConsumer.html |    2 +-
 ...nFamilyStoreFileTrackerProcedureBiConsumer.html |    2 +-
 ...seAdmin.ModifyNamespaceProcedureBiConsumer.html |    2 +-
 ...cHBaseAdmin.ModifyTableProcedureBiConsumer.html |    2 +-
 ...fyTableStoreFileTrackerProcedureBiConsumer.html |    2 +-
 ...yncHBaseAdmin.NamespaceProcedureBiConsumer.html |    2 +-
 .../RawAsyncHBaseAdmin.ProcedureBiConsumer.html    |    2 +-
 ...dmin.ReopenTableRegionsProcedureBiConsumer.html |    2 +-
 ...cHBaseAdmin.ReplicationProcedureBiConsumer.html |    2 +-
 ...estoreBackupSystemTableProcedureBiConsumer.html |    2 +-
 ...syncHBaseAdmin.RollAllWALWritersBiConsumer.html |    2 +-
 ...syncHBaseAdmin.SnapshotProcedureBiConsumer.html |    2 +-
 ...eAdmin.SplitTableRegionProcedureBiConsumer.html |    2 +-
 ...awAsyncHBaseAdmin.TableProcedureBiConsumer.html |    2 +-
 ...aseAdmin.TruncateRegionProcedureBiConsumer.html |    2 +-
 ...BaseAdmin.TruncateTableProcedureBiConsumer.html |    2 +-
 .../hadoop/hbase/client/RawAsyncHBaseAdmin.html    |    2 +-
 ...LogManagerCoordination.CreateAsyncCallback.html |    2 +-
 ...agerCoordination.CreateRescanAsyncCallback.html |    2 +-
 ...LogManagerCoordination.DeleteAsyncCallback.html |    2 +-
 ...ogManagerCoordination.GetDataAsyncCallback.html |    2 +-
 ...LogManagerCoordination.TaskFinisher.Status.html |    2 +-
 ...ZKSplitLogManagerCoordination.TaskFinisher.html |    2 +-
 .../ZKSplitLogManagerCoordination.html             |    2 +-
 .../coprocessor/MultiRowMutationEndpoint.html      |    2 +-
 ...GzipOutputStream.ResetableGZIPOutputStream.html |    2 +-
 ...leStreamGzipCodec.ReusableGzipOutputStream.html |    2 +-
 .../hbase/io/compress/ReusableStreamGzipCodec.html |    2 +-
 .../hadoop/hbase/io/hfile/HFilePreadReader.html    |    2 +-
 .../hbase/mapreduce/Import.CellImporter.html       |    2 +-
 .../hadoop/hbase/mapreduce/Import.CellReducer.html |    2 +-
 .../hbase/mapreduce/Import.CellSortImporter.html   |    2 +-
 ...lWritableComparable.CellWritableComparator.html |    2 +-
 .../mapreduce/Import.CellWritableComparable.html   |    2 +-
 .../Import.CellWritableComparablePartitioner.html  |    2 +-
 .../hadoop/hbase/mapreduce/Import.Importer.html    |    2 +-
 .../org/apache/hadoop/hbase/mapreduce/Import.html  |    2 +-
 .../hbase/metrics/MetricRegistriesLoader.html      |    2 +-
 .../regionserver/ReplicationSourceLogQueue.html    |    2 +-
 .../SaslServerAuthenticationProviders.html         |    2 +-
 .../hbase/thrift/HThreadedSelectorServerArgs.html  |    2 +-
 .../hadoop/hbase/tool/CanaryTool.Monitor.html      |    2 +-
 .../hbase/tool/CanaryTool.RegionMonitor.html       |    2 +-
 .../hbase/tool/CanaryTool.RegionServerMonitor.html |    2 +-
 .../tool/CanaryTool.RegionServerStdOutSink.html    |    2 +-
 .../hbase/tool/CanaryTool.RegionServerTask.html    |    2 +-
 .../hbase/tool/CanaryTool.RegionStdOutSink.html    |    2 +-
 .../hbase/tool/CanaryTool.RegionTask.TaskType.html |    2 +-
 .../hadoop/hbase/tool/CanaryTool.RegionTask.html   |    2 +-
 .../hbase/tool/CanaryTool.RegionTaskResult.html    |    2 +-
 .../apache/hadoop/hbase/tool/CanaryTool.Sink.html  |    2 +-
 .../hadoop/hbase/tool/CanaryTool.StdOutSink.html   |    2 +-
 .../hbase/tool/CanaryTool.ZookeeperMonitor.html    |    2 +-
 .../hbase/tool/CanaryTool.ZookeeperStdOutSink.html |    2 +-
 .../hbase/tool/CanaryTool.ZookeeperTask.html       |    2 +-
 .../org/apache/hadoop/hbase/tool/CanaryTool.html   |    2 +-
 ...overedEditsOutputSink.RecoveredEditsWriter.html |    2 +-
 .../wal/AbstractRecoveredEditsOutputSink.html      |    2 +-
 .../JmxCacheBuster.JmxCacheBusterRunnable.html     |   90 +-
 .../hadoop/metrics2/impl/JmxCacheBuster.html       |   90 +-
 hbase-website/dependency-convergence.html          |    2 +-
 hbase-website/dependency-info.html                 |    2 +-
 hbase-website/dependency-management.html           |    2 +-
 hbase-website/index.html                           |    2 +-
 hbase-website/issue-management.html                |    2 +-
 hbase-website/licenses.html                        |    2 +-
 hbase-website/mailing-lists.html                   |    2 +-
 hbase-website/plugin-management.html               |    2 +-
 hbase-website/plugins.html                         |    2 +-
 hbase-website/project-info.html                    |    2 +-
 hbase-website/scm.html                             |    2 +-
 hbase-website/summary.html                         |    2 +-
 hbase-website/team.html                            |    2 +-
 issue-management.html                              |    2 +-
 licenses.html                                      |    2 +-
 mailing-lists.html                                 |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 scm.html                                           |    2 +-
 summary.html                                       |    2 +-
 team.html                                          |    2 +-
 testapidocs/allclasses-index.html                  | 2692 +++----
 testapidocs/index-all.html                         |   48 +-
 testapidocs/member-search-index.js                 |    2 +-
 .../class-use/HBaseParameterizedTestTemplate.html  |   33 +-
 .../client/class-use/FromClientSideTest2.html      |  106 +
 .../client/class-use/FromClientSideTestBase.html   |   74 +-
 .../client/class-use/TestFromClientSide2.html      |   62 +
 .../TestFromClientSide2WithCoprocessor.html        |   62 +
 .../hadoop/hbase/client/package-summary.html       | 1020 +--
 .../apache/hadoop/hbase/client/package-tree.html   |    6 +
 .../apache/hadoop/hbase/client/package-use.html    |  104 +-
 .../class-use/TestFromClientSide2WoUnsafe.html     |   62 +
 .../apache/hadoop/hbase/util/package-summary.html  |  180 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |    5 +
 testapidocs/overview-tree.html                     |    7 +
 .../hbase/HBaseTestingUtil.SeenRowTracker.html     | 7143 +++++++++---------
 .../org/apache/hadoop/hbase/HBaseTestingUtil.html  | 7143 +++++++++---------
 ...tConnectionRegistriesTestBase.RegistryImpl.html |    2 +-
 ...eWithDifferentConnectionRegistriesTestBase.html |    2 +-
 .../hadoop/hbase/client/FromClientSideTest2.html   |  596 ++
 ...SideTest3.WaitingForMultiMutationsObserver.html | 1552 ++--
 ...FromClientSideTest3.WaitingForScanObserver.html | 1552 ++--
 .../hadoop/hbase/client/FromClientSideTest3.html   | 1552 ++--
 .../hadoop/hbase/client/TestFromClientSide2.html   |   43 +-
 .../client/TestFromClientSide2WithCoprocessor.html |   51 +-
 ...stGlobalFilter.RecordingFilter.Initializer.html |    2 +-
 .../http/TestGlobalFilter.RecordingFilter.html     |    2 +-
 .../apache/hadoop/hbase/http/TestGlobalFilter.html |    2 +-
 ...TestPathFilter.RecordingFilter.Initializer.html |    2 +-
 .../hbase/http/TestPathFilter.RecordingFilter.html |    2 +-
 .../apache/hadoop/hbase/http/TestPathFilter.html   |    2 +-
 .../TestServletFilter.ErrorFilter.Initializer.html |    2 +-
 .../hbase/http/TestServletFilter.ErrorFilter.html  |    2 +-
 ...TestServletFilter.SimpleFilter.Initializer.html |    2 +-
 .../hbase/http/TestServletFilter.SimpleFilter.html |    2 +-
 .../hadoop/hbase/http/TestServletFilter.html       |    2 +-
 .../MultiTableInputFormatTestBase.ScanMapper.html  |    2 +-
 .../MultiTableInputFormatTestBase.ScanReducer.html |    2 +-
 .../mapreduce/MultiTableInputFormatTestBase.html   |    2 +-
 .../hadoop/hbase/master/AbstractTestDLS.html       |    2 +-
 .../TestMasterOperationsForRegionReplicas.html     |  637 +-
 .../hbase/namequeues/TestWALEventTracker.html      |    2 +-
 .../regionserver/TestHRegionReplayEvents.html      |    2 +-
 .../regionserver/TestRegionReplicaFailover.html    |  637 +-
 .../hbase/regionserver/wal/TestLogRollAbort.html   |    2 +-
 .../TestReplicationStuckWithDroppedTable.html      |    2 +-
 .../hbase/rsgroup/EnableRSGroupsTestBase.html      |    2 +-
 .../TestConcurrentFlushSnapshotFromClient.html     |   29 +-
 .../snapshot/TestMobFlushSnapshotFromClient.html   |    2 +-
 .../snapshot/TestSnapshotWhenChoreCleaning.html    |    2 +-
 .../hbase/util/TestFromClientSide2WoUnsafe.html    |  144 +
 .../hadoop/hbase/wal/CompressedWALTestBase.html    |  221 +-
 .../apache/hadoop/hbase/wal/TestCompressedWAL.html |   72 +-
 .../wal/TestCompressedWALValueCompression.html     |   78 +-
 .../hadoop/hbase/wal/TestWALSplitToHFile.html      |    2 +-
 ...LCorruptionDueToDanglingByteBufferTestBase.html |    2 +-
 testapidocs/type-search-index.js                   |    2 +-
 testdevapidocs/allclasses-index.html               | 3966 +++++-----
 testdevapidocs/index-all.html                      |  122 +-
 testdevapidocs/member-search-index.js              |    2 +-
 ...TestingUtil.FsDatasetAsyncDiskServiceFixer.html |   12 +-
 .../hbase/HBaseTestingUtil.SeenRowTracker.html     |   20 +-
 .../org/apache/hadoop/hbase/HBaseTestingUtil.html  |  504 +-
 .../hadoop/hbase/class-use/HBaseClassTestRule.html |  206 +-
 .../class-use/HBaseParameterizedTestTemplate.html  |   33 +-
 ...ientSideTest3.html => FromClientSideTest2.html} |  357 +-
 ...SideTest3.WaitingForMultiMutationsObserver.html |   10 +-
 ...FromClientSideTest3.WaitingForScanObserver.html |   12 +-
 .../hadoop/hbase/client/FromClientSideTest3.html   |  319 +-
 .../hbase/client/FromClientSideTestBase.html       |    2 +-
 ...omClientSide3.html => TestFromClientSide2.html} |   39 +-
 ...tml => TestFromClientSide2WithCoprocessor.html} |   39 +-
 .../hadoop/hbase/client/TestFromClientSide3.html   |    2 +-
 .../client/TestFromClientSide3WithCoprocessor.html |    2 +-
 .../client/class-use/FromClientSideTest2.html      |  106 +
 .../client/class-use/FromClientSideTestBase.html   |   74 +-
 .../client/class-use/TestFromClientSide2.html      |   62 +
 .../TestFromClientSide2WithCoprocessor.html        |   62 +
 .../hadoop/hbase/client/package-summary.html       | 1098 +--
 .../apache/hadoop/hbase/client/package-tree.html   |    6 +
 .../apache/hadoop/hbase/client/package-use.html    |  128 +-
 .../aircompressor/TestHFileCompressionLz4.html     |   26 +-
 .../aircompressor/TestHFileCompressionLzo.html     |   26 +-
 .../aircompressor/TestHFileCompressionSnappy.html  |   26 +-
 .../aircompressor/TestHFileCompressionZstd.html    |   26 +-
 .../io/compress/aircompressor/TestLz4Codec.html    |   39 +-
 .../io/compress/aircompressor/TestLzoCodec.html    |   39 +-
 .../io/compress/aircompressor/TestSnappyCodec.html |   39 +-
 .../aircompressor/TestWALCompressionLz4.html       |   36 +-
 .../aircompressor/TestWALCompressionLzo.html       |   36 +-
 .../aircompressor/TestWALCompressionSnappy.html    |   36 +-
 .../aircompressor/TestWALCompressionZstd.html      |   36 +-
 .../io/compress/aircompressor/TestZstdCodec.html   |   39 +-
 .../hbase/io/compress/brotli/TestBrotliCodec.html  |   39 +-
 .../brotli/TestHFileCompressionBrotli.html         |   26 +-
 .../compress/brotli/TestWALCompressionBrotli.html  |   36 +-
 .../io/compress/lz4/TestHFileCompressionLz4.html   |   26 +-
 .../hadoop/hbase/io/compress/lz4/TestLz4Codec.html |   39 +-
 .../io/compress/lz4/TestWALCompressionLz4.html     |   36 +-
 .../xerial/TestHFileCompressionSnappy.html         |   26 +-
 .../hbase/io/compress/xerial/TestSnappyCodec.html  |   42 +-
 .../compress/xerial/TestWALCompressionSnappy.html  |   36 +-
 .../io/compress/zstd/TestHFileCompressionZstd.html |   35 +-
 .../io/compress/zstd/TestWALCompressionZstd.html   |   36 +-
 .../zstd/TestZstdByteBuffDecompressor.html         |   35 +-
 .../hbase/io/compress/zstd/TestZstdCodec.html      |   39 +-
 .../hbase/io/compress/zstd/TestZstdDictionary.html |   40 +-
 .../zstd/TestZstdDictionarySplitMerge.html         |   35 +-
 .../TestMasterOperationsForRegionReplicas.html     |   36 +-
 ...stCreateTableNoRegionServer.HMasterForTest.html |    8 +-
 .../procedure/TestCreateTableNoRegionServer.html   |   22 +-
 .../org/apache/hadoop/hbase/package-use.html       |   66 +-
 .../regionserver/TestRegionReplicaFailover.html    |   46 +-
 .../TestConcurrentFlushSnapshotFromClient.html     |    4 +-
 ...nsafe.html => TestFromClientSide2WoUnsafe.html} |   41 +-
 .../hbase/util/TestFromClientSide3WoUnsafe.html    |    2 +-
 .../class-use/TestFromClientSide2WoUnsafe.html     |   62 +
 .../apache/hadoop/hbase/util/package-summary.html  |  210 +-
 .../org/apache/hadoop/hbase/util/package-tree.html |    5 +
 .../hadoop/hbase/wal/CompressedWALTestBase.html    |   37 +-
 .../apache/hadoop/hbase/wal/TestCompressedWAL.html |   14 +-
 .../wal/TestCompressedWALValueCompression.html     |   14 +-
 testdevapidocs/overview-tree.html                  |    7 +
 ...TestingUtil.FsDatasetAsyncDiskServiceFixer.html | 7143 +++++++++---------
 .../hbase/HBaseTestingUtil.SeenRowTracker.html     | 7143 +++++++++---------
 .../org/apache/hadoop/hbase/HBaseTestingUtil.html  | 7143 +++++++++---------
 ...tConnectionRegistriesTestBase.RegistryImpl.html |    2 +-
 ...eWithDifferentConnectionRegistriesTestBase.html |    2 +-
 .../hadoop/hbase/client/FromClientSideTest2.html   |  596 ++
 ...SideTest3.WaitingForMultiMutationsObserver.html | 1552 ++--
 ...FromClientSideTest3.WaitingForScanObserver.html | 1552 ++--
 .../hadoop/hbase/client/FromClientSideTest3.html   | 1552 ++--
 .../TestFromClientSide2.html}                      |   43 +-
 .../TestFromClientSide2WithCoprocessor.html}       |   51 +-
 ...stGlobalFilter.RecordingFilter.Initializer.html |    2 +-
 .../http/TestGlobalFilter.RecordingFilter.html     |    2 +-
 .../apache/hadoop/hbase/http/TestGlobalFilter.html |    2 +-
 ...TestPathFilter.RecordingFilter.Initializer.html |    2 +-
 .../hbase/http/TestPathFilter.RecordingFilter.html |    2 +-
 .../apache/hadoop/hbase/http/TestPathFilter.html   |    2 +-
 .../TestServletFilter.ErrorFilter.Initializer.html |    2 +-
 .../hbase/http/TestServletFilter.ErrorFilter.html  |    2 +-
 ...TestServletFilter.SimpleFilter.Initializer.html |    2 +-
 .../hbase/http/TestServletFilter.SimpleFilter.html |    2 +-
 .../hadoop/hbase/http/TestServletFilter.html       |    2 +-
 .../aircompressor/TestHFileCompressionLz4.html     |   66 +-
 .../aircompressor/TestHFileCompressionLzo.html     |   66 +-
 .../aircompressor/TestHFileCompressionSnappy.html  |   66 +-
 .../aircompressor/TestHFileCompressionZstd.html    |   66 +-
 .../io/compress/aircompressor/TestLz4Codec.html    |   56 +-
 .../io/compress/aircompressor/TestLzoCodec.html    |   57 +-
 .../io/compress/aircompressor/TestSnappyCodec.html |   57 +-
 .../aircompressor/TestWALCompressionLz4.html       |   64 +-
 .../aircompressor/TestWALCompressionLzo.html       |   63 +-
 .../aircompressor/TestWALCompressionSnappy.html    |   64 +-
 .../aircompressor/TestWALCompressionZstd.html      |   64 +-
 .../io/compress/aircompressor/TestZstdCodec.html   |   57 +-
 .../hbase/io/compress/brotli/TestBrotliCodec.html  |   57 +-
 .../brotli/TestHFileCompressionBrotli.html         |   66 +-
 .../compress/brotli/TestWALCompressionBrotli.html  |   64 +-
 .../io/compress/lz4/TestHFileCompressionLz4.html   |   66 +-
 .../hadoop/hbase/io/compress/lz4/TestLz4Codec.html |   57 +-
 .../io/compress/lz4/TestWALCompressionLz4.html     |   63 +-
 .../xerial/TestHFileCompressionSnappy.html         |   70 +-
 .../hbase/io/compress/xerial/TestSnappyCodec.html  |   71 +-
 .../compress/xerial/TestWALCompressionSnappy.html  |   68 +-
 .../io/compress/zstd/TestHFileCompressionZstd.html |  131 +-
 .../io/compress/zstd/TestWALCompressionZstd.html   |   63 +-
 .../zstd/TestZstdByteBuffDecompressor.html         |  191 +-
 .../hbase/io/compress/zstd/TestZstdCodec.html      |   71 +-
 .../hbase/io/compress/zstd/TestZstdDictionary.html |  135 +-
 .../zstd/TestZstdDictionarySplitMerge.html         |  231 +-
 .../MultiTableInputFormatTestBase.ScanMapper.html  |    2 +-
 .../MultiTableInputFormatTestBase.ScanReducer.html |    2 +-
 .../mapreduce/MultiTableInputFormatTestBase.html   |    2 +-
 .../hadoop/hbase/master/AbstractTestDLS.html       |    2 +-
 .../TestMasterOperationsForRegionReplicas.html     |  637 +-
 ...stCreateTableNoRegionServer.HMasterForTest.html |  244 +-
 .../procedure/TestCreateTableNoRegionServer.html   |  244 +-
 .../procedure/TestMasterProcedureEvents.html       |    2 +-
 .../hbase/namequeues/TestWALEventTracker.html      |    2 +-
 .../regionserver/TestHRegionReplayEvents.html      |    2 +-
 .../regionserver/TestRegionReplicaFailover.html    |  637 +-
 .../hbase/regionserver/wal/TestLogRollAbort.html   |    2 +-
 .../TestReplicationStuckWithDroppedTable.html      |    2 +-
 .../hbase/rsgroup/EnableRSGroupsTestBase.html      |    2 +-
 ...stAccessController3.FaultyAccessController.html |    2 +-
 .../security/access/TestAccessController3.html     |    2 +-
 .../TestConcurrentFlushSnapshotFromClient.html     |   29 +-
 .../snapshot/TestMobFlushSnapshotFromClient.html   |    2 +-
 .../snapshot/TestSnapshotWhenChoreCleaning.html    |    2 +-
 .../hbase/util/TestFromClientSide2WoUnsafe.html    |  144 +
 .../hadoop/hbase/wal/CompressedWALTestBase.html    |  221 +-
 .../apache/hadoop/hbase/wal/TestCompressedWAL.html |   72 +-
 .../wal/TestCompressedWALValueCompression.html     |   78 +-
 .../hadoop/hbase/wal/TestWALSplitToHFile.html      |    2 +-
 ...LCorruptionDueToDanglingByteBufferTestBase.html |    2 +-
 testdevapidocs/type-search-index.js                |    2 +-
 338 files changed, 52473 insertions(+), 54307 deletions(-)

diff --git a/apidocs/src-html/org/apache/hadoop/hbase/CompatibilityFactory.html b/apidocs/src-html/org/apache/hadoop/hbase/CompatibilityFactory.html
index 8b382657df0..5d6c2c6b06f 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/CompatibilityFactory.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/CompatibilityFactory.html
@@ -42,7 +42,7 @@
 <span class="source-line-no">029</span><span id="line-29">@InterfaceAudience.Private</span>
 <span class="source-line-no">030</span><span id="line-30">public class CompatibilityFactory {</span>
 <span class="source-line-no">031</span><span id="line-31"></span>
-<span class="source-line-no">032</span><span id="line-32">  private static final Logger LOG = LoggerFactory.getLogger(CompatibilitySingletonFactory.class);</span>
+<span class="source-line-no">032</span><span id="line-32">  private static final Logger LOG = LoggerFactory.getLogger(CompatibilityFactory.class);</span>
 <span class="source-line-no">033</span><span id="line-33">  public static final String EXCEPTION_START = "Could not create  ";</span>
 <span class="source-line-no">034</span><span id="line-34">  public static final String EXCEPTION_END = " Is the hadoop compatibility jar on the classpath?";</span>
 <span class="source-line-no">035</span><span id="line-35"></span>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/ExecutorStatusChore.html b/apidocs/src-html/org/apache/hadoop/hbase/ExecutorStatusChore.html
index d2e6005ffcd..9ed7acdfd47 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/ExecutorStatusChore.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/ExecutorStatusChore.html
@@ -49,7 +49,7 @@
 <span class="source-line-no">036</span><span id="line-36"> */</span>
 <span class="source-line-no">037</span><span id="line-37">@InterfaceAudience.Private</span>
 <span class="source-line-no">038</span><span id="line-38">public class ExecutorStatusChore extends ScheduledChore {</span>
-<span class="source-line-no">039</span><span id="line-39">  private static final Logger LOG = LoggerFactory.getLogger(HealthCheckChore.class);</span>
+<span class="source-line-no">039</span><span id="line-39">  private static final Logger LOG = LoggerFactory.getLogger(ExecutorStatusChore.class);</span>
 <span class="source-line-no">040</span><span id="line-40">  public static final String WAKE_FREQ = "hbase.executors.status.collect.period";</span>
 <span class="source-line-no">041</span><span id="line-41">  public static final int DEFAULT_WAKE_FREQ = 60000;</span>
 <span class="source-line-no">042</span><span id="line-42">  private ExecutorService service;</span>
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html b/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
index b6f100f121b..03a208aad7b 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.SeenRowTracker.html
@@ -156,2326 +156,2326 @@
 <span class="source-line-no">143</span><span id="line-143">import org.apache.hadoop.mapred.JobConf;</span>
 <span class="source-line-no">144</span><span id="line-144">import org.apache.hadoop.mapred.MiniMRCluster;</span>
 <span class="source-line-no">145</span><span id="line-145">import org.apache.hadoop.mapred.TaskLog;</span>
-<span class="source-line-no">146</span><span id="line-146">import org.apache.hadoop.minikdc.MiniKdc;</span>
-<span class="source-line-no">147</span><span id="line-147">import org.apache.yetus.audience.InterfaceAudience;</span>
-<span class="source-line-no">148</span><span id="line-148">import org.apache.zookeeper.WatchedEvent;</span>
-<span class="source-line-no">149</span><span id="line-149">import org.apache.zookeeper.ZooKeeper;</span>
-<span class="source-line-no">150</span><span id="line-150">import org.apache.zookeeper.ZooKeeper.States;</span>
-<span class="source-line-no">151</span><span id="line-151"></span>
-<span class="source-line-no">152</span><span id="line-152">import org.apache.hbase.thirdparty.com.google.common.io.Closeables;</span>
-<span class="source-line-no">153</span><span id="line-153"></span>
-<span class="source-line-no">154</span><span id="line-154">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
-<span class="source-line-no">155</span><span id="line-155"></span>
-<span class="source-line-no">156</span><span id="line-156">/**</span>
-<span class="source-line-no">157</span><span id="line-157"> * Facility for testing HBase. Replacement for old HBaseTestCase and HBaseClusterTestCase</span>
-<span class="source-line-no">158</span><span id="line-158"> * functionality. Create an instance and keep it around testing HBase. This class is meant to be</span>
-<span class="source-line-no">159</span><span id="line-159"> * your one-stop shop for anything you might need testing. Manages one cluster at a time only.</span>
-<span class="source-line-no">160</span><span id="line-160"> * Managed cluster can be an in-process {@link MiniHBaseCluster}, or a deployed cluster of type</span>
-<span class="source-line-no">161</span><span id="line-161"> * {@code DistributedHBaseCluster}. Not all methods work with the real cluster. Depends on log4j</span>
-<span class="source-line-no">162</span><span id="line-162"> * being on classpath and hbase-site.xml for logging and test-run configuration. It does not set</span>
-<span class="source-line-no">163</span><span id="line-163"> * logging levels. In the configuration properties, default values for master-info-port and</span>
-<span class="source-line-no">164</span><span id="line-164"> * region-server-port are overridden such that a random port will be assigned (thus avoiding port</span>
-<span class="source-line-no">165</span><span id="line-165"> * contention if another local HBase instance is already running).</span>
-<span class="source-line-no">166</span><span id="line-166"> * &lt;p&gt;</span>
-<span class="source-line-no">167</span><span id="line-167"> * To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"</span>
-<span class="source-line-no">168</span><span id="line-168"> * setting it to true.</span>
-<span class="source-line-no">169</span><span id="line-169"> * @deprecated since 3.0.0, will be removed in 4.0.0. Use</span>
-<span class="source-line-no">170</span><span id="line-170"> *             {@link org.apache.hadoop.hbase.testing.TestingHBaseCluster} instead.</span>
-<span class="source-line-no">171</span><span id="line-171"> */</span>
-<span class="source-line-no">172</span><span id="line-172">@InterfaceAudience.Public</span>
-<span class="source-line-no">173</span><span id="line-173">@Deprecated</span>
-<span class="source-line-no">174</span><span id="line-174">public class HBaseTestingUtility extends HBaseZKTestingUtility {</span>
-<span class="source-line-no">175</span><span id="line-175"></span>
-<span class="source-line-no">176</span><span id="line-176">  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";</span>
-<span class="source-line-no">177</span><span id="line-177">  /**</span>
-<span class="source-line-no">178</span><span id="line-178">   * The default number of regions per regionserver when creating a pre-split table.</span>
-<span class="source-line-no">179</span><span id="line-179">   */</span>
-<span class="source-line-no">180</span><span id="line-180">  public static final int DEFAULT_REGIONS_PER_SERVER = 3;</span>
-<span class="source-line-no">181</span><span id="line-181"></span>
-<span class="source-line-no">182</span><span id="line-182">  private MiniDFSCluster dfsCluster = null;</span>
-<span class="source-line-no">183</span><span id="line-183">  private FsDatasetAsyncDiskServiceFixer dfsClusterFixer = null;</span>
-<span class="source-line-no">184</span><span id="line-184"></span>
-<span class="source-line-no">185</span><span id="line-185">  private volatile HBaseCluster hbaseCluster = null;</span>
-<span class="source-line-no">186</span><span id="line-186">  private MiniMRCluster mrCluster = null;</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">  /** If there is a mini cluster running for this testing utility instance. */</span>
-<span class="source-line-no">189</span><span id="line-189">  private volatile boolean miniClusterRunning;</span>
-<span class="source-line-no">190</span><span id="line-190"></span>
-<span class="source-line-no">191</span><span id="line-191">  private String hadoopLogDir;</span>
-<span class="source-line-no">192</span><span id="line-192"></span>
-<span class="source-line-no">193</span><span id="line-193">  /**</span>
-<span class="source-line-no">194</span><span id="line-194">   * Directory on test filesystem where we put the data for this instance of HBaseTestingUtility</span>
-<span class="source-line-no">195</span><span id="line-195">   */</span>
-<span class="source-line-no">196</span><span id="line-196">  private Path dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">197</span><span id="line-197"></span>
-<span class="source-line-no">198</span><span id="line-198">  private final AtomicReference&lt;AsyncClusterConnection&gt; asyncConnection = new AtomicReference&lt;&gt;();</span>
-<span class="source-line-no">199</span><span id="line-199"></span>
-<span class="source-line-no">200</span><span id="line-200">  /** Filesystem URI used for map-reduce mini-cluster setup */</span>
-<span class="source-line-no">201</span><span id="line-201">  private static String FS_URI;</span>
-<span class="source-line-no">202</span><span id="line-202"></span>
-<span class="source-line-no">203</span><span id="line-203">  /** This is for unit tests parameterized with a single boolean. */</span>
-<span class="source-line-no">204</span><span id="line-204">  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();</span>
-<span class="source-line-no">205</span><span id="line-205"></span>
-<span class="source-line-no">206</span><span id="line-206">  private Admin hbaseAdmin = null;</span>
-<span class="source-line-no">207</span><span id="line-207"></span>
-<span class="source-line-no">208</span><span id="line-208">  /**</span>
-<span class="source-line-no">209</span><span id="line-209">   * Checks to see if a specific port is available.</span>
-<span class="source-line-no">210</span><span id="line-210">   * @param port the port number to check for availability</span>
-<span class="source-line-no">211</span><span id="line-211">   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not</span>
-<span class="source-line-no">212</span><span id="line-212">   */</span>
-<span class="source-line-no">213</span><span id="line-213">  public static boolean available(int port) {</span>
-<span class="source-line-no">214</span><span id="line-214">    ServerSocket ss = null;</span>
-<span class="source-line-no">215</span><span id="line-215">    DatagramSocket ds = null;</span>
-<span class="source-line-no">216</span><span id="line-216">    try {</span>
-<span class="source-line-no">217</span><span id="line-217">      ss = new ServerSocket(port);</span>
-<span class="source-line-no">218</span><span id="line-218">      ss.setReuseAddress(true);</span>
-<span class="source-line-no">219</span><span id="line-219">      ds = new DatagramSocket(port);</span>
-<span class="source-line-no">220</span><span id="line-220">      ds.setReuseAddress(true);</span>
-<span class="source-line-no">221</span><span id="line-221">      return true;</span>
-<span class="source-line-no">222</span><span id="line-222">    } catch (IOException e) {</span>
-<span class="source-line-no">223</span><span id="line-223">      // Do nothing</span>
-<span class="source-line-no">224</span><span id="line-224">    } finally {</span>
-<span class="source-line-no">225</span><span id="line-225">      if (ds != null) {</span>
-<span class="source-line-no">226</span><span id="line-226">        ds.close();</span>
-<span class="source-line-no">227</span><span id="line-227">      }</span>
-<span class="source-line-no">228</span><span id="line-228"></span>
-<span class="source-line-no">229</span><span id="line-229">      if (ss != null) {</span>
-<span class="source-line-no">230</span><span id="line-230">        try {</span>
-<span class="source-line-no">231</span><span id="line-231">          ss.close();</span>
-<span class="source-line-no">232</span><span id="line-232">        } catch (IOException e) {</span>
-<span class="source-line-no">233</span><span id="line-233">          /* should not be thrown */</span>
-<span class="source-line-no">234</span><span id="line-234">        }</span>
-<span class="source-line-no">235</span><span id="line-235">      }</span>
-<span class="source-line-no">236</span><span id="line-236">    }</span>
-<span class="source-line-no">237</span><span id="line-237"></span>
-<span class="source-line-no">238</span><span id="line-238">    return false;</span>
-<span class="source-line-no">239</span><span id="line-239">  }</span>
-<span class="source-line-no">240</span><span id="line-240"></span>
-<span class="source-line-no">241</span><span id="line-241">  /**</span>
-<span class="source-line-no">242</span><span id="line-242">   * Create all combinations of Bloom filters and compression algorithms for testing.</span>
-<span class="source-line-no">243</span><span id="line-243">   */</span>
-<span class="source-line-no">244</span><span id="line-244">  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {</span>
-<span class="source-line-no">245</span><span id="line-245">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">246</span><span id="line-246">    for (Compression.Algorithm comprAlgo : HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {</span>
-<span class="source-line-no">247</span><span id="line-247">      for (BloomType bloomType : BloomType.values()) {</span>
-<span class="source-line-no">248</span><span id="line-248">        configurations.add(new Object[] { comprAlgo, bloomType });</span>
-<span class="source-line-no">249</span><span id="line-249">      }</span>
-<span class="source-line-no">250</span><span id="line-250">    }</span>
-<span class="source-line-no">251</span><span id="line-251">    return Collections.unmodifiableList(configurations);</span>
+<span class="source-line-no">146</span><span id="line-146">import org.apache.hadoop.metrics2.impl.JmxCacheBuster;</span>
+<span class="source-line-no">147</span><span id="line-147">import org.apache.hadoop.minikdc.MiniKdc;</span>
+<span class="source-line-no">148</span><span id="line-148">import org.apache.yetus.audience.InterfaceAudience;</span>
+<span class="source-line-no">149</span><span id="line-149">import org.apache.zookeeper.WatchedEvent;</span>
+<span class="source-line-no">150</span><span id="line-150">import org.apache.zookeeper.ZooKeeper;</span>
+<span class="source-line-no">151</span><span id="line-151">import org.apache.zookeeper.ZooKeeper.States;</span>
+<span class="source-line-no">152</span><span id="line-152"></span>
+<span class="source-line-no">153</span><span id="line-153">import org.apache.hbase.thirdparty.com.google.common.io.Closeables;</span>
+<span class="source-line-no">154</span><span id="line-154"></span>
+<span class="source-line-no">155</span><span id="line-155">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
+<span class="source-line-no">156</span><span id="line-156"></span>
+<span class="source-line-no">157</span><span id="line-157">/**</span>
+<span class="source-line-no">158</span><span id="line-158"> * Facility for testing HBase. Replacement for old HBaseTestCase and HBaseClusterTestCase</span>
+<span class="source-line-no">159</span><span id="line-159"> * functionality. Create an instance and keep it around testing HBase. This class is meant to be</span>
+<span class="source-line-no">160</span><span id="line-160"> * your one-stop shop for anything you might need testing. Manages one cluster at a time only.</span>
+<span class="source-line-no">161</span><span id="line-161"> * Managed cluster can be an in-process {@link MiniHBaseCluster}, or a deployed cluster of type</span>
+<span class="source-line-no">162</span><span id="line-162"> * {@code DistributedHBaseCluster}. Not all methods work with the real cluster. Depends on log4j</span>
+<span class="source-line-no">163</span><span id="line-163"> * being on classpath and hbase-site.xml for logging and test-run configuration. It does not set</span>
+<span class="source-line-no">164</span><span id="line-164"> * logging levels. In the configuration properties, default values for master-info-port and</span>
+<span class="source-line-no">165</span><span id="line-165"> * region-server-port are overridden such that a random port will be assigned (thus avoiding port</span>
+<span class="source-line-no">166</span><span id="line-166"> * contention if another local HBase instance is already running).</span>
+<span class="source-line-no">167</span><span id="line-167"> * &lt;p&gt;</span>
+<span class="source-line-no">168</span><span id="line-168"> * To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"</span>
+<span class="source-line-no">169</span><span id="line-169"> * setting it to true.</span>
+<span class="source-line-no">170</span><span id="line-170"> * @deprecated since 3.0.0, will be removed in 4.0.0. Use</span>
+<span class="source-line-no">171</span><span id="line-171"> *             {@link org.apache.hadoop.hbase.testing.TestingHBaseCluster} instead.</span>
+<span class="source-line-no">172</span><span id="line-172"> */</span>
+<span class="source-line-no">173</span><span id="line-173">@InterfaceAudience.Public</span>
+<span class="source-line-no">174</span><span id="line-174">@Deprecated</span>
+<span class="source-line-no">175</span><span id="line-175">public class HBaseTestingUtility extends HBaseZKTestingUtility {</span>
+<span class="source-line-no">176</span><span id="line-176"></span>
+<span class="source-line-no">177</span><span id="line-177">  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";</span>
+<span class="source-line-no">178</span><span id="line-178">  /**</span>
+<span class="source-line-no">179</span><span id="line-179">   * The default number of regions per regionserver when creating a pre-split table.</span>
+<span class="source-line-no">180</span><span id="line-180">   */</span>
+<span class="source-line-no">181</span><span id="line-181">  public static final int DEFAULT_REGIONS_PER_SERVER = 3;</span>
+<span class="source-line-no">182</span><span id="line-182"></span>
+<span class="source-line-no">183</span><span id="line-183">  private MiniDFSCluster dfsCluster = null;</span>
+<span class="source-line-no">184</span><span id="line-184">  private FsDatasetAsyncDiskServiceFixer dfsClusterFixer = null;</span>
+<span class="source-line-no">185</span><span id="line-185"></span>
+<span class="source-line-no">186</span><span id="line-186">  private volatile HBaseCluster hbaseCluster = null;</span>
+<span class="source-line-no">187</span><span id="line-187">  private MiniMRCluster mrCluster = null;</span>
+<span class="source-line-no">188</span><span id="line-188"></span>
+<span class="source-line-no">189</span><span id="line-189">  /** If there is a mini cluster running for this testing utility instance. */</span>
+<span class="source-line-no">190</span><span id="line-190">  private volatile boolean miniClusterRunning;</span>
+<span class="source-line-no">191</span><span id="line-191"></span>
+<span class="source-line-no">192</span><span id="line-192">  private String hadoopLogDir;</span>
+<span class="source-line-no">193</span><span id="line-193"></span>
+<span class="source-line-no">194</span><span id="line-194">  /**</span>
+<span class="source-line-no">195</span><span id="line-195">   * Directory on test filesystem where we put the data for this instance of HBaseTestingUtility</span>
+<span class="source-line-no">196</span><span id="line-196">   */</span>
+<span class="source-line-no">197</span><span id="line-197">  private Path dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">198</span><span id="line-198"></span>
+<span class="source-line-no">199</span><span id="line-199">  private final AtomicReference&lt;AsyncClusterConnection&gt; asyncConnection = new AtomicReference&lt;&gt;();</span>
+<span class="source-line-no">200</span><span id="line-200"></span>
+<span class="source-line-no">201</span><span id="line-201">  /** Filesystem URI used for map-reduce mini-cluster setup */</span>
+<span class="source-line-no">202</span><span id="line-202">  private static String FS_URI;</span>
+<span class="source-line-no">203</span><span id="line-203"></span>
+<span class="source-line-no">204</span><span id="line-204">  /** This is for unit tests parameterized with a single boolean. */</span>
+<span class="source-line-no">205</span><span id="line-205">  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();</span>
+<span class="source-line-no">206</span><span id="line-206"></span>
+<span class="source-line-no">207</span><span id="line-207">  private Admin hbaseAdmin = null;</span>
+<span class="source-line-no">208</span><span id="line-208"></span>
+<span class="source-line-no">209</span><span id="line-209">  static {</span>
+<span class="source-line-no">210</span><span id="line-210">    // JmxCacheBuster may cause dead lock in test environment. As on master side, the table/region</span>
+<span class="source-line-no">211</span><span id="line-211">    // related metrics updating will finally lead to a meta access, so if meta is not online yet, we</span>
+<span class="source-line-no">212</span><span id="line-212">    // will block when updating while holding the metrics lock. But when we assign meta, there are</span>
+<span class="source-line-no">213</span><span id="line-213">    // bunch of places where we need to register a new metrics thus need to get the metrics lock,</span>
+<span class="source-line-no">214</span><span id="line-214">    // and then lead to a dead lock and cause the test to hang forever.</span>
+<span class="source-line-no">215</span><span id="line-215">    // The code is in hadoop so there is no easy way for us to fix, so here we just stop</span>
+<span class="source-line-no">216</span><span id="line-216">    // JmxCacheBuster to stabilize our tests first. See HBASE-30118 for more details and future</span>
+<span class="source-line-no">217</span><span id="line-217">    // plans.</span>
+<span class="source-line-no">218</span><span id="line-218">    JmxCacheBuster.stop();</span>
+<span class="source-line-no">219</span><span id="line-219">  }</span>
+<span class="source-line-no">220</span><span id="line-220"></span>
+<span class="source-line-no">221</span><span id="line-221">  /**</span>
+<span class="source-line-no">222</span><span id="line-222">   * Checks to see if a specific port is available.</span>
+<span class="source-line-no">223</span><span id="line-223">   * @param port the port number to check for availability</span>
+<span class="source-line-no">224</span><span id="line-224">   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not</span>
+<span class="source-line-no">225</span><span id="line-225">   */</span>
+<span class="source-line-no">226</span><span id="line-226">  public static boolean available(int port) {</span>
+<span class="source-line-no">227</span><span id="line-227">    ServerSocket ss = null;</span>
+<span class="source-line-no">228</span><span id="line-228">    DatagramSocket ds = null;</span>
+<span class="source-line-no">229</span><span id="line-229">    try {</span>
+<span class="source-line-no">230</span><span id="line-230">      ss = new ServerSocket(port);</span>
+<span class="source-line-no">231</span><span id="line-231">      ss.setReuseAddress(true);</span>
+<span class="source-line-no">232</span><span id="line-232">      ds = new DatagramSocket(port);</span>
+<span class="source-line-no">233</span><span id="line-233">      ds.setReuseAddress(true);</span>
+<span class="source-line-no">234</span><span id="line-234">      return true;</span>
+<span class="source-line-no">235</span><span id="line-235">    } catch (IOException e) {</span>
+<span class="source-line-no">236</span><span id="line-236">      // Do nothing</span>
+<span class="source-line-no">237</span><span id="line-237">    } finally {</span>
+<span class="source-line-no">238</span><span id="line-238">      if (ds != null) {</span>
+<span class="source-line-no">239</span><span id="line-239">        ds.close();</span>
+<span class="source-line-no">240</span><span id="line-240">      }</span>
+<span class="source-line-no">241</span><span id="line-241"></span>
+<span class="source-line-no">242</span><span id="line-242">      if (ss != null) {</span>
+<span class="source-line-no">243</span><span id="line-243">        try {</span>
+<span class="source-line-no">244</span><span id="line-244">          ss.close();</span>
+<span class="source-line-no">245</span><span id="line-245">        } catch (IOException e) {</span>
+<span class="source-line-no">246</span><span id="line-246">          /* should not be thrown */</span>
+<span class="source-line-no">247</span><span id="line-247">        }</span>
+<span class="source-line-no">248</span><span id="line-248">      }</span>
+<span class="source-line-no">249</span><span id="line-249">    }</span>
+<span class="source-line-no">250</span><span id="line-250"></span>
+<span class="source-line-no">251</span><span id="line-251">    return false;</span>
 <span class="source-line-no">252</span><span id="line-252">  }</span>
 <span class="source-line-no">253</span><span id="line-253"></span>
 <span class="source-line-no">254</span><span id="line-254">  /**</span>
-<span class="source-line-no">255</span><span id="line-255">   * Create combination of memstoreTS and tags</span>
+<span class="source-line-no">255</span><span id="line-255">   * Create all combinations of Bloom filters and compression algorithms for testing.</span>
 <span class="source-line-no">256</span><span id="line-256">   */</span>
-<span class="source-line-no">257</span><span id="line-257">  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {</span>
+<span class="source-line-no">257</span><span id="line-257">  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {</span>
 <span class="source-line-no">258</span><span id="line-258">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">259</span><span id="line-259">    configurations.add(new Object[] { false, false });</span>
-<span class="source-line-no">260</span><span id="line-260">    configurations.add(new Object[] { false, true });</span>
-<span class="source-line-no">261</span><span id="line-261">    configurations.add(new Object[] { true, false });</span>
-<span class="source-line-no">262</span><span id="line-262">    configurations.add(new Object[] { true, true });</span>
-<span class="source-line-no">263</span><span id="line-263">    return Collections.unmodifiableList(configurations);</span>
-<span class="source-line-no">264</span><span id="line-264">  }</span>
-<span class="source-line-no">265</span><span id="line-265"></span>
-<span class="source-line-no">266</span><span id="line-266">  public static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {</span>
-<span class="source-line-no">267</span><span id="line-267">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">268</span><span id="line-268">    configurations.add(new Object[] { false, false, true });</span>
-<span class="source-line-no">269</span><span id="line-269">    configurations.add(new Object[] { false, false, false });</span>
-<span class="source-line-no">270</span><span id="line-270">    configurations.add(new Object[] { false, true, true });</span>
-<span class="source-line-no">271</span><span id="line-271">    configurations.add(new Object[] { false, true, false });</span>
-<span class="source-line-no">272</span><span id="line-272">    configurations.add(new Object[] { true, false, true });</span>
-<span class="source-line-no">273</span><span id="line-273">    configurations.add(new Object[] { true, false, false });</span>
-<span class="source-line-no">274</span><span id="line-274">    configurations.add(new Object[] { true, true, true });</span>
-<span class="source-line-no">275</span><span id="line-275">    configurations.add(new Object[] { true, true, false });</span>
+<span class="source-line-no">259</span><span id="line-259">    for (Compression.Algorithm comprAlgo : HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {</span>
+<span class="source-line-no">260</span><span id="line-260">      for (BloomType bloomType : BloomType.values()) {</span>
+<span class="source-line-no">261</span><span id="line-261">        configurations.add(new Object[] { comprAlgo, bloomType });</span>
+<span class="source-line-no">262</span><span id="line-262">      }</span>
+<span class="source-line-no">263</span><span id="line-263">    }</span>
+<span class="source-line-no">264</span><span id="line-264">    return Collections.unmodifiableList(configurations);</span>
+<span class="source-line-no">265</span><span id="line-265">  }</span>
+<span class="source-line-no">266</span><span id="line-266"></span>
+<span class="source-line-no">267</span><span id="line-267">  /**</span>
+<span class="source-line-no">268</span><span id="line-268">   * Create combination of memstoreTS and tags</span>
+<span class="source-line-no">269</span><span id="line-269">   */</span>
+<span class="source-line-no">270</span><span id="line-270">  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {</span>
+<span class="source-line-no">271</span><span id="line-271">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">272</span><span id="line-272">    configurations.add(new Object[] { false, false });</span>
+<span class="source-line-no">273</span><span id="line-273">    configurations.add(new Object[] { false, true });</span>
+<span class="source-line-no">274</span><span id="line-274">    configurations.add(new Object[] { true, false });</span>
+<span class="source-line-no">275</span><span id="line-275">    configurations.add(new Object[] { true, true });</span>
 <span class="source-line-no">276</span><span id="line-276">    return Collections.unmodifiableList(configurations);</span>
 <span class="source-line-no">277</span><span id="line-277">  }</span>
 <span class="source-line-no">278</span><span id="line-278"></span>
-<span class="source-line-no">279</span><span id="line-279">  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =</span>
-<span class="source-line-no">280</span><span id="line-280">    bloomAndCompressionCombinations();</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">  /**</span>
-<span class="source-line-no">283</span><span id="line-283">   * &lt;p&gt;</span>
-<span class="source-line-no">284</span><span id="line-284">   * Create an HBaseTestingUtility using a default configuration.</span>
-<span class="source-line-no">285</span><span id="line-285">   * &lt;p&gt;</span>
-<span class="source-line-no">286</span><span id="line-286">   * Initially, all tmp files are written to a local test data directory. Once</span>
-<span class="source-line-no">287</span><span id="line-287">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
-<span class="source-line-no">288</span><span id="line-288">   * data will be written to the DFS directory instead.</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  public HBaseTestingUtility() {</span>
-<span class="source-line-no">291</span><span id="line-291">    this(HBaseConfiguration.create());</span>
-<span class="source-line-no">292</span><span id="line-292">  }</span>
-<span class="source-line-no">293</span><span id="line-293"></span>
-<span class="source-line-no">294</span><span id="line-294">  /**</span>
-<span class="source-line-no">295</span><span id="line-295">   * &lt;p&gt;</span>
-<span class="source-line-no">296</span><span id="line-296">   * Create an HBaseTestingUtility using a given configuration.</span>
-<span class="source-line-no">297</span><span id="line-297">   * &lt;p&gt;</span>
-<span class="source-line-no">298</span><span id="line-298">   * Initially, all tmp files are written to a local test data directory. Once</span>
-<span class="source-line-no">299</span><span id="line-299">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
-<span class="source-line-no">300</span><span id="line-300">   * data will be written to the DFS directory instead.</span>
-<span class="source-line-no">301</span><span id="line-301">   * @param conf The configuration to use for further operations</span>
+<span class="source-line-no">279</span><span id="line-279">  public static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {</span>
+<span class="source-line-no">280</span><span id="line-280">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">281</span><span id="line-281">    configurations.add(new Object[] { false, false, true });</span>
+<span class="source-line-no">282</span><span id="line-282">    configurations.add(new Object[] { false, false, false });</span>
+<span class="source-line-no">283</span><span id="line-283">    configurations.add(new Object[] { false, true, true });</span>
+<span class="source-line-no">284</span><span id="line-284">    configurations.add(new Object[] { false, true, false });</span>
+<span class="source-line-no">285</span><span id="line-285">    configurations.add(new Object[] { true, false, true });</span>
+<span class="source-line-no">286</span><span id="line-286">    configurations.add(new Object[] { true, false, false });</span>
+<span class="source-line-no">287</span><span id="line-287">    configurations.add(new Object[] { true, true, true });</span>
+<span class="source-line-no">288</span><span id="line-288">    configurations.add(new Object[] { true, true, false });</span>
+<span class="source-line-no">289</span><span id="line-289">    return Collections.unmodifiableList(configurations);</span>
+<span class="source-line-no">290</span><span id="line-290">  }</span>
+<span class="source-line-no">291</span><span id="line-291"></span>
+<span class="source-line-no">292</span><span id="line-292">  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =</span>
+<span class="source-line-no">293</span><span id="line-293">    bloomAndCompressionCombinations();</span>
+<span class="source-line-no">294</span><span id="line-294"></span>
+<span class="source-line-no">295</span><span id="line-295">  /**</span>
+<span class="source-line-no">296</span><span id="line-296">   * &lt;p&gt;</span>
+<span class="source-line-no">297</span><span id="line-297">   * Create an HBaseTestingUtility using a default configuration.</span>
+<span class="source-line-no">298</span><span id="line-298">   * &lt;p&gt;</span>
+<span class="source-line-no">299</span><span id="line-299">   * Initially, all tmp files are written to a local test data directory. Once</span>
+<span class="source-line-no">300</span><span id="line-300">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
+<span class="source-line-no">301</span><span id="line-301">   * data will be written to the DFS directory instead.</span>
 <span class="source-line-no">302</span><span id="line-302">   */</span>
-<span class="source-line-no">303</span><span id="line-303">  public HBaseTestingUtility(Configuration conf) {</span>
-<span class="source-line-no">304</span><span id="line-304">    super(conf);</span>
-<span class="source-line-no">305</span><span id="line-305"></span>
-<span class="source-line-no">306</span><span id="line-306">    // a hbase checksum verification failure will cause unit tests to fail</span>
-<span class="source-line-no">307</span><span id="line-307">    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);</span>
-<span class="source-line-no">308</span><span id="line-308"></span>
-<span class="source-line-no">309</span><span id="line-309">    // Save this for when setting default file:// breaks things</span>
-<span class="source-line-no">310</span><span id="line-310">    if (this.conf.get("fs.defaultFS") != null) {</span>
-<span class="source-line-no">311</span><span id="line-311">      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));</span>
-<span class="source-line-no">312</span><span id="line-312">    }</span>
-<span class="source-line-no">313</span><span id="line-313">    if (this.conf.get(HConstants.HBASE_DIR) != null) {</span>
-<span class="source-line-no">314</span><span id="line-314">      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));</span>
-<span class="source-line-no">315</span><span id="line-315">    }</span>
-<span class="source-line-no">316</span><span id="line-316">    // Every cluster is a local cluster until we start DFS</span>
-<span class="source-line-no">317</span><span id="line-317">    // Note that conf could be null, but this.conf will not be</span>
-<span class="source-line-no">318</span><span id="line-318">    String dataTestDir = getDataTestDir().toString();</span>
-<span class="source-line-no">319</span><span id="line-319">    this.conf.set("fs.defaultFS", "file:///");</span>
-<span class="source-line-no">320</span><span id="line-320">    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);</span>
-<span class="source-line-no">321</span><span id="line-321">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
-<span class="source-line-no">322</span><span id="line-322">    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, false);</span>
-<span class="source-line-no">323</span><span id="line-323">    // If the value for random ports isn't set set it to true, thus making</span>
-<span class="source-line-no">324</span><span id="line-324">    // tests opt-out for random port assignment</span>
-<span class="source-line-no">325</span><span id="line-325">    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,</span>
-<span class="source-line-no">326</span><span id="line-326">      this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));</span>
-<span class="source-line-no">327</span><span id="line-327">  }</span>
-<span class="source-line-no">328</span><span id="line-328"></span>
-<span class="source-line-no">329</span><span id="line-329">  /**</span>
-<span class="source-line-no">330</span><span id="line-330">   * Close both the region {@code r} and it's underlying WAL. For use in tests.</span>
-<span class="source-line-no">331</span><span id="line-331">   */</span>
-<span class="source-line-no">332</span><span id="line-332">  public static void closeRegionAndWAL(final Region r) throws IOException {</span>
-<span class="source-line-no">333</span><span id="line-333">    closeRegionAndWAL((HRegion) r);</span>
-<span class="source-line-no">334</span><span id="line-334">  }</span>
-<span class="source-line-no">335</span><span id="line-335"></span>
-<span class="source-line-no">336</span><span id="line-336">  /**</span>
-<span class="source-line-no">337</span><span id="line-337">   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.</span>
-<span class="source-line-no">338</span><span id="line-338">   */</span>
-<span class="source-line-no">339</span><span id="line-339">  public static void closeRegionAndWAL(final HRegion r) throws IOException {</span>
-<span class="source-line-no">340</span><span id="line-340">    if (r == null) return;</span>
-<span class="source-line-no">341</span><span id="line-341">    r.close();</span>
-<span class="source-line-no">342</span><span id="line-342">    if (r.getWAL() == null) return;</span>
-<span class="source-line-no">343</span><span id="line-343">    r.getWAL().close();</span>
-<span class="source-line-no">344</span><span id="line-344">  }</span>
-<span class="source-line-no">345</span><span id="line-345"></span>
-<span class="source-line-no">346</span><span id="line-346">  /**</span>
-<span class="source-line-no">347</span><span id="line-347">   * Returns this classes's instance of {@link Configuration}. Be careful how you use the returned</span>
-<span class="source-line-no">348</span><span id="line-348">   * Configuration since {@link Connection} instances can be shared. The Map of Connections is keyed</span>
-<span class="source-line-no">349</span><span id="line-349">   * by the Configuration. If say, a Connection was being used against a cluster that had been</span>
-<span class="source-line-no">350</span><span id="line-350">   * shutdown, see {@link #shutdownMiniCluster()}, then the Connection will no longer be wholesome.</span>
-<span class="source-line-no">351</span><span id="line-351">   * Rather than use the return direct, its usually best to make a copy and use that. Do</span>
-<span class="source-line-no">352</span><span id="line-352">   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;</span>
-<span class="source-line-no">353</span><span id="line-353">   * @return Instance of Configuration.</span>
-<span class="source-line-no">354</span><span id="line-354">   */</span>
-<span class="source-line-no">355</span><span id="line-355">  @Override</span>
-<span class="source-line-no">356</span><span id="line-356">  public Configuration getConfiguration() {</span>
-<span class="source-line-no">357</span><span id="line-357">    return super.getConfiguration();</span>
-<span class="source-line-no">358</span><span id="line-358">  }</span>
-<span class="source-line-no">359</span><span id="line-359"></span>
-<span class="source-line-no">360</span><span id="line-360">  public void setHBaseCluster(HBaseCluster hbaseCluster) {</span>
-<span class="source-line-no">361</span><span id="line-361">    this.hbaseCluster = hbaseCluster;</span>
-<span class="source-line-no">362</span><span id="line-362">  }</span>
-<span class="source-line-no">363</span><span id="line-363"></span>
-<span class="source-line-no">364</span><span id="line-364">  /**</span>
-<span class="source-line-no">365</span><span id="line-365">   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}. Give it a random name so can</span>
-<span class="source-line-no">366</span><span id="line-366">   * have many concurrent tests running if we need to. Moding a System property is not the way to do</span>
-<span class="source-line-no">367</span><span id="line-367">   * concurrent instances -- another instance could grab the temporary value unintentionally -- but</span>
-<span class="source-line-no">368</span><span id="line-368">   * not anything can do about it at moment; single instance only is how the minidfscluster works.</span>
-<span class="source-line-no">369</span><span id="line-369">   * We also create the underlying directory names for hadoop.log.dir, mapreduce.cluster.local.dir</span>
-<span class="source-line-no">370</span><span id="line-370">   * and hadoop.tmp.dir, and set the values in the conf, and as a system property for hadoop.tmp.dir</span>
-<span class="source-line-no">371</span><span id="line-371">   * (We do not create them!).</span>
-<span class="source-line-no">372</span><span id="line-372">   * @return The calculated data test build directory, if newly-created.</span>
-<span class="source-line-no">373</span><span id="line-373">   */</span>
-<span class="source-line-no">374</span><span id="line-374">  @Override</span>
-<span class="source-line-no">375</span><span id="line-375">  protected Path setupDataTestDir() {</span>
-<span class="source-line-no">376</span><span id="line-376">    Path testPath = super.setupDataTestDir();</span>
-<span class="source-line-no">377</span><span id="line-377">    if (null == testPath) {</span>
-<span class="source-line-no">378</span><span id="line-378">      return null;</span>
-<span class="source-line-no">379</span><span id="line-379">    }</span>
-<span class="source-line-no">380</span><span id="line-380"></span>
-<span class="source-line-no">381</span><span id="line-381">    createSubDirAndSystemProperty("hadoop.log.dir", testPath, "hadoop-log-dir");</span>
-<span class="source-line-no">382</span><span id="line-382"></span>
-<span class="source-line-no">383</span><span id="line-383">    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but</span>
-<span class="source-line-no">384</span><span id="line-384">    // we want our own value to ensure uniqueness on the same machine</span>
-<span class="source-line-no">385</span><span id="line-385">    createSubDirAndSystemProperty("hadoop.tmp.dir", testPath, "hadoop-tmp-dir");</span>
-<span class="source-line-no">386</span><span id="line-386"></span>
-<span class="source-line-no">387</span><span id="line-387">    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster</span>
-<span class="source-line-no">388</span><span id="line-388">    createSubDir("mapreduce.cluster.local.dir", testPath, "mapred-local-dir");</span>
-<span class="source-line-no">389</span><span id="line-389">    return testPath;</span>
-<span class="source-line-no">390</span><span id="line-390">  }</span>
-<span class="source-line-no">391</span><span id="line-391"></span>
-<span class="source-line-no">392</span><span id="line-392">  private void createSubDirAndSystemProperty(String propertyName, Path parent, String subDirName) {</span>
+<span class="source-line-no">303</span><span id="line-303">  public HBaseTestingUtility() {</span>
+<span class="source-line-no">304</span><span id="line-304">    this(HBaseConfiguration.create());</span>
+<span class="source-line-no">305</span><span id="line-305">  }</span>
+<span class="source-line-no">306</span><span id="line-306"></span>
+<span class="source-line-no">307</span><span id="line-307">  /**</span>
+<span class="source-line-no">308</span><span id="line-308">   * &lt;p&gt;</span>
+<span class="source-line-no">309</span><span id="line-309">   * Create an HBaseTestingUtility using a given configuration.</span>
+<span class="source-line-no">310</span><span id="line-310">   * &lt;p&gt;</span>
+<span class="source-line-no">311</span><span id="line-311">   * Initially, all tmp files are written to a local test data directory. Once</span>
+<span class="source-line-no">312</span><span id="line-312">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
+<span class="source-line-no">313</span><span id="line-313">   * data will be written to the DFS directory instead.</span>
+<span class="source-line-no">314</span><span id="line-314">   * @param conf The configuration to use for further operations</span>
+<span class="source-line-no">315</span><span id="line-315">   */</span>
+<span class="source-line-no">316</span><span id="line-316">  public HBaseTestingUtility(Configuration conf) {</span>
+<span class="source-line-no">317</span><span id="line-317">    super(conf);</span>
+<span class="source-line-no">318</span><span id="line-318"></span>
+<span class="source-line-no">319</span><span id="line-319">    // a hbase checksum verification failure will cause unit tests to fail</span>
+<span class="source-line-no">320</span><span id="line-320">    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);</span>
+<span class="source-line-no">321</span><span id="line-321"></span>
+<span class="source-line-no">322</span><span id="line-322">    // Save this for when setting default file:// breaks things</span>
+<span class="source-line-no">323</span><span id="line-323">    if (this.conf.get("fs.defaultFS") != null) {</span>
+<span class="source-line-no">324</span><span id="line-324">      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));</span>
+<span class="source-line-no">325</span><span id="line-325">    }</span>
+<span class="source-line-no">326</span><span id="line-326">    if (this.conf.get(HConstants.HBASE_DIR) != null) {</span>
+<span class="source-line-no">327</span><span id="line-327">      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));</span>
+<span class="source-line-no">328</span><span id="line-328">    }</span>
+<span class="source-line-no">329</span><span id="line-329">    // Every cluster is a local cluster until we start DFS</span>
+<span class="source-line-no">330</span><span id="line-330">    // Note that conf could be null, but this.conf will not be</span>
+<span class="source-line-no">331</span><span id="line-331">    String dataTestDir = getDataTestDir().toString();</span>
+<span class="source-line-no">332</span><span id="line-332">    this.conf.set("fs.defaultFS", "file:///");</span>
+<span class="source-line-no">333</span><span id="line-333">    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);</span>
+<span class="source-line-no">334</span><span id="line-334">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
+<span class="source-line-no">335</span><span id="line-335">    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, false);</span>
+<span class="source-line-no">336</span><span id="line-336">    // If the value for random ports isn't set set it to true, thus making</span>
+<span class="source-line-no">337</span><span id="line-337">    // tests opt-out for random port assignment</span>
+<span class="source-line-no">338</span><span id="line-338">    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,</span>
+<span class="source-line-no">339</span><span id="line-339">      this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));</span>
+<span class="source-line-no">340</span><span id="line-340">  }</span>
+<span class="source-line-no">341</span><span id="line-341"></span>
+<span class="source-line-no">342</span><span id="line-342">  /**</span>
+<span class="source-line-no">343</span><span id="line-343">   * Close both the region {@code r} and it's underlying WAL. For use in tests.</span>
+<span class="source-line-no">344</span><span id="line-344">   */</span>
+<span class="source-line-no">345</span><span id="line-345">  public static void closeRegionAndWAL(final Region r) throws IOException {</span>
+<span class="source-line-no">346</span><span id="line-346">    closeRegionAndWAL((HRegion) r);</span>
+<span class="source-line-no">347</span><span id="line-347">  }</span>
+<span class="source-line-no">348</span><span id="line-348"></span>
+<span class="source-line-no">349</span><span id="line-349">  /**</span>
+<span class="source-line-no">350</span><span id="line-350">   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.</span>
+<span class="source-line-no">351</span><span id="line-351">   */</span>
+<span class="source-line-no">352</span><span id="line-352">  public static void closeRegionAndWAL(final HRegion r) throws IOException {</span>
+<span class="source-line-no">353</span><span id="line-353">    if (r == null) return;</span>
+<span class="source-line-no">354</span><span id="line-354">    r.close();</span>
+<span class="source-line-no">355</span><span id="line-355">    if (r.getWAL() == null) return;</span>
+<span class="source-line-no">356</span><span id="line-356">    r.getWAL().close();</span>
+<span class="source-line-no">357</span><span id="line-357">  }</span>
+<span class="source-line-no">358</span><span id="line-358"></span>
+<span class="source-line-no">359</span><span id="line-359">  /**</span>
+<span class="source-line-no">360</span><span id="line-360">   * Returns this classes's instance of {@link Configuration}. Be careful how you use the returned</span>
+<span class="source-line-no">361</span><span id="line-361">   * Configuration since {@link Connection} instances can be shared. The Map of Connections is keyed</span>
+<span class="source-line-no">362</span><span id="line-362">   * by the Configuration. If say, a Connection was being used against a cluster that had been</span>
+<span class="source-line-no">363</span><span id="line-363">   * shutdown, see {@link #shutdownMiniCluster()}, then the Connection will no longer be wholesome.</span>
+<span class="source-line-no">364</span><span id="line-364">   * Rather than use the return direct, its usually best to make a copy and use that. Do</span>
+<span class="source-line-no">365</span><span id="line-365">   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;</span>
+<span class="source-line-no">366</span><span id="line-366">   * @return Instance of Configuration.</span>
+<span class="source-line-no">367</span><span id="line-367">   */</span>
+<span class="source-line-no">368</span><span id="line-368">  @Override</span>
+<span class="source-line-no">369</span><span id="line-369">  public Configuration getConfiguration() {</span>
+<span class="source-line-no">370</span><span id="line-370">    return super.getConfiguration();</span>
+<span class="source-line-no">371</span><span id="line-371">  }</span>
+<span class="source-line-no">372</span><span id="line-372"></span>
+<span class="source-line-no">373</span><span id="line-373">  public void setHBaseCluster(HBaseCluster hbaseCluster) {</span>
+<span class="source-line-no">374</span><span id="line-374">    this.hbaseCluster = hbaseCluster;</span>
+<span class="source-line-no">375</span><span id="line-375">  }</span>
+<span class="source-line-no">376</span><span id="line-376"></span>
+<span class="source-line-no">377</span><span id="line-377">  /**</span>
+<span class="source-line-no">378</span><span id="line-378">   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}. Give it a random name so can</span>
+<span class="source-line-no">379</span><span id="line-379">   * have many concurrent tests running if we need to. Moding a System property is not the way to do</span>
+<span class="source-line-no">380</span><span id="line-380">   * concurrent instances -- another instance could grab the temporary value unintentionally -- but</span>
+<span class="source-line-no">381</span><span id="line-381">   * not anything can do about it at moment; single instance only is how the minidfscluster works.</span>
+<span class="source-line-no">382</span><span id="line-382">   * We also create the underlying directory names for hadoop.log.dir, mapreduce.cluster.local.dir</span>
+<span class="source-line-no">383</span><span id="line-383">   * and hadoop.tmp.dir, and set the values in the conf, and as a system property for hadoop.tmp.dir</span>
+<span class="source-line-no">384</span><span id="line-384">   * (We do not create them!).</span>
+<span class="source-line-no">385</span><span id="line-385">   * @return The calculated data test build directory, if newly-created.</span>
+<span class="source-line-no">386</span><span id="line-386">   */</span>
+<span class="source-line-no">387</span><span id="line-387">  @Override</span>
+<span class="source-line-no">388</span><span id="line-388">  protected Path setupDataTestDir() {</span>
+<span class="source-line-no">389</span><span id="line-389">    Path testPath = super.setupDataTestDir();</span>
+<span class="source-line-no">390</span><span id="line-390">    if (null == testPath) {</span>
+<span class="source-line-no">391</span><span id="line-391">      return null;</span>
+<span class="source-line-no">392</span><span id="line-392">    }</span>
 <span class="source-line-no">393</span><span id="line-393"></span>
-<span class="source-line-no">394</span><span id="line-394">    String sysValue = System.getProperty(propertyName);</span>
+<span class="source-line-no">394</span><span id="line-394">    createSubDirAndSystemProperty("hadoop.log.dir", testPath, "hadoop-log-dir");</span>
 <span class="source-line-no">395</span><span id="line-395"></span>
-<span class="source-line-no">396</span><span id="line-396">    if (sysValue != null) {</span>
-<span class="source-line-no">397</span><span id="line-397">      // There is already a value set. So we do nothing but hope</span>
-<span class="source-line-no">398</span><span id="line-398">      // that there will be no conflicts</span>
-<span class="source-line-no">399</span><span id="line-399">      LOG.info("System.getProperty(\"" + propertyName + "\") already set to: " + sysValue</span>
-<span class="source-line-no">400</span><span id="line-400">        + " so I do NOT create it in " + parent);</span>
-<span class="source-line-no">401</span><span id="line-401">      String confValue = conf.get(propertyName);</span>
-<span class="source-line-no">402</span><span id="line-402">      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)) {</span>
-<span class="source-line-no">403</span><span id="line-403">        LOG.warn(propertyName + " property value differs in configuration and system: "</span>
-<span class="source-line-no">404</span><span id="line-404">          + "Configuration=" + confValue + " while System=" + sysValue</span>
-<span class="source-line-no">405</span><span id="line-405">          + " Erasing configuration value by system value.");</span>
-<span class="source-line-no">406</span><span id="line-406">      }</span>
-<span class="source-line-no">407</span><span id="line-407">      conf.set(propertyName, sysValue);</span>
-<span class="source-line-no">408</span><span id="line-408">    } else {</span>
-<span class="source-line-no">409</span><span id="line-409">      // Ok, it's not set, so we create it as a subdirectory</span>
-<span class="source-line-no">410</span><span id="line-410">      createSubDir(propertyName, parent, subDirName);</span>
-<span class="source-line-no">411</span><span id="line-411">      System.setProperty(propertyName, conf.get(propertyName));</span>
-<span class="source-line-no">412</span><span id="line-412">    }</span>
-<span class="source-line-no">413</span><span id="line-413">  }</span>
-<span class="source-line-no">414</span><span id="line-414"></span>
-<span class="source-line-no">415</span><span id="line-415">  /**</span>
-<span class="source-line-no">416</span><span id="line-416">   * @return Where to write test data on the test filesystem; Returns working directory for the test</span>
-<span class="source-line-no">417</span><span id="line-417">   *         filesystem by default</span>
-<span class="source-line-no">418</span><span id="line-418">   * @see #setupDataTestDirOnTestFS()</span>
-<span class="source-line-no">419</span><span id="line-419">   * @see #getTestFileSystem()</span>
-<span class="source-line-no">420</span><span id="line-420">   */</span>
-<span class="source-line-no">421</span><span id="line-421">  private Path getBaseTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">422</span><span id="line-422">    FileSystem fs = getTestFileSystem();</span>
-<span class="source-line-no">423</span><span id="line-423">    return new Path(fs.getWorkingDirectory(), "test-data");</span>
-<span class="source-line-no">424</span><span id="line-424">  }</span>
-<span class="source-line-no">425</span><span id="line-425"></span>
-<span class="source-line-no">426</span><span id="line-426">  /**</span>
-<span class="source-line-no">427</span><span id="line-427">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
-<span class="source-line-no">428</span><span id="line-428">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
-<span class="source-line-no">429</span><span id="line-429">   * on it.</span>
-<span class="source-line-no">430</span><span id="line-430">   * @return a unique path in the test filesystem</span>
-<span class="source-line-no">431</span><span id="line-431">   */</span>
-<span class="source-line-no">432</span><span id="line-432">  public Path getDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">433</span><span id="line-433">    if (dataTestDirOnTestFS == null) {</span>
-<span class="source-line-no">434</span><span id="line-434">      setupDataTestDirOnTestFS();</span>
-<span class="source-line-no">435</span><span id="line-435">    }</span>
-<span class="source-line-no">436</span><span id="line-436"></span>
-<span class="source-line-no">437</span><span id="line-437">    return dataTestDirOnTestFS;</span>
-<span class="source-line-no">438</span><span id="line-438">  }</span>
-<span class="source-line-no">439</span><span id="line-439"></span>
-<span class="source-line-no">440</span><span id="line-440">  /**</span>
-<span class="source-line-no">441</span><span id="line-441">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
-<span class="source-line-no">442</span><span id="line-442">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
-<span class="source-line-no">443</span><span id="line-443">   * on it.</span>
-<span class="source-line-no">444</span><span id="line-444">   * @return a unique path in the test filesystem</span>
-<span class="source-line-no">445</span><span id="line-445">   * @param subdirName name of the subdir to create under the base test dir</span>
-<span class="source-line-no">446</span><span id="line-446">   */</span>
-<span class="source-line-no">447</span><span id="line-447">  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {</span>
-<span class="source-line-no">448</span><span id="line-448">    return new Path(getDataTestDirOnTestFS(), subdirName);</span>
-<span class="source-line-no">449</span><span id="line-449">  }</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">  /**</span>
-<span class="source-line-no">452</span><span id="line-452">   * Sets up a path in test filesystem to be used by tests. Creates a new directory if not already</span>
-<span class="source-line-no">453</span><span id="line-453">   * setup.</span>
-<span class="source-line-no">454</span><span id="line-454">   */</span>
-<span class="source-line-no">455</span><span id="line-455">  private void setupDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">456</span><span id="line-456">    if (dataTestDirOnTestFS != null) {</span>
-<span class="source-line-no">457</span><span id="line-457">      LOG.warn("Data test on test fs dir already setup in " + dataTestDirOnTestFS.toString());</span>
-<span class="source-line-no">458</span><span id="line-458">      return;</span>
-<span class="source-line-no">459</span><span id="line-459">    }</span>
-<span class="source-line-no">460</span><span id="line-460">    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();</span>
-<span class="source-line-no">461</span><span id="line-461">  }</span>
-<span class="source-line-no">462</span><span id="line-462"></span>
-<span class="source-line-no">463</span><span id="line-463">  /**</span>
-<span class="source-line-no">464</span><span id="line-464">   * Sets up a new path in test filesystem to be used by tests.</span>
-<span class="source-line-no">465</span><span id="line-465">   */</span>
-<span class="source-line-no">466</span><span id="line-466">  private Path getNewDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">467</span><span id="line-467">    // The file system can be either local, mini dfs, or if the configuration</span>
-<span class="source-line-no">468</span><span id="line-468">    // is supplied externally, it can be an external cluster FS. If it is a local</span>
-<span class="source-line-no">469</span><span id="line-469">    // file system, the tests should use getBaseTestDir, otherwise, we can use</span>
-<span class="source-line-no">470</span><span id="line-470">    // the working directory, and create a unique sub dir there</span>
-<span class="source-line-no">471</span><span id="line-471">    FileSystem fs = getTestFileSystem();</span>
-<span class="source-line-no">472</span><span id="line-472">    Path newDataTestDir;</span>
-<span class="source-line-no">473</span><span id="line-473">    String randomStr = getRandomUUID().toString();</span>
-<span class="source-line-no">474</span><span id="line-474">    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {</span>
-<span class="source-line-no">475</span><span id="line-475">      newDataTestDir = new Path(getDataTestDir(), randomStr);</span>
-<span class="source-line-no">476</span><span id="line-476">      File dataTestDir = new File(newDataTestDir.toString());</span>
-<span class="source-line-no">477</span><span id="line-477">      if (deleteOnExit()) dataTestDir.deleteOnExit();</span>
-<span class="source-line-no">478</span><span id="line-478">    } else {</span>
-<span class="source-line-no">479</span><span id="line-479">      Path base = getBaseTestDirOnTestFS();</span>
-<span class="source-line-no">480</span><span id="line-480">      newDataTestDir = new Path(base, randomStr);</span>
-<span class="source-line-no">481</span><span id="line-481">      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);</span>
-<span class="source-line-no">482</span><span id="line-482">    }</span>
-<span class="source-line-no">483</span><span id="line-483">    return newDataTestDir;</span>
-<span class="source-line-no">484</span><span id="line-484">  }</span>
-<span class="source-line-no">485</span><span id="line-485"></span>
-<span class="source-line-no">486</span><span id="line-486">  /**</span>
-<span class="source-line-no">487</span><span id="line-487">   * Cleans the test data directory on the test filesystem.</span>
-<span class="source-line-no">488</span><span id="line-488">   * @return True if we removed the test dirs</span>
-<span class="source-line-no">489</span><span id="line-489">   */</span>
-<span class="source-line-no">490</span><span id="line-490">  public boolean cleanupDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">491</span><span id="line-491">    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);</span>
-<span class="source-line-no">492</span><span id="line-492">    if (ret) dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">493</span><span id="line-493">    return ret;</span>
-<span class="source-line-no">494</span><span id="line-494">  }</span>
-<span class="source-line-no">495</span><span id="line-495"></span>
-<span class="source-line-no">496</span><span id="line-496">  /**</span>
-<span class="source-line-no">497</span><span id="line-497">   * Cleans a subdirectory under the test data directory on the test filesystem.</span>
-<span class="source-line-no">498</span><span id="line-498">   * @return True if we removed child</span>
-<span class="source-line-no">499</span><span id="line-499">   */</span>
-<span class="source-line-no">500</span><span id="line-500">  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {</span>
-<span class="source-line-no">501</span><span id="line-501">    Path cpath = getDataTestDirOnTestFS(subdirName);</span>
-<span class="source-line-no">502</span><span id="line-502">    return getTestFileSystem().delete(cpath, true);</span>
-<span class="source-line-no">503</span><span id="line-503">  }</span>
-<span class="source-line-no">504</span><span id="line-504"></span>
-<span class="source-line-no">505</span><span id="line-505">  // Workaround to avoid IllegalThreadStateException</span>
-<span class="source-line-no">506</span><span id="line-506">  // See HBASE-27148 for more details</span>
-<span class="source-line-no">507</span><span id="line-507">  private static final class FsDatasetAsyncDiskServiceFixer extends Thread {</span>
+<span class="source-line-no">396</span><span id="line-396">    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but</span>
+<span class="source-line-no">397</span><span id="line-397">    // we want our own value to ensure uniqueness on the same machine</span>
+<span class="source-line-no">398</span><span id="line-398">    createSubDirAndSystemProperty("hadoop.tmp.dir", testPath, "hadoop-tmp-dir");</span>
+<span class="source-line-no">399</span><span id="line-399"></span>
+<span class="source-line-no">400</span><span id="line-400">    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster</span>
+<span class="source-line-no">401</span><span id="line-401">    createSubDir("mapreduce.cluster.local.dir", testPath, "mapred-local-dir");</span>
+<span class="source-line-no">402</span><span id="line-402">    return testPath;</span>
+<span class="source-line-no">403</span><span id="line-403">  }</span>
+<span class="source-line-no">404</span><span id="line-404"></span>
+<span class="source-line-no">405</span><span id="line-405">  private void createSubDirAndSystemProperty(String propertyName, Path parent, String subDirName) {</span>
+<span class="source-line-no">406</span><span id="line-406"></span>
+<span class="source-line-no">407</span><span id="line-407">    String sysValue = System.getProperty(propertyName);</span>
+<span class="source-line-no">408</span><span id="line-408"></span>
+<span class="source-line-no">409</span><span id="line-409">    if (sysValue != null) {</span>
+<span class="source-line-no">410</span><span id="line-410">      // There is already a value set. So we do nothing but hope</span>
+<span class="source-line-no">411</span><span id="line-411">      // that there will be no conflicts</span>
+<span class="source-line-no">412</span><span id="line-412">      LOG.info("System.getProperty(\"" + propertyName + "\") already set to: " + sysValue</span>
+<span class="source-line-no">413</span><span id="line-413">        + " so I do NOT create it in " + parent);</span>
+<span class="source-line-no">414</span><span id="line-414">      String confValue = conf.get(propertyName);</span>
+<span class="source-line-no">415</span><span id="line-415">      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)) {</span>
+<span class="source-line-no">416</span><span id="line-416">        LOG.warn(propertyName + " property value differs in configuration and system: "</span>
+<span class="source-line-no">417</span><span id="line-417">          + "Configuration=" + confValue + " while System=" + sysValue</span>
+<span class="source-line-no">418</span><span id="line-418">          + " Erasing configuration value by system value.");</span>
+<span class="source-line-no">419</span><span id="line-419">      }</span>
+<span class="source-line-no">420</span><span id="line-420">      conf.set(propertyName, sysValue);</span>
+<span class="source-line-no">421</span><span id="line-421">    } else {</span>
+<span class="source-line-no">422</span><span id="line-422">      // Ok, it's not set, so we create it as a subdirectory</span>
+<span class="source-line-no">423</span><span id="line-423">      createSubDir(propertyName, parent, subDirName);</span>
+<span class="source-line-no">424</span><span id="line-424">      System.setProperty(propertyName, conf.get(propertyName));</span>
+<span class="source-line-no">425</span><span id="line-425">    }</span>
+<span class="source-line-no">426</span><span id="line-426">  }</span>
+<span class="source-line-no">427</span><span id="line-427"></span>
+<span class="source-line-no">428</span><span id="line-428">  /**</span>
+<span class="source-line-no">429</span><span id="line-429">   * @return Where to write test data on the test filesystem; Returns working directory for the test</span>
+<span class="source-line-no">430</span><span id="line-430">   *         filesystem by default</span>
+<span class="source-line-no">431</span><span id="line-431">   * @see #setupDataTestDirOnTestFS()</span>
+<span class="source-line-no">432</span><span id="line-432">   * @see #getTestFileSystem()</span>
+<span class="source-line-no">433</span><span id="line-433">   */</span>
+<span class="source-line-no">434</span><span id="line-434">  private Path getBaseTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">435</span><span id="line-435">    FileSystem fs = getTestFileSystem();</span>
+<span class="source-line-no">436</span><span id="line-436">    return new Path(fs.getWorkingDirectory(), "test-data");</span>
+<span class="source-line-no">437</span><span id="line-437">  }</span>
+<span class="source-line-no">438</span><span id="line-438"></span>
+<span class="source-line-no">439</span><span id="line-439">  /**</span>
+<span class="source-line-no">440</span><span id="line-440">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
+<span class="source-line-no">441</span><span id="line-441">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
+<span class="source-line-no">442</span><span id="line-442">   * on it.</span>
+<span class="source-line-no">443</span><span id="line-443">   * @return a unique path in the test filesystem</span>
+<span class="source-line-no">444</span><span id="line-444">   */</span>
+<span class="source-line-no">445</span><span id="line-445">  public Path getDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">446</span><span id="line-446">    if (dataTestDirOnTestFS == null) {</span>
+<span class="source-line-no">447</span><span id="line-447">      setupDataTestDirOnTestFS();</span>
+<span class="source-line-no">448</span><span id="line-448">    }</span>
+<span class="source-line-no">449</span><span id="line-449"></span>
+<span class="source-line-no">450</span><span id="line-450">    return dataTestDirOnTestFS;</span>
+<span class="source-line-no">451</span><span id="line-451">  }</span>
+<span class="source-line-no">452</span><span id="line-452"></span>
+<span class="source-line-no">453</span><span id="line-453">  /**</span>
+<span class="source-line-no">454</span><span id="line-454">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
+<span class="source-line-no">455</span><span id="line-455">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
+<span class="source-line-no">456</span><span id="line-456">   * on it.</span>
+<span class="source-line-no">457</span><span id="line-457">   * @return a unique path in the test filesystem</span>
+<span class="source-line-no">458</span><span id="line-458">   * @param subdirName name of the subdir to create under the base test dir</span>
+<span class="source-line-no">459</span><span id="line-459">   */</span>
+<span class="source-line-no">460</span><span id="line-460">  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {</span>
+<span class="source-line-no">461</span><span id="line-461">    return new Path(getDataTestDirOnTestFS(), subdirName);</span>
+<span class="source-line-no">462</span><span id="line-462">  }</span>
+<span class="source-line-no">463</span><span id="line-463"></span>
+<span class="source-line-no">464</span><span id="line-464">  /**</span>
+<span class="source-line-no">465</span><span id="line-465">   * Sets up a path in test filesystem to be used by tests. Creates a new directory if not already</span>
+<span class="source-line-no">466</span><span id="line-466">   * setup.</span>
+<span class="source-line-no">467</span><span id="line-467">   */</span>
+<span class="source-line-no">468</span><span id="line-468">  private void setupDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">469</span><span id="line-469">    if (dataTestDirOnTestFS != null) {</span>
+<span class="source-line-no">470</span><span id="line-470">      LOG.warn("Data test on test fs dir already setup in " + dataTestDirOnTestFS.toString());</span>
+<span class="source-line-no">471</span><span id="line-471">      return;</span>
+<span class="source-line-no">472</span><span id="line-472">    }</span>
+<span class="source-line-no">473</span><span id="line-473">    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();</span>
+<span class="source-line-no">474</span><span id="line-474">  }</span>
+<span class="source-line-no">475</span><span id="line-475"></span>
+<span class="source-line-no">476</span><span id="line-476">  /**</span>
+<span class="source-line-no">477</span><span id="line-477">   * Sets up a new path in test filesystem to be used by tests.</span>
+<span class="source-line-no">478</span><span id="line-478">   */</span>
+<span class="source-line-no">479</span><span id="line-479">  private Path getNewDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">480</span><span id="line-480">    // The file system can be either local, mini dfs, or if the configuration</span>
+<span class="source-line-no">481</span><span id="line-481">    // is supplied externally, it can be an external cluster FS. If it is a local</span>
+<span class="source-line-no">482</span><span id="line-482">    // file system, the tests should use getBaseTestDir, otherwise, we can use</span>
+<span class="source-line-no">483</span><span id="line-483">    // the working directory, and create a unique sub dir there</span>
+<span class="source-line-no">484</span><span id="line-484">    FileSystem fs = getTestFileSystem();</span>
+<span class="source-line-no">485</span><span id="line-485">    Path newDataTestDir;</span>
+<span class="source-line-no">486</span><span id="line-486">    String randomStr = getRandomUUID().toString();</span>
+<span class="source-line-no">487</span><span id="line-487">    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {</span>
+<span class="source-line-no">488</span><span id="line-488">      newDataTestDir = new Path(getDataTestDir(), randomStr);</span>
+<span class="source-line-no">489</span><span id="line-489">      File dataTestDir = new File(newDataTestDir.toString());</span>
+<span class="source-line-no">490</span><span id="line-490">      if (deleteOnExit()) dataTestDir.deleteOnExit();</span>
+<span class="source-line-no">491</span><span id="line-491">    } else {</span>
+<span class="source-line-no">492</span><span id="line-492">      Path base = getBaseTestDirOnTestFS();</span>
+<span class="source-line-no">493</span><span id="line-493">      newDataTestDir = new Path(base, randomStr);</span>
+<span class="source-line-no">494</span><span id="line-494">      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);</span>
+<span class="source-line-no">495</span><span id="line-495">    }</span>
+<span class="source-line-no">496</span><span id="line-496">    return newDataTestDir;</span>
+<span class="source-line-no">497</span><span id="line-497">  }</span>
+<span class="source-line-no">498</span><span id="line-498"></span>
+<span class="source-line-no">499</span><span id="line-499">  /**</span>
+<span class="source-line-no">500</span><span id="line-500">   * Cleans the test data directory on the test filesystem.</span>
+<span class="source-line-no">501</span><span id="line-501">   * @return True if we removed the test dirs</span>
+<span class="source-line-no">502</span><span id="line-502">   */</span>
+<span class="source-line-no">503</span><span id="line-503">  public boolean cleanupDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">504</span><span id="line-504">    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);</span>
+<span class="source-line-no">505</span><span id="line-505">    if (ret) dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">506</span><span id="line-506">    return ret;</span>
+<span class="source-line-no">507</span><span id="line-507">  }</span>
 <span class="source-line-no">508</span><span id="line-508"></span>
-<span class="source-line-no">509</span><span id="line-509">    private volatile boolean stopped = false;</span>
-<span class="source-line-no">510</span><span id="line-510"></span>
-<span class="source-line-no">511</span><span id="line-511">    private final MiniDFSCluster cluster;</span>
-<span class="source-line-no">512</span><span id="line-512"></span>
-<span class="source-line-no">513</span><span id="line-513">    FsDatasetAsyncDiskServiceFixer(MiniDFSCluster cluster) {</span>
-<span class="source-line-no">514</span><span id="line-514">      super("FsDatasetAsyncDiskServiceFixer");</span>
-<span class="source-line-no">515</span><span id="line-515">      setDaemon(true);</span>
-<span class="source-line-no">516</span><span id="line-516">      this.cluster = cluster;</span>
-<span class="source-line-no">517</span><span id="line-517">    }</span>
-<span class="source-line-no">518</span><span id="line-518"></span>
-<span class="source-line-no">519</span><span id="line-519">    @Override</span>
-<span class="source-line-no">520</span><span id="line-520">    public void run() {</span>
-<span class="source-line-no">521</span><span id="line-521">      while (!stopped) {</span>
-<span class="source-line-no">522</span><span id="line-522">        try {</span>
-<span class="source-line-no">523</span><span id="line-523">          Thread.sleep(30000);</span>
-<span class="source-line-no">524</span><span id="line-524">        } catch (InterruptedException e) {</span>
-<span class="source-line-no">525</span><span id="line-525">          Thread.currentThread().interrupt();</span>
-<span class="source-line-no">526</span><span id="line-526">          continue;</span>
-<span class="source-line-no">527</span><span id="line-527">        }</span>
-<span class="source-line-no">528</span><span id="line-528">        // we could add new datanodes during tests, so here we will check every 30 seconds, as the</span>
-<span class="source-line-no">529</span><span id="line-529">        // timeout of the thread pool executor is 60 seconds by default.</span>
-<span class="source-line-no">530</span><span id="line-530">        try {</span>
-<span class="source-line-no">531</span><span id="line-531">          for (DataNode dn : cluster.getDataNodes()) {</span>
-<span class="source-line-no">532</span><span id="line-532">            FsDatasetSpi&lt;?&gt; dataset = dn.getFSDataset();</span>
-<span class="source-line-no">533</span><span id="line-533">            Field service = dataset.getClass().getDeclaredField("asyncDiskService");</span>
-<span class="source-line-no">534</span><span id="line-534">            service.setAccessible(true);</span>
-<span class="source-line-no">535</span><span id="line-535">            Object asyncDiskService = service.get(dataset);</span>
-<span class="source-line-no">536</span><span id="line-536">            Field group = asyncDiskService.getClass().getDeclaredField("threadGroup");</span>
-<span class="source-line-no">537</span><span id="line-537">            group.setAccessible(true);</span>
-<span class="source-line-no">538</span><span id="line-538">            ThreadGroup threadGroup = (ThreadGroup) group.get(asyncDiskService);</span>
-<span class="source-line-no">539</span><span id="line-539">            if (threadGroup.isDaemon()) {</span>
-<span class="source-line-no">540</span><span id="line-540">              threadGroup.setDaemon(false);</span>
-<span class="source-line-no">541</span><span id="line-541">            }</span>
-<span class="source-line-no">542</span><span id="line-542">          }</span>
-<span class="source-line-no">543</span><span id="line-543">        } catch (NoSuchFieldException e) {</span>
-<span class="source-line-no">544</span><span id="line-544">          LOG.debug("NoSuchFieldException: " + e.getMessage()</span>
-<span class="source-line-no">545</span><span id="line-545">            + "; It might because your Hadoop version &gt; 3.2.3 or 3.3.4, "</span>
-<span class="source-line-no">546</span><span id="line-546">            + "See HBASE-27595 for details.");</span>
-<span class="source-line-no">547</span><span id="line-547">        } catch (Exception e) {</span>
-<span class="source-line-no">548</span><span id="line-548">          LOG.warn("failed to reset thread pool timeout for FsDatasetAsyncDiskService", e);</span>
-<span class="source-line-no">549</span><span id="line-549">        }</span>
-<span class="source-line-no">550</span><span id="line-550">      }</span>
-<span class="source-line-no">551</span><span id="line-551">    }</span>
-<span class="source-line-no">552</span><span id="line-552"></span>
-<span class="source-line-no">553</span><span id="line-553">    void shutdown() {</span>
-<span class="source-line-no">554</span><span id="line-554">      stopped = true;</span>
-<span class="source-line-no">555</span><span id="line-555">      interrupt();</span>
-<span class="source-line-no">556</span><span id="line-556">    }</span>
-<span class="source-line-no">557</span><span id="line-557">  }</span>
-<span class="source-line-no">558</span><span id="line-558"></span>
-<span class="source-line-no">559</span><span id="line-559">  /**</span>
-<span class="source-line-no">560</span><span id="line-560">   * Start a minidfscluster.</span>
-<span class="source-line-no">561</span><span id="line-561">   * @param servers How many DNs to start.</span>
-<span class="source-line-no">562</span><span id="line-562">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">563</span><span id="line-563">   * @return The mini dfs cluster created.</span>
-<span class="source-line-no">564</span><span id="line-564">   */</span>
-<span class="source-line-no">565</span><span id="line-565">  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {</span>
-<span class="source-line-no">566</span><span id="line-566">    return startMiniDFSCluster(servers, null);</span>
-<span class="source-line-no">567</span><span id="line-567">  }</span>
-<span class="source-line-no">568</span><span id="line-568"></span>
-<span class="source-line-no">569</span><span id="line-569">  /**</span>
-<span class="source-line-no">570</span><span id="line-570">   * Start a minidfscluster. This is useful if you want to run datanode on distinct hosts for things</span>
-<span class="source-line-no">571</span><span id="line-571">   * like HDFS block location verification. If you start MiniDFSCluster without host names, all</span>
-<span class="source-line-no">572</span><span id="line-572">   * instances of the datanodes will have the same host name.</span>
-<span class="source-line-no">573</span><span id="line-573">   * @param hosts hostnames DNs to run on.</span>
-<span class="source-line-no">574</span><span id="line-574">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">575</span><span id="line-575">   * @return The mini dfs cluster created.</span>
-<span class="source-line-no">576</span><span id="line-576">   */</span>
-<span class="source-line-no">577</span><span id="line-577">  public MiniDFSCluster startMiniDFSCluster(final String hosts[]) throws Exception {</span>
-<span class="source-line-no">578</span><span id="line-578">    if (hosts != null &amp;&amp; hosts.length != 0) {</span>
-<span class="source-line-no">579</span><span id="line-579">      return startMiniDFSCluster(hosts.length, hosts);</span>
-<span class="source-line-no">580</span><span id="line-580">    } else {</span>
-<span class="source-line-no">581</span><span id="line-581">      return startMiniDFSCluster(1, null);</span>
-<span class="source-line-no">582</span><span id="line-582">    }</span>
-<span class="source-line-no">583</span><span id="line-583">  }</span>
-<span class="source-line-no">584</span><span id="line-584"></span>
-<span class="source-line-no">585</span><span id="line-585">  /**</span>
-<span class="source-line-no">586</span><span id="line-586">   * Start a minidfscluster. Can only create one.</span>
-<span class="source-line-no">587</span><span id="line-587">   * @param servers How many DNs to start.</span>
-<span class="source-line-no">588</span><span id="line-588">   * @param hosts   hostnames DNs to run on.</span>
-<span class="source-line-no">589</span><span id="line-589">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">590</span><span id="line-590">   * @return The mini dfs cluster created.</span>
-<span class="source-line-no">591</span><span id="line-591">   */</span>
-<span class="source-line-no">592</span><span id="line-592">  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[]) throws Exception {</span>
-<span class="source-line-no">593</span><span id="line-593">    return startMiniDFSCluster(servers, null, hosts);</span>
-<span class="source-line-no">594</span><span id="line-594">  }</span>
-<span class="source-line-no">595</span><span id="line-595"></span>
-<span class="source-line-no">596</span><span id="line-596">  private void setFs() throws IOException {</span>
-<span class="source-line-no">597</span><span id="line-597">    if (this.dfsCluster == null) {</span>
-<span class="source-line-no">598</span><span id="line-598">      LOG.info("Skipping setting fs because dfsCluster is null");</span>
-<span class="source-line-no">599</span><span id="line-599">      return;</span>
-<span class="source-line-no">600</span><span id="line-600">    }</span>
-<span class="source-line-no">601</span><span id="line-601">    FileSystem fs = this.dfsCluster.getFileSystem();</span>
-<span class="source-line-no">602</span><span id="line-602">    CommonFSUtils.setFsDefault(this.conf, new Path(fs.getUri()));</span>
-<span class="source-line-no">603</span><span id="line-603"></span>
-<span class="source-line-no">604</span><span id="line-604">    // re-enable this check with dfs</span>
-<span class="source-line-no">605</span><span id="line-605">    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);</span>
-<span class="source-line-no">606</span><span id="line-606">  }</span>
-<span class="source-line-no">607</span><span id="line-607"></span>
-<span class="source-line-no">608</span><span id="line-608">  public MiniDFSCluster startMiniDFSCluster(int servers, final String racks[], String hosts[])</span>
-<span class="source-line-no">609</span><span id="line-609">    throws Exception {</span>
-<span class="source-line-no">610</span><span id="line-610">    createDirsAndSetProperties();</span>
-<span class="source-line-no">611</span><span id="line-611">    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);</span>
-<span class="source-line-no">612</span><span id="line-612"></span>
-<span class="source-line-no">613</span><span id="line-613">    this.dfsCluster =</span>
-<span class="source-line-no">614</span><span id="line-614">      new MiniDFSCluster(0, this.conf, servers, true, true, true, null, racks, hosts, null);</span>
-<span class="source-line-no">615</span><span id="line-615">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
-<span class="source-line-no">616</span><span id="line-616">    this.dfsClusterFixer.start();</span>
-<span class="source-line-no">617</span><span id="line-617">    // Set this just-started cluster as our filesystem.</span>
-<span class="source-line-no">618</span><span id="line-618">    setFs();</span>
-<span class="source-line-no">619</span><span id="line-619"></span>
-<span class="source-line-no">620</span><span id="line-620">    // Wait for the cluster to be totally up</span>
-<span class="source-line-no">621</span><span id="line-621">    this.dfsCluster.waitClusterUp();</span>
-<span class="source-line-no">622</span><span id="line-622"></span>
-<span class="source-line-no">623</span><span id="line-623">    // reset the test directory for test file system</span>
-<span class="source-line-no">624</span><span id="line-624">    dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">625</span><span id="line-625">    String dataTestDir = getDataTestDir().toString();</span>
-<span class="source-line-no">626</span><span id="line-626">    conf.set(HConstants.HBASE_DIR, dataTestDir);</span>
-<span class="source-line-no">627</span><span id="line-627">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
-<span class="source-line-no">628</span><span id="line-628"></span>
-<span class="source-line-no">629</span><span id="line-629">    return this.dfsCluster;</span>
-<span class="source-line-no">630</span><span id="line-630">  }</span>
-<span class="source-line-no">631</span><span id="line-631"></span>
-<span class="source-line-no">632</span><span id="line-632">  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {</span>
-<span class="source-line-no">633</span><span id="line-633">    createDirsAndSetProperties();</span>
-<span class="source-line-no">634</span><span id="line-634">    dfsCluster =</span>
-<span class="source-line-no">635</span><span id="line-635">      new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null, null, null, null);</span>
-<span class="source-line-no">636</span><span id="line-636">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
-<span class="source-line-no">637</span><span id="line-637">    this.dfsClusterFixer.start();</span>
-<span class="source-line-no">638</span><span id="line-638">    return dfsCluster;</span>
-<span class="source-line-no">639</span><span id="line-639">  }</span>
-<span class="source-line-no">640</span><span id="line-640"></span>
-<span class="source-line-no">641</span><span id="line-641">  /**</span>
-<span class="source-line-no">642</span><span id="line-642">   * This is used before starting HDFS and map-reduce mini-clusters Run something like the below to</span>
-<span class="source-line-no">643</span><span id="line-643">   * check for the likes of '/tmp' references -- i.e. references outside of the test data dir -- in</span>
-<span class="source-line-no">644</span><span id="line-644">   * the conf.</span>
-<span class="source-line-no">645</span><span id="line-645">   *</span>
-<span class="source-line-no">646</span><span id="line-646">   * &lt;pre&gt;</span>
-<span class="source-line-no">647</span><span id="line-647">   * Configuration conf = TEST_UTIL.getConfiguration();</span>
-<span class="source-line-no">648</span><span id="line-648">   * for (Iterator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt; i = conf.iterator(); i.hasNext();) {</span>
-<span class="source-line-no">649</span><span id="line-649">   *   Map.Entry&amp;lt;String, String&amp;gt; e = i.next();</span>
-<span class="source-line-no">650</span><span id="line-650">   *   assertFalse(e.getKey() + " " + e.getValue(), e.getValue().contains("/tmp"));</span>
-<span class="source-line-no">651</span><span id="line-651">   * }</span>
-<span class="source-line-no">652</span><span id="line-652">   * &lt;/pre&gt;</span>
-<span class="source-line-no">653</span><span id="line-653">   */</span>
-<span class="source-line-no">654</span><span id="line-654">  private void createDirsAndSetProperties() throws IOException {</span>
-<span class="source-line-no">655</span><span id="line-655">    setupClusterTestDir();</span>
-<span class="source-line-no">656</span><span id="line-656">    conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, clusterTestDir.getCanonicalPath());</span>
-<span class="source-line-no">657</span><span id="line-657">    createDirAndSetProperty("test.cache.data");</span>
-<span class="source-line-no">658</span><span id="line-658">    createDirAndSetProperty("hadoop.tmp.dir");</span>
-<span class="source-line-no">659</span><span id="line-659">    hadoopLogDir = createDirAndSetProperty("hadoop.log.dir");</span>
-<span class="source-line-no">660</span><span id="line-660">    createDirAndSetProperty("mapreduce.cluster.local.dir");</span>
-<span class="source-line-no">661</span><span id="line-661">    createDirAndSetProperty("mapreduce.cluster.temp.dir");</span>
-<span class="source-line-no">662</span><span id="line-662">    enableShortCircuit();</span>
-<span class="source-line-no">663</span><span id="line-663"></span>
-<span class="source-line-no">664</span><span id="line-664">    Path root = getDataTestDirOnTestFS("hadoop");</span>
-<span class="source-line-no">665</span><span id="line-665">    conf.set(MapreduceTestingShim.getMROutputDirProp(),</span>
-<span class="source-line-no">666</span><span id="line-666">      new Path(root, "mapred-output-dir").toString());</span>
-<span class="source-line-no">667</span><span id="line-667">    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());</span>
-<span class="source-line-no">668</span><span id="line-668">    conf.set("mapreduce.jobtracker.staging.root.dir",</span>
-<span class="source-line-no">669</span><span id="line-669">      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());</span>
-<span class="source-line-no">670</span><span id="line-670">    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());</span>
-<span class="source-line-no">671</span><span id="line-671">    conf.set("yarn.app.mapreduce.am.staging-dir",</span>
-<span class="source-line-no">672</span><span id="line-672">      new Path(root, "mapreduce-am-staging-root-dir").toString());</span>
-<span class="source-line-no">673</span><span id="line-673"></span>
-<span class="source-line-no">674</span><span id="line-674">    // Frustrate yarn's and hdfs's attempts at writing /tmp.</span>
-<span class="source-line-no">675</span><span id="line-675">    // Below is fragile. Make it so we just interpolate any 'tmp' reference.</span>
-<span class="source-line-no">676</span><span id="line-676">    createDirAndSetProperty("yarn.node-labels.fs-store.root-dir");</span>
-<span class="source-line-no">677</span><span id="line-677">    createDirAndSetProperty("yarn.node-attribute.fs-store.root-dir");</span>
-<span class="source-line-no">678</span><span id="line-678">    createDirAndSetProperty("yarn.nodemanager.log-dirs");</span>
-<span class="source-line-no">679</span><span id="line-679">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
-<span class="source-line-no">680</span><span id="line-680">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.active-dir");</span>
-<span class="source-line-no">681</span><span id="line-681">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.done-dir");</span>
-<span class="source-line-no">682</span><span id="line-682">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
-<span class="source-line-no">683</span><span id="line-683">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
-<span class="source-line-no">684</span><span id="line-684">    createDirAndSetProperty("dfs.datanode.shared.file.descriptor.paths");</span>
-<span class="source-line-no">685</span><span id="line-685">    createDirAndSetProperty("nfs.dump.dir");</span>
-<span class="source-line-no">686</span><span id="line-686">    createDirAndSetProperty("java.io.tmpdir");</span>
-<span class="source-line-no">687</span><span id="line-687">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
-<span class="source-line-no">688</span><span id="line-688">    createDirAndSetProperty("dfs.provided.aliasmap.inmemory.leveldb.dir");</span>
-<span class="source-line-no">689</span><span id="line-689">    createDirAndSetProperty("fs.s3a.committer.staging.tmp.path");</span>
-<span class="source-line-no">690</span><span id="line-690"></span>
-<span class="source-line-no">691</span><span id="line-691">    // disable metrics logger since it depend on commons-logging internal classes and we do not want</span>
-<span class="source-line-no">692</span><span id="line-692">    // commons-logging on our classpath</span>
-<span class="source-line-no">693</span><span id="line-693">    conf.setInt(DFSConfigKeys.DFS_NAMENODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
-<span class="source-line-no">694</span><span id="line-694">    conf.setInt(DFSConfigKeys.DFS_DATANODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
-<span class="source-line-no">695</span><span id="line-695">  }</span>
-<span class="source-line-no">696</span><span id="line-696"></span>
-<span class="source-line-no">697</span><span id="line-697">  /**</span>
-<span class="source-line-no">698</span><span id="line-698">   * Check whether the tests should assume NEW_VERSION_BEHAVIOR when creating new column families.</span>
-<span class="source-line-no">699</span><span id="line-699">   * Default to false.</span>
-<span class="source-line-no">700</span><span id="line-700">   */</span>
-<span class="source-line-no">701</span><span id="line-701">  public boolean isNewVersionBehaviorEnabled() {</span>
-<span class="source-line-no">702</span><span id="line-702">    final String propName = "hbase.tests.new.version.behavior";</span>
-<span class="source-line-no">703</span><span id="line-703">    String v = System.getProperty(propName);</span>
-<span class="source-line-no">704</span><span id="line-704">    if (v != null) {</span>
-<span class="source-line-no">705</span><span id="line-705">      return Boolean.parseBoolean(v);</span>
-<span class="source-line-no">706</span><span id="line-706">    }</span>
-<span class="source-line-no">707</span><span id="line-707">    return false;</span>
+<span class="source-line-no">509</span><span id="line-509">  /**</span>
+<span class="source-line-no">510</span><span id="line-510">   * Cleans a subdirectory under the test data directory on the test filesystem.</span>
+<span class="source-line-no">511</span><span id="line-511">   * @return True if we removed child</span>
+<span class="source-line-no">512</span><span id="line-512">   */</span>
+<span class="source-line-no">513</span><span id="line-513">  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {</span>
+<span class="source-line-no">514</span><span id="line-514">    Path cpath = getDataTestDirOnTestFS(subdirName);</span>
+<span class="source-line-no">515</span><span id="line-515">    return getTestFileSystem().delete(cpath, true);</span>
+<span class="source-line-no">516</span><span id="line-516">  }</span>
+<span class="source-line-no">517</span><span id="line-517"></span>
+<span class="source-line-no">518</span><span id="line-518">  // Workaround to avoid IllegalThreadStateException</span>
+<span class="source-line-no">519</span><span id="line-519">  // See HBASE-27148 for more details</span>
+<span class="source-line-no">520</span><span id="line-520">  private static final class FsDatasetAsyncDiskServiceFixer extends Thread {</span>
+<span class="source-line-no">521</span><span id="line-521"></span>
+<span class="source-line-no">522</span><span id="line-522">    private volatile boolean stopped = false;</span>
+<span class="source-line-no">523</span><span id="line-523"></span>
+<span class="source-line-no">524</span><span id="line-524">    private final MiniDFSCluster cluster;</span>
+<span class="source-line-no">525</span><span id="line-525"></span>
+<span class="source-line-no">526</span><span id="line-526">    FsDatasetAsyncDiskServiceFixer(MiniDFSCluster cluster) {</span>
+<span class="source-line-no">527</span><span id="line-527">      super("FsDatasetAsyncDiskServiceFixer");</span>
+<span class="source-line-no">528</span><span id="line-528">      setDaemon(true);</span>
+<span class="source-line-no">529</span><span id="line-529">      this.cluster = cluster;</span>
+<span class="source-line-no">530</span><span id="line-530">    }</span>
+<span class="source-line-no">531</span><span id="line-531"></span>
+<span class="source-line-no">532</span><span id="line-532">    @Override</span>
+<span class="source-line-no">533</span><span id="line-533">    public void run() {</span>
+<span class="source-line-no">534</span><span id="line-534">      while (!stopped) {</span>
+<span class="source-line-no">535</span><span id="line-535">        try {</span>
+<span class="source-line-no">536</span><span id="line-536">          Thread.sleep(30000);</span>
+<span class="source-line-no">537</span><span id="line-537">        } catch (InterruptedException e) {</span>
+<span class="source-line-no">538</span><span id="line-538">          Thread.currentThread().interrupt();</span>
+<span class="source-line-no">539</span><span id="line-539">          continue;</span>
+<span class="source-line-no">540</span><span id="line-540">        }</span>
+<span class="source-line-no">541</span><span id="line-541">        // we could add new datanodes during tests, so here we will check every 30 seconds, as the</span>
+<span class="source-line-no">542</span><span id="line-542">        // timeout of the thread pool executor is 60 seconds by default.</span>
+<span class="source-line-no">543</span><span id="line-543">        try {</span>
+<span class="source-line-no">544</span><span id="line-544">          for (DataNode dn : cluster.getDataNodes()) {</span>
+<span class="source-line-no">545</span><span id="line-545">            FsDatasetSpi&lt;?&gt; dataset = dn.getFSDataset();</span>
+<span class="source-line-no">546</span><span id="line-546">            Field service = dataset.getClass().getDeclaredField("asyncDiskService");</span>
+<span class="source-line-no">547</span><span id="line-547">            service.setAccessible(true);</span>
+<span class="source-line-no">548</span><span id="line-548">            Object asyncDiskService = service.get(dataset);</span>
+<span class="source-line-no">549</span><span id="line-549">            Field group = asyncDiskService.getClass().getDeclaredField("threadGroup");</span>
+<span class="source-line-no">550</span><span id="line-550">            group.setAccessible(true);</span>
+<span class="source-line-no">551</span><span id="line-551">            ThreadGroup threadGroup = (ThreadGroup) group.get(asyncDiskService);</span>
+<span class="source-line-no">552</span><span id="line-552">            if (threadGroup.isDaemon()) {</span>
+<span class="source-line-no">553</span><span id="line-553">              threadGroup.setDaemon(false);</span>
+<span class="source-line-no">554</span><span id="line-554">            }</span>
+<span class="source-line-no">555</span><span id="line-555">          }</span>
+<span class="source-line-no">556</span><span id="line-556">        } catch (NoSuchFieldException e) {</span>
+<span class="source-line-no">557</span><span id="line-557">          LOG.debug("NoSuchFieldException: " + e.getMessage()</span>
+<span class="source-line-no">558</span><span id="line-558">            + "; It might because your Hadoop version &gt; 3.2.3 or 3.3.4, "</span>
+<span class="source-line-no">559</span><span id="line-559">            + "See HBASE-27595 for details.");</span>
+<span class="source-line-no">560</span><span id="line-560">        } catch (Exception e) {</span>
+<span class="source-line-no">561</span><span id="line-561">          LOG.warn("failed to reset thread pool timeout for FsDatasetAsyncDiskService", e);</span>
+<span class="source-line-no">562</span><span id="line-562">        }</span>
+<span class="source-line-no">563</span><span id="line-563">      }</span>
+<span class="source-line-no">564</span><span id="line-564">    }</span>
+<span class="source-line-no">565</span><span id="line-565"></span>
+<span class="source-line-no">566</span><span id="line-566">    void shutdown() {</span>
+<span class="source-line-no">567</span><span id="line-567">      stopped = true;</span>
+<span class="source-line-no">568</span><span id="line-568">      interrupt();</span>
+<span class="source-line-no">569</span><span id="line-569">    }</span>
+<span class="source-line-no">570</span><span id="line-570">  }</span>
+<span class="source-line-no">571</span><span id="line-571"></span>
+<span class="source-line-no">572</span><span id="line-572">  /**</span>
+<span class="source-line-no">573</span><span id="line-573">   * Start a minidfscluster.</span>
+<span class="source-line-no">574</span><span id="line-574">   * @param servers How many DNs to start.</span>
+<span class="source-line-no">575</span><span id="line-575">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">576</span><span id="line-576">   * @return The mini dfs cluster created.</span>
+<span class="source-line-no">577</span><span id="line-577">   */</span>
+<span class="source-line-no">578</span><span id="line-578">  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {</span>
+<span class="source-line-no">579</span><span id="line-579">    return startMiniDFSCluster(servers, null);</span>
+<span class="source-line-no">580</span><span id="line-580">  }</span>
+<span class="source-line-no">581</span><span id="line-581"></span>
+<span class="source-line-no">582</span><span id="line-582">  /**</span>
+<span class="source-line-no">583</span><span id="line-583">   * Start a minidfscluster. This is useful if you want to run datanode on distinct hosts for things</span>
+<span class="source-line-no">584</span><span id="line-584">   * like HDFS block location verification. If you start MiniDFSCluster without host names, all</span>
+<span class="source-line-no">585</span><span id="line-585">   * instances of the datanodes will have the same host name.</span>
+<span class="source-line-no">586</span><span id="line-586">   * @param hosts hostnames DNs to run on.</span>
+<span class="source-line-no">587</span><span id="line-587">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">588</span><span id="line-588">   * @return The mini dfs cluster created.</span>
+<span class="source-line-no">589</span><span id="line-589">   */</span>
+<span class="source-line-no">590</span><span id="line-590">  public MiniDFSCluster startMiniDFSCluster(final String hosts[]) throws Exception {</span>
+<span class="source-line-no">591</span><span id="line-591">    if (hosts != null &amp;&amp; hosts.length != 0) {</span>
+<span class="source-line-no">592</span><span id="line-592">      return startMiniDFSCluster(hosts.length, hosts);</span>
+<span class="source-line-no">593</span><span id="line-593">    } else {</span>
+<span class="source-line-no">594</span><span id="line-594">      return startMiniDFSCluster(1, null);</span>
+<span class="source-line-no">595</span><span id="line-595">    }</span>
+<span class="source-line-no">596</span><span id="line-596">  }</span>
+<span class="source-line-no">597</span><span id="line-597"></span>
+<span class="source-line-no">598</span><span id="line-598">  /**</span>
+<span class="source-line-no">599</span><span id="line-599">   * Start a minidfscluster. Can only create one.</span>
+<span class="source-line-no">600</span><span id="line-600">   * @param servers How many DNs to start.</span>
+<span class="source-line-no">601</span><span id="line-601">   * @param hosts   hostnames DNs to run on.</span>
+<span class="source-line-no">602</span><span id="line-602">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">603</span><span id="line-603">   * @return The mini dfs cluster created.</span>
+<span class="source-line-no">604</span><span id="line-604">   */</span>
+<span class="source-line-no">605</span><span id="line-605">  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[]) throws Exception {</span>
+<span class="source-line-no">606</span><span id="line-606">    return startMiniDFSCluster(servers, null, hosts);</span>
+<span class="source-line-no">607</span><span id="line-607">  }</span>
+<span class="source-line-no">608</span><span id="line-608"></span>
+<span class="source-line-no">609</span><span id="line-609">  private void setFs() throws IOException {</span>
+<span class="source-line-no">610</span><span id="line-610">    if (this.dfsCluster == null) {</span>
+<span class="source-line-no">611</span><span id="line-611">      LOG.info("Skipping setting fs because dfsCluster is null");</span>
+<span class="source-line-no">612</span><span id="line-612">      return;</span>
+<span class="source-line-no">613</span><span id="line-613">    }</span>
+<span class="source-line-no">614</span><span id="line-614">    FileSystem fs = this.dfsCluster.getFileSystem();</span>
+<span class="source-line-no">615</span><span id="line-615">    CommonFSUtils.setFsDefault(this.conf, new Path(fs.getUri()));</span>
+<span class="source-line-no">616</span><span id="line-616"></span>
+<span class="source-line-no">617</span><span id="line-617">    // re-enable this check with dfs</span>
+<span class="source-line-no">618</span><span id="line-618">    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);</span>
+<span class="source-line-no">619</span><span id="line-619">  }</span>
+<span class="source-line-no">620</span><span id="line-620"></span>
+<span class="source-line-no">621</span><span id="line-621">  public MiniDFSCluster startMiniDFSCluster(int servers, final String racks[], String hosts[])</span>
+<span class="source-line-no">622</span><span id="line-622">    throws Exception {</span>
+<span class="source-line-no">623</span><span id="line-623">    createDirsAndSetProperties();</span>
+<span class="source-line-no">624</span><span id="line-624">    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);</span>
+<span class="source-line-no">625</span><span id="line-625"></span>
+<span class="source-line-no">626</span><span id="line-626">    this.dfsCluster =</span>
+<span class="source-line-no">627</span><span id="line-627">      new MiniDFSCluster(0, this.conf, servers, true, true, true, null, racks, hosts, null);</span>
+<span class="source-line-no">628</span><span id="line-628">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
+<span class="source-line-no">629</span><span id="line-629">    this.dfsClusterFixer.start();</span>
+<span class="source-line-no">630</span><span id="line-630">    // Set this just-started cluster as our filesystem.</span>
+<span class="source-line-no">631</span><span id="line-631">    setFs();</span>
+<span class="source-line-no">632</span><span id="line-632"></span>
+<span class="source-line-no">633</span><span id="line-633">    // Wait for the cluster to be totally up</span>
+<span class="source-line-no">634</span><span id="line-634">    this.dfsCluster.waitClusterUp();</span>
+<span class="source-line-no">635</span><span id="line-635"></span>
+<span class="source-line-no">636</span><span id="line-636">    // reset the test directory for test file system</span>
+<span class="source-line-no">637</span><span id="line-637">    dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">638</span><span id="line-638">    String dataTestDir = getDataTestDir().toString();</span>
+<span class="source-line-no">639</span><span id="line-639">    conf.set(HConstants.HBASE_DIR, dataTestDir);</span>
+<span class="source-line-no">640</span><span id="line-640">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
+<span class="source-line-no">641</span><span id="line-641"></span>
+<span class="source-line-no">642</span><span id="line-642">    return this.dfsCluster;</span>
+<span class="source-line-no">643</span><span id="line-643">  }</span>
+<span class="source-line-no">644</span><span id="line-644"></span>
+<span class="source-line-no">645</span><span id="line-645">  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {</span>
+<span class="source-line-no">646</span><span id="line-646">    createDirsAndSetProperties();</span>
+<span class="source-line-no">647</span><span id="line-647">    dfsCluster =</span>
+<span class="source-line-no">648</span><span id="line-648">      new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null, null, null, null);</span>
+<span class="source-line-no">649</span><span id="line-649">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
+<span class="source-line-no">650</span><span id="line-650">    this.dfsClusterFixer.start();</span>
+<span class="source-line-no">651</span><span id="line-651">    return dfsCluster;</span>
+<span class="source-line-no">652</span><span id="line-652">  }</span>
+<span class="source-line-no">653</span><span id="line-653"></span>
+<span class="source-line-no">654</span><span id="line-654">  /**</span>
+<span class="source-line-no">655</span><span id="line-655">   * This is used before starting HDFS and map-reduce mini-clusters Run something like the below to</span>
+<span class="source-line-no">656</span><span id="line-656">   * check for the likes of '/tmp' references -- i.e. references outside of the test data dir -- in</span>
+<span class="source-line-no">657</span><span id="line-657">   * the conf.</span>
+<span class="source-line-no">658</span><span id="line-658">   *</span>
+<span class="source-line-no">659</span><span id="line-659">   * &lt;pre&gt;</span>
+<span class="source-line-no">660</span><span id="line-660">   * Configuration conf = TEST_UTIL.getConfiguration();</span>
+<span class="source-line-no">661</span><span id="line-661">   * for (Iterator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt; i = conf.iterator(); i.hasNext();) {</span>
+<span class="source-line-no">662</span><span id="line-662">   *   Map.Entry&amp;lt;String, String&amp;gt; e = i.next();</span>
+<span class="source-line-no">663</span><span id="line-663">   *   assertFalse(e.getKey() + " " + e.getValue(), e.getValue().contains("/tmp"));</span>
+<span class="source-line-no">664</span><span id="line-664">   * }</span>
+<span class="source-line-no">665</span><span id="line-665">   * &lt;/pre&gt;</span>
+<span class="source-line-no">666</span><span id="line-666">   */</span>
+<span class="source-line-no">667</span><span id="line-667">  private void createDirsAndSetProperties() throws IOException {</span>
+<span class="source-line-no">668</span><span id="line-668">    setupClusterTestDir();</span>
+<span class="source-line-no">669</span><span id="line-669">    conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, clusterTestDir.getCanonicalPath());</span>
+<span class="source-line-no">670</span><span id="line-670">    createDirAndSetProperty("test.cache.data");</span>
+<span class="source-line-no">671</span><span id="line-671">    createDirAndSetProperty("hadoop.tmp.dir");</span>
+<span class="source-line-no">672</span><span id="line-672">    hadoopLogDir = createDirAndSetProperty("hadoop.log.dir");</span>
+<span class="source-line-no">673</span><span id="line-673">    createDirAndSetProperty("mapreduce.cluster.local.dir");</span>
+<span class="source-line-no">674</span><span id="line-674">    createDirAndSetProperty("mapreduce.cluster.temp.dir");</span>
+<span class="source-line-no">675</span><span id="line-675">    enableShortCircuit();</span>
+<span class="source-line-no">676</span><span id="line-676"></span>
+<span class="source-line-no">677</span><span id="line-677">    Path root = getDataTestDirOnTestFS("hadoop");</span>
+<span class="source-line-no">678</span><span id="line-678">    conf.set(MapreduceTestingShim.getMROutputDirProp(),</span>
+<span class="source-line-no">679</span><span id="line-679">      new Path(root, "mapred-output-dir").toString());</span>
+<span class="source-line-no">680</span><span id="line-680">    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());</span>
+<span class="source-line-no">681</span><span id="line-681">    conf.set("mapreduce.jobtracker.staging.root.dir",</span>
+<span class="source-line-no">682</span><span id="line-682">      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());</span>
+<span class="source-line-no">683</span><span id="line-683">    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());</span>
+<span class="source-line-no">684</span><span id="line-684">    conf.set("yarn.app.mapreduce.am.staging-dir",</span>
+<span class="source-line-no">685</span><span id="line-685">      new Path(root, "mapreduce-am-staging-root-dir").toString());</span>
+<span class="source-line-no">686</span><span id="line-686"></span>
+<span class="source-line-no">687</span><span id="line-687">    // Frustrate yarn's and hdfs's attempts at writing /tmp.</span>
+<span class="source-line-no">688</span><span id="line-688">    // Below is fragile. Make it so we just interpolate any 'tmp' reference.</span>
+<span class="source-line-no">689</span><span id="line-689">    createDirAndSetProperty("yarn.node-labels.fs-store.root-dir");</span>
+<span class="source-line-no">690</span><span id="line-690">    createDirAndSetProperty("yarn.node-attribute.fs-store.root-dir");</span>
+<span class="source-line-no">691</span><span id="line-691">    createDirAndSetProperty("yarn.nodemanager.log-dirs");</span>
+<span class="source-line-no">692</span><span id="line-692">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
+<span class="source-line-no">693</span><span id="line-693">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.active-dir");</span>
+<span class="source-line-no">694</span><span id="line-694">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.done-dir");</span>
+<span class="source-line-no">695</span><span id="line-695">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
+<span class="source-line-no">696</span><span id="line-696">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
+<span class="source-line-no">697</span><span id="line-697">    createDirAndSetProperty("dfs.datanode.shared.file.descriptor.paths");</span>
+<span class="source-line-no">698</span><span id="line-698">    createDirAndSetProperty("nfs.dump.dir");</span>
+<span class="source-line-no">699</span><span id="line-699">    createDirAndSetProperty("java.io.tmpdir");</span>
+<span class="source-line-no">700</span><span id="line-700">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
+<span class="source-line-no">701</span><span id="line-701">    createDirAndSetProperty("dfs.provided.aliasmap.inmemory.leveldb.dir");</span>
+<span class="source-line-no">702</span><span id="line-702">    createDirAndSetProperty("fs.s3a.committer.staging.tmp.path");</span>
+<span class="source-line-no">703</span><span id="line-703"></span>
+<span class="source-line-no">704</span><span id="line-704">    // disable metrics logger since it depend on commons-logging internal classes and we do not want</span>
+<span class="source-line-no">705</span><span id="line-705">    // commons-logging on our classpath</span>
+<span class="source-line-no">706</span><span id="line-706">    conf.setInt(DFSConfigKeys.DFS_NAMENODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
+<span class="source-line-no">707</span><span id="line-707">    conf.setInt(DFSConfigKeys.DFS_DATANODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
 <span class="source-line-no">708</span><span id="line-708">  }</span>
 <span class="source-line-no">709</span><span id="line-709"></span>
 <span class="source-line-no">710</span><span id="line-710">  /**</span>
-<span class="source-line-no">711</span><span id="line-711">   * Get the HBase setting for dfs.client.read.shortcircuit from the conf or a system property. This</span>
-<span class="source-line-no">712</span><span id="line-712">   * allows to specify this parameter on the command line. If not set, default is true.</span>
+<span class="source-line-no">711</span><span id="line-711">   * Check whether the tests should assume NEW_VERSION_BEHAVIOR when creating new column families.</span>
+<span class="source-line-no">712</span><span id="line-712">   * Default to false.</span>
 <span class="source-line-no">713</span><span id="line-713">   */</span>
-<span class="source-line-no">714</span><span id="line-714">  public boolean isReadShortCircuitOn() {</span>
-<span class="source-line-no">715</span><span id="line-715">    final String propName = "hbase.tests.use.shortcircuit.reads";</span>
-<span class="source-line-no">716</span><span id="line-716">    String readOnProp = System.getProperty(propName);</span>
-<span class="source-line-no">717</span><span id="line-717">    if (readOnProp != null) {</span>
-<span class="source-line-no">718</span><span id="line-718">      return Boolean.parseBoolean(readOnProp);</span>
-<span class="source-line-no">719</span><span id="line-719">    } else {</span>
-<span class="source-line-no">720</span><span id="line-720">      return conf.getBoolean(propName, false);</span>
-<span class="source-line-no">721</span><span id="line-721">    }</span>
-<span class="source-line-no">722</span><span id="line-722">  }</span>
-<span class="source-line-no">723</span><span id="line-723"></span>
-<span class="source-line-no">724</span><span id="line-724">  /**</span>
-<span class="source-line-no">725</span><span id="line-725">   * Enable the short circuit read, unless configured differently. Set both HBase and HDFS settings,</span>
-<span class="source-line-no">726</span><span id="line-726">   * including skipping the hdfs checksum checks.</span>
-<span class="source-line-no">727</span><span id="line-727">   */</span>
-<span class="source-line-no">728</span><span id="line-728">  private void enableShortCircuit() {</span>
-<span class="source-line-no">729</span><span id="line-729">    if (isReadShortCircuitOn()) {</span>
-<span class="source-line-no">730</span><span id="line-730">      String curUser = System.getProperty("user.name");</span>
-<span class="source-line-no">731</span><span id="line-731">      LOG.info("read short circuit is ON for user " + curUser);</span>
-<span class="source-line-no">732</span><span id="line-732">      // read short circuit, for hdfs</span>
-<span class="source-line-no">733</span><span id="line-733">      conf.set("dfs.block.local-path-access.user", curUser);</span>
-<span class="source-line-no">734</span><span id="line-734">      // read short circuit, for hbase</span>
-<span class="source-line-no">735</span><span id="line-735">      conf.setBoolean("dfs.client.read.shortcircuit", true);</span>
-<span class="source-line-no">736</span><span id="line-736">      // Skip checking checksum, for the hdfs client and the datanode</span>
-<span class="source-line-no">737</span><span id="line-737">      conf.setBoolean("dfs.client.read.shortcircuit.skip.checksum", true);</span>
-<span class="source-line-no">738</span><span id="line-738">    } else {</span>
-<span class="source-line-no">739</span><span id="line-739">      LOG.info("read short circuit is OFF");</span>
-<span class="source-line-no">740</span><span id="line-740">    }</span>
-<span class="source-line-no">741</span><span id="line-741">  }</span>
-<span class="source-line-no">742</span><span id="line-742"></span>
-<span class="source-line-no">743</span><span id="line-743">  private String createDirAndSetProperty(final String property) {</span>
-<span class="source-line-no">744</span><span id="line-744">    return createDirAndSetProperty(property, property);</span>
-<span class="source-line-no">745</span><span id="line-745">  }</span>
-<span class="source-line-no">746</span><span id="line-746"></span>
-<span class="source-line-no">747</span><span id="line-747">  private String createDirAndSetProperty(final String relPath, String property) {</span>
-<span class="source-line-no">748</span><span id="line-748">    String path = getDataTestDir(relPath).toString();</span>
-<span class="source-line-no">749</span><span id="line-749">    System.setProperty(property, path);</span>
-<span class="source-line-no">750</span><span id="line-750">    conf.set(property, path);</span>
-<span class="source-line-no">751</span><span id="line-751">    new File(path).mkdirs();</span>
-<span class="source-line-no">752</span><span id="line-752">    LOG.info("Setting " + property + " to " + path + " in system properties and HBase conf");</span>
-<span class="source-line-no">753</span><span id="line-753">    return path;</span>
+<span class="source-line-no">714</span><span id="line-714">  public boolean isNewVersionBehaviorEnabled() {</span>
+<span class="source-line-no">715</span><span id="line-715">    final String propName = "hbase.tests.new.version.behavior";</span>
+<span class="source-line-no">716</span><span id="line-716">    String v = System.getProperty(propName);</span>
+<span class="source-line-no">717</span><span id="line-717">    if (v != null) {</span>
+<span class="source-line-no">718</span><span id="line-718">      return Boolean.parseBoolean(v);</span>
+<span class="source-line-no">719</span><span id="line-719">    }</span>
+<span class="source-line-no">720</span><span id="line-720">    return false;</span>
+<span class="source-line-no">721</span><span id="line-721">  }</span>
+<span class="source-line-no">722</span><span id="line-722"></span>
+<span class="source-line-no">723</span><span id="line-723">  /**</span>
+<span class="source-line-no">724</span><span id="line-724">   * Get the HBase setting for dfs.client.read.shortcircuit from the conf or a system property. This</span>
+<span class="source-line-no">725</span><span id="line-725">   * allows to specify this parameter on the command line. If not set, default is true.</span>
+<span class="source-line-no">726</span><span id="line-726">   */</span>
+<span class="source-line-no">727</span><span id="line-727">  public boolean isReadShortCircuitOn() {</span>
+<span class="source-line-no">728</span><span id="line-728">    final String propName = "hbase.tests.use.shortcircuit.reads";</span>
+<span class="source-line-no">729</span><span id="line-729">    String readOnProp = System.getProperty(propName);</span>
+<span class="source-line-no">730</span><span id="line-730">    if (readOnProp != null) {</span>
+<span class="source-line-no">731</span><span id="line-731">      return Boolean.parseBoolean(readOnProp);</span>
+<span class="source-line-no">732</span><span id="line-732">    } else {</span>
+<span class="source-line-no">733</span><span id="line-733">      return conf.getBoolean(propName, false);</span>
+<span class="source-line-no">734</span><span id="line-734">    }</span>
+<span class="source-line-no">735</span><span id="line-735">  }</span>
+<span class="source-line-no">736</span><span id="line-736"></span>
+<span class="source-line-no">737</span><span id="line-737">  /**</span>
+<span class="source-line-no">738</span><span id="line-738">   * Enable the short circuit read, unless configured differently. Set both HBase and HDFS settings,</span>
+<span class="source-line-no">739</span><span id="line-739">   * including skipping the hdfs checksum checks.</span>
+<span class="source-line-no">740</span><span id="line-740">   */</span>
+<span class="source-line-no">741</span><span id="line-741">  private void enableShortCircuit() {</span>
+<span class="source-line-no">742</span><span id="line-742">    if (isReadShortCircuitOn()) {</span>
+<span class="source-line-no">743</span><span id="line-743">      String curUser = System.getProperty("user.name");</span>
+<span class="source-line-no">744</span><span id="line-744">      LOG.info("read short circuit is ON for user " + curUser);</span>
+<span class="source-line-no">745</span><span id="line-745">      // read short circuit, for hdfs</span>
+<span class="source-line-no">746</span><span id="line-746">      conf.set("dfs.block.local-path-access.user", curUser);</span>
+<span class="source-line-no">747</span><span id="line-747">      // read short circuit, for hbase</span>
+<span class="source-line-no">748</span><span id="line-748">      conf.setBoolean("dfs.client.read.shortcircuit", true);</span>
+<span class="source-line-no">749</span><span id="line-749">      // Skip checking checksum, for the hdfs client and the datanode</span>
+<span class="source-line-no">750</span><span id="line-750">      conf.setBoolean("dfs.client.read.shortcircuit.skip.checksum", true);</span>
+<span class="source-line-no">751</span><span id="line-751">    } else {</span>
+<span class="source-line-no">752</span><span id="line-752">      LOG.info("read short circuit is OFF");</span>
+<span class="source-line-no">753</span><span id="line-753">    }</span>
 <span class="source-line-no">754</span><span id="line-754">  }</span>
 <span class="source-line-no">755</span><span id="line-755"></span>
-<span class="source-line-no">756</span><span id="line-756">  /**</span>
-<span class="source-line-no">757</span><span id="line-757">   * Shuts down instance created by call to {@link #startMiniDFSCluster(int)} or does nothing.</span>
-<span class="source-line-no">758</span><span id="line-758">   */</span>
-<span class="source-line-no">759</span><span id="line-759">  public void shutdownMiniDFSCluster() throws IOException {</span>
-<span class="source-line-no">760</span><span id="line-760">    if (this.dfsCluster != null) {</span>
-<span class="source-line-no">761</span><span id="line-761">      // The below throws an exception per dn, AsynchronousCloseException.</span>
-<span class="source-line-no">762</span><span id="line-762">      this.dfsCluster.shutdown();</span>
-<span class="source-line-no">763</span><span id="line-763">      dfsCluster = null;</span>
-<span class="source-line-no">764</span><span id="line-764">      // It is possible that the dfs cluster is set through setDFSCluster method, where we will not</span>
-<span class="source-line-no">765</span><span id="line-765">      // have a fixer</span>
-<span class="source-line-no">766</span><span id="line-766">      if (dfsClusterFixer != null) {</span>
-<span class="source-line-no">767</span><span id="line-767">        this.dfsClusterFixer.shutdown();</span>
-<span class="source-line-no">768</span><span id="line-768">        dfsClusterFixer = null;</span>
-<span class="source-line-no">769</span><span id="line-769">      }</span>
-<span class="source-line-no">770</span><span id="line-770">      dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">771</span><span id="line-771">      CommonFSUtils.setFsDefault(this.conf, new Path("file:///"));</span>
-<span class="source-line-no">772</span><span id="line-772">    }</span>
-<span class="source-line-no">773</span><span id="line-773">  }</span>
-<span class="source-line-no">774</span><span id="line-774"></span>
-<span class="source-line-no">775</span><span id="line-775">  /**</span>
-<span class="source-line-no">776</span><span id="line-776">   * Start up a minicluster of hbase, dfs, and zookeeper where WAL's walDir is created separately.</span>
-<span class="source-line-no">777</span><span id="line-777">   * All other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">778</span><span id="line-778">   * @param createWALDir Whether to create a new WAL directory.</span>
-<span class="source-line-no">779</span><span id="line-779">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">780</span><span id="line-780">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">781</span><span id="line-781">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">782</span><span id="line-782">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">783</span><span id="line-783">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">784</span><span id="line-784">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">785</span><span id="line-785">   */</span>
-<span class="source-line-no">786</span><span id="line-786">  @Deprecated</span>
-<span class="source-line-no">787</span><span id="line-787">  public MiniHBaseCluster startMiniCluster(boolean createWALDir) throws Exception {</span>
-<span class="source-line-no">788</span><span id="line-788">    StartMiniClusterOption option =</span>
-<span class="source-line-no">789</span><span id="line-789">      StartMiniClusterOption.builder().createWALDir(createWALDir).build();</span>
-<span class="source-line-no">790</span><span id="line-790">    return startMiniCluster(option);</span>
-<span class="source-line-no">791</span><span id="line-791">  }</span>
-<span class="source-line-no">792</span><span id="line-792"></span>
-<span class="source-line-no">793</span><span id="line-793">  /**</span>
-<span class="source-line-no">794</span><span id="line-794">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">795</span><span id="line-795">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">796</span><span id="line-796">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">797</span><span id="line-797">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">798</span><span id="line-798">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">799</span><span id="line-799">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">800</span><span id="line-800">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">801</span><span id="line-801">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">802</span><span id="line-802">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">803</span><span id="line-803">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">804</span><span id="line-804">   */</span>
-<span class="source-line-no">805</span><span id="line-805">  @Deprecated</span>
-<span class="source-line-no">806</span><span id="line-806">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir) throws Exception {</span>
-<span class="source-line-no">807</span><span id="line-807">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
-<span class="source-line-no">808</span><span id="line-808">      .numDataNodes(numSlaves).createRootDir(createRootDir).build();</span>
-<span class="source-line-no">809</span><span id="line-809">    return startMiniCluster(option);</span>
-<span class="source-line-no">810</span><span id="line-810">  }</span>
-<span class="source-line-no">811</span><span id="line-811"></span>
-<span class="source-line-no">812</span><span id="line-812">  /**</span>
-<span class="source-line-no">813</span><span id="line-813">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">814</span><span id="line-814">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">815</span><span id="line-815">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">816</span><span id="line-816">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">817</span><span id="line-817">   * @param createWALDir  Whether to create a new WAL directory.</span>
-<span class="source-line-no">818</span><span id="line-818">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">819</span><span id="line-819">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">820</span><span id="line-820">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">821</span><span id="line-821">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">822</span><span id="line-822">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">823</span><span id="line-823">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">824</span><span id="line-824">   */</span>
-<span class="source-line-no">825</span><span id="line-825">  @Deprecated</span>
-<span class="source-line-no">826</span><span id="line-826">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir,</span>
-<span class="source-line-no">827</span><span id="line-827">    boolean createWALDir) throws Exception {</span>
-<span class="source-line-no">828</span><span id="line-828">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
-<span class="source-line-no">829</span><span id="line-829">      .numDataNodes(numSlaves).createRootDir(createRootDir).createWALDir(createWALDir).build();</span>
-<span class="source-line-no">830</span><span id="line-830">    return startMiniCluster(option);</span>
-<span class="source-line-no">831</span><span id="line-831">  }</span>
-<span class="source-line-no">832</span><span id="line-832"></span>
-<span class="source-line-no">833</span><span id="line-833">  /**</span>
-<span class="source-line-no">834</span><span id="line-834">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">835</span><span id="line-835">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">836</span><span id="line-836">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">837</span><span id="line-837">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">838</span><span id="line-838">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">839</span><span id="line-839">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">840</span><span id="line-840">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">841</span><span id="line-841">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">842</span><span id="line-842">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">843</span><span id="line-843">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">844</span><span id="line-844">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">845</span><span id="line-845">   */</span>
-<span class="source-line-no">846</span><span id="line-846">  @Deprecated</span>
-<span class="source-line-no">847</span><span id="line-847">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, boolean createRootDir)</span>
-<span class="source-line-no">848</span><span id="line-848">    throws Exception {</span>
-<span class="source-line-no">849</span><span id="line-849">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">850</span><span id="line-850">      .numRegionServers(numSlaves).createRootDir(createRootDir).numDataNodes(numSlaves).build();</span>
-<span class="source-line-no">851</span><span id="line-851">    return startMiniCluster(option);</span>
-<span class="source-line-no">852</span><span id="line-852">  }</span>
-<span class="source-line-no">853</span><span id="line-853"></span>
-<span class="source-line-no">854</span><span id="line-854">  /**</span>
-<span class="source-line-no">855</span><span id="line-855">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">856</span><span id="line-856">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">857</span><span id="line-857">   * @param numMasters Master node number.</span>
-<span class="source-line-no">858</span><span id="line-858">   * @param numSlaves  Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">859</span><span id="line-859">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">860</span><span id="line-860">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">861</span><span id="line-861">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">862</span><span id="line-862">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">863</span><span id="line-863">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">864</span><span id="line-864">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">865</span><span id="line-865">   */</span>
-<span class="source-line-no">866</span><span id="line-866">  @Deprecated</span>
-<span class="source-line-no">867</span><span id="line-867">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves) throws Exception {</span>
-<span class="source-line-no">868</span><span id="line-868">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">869</span><span id="line-869">      .numRegionServers(numSlaves).numDataNodes(numSlaves).build();</span>
-<span class="source-line-no">870</span><span id="line-870">    return startMiniCluster(option);</span>
-<span class="source-line-no">871</span><span id="line-871">  }</span>
-<span class="source-line-no">872</span><span id="line-872"></span>
-<span class="source-line-no">873</span><span id="line-873">  /**</span>
-<span class="source-line-no">874</span><span id="line-874">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">875</span><span id="line-875">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">876</span><span id="line-876">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">877</span><span id="line-877">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">878</span><span id="line-878">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
-<span class="source-line-no">879</span><span id="line-879">   *                      HDFS data node number.</span>
-<span class="source-line-no">880</span><span id="line-880">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">881</span><span id="line-881">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">882</span><span id="line-882">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">883</span><span id="line-883">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">884</span><span id="line-884">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">885</span><span id="line-885">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">886</span><span id="line-886">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">887</span><span id="line-887">   */</span>
-<span class="source-line-no">888</span><span id="line-888">  @Deprecated</span>
-<span class="source-line-no">889</span><span id="line-889">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts,</span>
-<span class="source-line-no">890</span><span id="line-890">    boolean createRootDir) throws Exception {</span>
-<span class="source-line-no">891</span><span id="line-891">    StartMiniClusterOption option =</span>
-<span class="source-line-no">892</span><span id="line-892">      StartMiniClusterOption.builder().numMasters(numMasters).numRegionServers(numSlaves)</span>
-<span class="source-line-no">893</span><span id="line-893">        .createRootDir(createRootDir).numDataNodes(numSlaves).dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">894</span><span id="line-894">    return startMiniCluster(option);</span>
-<span class="source-line-no">895</span><span id="line-895">  }</span>
-<span class="source-line-no">896</span><span id="line-896"></span>
-<span class="source-line-no">897</span><span id="line-897">  /**</span>
-<span class="source-line-no">898</span><span id="line-898">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">899</span><span id="line-899">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">900</span><span id="line-900">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">901</span><span id="line-901">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">902</span><span id="line-902">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
-<span class="source-line-no">903</span><span id="line-903">   *                      HDFS data node number.</span>
-<span class="source-line-no">904</span><span id="line-904">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">905</span><span id="line-905">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">906</span><span id="line-906">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">907</span><span id="line-907">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">908</span><span id="line-908">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">909</span><span id="line-909">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">910</span><span id="line-910">   */</span>
-<span class="source-line-no">911</span><span id="line-911">  @Deprecated</span>
-<span class="source-line-no">912</span><span id="line-912">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts)</span>
-<span class="source-line-no">913</span><span id="line-913">    throws Exception {</span>
-<span class="source-line-no">914</span><span id="line-914">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">915</span><span id="line-915">      .numRegionServers(numSlaves).numDataNodes(numSlaves).dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">916</span><span id="line-916">    return startMiniCluster(option);</span>
-<span class="source-line-no">917</span><span id="line-917">  }</span>
-<span class="source-line-no">918</span><span id="line-918"></span>
-<span class="source-line-no">919</span><span id="line-919">  /**</span>
-<span class="source-line-no">920</span><span id="line-920">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">921</span><span id="line-921">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">922</span><span id="line-922">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">923</span><span id="line-923">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">924</span><span id="line-924">   * @param numDataNodes     Number of datanodes.</span>
-<span class="source-line-no">925</span><span id="line-925">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">926</span><span id="line-926">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">927</span><span id="line-927">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">928</span><span id="line-928">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">929</span><span id="line-929">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">930</span><span id="line-930">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">931</span><span id="line-931">   */</span>
-<span class="source-line-no">932</span><span id="line-932">  @Deprecated</span>
-<span class="source-line-no">933</span><span id="line-933">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes)</span>
-<span class="source-line-no">934</span><span id="line-934">    throws Exception {</span>
-<span class="source-line-no">935</span><span id="line-935">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">936</span><span id="line-936">      .numRegionServers(numRegionServers).numDataNodes(numDataNodes).build();</span>
-<span class="source-line-no">937</span><span id="line-937">    return startMiniCluster(option);</span>
-<span class="source-line-no">938</span><span id="line-938">  }</span>
-<span class="source-line-no">939</span><span id="line-939"></span>
-<span class="source-line-no">940</span><span id="line-940">  /**</span>
-<span class="source-line-no">941</span><span id="line-941">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">942</span><span id="line-942">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">943</span><span id="line-943">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">944</span><span id="line-944">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">945</span><span id="line-945">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
-<span class="source-line-no">946</span><span id="line-946">   *                      HDFS data node number.</span>
-<span class="source-line-no">947</span><span id="line-947">   * @param masterClass   The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">948</span><span id="line-948">   * @param rsClass       The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">949</span><span id="line-949">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">950</span><span id="line-950">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">951</span><span id="line-951">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">952</span><span id="line-952">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">953</span><span id="line-953">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">954</span><span id="line-954">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">955</span><span id="line-955">   */</span>
-<span class="source-line-no">956</span><span id="line-956">  @Deprecated</span>
-<span class="source-line-no">957</span><span id="line-957">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts,</span>
-<span class="source-line-no">958</span><span id="line-958">    Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">959</span><span id="line-959">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass) throws Exception {</span>
-<span class="source-line-no">960</span><span id="line-960">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">961</span><span id="line-961">      .masterClass(masterClass).numRegionServers(numSlaves).rsClass(rsClass).numDataNodes(numSlaves)</span>
-<span class="source-line-no">962</span><span id="line-962">      .dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">963</span><span id="line-963">    return startMiniCluster(option);</span>
-<span class="source-line-no">964</span><span id="line-964">  }</span>
-<span class="source-line-no">965</span><span id="line-965"></span>
-<span class="source-line-no">966</span><span id="line-966">  /**</span>
-<span class="source-line-no">967</span><span id="line-967">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">968</span><span id="line-968">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">969</span><span id="line-969">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">970</span><span id="line-970">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">971</span><span id="line-971">   * @param numDataNodes     Number of datanodes.</span>
-<span class="source-line-no">972</span><span id="line-972">   * @param dataNodeHosts    The hostnames of DataNodes to run on. If not null, its size will</span>
-<span class="source-line-no">973</span><span id="line-973">   *                         overwrite HDFS data node number.</span>
-<span class="source-line-no">974</span><span id="line-974">   * @param masterClass      The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">975</span><span id="line-975">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">976</span><span id="line-976">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">977</span><span id="line-977">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">978</span><span id="line-978">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">979</span><span id="line-979">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">980</span><span id="line-980">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">981</span><span id="line-981">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">982</span><span id="line-982">   */</span>
-<span class="source-line-no">983</span><span id="line-983">  @Deprecated</span>
-<span class="source-line-no">984</span><span id="line-984">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes,</span>
-<span class="source-line-no">985</span><span id="line-985">    String[] dataNodeHosts, Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">986</span><span id="line-986">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass) throws Exception {</span>
-<span class="source-line-no">987</span><span id="line-987">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">988</span><span id="line-988">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass)</span>
-<span class="source-line-no">989</span><span id="line-989">      .numDataNodes(numDataNodes).dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">990</span><span id="line-990">    return startMiniCluster(option);</span>
-<span class="source-line-no">991</span><span id="line-991">  }</span>
-<span class="source-line-no">992</span><span id="line-992"></span>
-<span class="source-line-no">993</span><span id="line-993">  /**</span>
-<span class="source-line-no">994</span><span id="line-994">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">995</span><span id="line-995">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">996</span><span id="line-996">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">997</span><span id="line-997">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">998</span><span id="line-998">   * @param numDataNodes     Number of datanodes.</span>
-<span class="source-line-no">999</span><span id="line-999">   * @param dataNodeHosts    The hostnames of DataNodes to run on. If not null, its size will</span>
-<span class="source-line-no">1000</span><span id="line-1000">   *                         overwrite HDFS data node number.</span>
-<span class="source-line-no">1001</span><span id="line-1001">   * @param masterClass      The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">1002</span><span id="line-1002">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">1003</span><span id="line-1003">   * @param createRootDir    Whether to create a new root or data directory path.</span>
-<span class="source-line-no">1004</span><span id="line-1004">   * @param createWALDir     Whether to create a new WAL directory.</span>
-<span class="source-line-no">1005</span><span id="line-1005">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">1006</span><span id="line-1006">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">1007</span><span id="line-1007">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">1008</span><span id="line-1008">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">1009</span><span id="line-1009">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1010</span><span id="line-1010">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">1011</span><span id="line-1011">   */</span>
-<span class="source-line-no">1012</span><span id="line-1012">  @Deprecated</span>
-<span class="source-line-no">1013</span><span id="line-1013">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes,</span>
-<span class="source-line-no">1014</span><span id="line-1014">    String[] dataNodeHosts, Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">1015</span><span id="line-1015">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass, boolean createRootDir,</span>
-<span class="source-line-no">1016</span><span id="line-1016">    boolean createWALDir) throws Exception {</span>
-<span class="source-line-no">1017</span><span id="line-1017">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">1018</span><span id="line-1018">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass)</span>
-<span class="source-line-no">1019</span><span id="line-1019">      .numDataNodes(numDataNodes).dataNodeHosts(dataNodeHosts).createRootDir(createRootDir)</span>
-<span class="source-line-no">1020</span><span id="line-1020">      .createWALDir(createWALDir).build();</span>
-<span class="source-line-no">1021</span><span id="line-1021">    return startMiniCluster(option);</span>
-<span class="source-line-no">1022</span><span id="line-1022">  }</span>
-<span class="source-line-no">1023</span><span id="line-1023"></span>
-<span class="source-line-no">1024</span><span id="line-1024">  /**</span>
-<span class="source-line-no">1025</span><span id="line-1025">   * Start up a minicluster of hbase, dfs and zookeeper clusters with given slave node number. All</span>
-<span class="source-line-no">1026</span><span id="line-1026">   * other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1027</span><span id="line-1027">   * @param numSlaves slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">1028</span><span id="line-1028">   * @see #startMiniCluster(StartMiniClusterOption option)</span>
-<span class="source-line-no">1029</span><span id="line-1029">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">1030</span><span id="line-1030">   */</span>
-<span class="source-line-no">1031</span><span id="line-1031">  public MiniHBaseCluster startMiniCluster(int numSlaves) throws Exception {</span>
-<span class="source-line-no">1032</span><span id="line-1032">    StartMiniClusterOption option =</span>
-<span class="source-line-no">1033</span><span id="line-1033">      StartMiniClusterOption.builder().numRegionServers(numSlaves).numDataNodes(numSlaves).build();</span>
+<span class="source-line-no">756</span><span id="line-756">  private String createDirAndSetProperty(final String property) {</span>
+<span class="source-line-no">757</span><span id="line-757">    return createDirAndSetProperty(property, property);</span>
+<span class="source-line-no">758</span><span id="line-758">  }</span>
+<span class="source-line-no">759</span><span id="line-759"></span>
+<span class="source-line-no">760</span><span id="line-760">  private String createDirAndSetProperty(final String relPath, String property) {</span>
+<span class="source-line-no">761</span><span id="line-761">    String path = getDataTestDir(relPath).toString();</span>
+<span class="source-line-no">762</span><span id="line-762">    System.setProperty(property, path);</span>
+<span class="source-line-no">763</span><span id="line-763">    conf.set(property, path);</span>
+<span class="source-line-no">764</span><span id="line-764">    new File(path).mkdirs();</span>
+<span class="source-line-no">765</span><span id="line-765">    LOG.info("Setting " + property + " to " + path + " in system properties and HBase conf");</span>
+<span class="source-line-no">766</span><span id="line-766">    return path;</span>
+<span class="source-line-no">767</span><span id="line-767">  }</span>
+<span class="source-line-no">768</span><span id="line-768"></span>
+<span class="source-line-no">769</span><span id="line-769">  /**</span>
+<span class="source-line-no">770</span><span id="line-770">   * Shuts down instance created by call to {@link #startMiniDFSCluster(int)} or does nothing.</span>
+<span class="source-line-no">771</span><span id="line-771">   */</span>
+<span class="source-line-no">772</span><span id="line-772">  public void shutdownMiniDFSCluster() throws IOException {</span>
+<span class="source-line-no">773</span><span id="line-773">    if (this.dfsCluster != null) {</span>
+<span class="source-line-no">774</span><span id="line-774">      // The below throws an exception per dn, AsynchronousCloseException.</span>
+<span class="source-line-no">775</span><span id="line-775">      this.dfsCluster.shutdown();</span>
+<span class="source-line-no">776</span><span id="line-776">      dfsCluster = null;</span>
+<span class="source-line-no">777</span><span id="line-777">      // It is possible that the dfs cluster is set through setDFSCluster method, where we will not</span>
+<span class="source-line-no">778</span><span id="line-778">      // have a fixer</span>
+<span class="source-line-no">779</span><span id="line-779">      if (dfsClusterFixer != null) {</span>
+<span class="source-line-no">780</span><span id="line-780">        this.dfsClusterFixer.shutdown();</span>
+<span class="source-line-no">781</span><span id="line-781">        dfsClusterFixer = null;</span>
+<span class="source-line-no">782</span><span id="line-782">      }</span>
+<span class="source-line-no">783</span><span id="line-783">      dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">784</span><span id="line-784">      CommonFSUtils.setFsDefault(this.conf, new Path("file:///"));</span>
+<span class="source-line-no">785</span><span id="line-785">    }</span>
+<span class="source-line-no">786</span><span id="line-786">  }</span>
+<span class="source-line-no">787</span><span id="line-787"></span>
+<span class="source-line-no">788</span><span id="line-788">  /**</span>
+<span class="source-line-no">789</span><span id="line-789">   * Start up a minicluster of hbase, dfs, and zookeeper where WAL's walDir is created separately.</span>
+<span class="source-line-no">790</span><span id="line-790">   * All other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">791</span><span id="line-791">   * @param createWALDir Whether to create a new WAL directory.</span>
+<span class="source-line-no">792</span><span id="line-792">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">793</span><span id="line-793">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">794</span><span id="line-794">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">795</span><span id="line-795">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">796</span><span id="line-796">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">797</span><span id="line-797">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">798</span><span id="line-798">   */</span>
+<span class="source-line-no">799</span><span id="line-799">  @Deprecated</span>
+<span class="source-line-no">800</span><span id="line-800">  public MiniHBaseCluster startMiniCluster(boolean createWALDir) throws Exception {</span>
+<span class="source-line-no">801</span><span id="line-801">    StartMiniClusterOption option =</span>
+<span class="source-line-no">802</span><span id="line-802">      StartMiniClusterOption.builder().createWALDir(createWALDir).build();</span>
+<span class="source-line-no">803</span><span id="line-803">    return startMiniCluster(option);</span>
+<span class="source-line-no">804</span><span id="line-804">  }</span>
+<span class="source-line-no">805</span><span id="line-805"></span>
+<span class="source-line-no">806</span><span id="line-806">  /**</span>
+<span class="source-line-no">807</span><span id="line-807">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">808</span><span id="line-808">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">809</span><span id="line-809">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">810</span><span id="line-810">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">811</span><span id="line-811">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">812</span><span id="line-812">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">813</span><span id="line-813">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">814</span><span id="line-814">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">815</span><span id="line-815">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">816</span><span id="line-816">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">817</span><span id="line-817">   */</span>
+<span class="source-line-no">818</span><span id="line-818">  @Deprecated</span>
+<span class="source-line-no">819</span><span id="line-819">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir) throws Exception {</span>
+<span class="source-line-no">820</span><span id="line-820">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
+<span class="source-line-no">821</span><span id="line-821">      .numDataNodes(numSlaves).createRootDir(createRootDir).build();</span>
+<span class="source-line-no">822</span><span id="line-822">    return startMiniCluster(option);</span>
+<span class="source-line-no">823</span><span id="line-823">  }</span>
+<span class="source-line-no">824</span><span id="line-824"></span>
+<span class="source-line-no">825</span><span id="line-825">  /**</span>
+<span class="source-line-no">826</span><span id="line-826">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">827</span><span id="line-827">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">828</span><span id="line-828">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">829</span><span id="line-829">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">830</span><span id="line-830">   * @param createWALDir  Whether to create a new WAL directory.</span>
+<span class="source-line-no">831</span><span id="line-831">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">832</span><span id="line-832">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">833</span><span id="line-833">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">834</span><span id="line-834">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">835</span><span id="line-835">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">836</span><span id="line-836">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">837</span><span id="line-837">   */</span>
+<span class="source-line-no">838</span><span id="line-838">  @Deprecated</span>
+<span class="source-line-no">839</span><span id="line-839">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir,</span>
+<span class="source-line-no">840</span><span id="line-840">    boolean createWALDir) throws Exception {</span>
+<span class="source-line-no">841</span><span id="line-841">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
+<span class="source-line-no">842</span><span id="line-842">      .numDataNodes(numSlaves).createRootDir(createRootDir).createWALDir(createWALDir).build();</span>
+<span class="source-line-no">843</span><span id="line-843">    return startMiniCluster(option);</span>
+<span class="source-line-no">844</span><span id="line-844">  }</span>
+<span class="source-line-no">845</span><span id="line-845"></span>
+<span class="source-line-no">846</span><span id="line-846">  /**</span>
+<span class="source-line-no">847</span><span id="line-847">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">848</span><span id="line-848">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">849</span><span id="line-849">   * @param numMasters    Master node number.</span>
+<span class="source-line-no">850</span><span id="line-850">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">851</span><span id="line-851">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">852</span><span id="line-852">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">853</span><span id="line-853">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">854</span><span id="line-854">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">855</span><span id="line-855">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">856</span><span id="line-856">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">857</span><span id="line-857">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">858</span><span id="line-858">   */</span>
+<span class="source-line-no">859</span><span id="line-859">  @Deprecated</span>
+<span class="source-line-no">860</span><span id="line-860">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, boolean createRootDir)</span>
+<span class="source-line-no">861</span><span id="line-861">    throws Exception {</span>
+<span class="source-line-no">862</span><span id="line-862">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">863</span><span id="line-863">      .numRegionServers(numSlaves).createRootDir(createRootDir).numDataNodes(numSlaves).build();</span>
+<span class="source-line-no">864</span><span id="line-864">    return startMiniCluster(option);</span>
+<span class="source-line-no">865</span><span id="line-865">  }</span>
+<span class="source-line-no">866</span><span id="line-866"></span>
+<span class="source-line-no">867</span><span id="line-867">  /**</span>
+<span class="source-line-no">868</span><span id="line-868">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">869</span><span id="line-869">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">870</span><span id="line-870">   * @param numMasters Master node number.</span>
+<span class="source-line-no">871</span><span id="line-871">   * @param numSlaves  Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">872</span><span id="line-872">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">873</span><span id="line-873">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">874</span><span id="line-874">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">875</span><span id="line-875">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">876</span><span id="line-876">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">877</span><span id="line-877">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">878</span><span id="line-878">   */</span>
+<span class="source-line-no">879</span><span id="line-879">  @Deprecated</span>
+<span class="source-line-no">880</span><span id="line-880">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves) throws Exception {</span>
+<span class="source-line-no">881</span><span id="line-881">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">882</span><span id="line-882">      .numRegionServers(numSlaves).numDataNodes(numSlaves).build();</span>
+<span class="source-line-no">883</span><span id="line-883">    return startMiniCluster(option);</span>
+<span class="source-line-no">884</span><span id="line-884">  }</span>
+<span class="source-line-no">885</span><span id="line-885"></span>
+<span class="source-line-no">886</span><span id="line-886">  /**</span>
+<span class="source-line-no">887</span><span id="line-887">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">888</span><span id="line-888">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">889</span><span id="line-889">   * @param numMasters    Master node number.</span>
+<span class="source-line-no">890</span><span id="line-890">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">891</span><span id="line-891">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
+<span class="source-line-no">892</span><span id="line-892">   *                      HDFS data node number.</span>
+<span class="source-line-no">893</span><span id="line-893">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">894</span><span id="line-894">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">895</span><span id="line-895">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">896</span><span id="line-896">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">897</span><span id="line-897">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">898</span><span id="line-898">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">899</span><span id="line-899">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">900</span><span id="line-900">   */</span>
+<span class="source-line-no">901</span><span id="line-901">  @Deprecated</span>
+<span class="source-line-no">902</span><span id="line-902">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts,</span>
+<span class="source-line-no">903</span><span id="line-903">    boolean createRootDir) throws Exception {</span>
+<span class="source-line-no">904</span><span id="line-904">    StartMiniClusterOption option =</span>
+<span class="source-line-no">905</span><span id="line-905">      StartMiniClusterOption.builder().numMasters(numMasters).numRegionServers(numSlaves)</span>
+<span class="source-line-no">906</span><span id="line-906">        .createRootDir(createRootDir).numDataNodes(numSlaves).dataNodeHosts(dataNodeHosts).build();</span>
+<span class="source-line-no">907</span><span id="line-907">    return startMiniCluster(option);</span>
+<span class="source-line-no">908</span><span id="line-908">  }</span>
+<span class="source-line-no">909</span><span id="line-909"></span>
+<span class="source-line-no">910</span><span id="line-910">  /**</span>
+<span class="source-line-no">911</span><span id="line-911">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">912</span><span id="line-912">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">913</span><span id="line-913">   * @param numMasters    Master node number.</span>
+<span class="source-line-no">914</span><span id="line-914">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">915</span><span id="line-915">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
+<span class="source-line-no">916</span><span id="line-916">   *                      HDFS data node number.</span>
+<span class="source-line-no">917</span><span id="line-917">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">918</span><span id="line-918">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">919</span><span id="line-919">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">920</span><span id="line-920">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">921</span><span id="line-921">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">922</span><span id="line-922">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">923</span><span id="line-923">   */</span>
+<span class="source-line-no">924</span><span id="line-924">  @Deprecated</span>
+<span class="source-line-no">925</span><span id="line-925">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts)</span>
+<span class="source-line-no">926</span><span id="line-926">    throws Exception {</span>
+<span class="source-line-no">927</span><span id="line-927">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">928</span><span id="line-928">      .numRegionServers(numSlaves).numDataNodes(numSlaves).dataNodeHosts(dataNodeHosts).build();</span>
+<span class="source-line-no">929</span><span id="line-929">    return startMiniCluster(option);</span>
+<span class="source-line-no">930</span><span id="line-930">  }</span>
+<span class="source-line-no">931</span><span id="line-931"></span>
+<span class="source-line-no">932</span><span id="line-932">  /**</span>
+<span class="source-line-no">933</span><span id="line-933">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">934</span><span id="line-934">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">935</span><span id="line-935">   * @param numMasters       Master node number.</span>
+<span class="source-line-no">936</span><span id="line-936">   * @param numRegionServers Number of region servers.</span>
+<span class="source-line-no">937</span><span id="line-937">   * @param numDataNodes     Number of datanodes.</span>
+<span class="source-line-no">938</span><span id="line-938">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">939</span><span id="line-939">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">940</span><span id="line-940">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">941</span><span id="line-941">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">942</span><span id="line-942">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">943</span><span id="line-943">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">944</span><span id="line-944">   */</span>
+<span class="source-line-no">945</span><span id="line-945">  @Deprecated</span>
+<span class="source-line-no">946</span><span id="line-946">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes)</span>
+<span class="source-line-no">947</span><span id="line-947">    throws Exception {</span>
+<span class="source-line-no">948</span><span id="line-948">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">949</span><span id="line-949">      .numRegionServers(numRegionServers).numDataNodes(numDataNodes).build();</span>
+<span class="source-line-no">950</span><span id="line-950">    return startMiniCluster(option);</span>
+<span class="source-line-no">951</span><span id="line-951">  }</span>
+<span class="source-line-no">952</span><span id="line-952"></span>
+<span class="source-line-no">953</span><span id="line-953">  /**</span>
+<span class="source-line-no">954</span><span id="line-954">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">955</span><span id="line-955">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">956</span><span id="line-956">   * @param numMasters    Master node number.</span>
+<span class="source-line-no">957</span><span id="line-957">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">958</span><span id="line-958">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
+<span class="source-line-no">959</span><span id="line-959">   *                      HDFS data node number.</span>
+<span class="source-line-no">960</span><span id="line-960">   * @param masterClass   The class to use as HMaster, or null for default.</span>
+<span class="source-line-no">961</span><span id="line-961">   * @param rsClass       The class to use as HRegionServer, or null for default.</span>
+<span class="source-line-no">962</span><span id="line-962">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">963</span><span id="line-963">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">964</span><span id="line-964">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">965</span><span id="line-965">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">966</span><span id="line-966">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">967</span><span id="line-967">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">968</span><span id="line-968">   */</span>
+<span class="source-line-no">969</span><span id="line-969">  @Deprecated</span>
+<span class="source-line-no">970</span><span id="line-970">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts,</span>
+<span class="source-line-no">971</span><span id="line-971">    Class&lt;? extends HMaster&gt; masterClass,</span>
+<span class="source-line-no">972</span><span id="line-972">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass) throws Exception {</span>
+<span class="source-line-no">973</span><span id="line-973">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">974</span><span id="line-974">      .masterClass(masterClass).numRegionServers(numSlaves).rsClass(rsClass).numDataNodes(numSlaves)</span>
+<span class="source-line-no">975</span><span id="line-975">      .dataNodeHosts(dataNodeHosts).build();</span>
+<span class="source-line-no">976</span><span id="line-976">    return startMiniCluster(option);</span>
+<span class="source-line-no">977</span><span id="line-977">  }</span>
+<span class="source-line-no">978</span><span id="line-978"></span>
+<span class="source-line-no">979</span><span id="line-979">  /**</span>
+<span class="source-line-no">980</span><span id="line-980">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">981</span><span id="line-981">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">982</span><span id="line-982">   * @param numMasters       Master node number.</span>
+<span class="source-line-no">983</span><span id="line-983">   * @param numRegionServers Number of region servers.</span>
+<span class="source-line-no">984</span><span id="line-984">   * @param numDataNodes     Number of datanodes.</span>
+<span class="source-line-no">985</span><span id="line-985">   * @param dataNodeHosts    The hostnames of DataNodes to run on. If not null, its size will</span>
+<span class="source-line-no">986</span><span id="line-986">   *                         overwrite HDFS data node number.</span>
+<span class="source-line-no">987</span><span id="line-987">   * @param masterClass      The class to use as HMaster, or null for default.</span>
+<span class="source-line-no">988</span><span id="line-988">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
+<span class="source-line-no">989</span><span id="line-989">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">990</span><span id="line-990">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">991</span><span id="line-991">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">992</span><span id="line-992">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">993</span><span id="line-993">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">994</span><span id="line-994">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">995</span><span id="line-995">   */</span>
+<span class="source-line-no">996</span><span id="line-996">  @Deprecated</span>
+<span class="source-line-no">997</span><span id="line-997">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes,</span>
+<span class="source-line-no">998</span><span id="line-998">    String[] dataNodeHosts, Class&lt;? extends HMaster&gt; masterClass,</span>
+<span class="source-line-no">999</span><span id="line-999">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass) throws Exception {</span>
+<span class="source-line-no">1000</span><span id="line-1000">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">1001</span><span id="line-1001">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass)</span>
+<span class="source-line-no">1002</span><span id="line-1002">      .numDataNodes(numDataNodes).dataNodeHosts(dataNodeHosts).build();</span>
+<span class="source-line-no">1003</span><span id="line-1003">    return startMiniCluster(option);</span>
+<span class="source-line-no">1004</span><span id="line-1004">  }</span>
+<span class="source-line-no">1005</span><span id="line-1005"></span>
+<span class="source-line-no">1006</span><span id="line-1006">  /**</span>
+<span class="source-line-no">1007</span><span id="line-1007">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">1008</span><span id="line-1008">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1009</span><span id="line-1009">   * @param numMasters       Master node number.</span>
+<span class="source-line-no">1010</span><span id="line-1010">   * @param numRegionServers Number of region servers.</span>
+<span class="source-line-no">1011</span><span id="line-1011">   * @param numDataNodes     Number of datanodes.</span>
+<span class="source-line-no">1012</span><span id="line-1012">   * @param dataNodeHosts    The hostnames of DataNodes to run on. If not null, its size will</span>
+<span class="source-line-no">1013</span><span id="line-1013">   *                         overwrite HDFS data node number.</span>
+<span class="source-line-no">1014</span><span id="line-1014">   * @param masterClass      The class to use as HMaster, or null for default.</span>
+<span class="source-line-no">1015</span><span id="line-1015">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
+<span class="source-line-no">1016</span><span id="line-1016">   * @param createRootDir    Whether to create a new root or data directory path.</span>
+<span class="source-line-no">1017</span><span id="line-1017">   * @param createWALDir     Whether to create a new WAL directory.</span>
+<span class="source-line-no">1018</span><span id="line-1018">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">1019</span><span id="line-1019">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">1020</span><span id="line-1020">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">1021</span><span id="line-1021">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">1022</span><span id="line-1022">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">1023</span><span id="line-1023">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">1024</span><span id="line-1024">   */</span>
+<span class="source-line-no">1025</span><span id="line-1025">  @Deprecated</span>
+<span class="source-line-no">1026</span><span id="line-1026">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes,</span>
+<span class="source-line-no">1027</span><span id="line-1027">    String[] dataNodeHosts, Class&lt;? extends HMaster&gt; masterClass,</span>
+<span class="source-line-no">1028</span><span id="line-1028">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass, boolean createRootDir,</span>
+<span class="source-line-no">1029</span><span id="line-1029">    boolean createWALDir) throws Exception {</span>
+<span class="source-line-no">1030</span><span id="line-1030">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">1031</span><span id="line-1031">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass)</span>
+<span class="source-line-no">1032</span><span id="line-1032">      .numDataNodes(numDataNodes).dataNodeHosts(dataNodeHosts).createRootDir(createRootDir)</span>
+<span class="source-line-no">1033</span><span id="line-1033">      .createWALDir(createWALDir).build();</span>
 <span class="source-line-no">1034</span><span id="line-1034">    return startMiniCluster(option);</span>
 <span class="source-line-no">1035</span><span id="line-1035">  }</span>
 <span class="source-line-no">1036</span><span id="line-1036"></span>
 <span class="source-line-no">1037</span><span id="line-1037">  /**</span>
-<span class="source-line-no">1038</span><span id="line-1038">   * Start up a minicluster of hbase, dfs and zookeeper all using default options. Option default</span>
-<span class="source-line-no">1039</span><span id="line-1039">   * value can be found in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1040</span><span id="line-1040">   * @see #startMiniCluster(StartMiniClusterOption option)</span>
-<span class="source-line-no">1041</span><span id="line-1041">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">1042</span><span id="line-1042">   */</span>
-<span class="source-line-no">1043</span><span id="line-1043">  public MiniHBaseCluster startMiniCluster() throws Exception {</span>
-<span class="source-line-no">1044</span><span id="line-1044">    return startMiniCluster(StartMiniClusterOption.builder().build());</span>
-<span class="source-line-no">1045</span><span id="line-1045">  }</span>
-<span class="source-line-no">1046</span><span id="line-1046"></span>
-<span class="source-line-no">1047</span><span id="line-1047">  /**</span>
-<span class="source-line-no">1048</span><span id="line-1048">   * Start up a mini cluster of hbase, optionally dfs and zookeeper if needed. It modifies</span>
-<span class="source-line-no">1049</span><span id="line-1049">   * Configuration. It homes the cluster data directory under a random subdirectory in a directory</span>
-<span class="source-line-no">1050</span><span id="line-1050">   * under System property test.build.data, to be cleaned up on exit.</span>
-<span class="source-line-no">1051</span><span id="line-1051">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">1052</span><span id="line-1052">   */</span>
-<span class="source-line-no">1053</span><span id="line-1053">  public MiniHBaseCluster startMiniCluster(StartMiniClusterOption option) throws Exception {</span>
-<span class="source-line-no">1054</span><span id="line-1054">    LOG.info("Starting up minicluster with option: {}", option);</span>
-<span class="source-line-no">1055</span><span id="line-1055"></span>
-<span class="source-line-no">1056</span><span id="line-1056">    // If we already put up a cluster, fail.</span>
-<span class="source-line-no">1057</span><span id="line-1057">    if (miniClusterRunning) {</span>
-<span class="source-line-no">1058</span><span id="line-1058">      throw new IllegalStateException("A mini-cluster is already running");</span>
-<span class="source-line-no">1059</span><span id="line-1059">    }</span>
-<span class="source-line-no">1060</span><span id="line-1060">    miniClusterRunning = true;</span>
-<span class="source-line-no">1061</span><span id="line-1061"></span>
-<span class="source-line-no">1062</span><span id="line-1062">    setupClusterTestDir();</span>
-<span class="source-line-no">1063</span><span id="line-1063"></span>
-<span class="source-line-no">1064</span><span id="line-1064">    // Bring up mini dfs cluster. This spews a bunch of warnings about missing</span>
-<span class="source-line-no">1065</span><span id="line-1065">    // scheme. Complaints are 'Scheme is undefined for build/test/data/dfs/name1'.</span>
-<span class="source-line-no">1066</span><span id="line-1066">    if (dfsCluster == null) {</span>
-<span class="source-line-no">1067</span><span id="line-1067">      LOG.info("STARTING DFS");</span>
-<span class="source-line-no">1068</span><span id="line-1068">      dfsCluster = startMiniDFSCluster(option.getNumDataNodes(), option.getDataNodeHosts());</span>
-<span class="source-line-no">1069</span><span id="line-1069">    } else {</span>
-<span class="source-line-no">1070</span><span id="line-1070">      LOG.info("NOT STARTING DFS");</span>
-<span class="source-line-no">1071</span><span id="line-1071">    }</span>
-<span class="source-line-no">1072</span><span id="line-1072"></span>
-<span class="source-line-no">1073</span><span id="line-1073">    // Start up a zk cluster.</span>
-<span class="source-line-no">1074</span><span id="line-1074">    if (getZkCluster() == null) {</span>
-<span class="source-line-no">1075</span><span id="line-1075">      startMiniZKCluster(option.getNumZkServers());</span>
-<span class="source-line-no">1076</span><span id="line-1076">    }</span>
-<span class="source-line-no">1077</span><span id="line-1077"></span>
-<span class="source-line-no">1078</span><span id="line-1078">    // Start the MiniHBaseCluster</span>
-<span class="source-line-no">1079</span><span id="line-1079">    return startMiniHBaseCluster(option);</span>
-<span class="source-line-no">1080</span><span id="line-1080">  }</span>
-<span class="source-line-no">1081</span><span id="line-1081"></span>
-<span class="source-line-no">1082</span><span id="line-1082">  /**</span>
-<span class="source-line-no">1083</span><span id="line-1083">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
-<span class="source-line-no">1084</span><span id="line-1084">   * {@link #startMiniCluster()}. This is useful when doing stepped startup of clusters.</span>
-<span class="source-line-no">1085</span><span id="line-1085">   * @return Reference to the hbase mini hbase cluster.</span>
-<span class="source-line-no">1086</span><span id="line-1086">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1087</span><span id="line-1087">   * @see #shutdownMiniHBaseCluster()</span>
-<span class="source-line-no">1088</span><span id="line-1088">   */</span>
-<span class="source-line-no">1089</span><span id="line-1089">  public MiniHBaseCluster startMiniHBaseCluster(StartMiniClusterOption option)</span>
-<span class="source-line-no">1090</span><span id="line-1090">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">1091</span><span id="line-1091">    // Now do the mini hbase cluster. Set the hbase.rootdir in config.</span>
-<span class="source-line-no">1092</span><span id="line-1092">    createRootDir(option.isCreateRootDir());</span>
-<span class="source-line-no">1093</span><span id="line-1093">    if (option.isCreateWALDir()) {</span>
-<span class="source-line-no">1094</span><span id="line-1094">      createWALRootDir();</span>
-<span class="source-line-no">1095</span><span id="line-1095">    }</span>
-<span class="source-line-no">1096</span><span id="line-1096">    // Set the hbase.fs.tmp.dir config to make sure that we have some default value. This is</span>
-<span class="source-line-no">1097</span><span id="line-1097">    // for tests that do not read hbase-defaults.xml</span>
-<span class="source-line-no">1098</span><span id="line-1098">    setHBaseFsTmpDir();</span>
-<span class="source-line-no">1099</span><span id="line-1099"></span>
-<span class="source-line-no">1100</span><span id="line-1100">    // These settings will make the server waits until this exact number of</span>
-<span class="source-line-no">1101</span><span id="line-1101">    // regions servers are connected.</span>
-<span class="source-line-no">1102</span><span id="line-1102">    if (conf.getInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1) == -1) {</span>
-<span class="source-line-no">1103</span><span id="line-1103">      conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, option.getNumRegionServers());</span>
-<span class="source-line-no">1104</span><span id="line-1104">    }</span>
-<span class="source-line-no">1105</span><span id="line-1105">    if (conf.getInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, -1) == -1) {</span>
-<span class="source-line-no">1106</span><span id="line-1106">      conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, option.getNumRegionServers());</span>
-<span class="source-line-no">1107</span><span id="line-1107">    }</span>
-<span class="source-line-no">1108</span><span id="line-1108"></span>
-<span class="source-line-no">1109</span><span id="line-1109">    Configuration c = new Configuration(this.conf);</span>
-<span class="source-line-no">1110</span><span id="line-1110">    this.hbaseCluster = new MiniHBaseCluster(c, option.getNumMasters(),</span>
-<span class="source-line-no">1111</span><span id="line-1111">      option.getNumAlwaysStandByMasters(), option.getNumRegionServers(), option.getRsPorts(),</span>
-<span class="source-line-no">1112</span><span id="line-1112">      option.getMasterClass(), option.getRsClass());</span>
-<span class="source-line-no">1113</span><span id="line-1113">    // Populate the master address configuration from mini cluster configuration.</span>
-<span class="source-line-no">1114</span><span id="line-1114">    conf.set(HConstants.MASTER_ADDRS_KEY, MasterRegistry.getMasterAddr(c));</span>
-<span class="source-line-no">1115</span><span id="line-1115">    // Don't leave here till we've done a successful scan of the hbase:meta</span>
-<span class="source-line-no">1116</span><span id="line-1116">    try (Table t = getConnection().getTable(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">1117</span><span id="line-1117">      ResultScanner s = t.getScanner(new Scan())) {</span>
-<span class="source-line-no">1118</span><span id="line-1118">      for (;;) {</span>
-<span class="source-line-no">1119</span><span id="line-1119">        if (s.next() == null) {</span>
-<span class="source-line-no">1120</span><span id="line-1120">          break;</span>
-<span class="source-line-no">1121</span><span id="line-1121">        }</span>
-<span class="source-line-no">1122</span><span id="line-1122">      }</span>
-<span class="source-line-no">1123</span><span id="line-1123">    }</span>
-<span class="source-line-no">1124</span><span id="line-1124"></span>
-<span class="source-line-no">1125</span><span id="line-1125">    getAdmin(); // create immediately the hbaseAdmin</span>
-<span class="source-line-no">1126</span><span id="line-1126">    LOG.info("Minicluster is up; activeMaster={}", getHBaseCluster().getMaster());</span>
-<span class="source-line-no">1127</span><span id="line-1127"></span>
-<span class="source-line-no">1128</span><span id="line-1128">    return (MiniHBaseCluster) hbaseCluster;</span>
-<span class="source-line-no">1129</span><span id="line-1129">  }</span>
-<span class="source-line-no">1130</span><span id="line-1130"></span>
-<span class="source-line-no">1131</span><span id="line-1131">  /**</span>
-<span class="source-line-no">1132</span><span id="line-1132">   * Starts up mini hbase cluster using default options. Default options can be found in</span>
-<span class="source-line-no">1133</span><span id="line-1133">   * {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1134</span><span id="line-1134">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1135</span><span id="line-1135">   * @see #shutdownMiniHBaseCluster()</span>
-<span class="source-line-no">1136</span><span id="line-1136">   */</span>
-<span class="source-line-no">1137</span><span id="line-1137">  public MiniHBaseCluster startMiniHBaseCluster() throws IOException, InterruptedException {</span>
-<span class="source-line-no">1138</span><span id="line-1138">    return startMiniHBaseCluster(StartMiniClusterOption.builder().build());</span>
-<span class="source-line-no">1139</span><span id="line-1139">  }</span>
+<span class="source-line-no">1038</span><span id="line-1038">   * Start up a minicluster of hbase, dfs and zookeeper clusters with given slave node number. All</span>
+<span class="source-line-no">1039</span><span id="line-1039">   * other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1040</span><span id="line-1040">   * @param numSlaves slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">1041</span><span id="line-1041">   * @see #startMiniCluster(StartMiniClusterOption option)</span>
+<span class="source-line-no">1042</span><span id="line-1042">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">1043</span><span id="line-1043">   */</span>
+<span class="source-line-no">1044</span><span id="line-1044">  public MiniHBaseCluster startMiniCluster(int numSlaves) throws Exception {</span>
+<span class="source-line-no">1045</span><span id="line-1045">    StartMiniClusterOption option =</span>
+<span class="source-line-no">1046</span><span id="line-1046">      StartMiniClusterOption.builder().numRegionServers(numSlaves).numDataNodes(numSlaves).build();</span>
+<span class="source-line-no">1047</span><span id="line-1047">    return startMiniCluster(option);</span>
+<span class="source-line-no">1048</span><span id="line-1048">  }</span>
+<span class="source-line-no">1049</span><span id="line-1049"></span>
+<span class="source-line-no">1050</span><span id="line-1050">  /**</span>
+<span class="source-line-no">1051</span><span id="line-1051">   * Start up a minicluster of hbase, dfs and zookeeper all using default options. Option default</span>
+<span class="source-line-no">1052</span><span id="line-1052">   * value can be found in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1053</span><span id="line-1053">   * @see #startMiniCluster(StartMiniClusterOption option)</span>
+<span class="source-line-no">1054</span><span id="line-1054">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">1055</span><span id="line-1055">   */</span>
+<span class="source-line-no">1056</span><span id="line-1056">  public MiniHBaseCluster startMiniCluster() throws Exception {</span>
+<span class="source-line-no">1057</span><span id="line-1057">    return startMiniCluster(StartMiniClusterOption.builder().build());</span>
+<span class="source-line-no">1058</span><span id="line-1058">  }</span>
+<span class="source-line-no">1059</span><span id="line-1059"></span>
+<span class="source-line-no">1060</span><span id="line-1060">  /**</span>
+<span class="source-line-no">1061</span><span id="line-1061">   * Start up a mini cluster of hbase, optionally dfs and zookeeper if needed. It modifies</span>
+<span class="source-line-no">1062</span><span id="line-1062">   * Configuration. It homes the cluster data directory under a random subdirectory in a directory</span>
+<span class="source-line-no">1063</span><span id="line-1063">   * under System property test.build.data, to be cleaned up on exit.</span>
+<span class="source-line-no">1064</span><span id="line-1064">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">1065</span><span id="line-1065">   */</span>
+<span class="source-line-no">1066</span><span id="line-1066">  public MiniHBaseCluster startMiniCluster(StartMiniClusterOption option) throws Exception {</span>
+<span class="source-line-no">1067</span><span id="line-1067">    LOG.info("Starting up minicluster with option: {}", option);</span>
+<span class="source-line-no">1068</span><span id="line-1068"></span>
+<span class="source-line-no">1069</span><span id="line-1069">    // If we already put up a cluster, fail.</span>
+<span class="source-line-no">1070</span><span id="line-1070">    if (miniClusterRunning) {</span>
+<span class="source-line-no">1071</span><span id="line-1071">      throw new IllegalStateException("A mini-cluster is already running");</span>
+<span class="source-line-no">1072</span><span id="line-1072">    }</span>
+<span class="source-line-no">1073</span><span id="line-1073">    miniClusterRunning = true;</span>
+<span class="source-line-no">1074</span><span id="line-1074"></span>
+<span class="source-line-no">1075</span><span id="line-1075">    setupClusterTestDir();</span>
+<span class="source-line-no">1076</span><span id="line-1076"></span>
+<span class="source-line-no">1077</span><span id="line-1077">    // Bring up mini dfs cluster. This spews a bunch of warnings about missing</span>
+<span class="source-line-no">1078</span><span id="line-1078">    // scheme. Complaints are 'Scheme is undefined for build/test/data/dfs/name1'.</span>
+<span class="source-line-no">1079</span><span id="line-1079">    if (dfsCluster == null) {</span>
+<span class="source-line-no">1080</span><span id="line-1080">      LOG.info("STARTING DFS");</span>
+<span class="source-line-no">1081</span><span id="line-1081">      dfsCluster = startMiniDFSCluster(option.getNumDataNodes(), option.getDataNodeHosts());</span>
+<span class="source-line-no">1082</span><span id="line-1082">    } else {</span>
+<span class="source-line-no">1083</span><span id="line-1083">      LOG.info("NOT STARTING DFS");</span>
+<span class="source-line-no">1084</span><span id="line-1084">    }</span>
+<span class="source-line-no">1085</span><span id="line-1085"></span>
+<span class="source-line-no">1086</span><span id="line-1086">    // Start up a zk cluster.</span>
+<span class="source-line-no">1087</span><span id="line-1087">    if (getZkCluster() == null) {</span>
+<span class="source-line-no">1088</span><span id="line-1088">      startMiniZKCluster(option.getNumZkServers());</span>
+<span class="source-line-no">1089</span><span id="line-1089">    }</span>
+<span class="source-line-no">1090</span><span id="line-1090"></span>
+<span class="source-line-no">1091</span><span id="line-1091">    // Start the MiniHBaseCluster</span>
+<span class="source-line-no">1092</span><span id="line-1092">    return startMiniHBaseCluster(option);</span>
+<span class="source-line-no">1093</span><span id="line-1093">  }</span>
+<span class="source-line-no">1094</span><span id="line-1094"></span>
+<span class="source-line-no">1095</span><span id="line-1095">  /**</span>
+<span class="source-line-no">1096</span><span id="line-1096">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
+<span class="source-line-no">1097</span><span id="line-1097">   * {@link #startMiniCluster()}. This is useful when doing stepped startup of clusters.</span>
+<span class="source-line-no">1098</span><span id="line-1098">   * @return Reference to the hbase mini hbase cluster.</span>
+<span class="source-line-no">1099</span><span id="line-1099">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">1100</span><span id="line-1100">   * @see #shutdownMiniHBaseCluster()</span>
+<span class="source-line-no">1101</span><span id="line-1101">   */</span>
+<span class="source-line-no">1102</span><span id="line-1102">  public MiniHBaseCluster startMiniHBaseCluster(StartMiniClusterOption option)</span>
+<span class="source-line-no">1103</span><span id="line-1103">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">1104</span><span id="line-1104">    // Now do the mini hbase cluster. Set the hbase.rootdir in config.</span>
+<span class="source-line-no">1105</span><span id="line-1105">    createRootDir(option.isCreateRootDir());</span>
+<span class="source-line-no">1106</span><span id="line-1106">    if (option.isCreateWALDir()) {</span>
+<span class="source-line-no">1107</span><span id="line-1107">      createWALRootDir();</span>
+<span class="source-line-no">1108</span><span id="line-1108">    }</span>
+<span class="source-line-no">1109</span><span id="line-1109">    // Set the hbase.fs.tmp.dir config to make sure that we have some default value. This is</span>
+<span class="source-line-no">1110</span><span id="line-1110">    // for tests that do not read hbase-defaults.xml</span>
+<span class="source-line-no">1111</span><span id="line-1111">    setHBaseFsTmpDir();</span>
+<span class="source-line-no">1112</span><span id="line-1112"></span>
+<span class="source-line-no">1113</span><span id="line-1113">    // These settings will make the server waits until this exact number of</span>
+<span class="source-line-no">1114</span><span id="line-1114">    // regions servers are connected.</span>
+<span class="source-line-no">1115</span><span id="line-1115">    if (conf.getInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1) == -1) {</span>
+<span class="source-line-no">1116</span><span id="line-1116">      conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, option.getNumRegionServers());</span>
+<span class="source-line-no">1117</span><span id="line-1117">    }</span>
+<span class="source-line-no">1118</span><span id="line-1118">    if (conf.getInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, -1) == -1) {</span>
+<span class="source-line-no">1119</span><span id="line-1119">      conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, option.getNumRegionServers());</span>
+<span class="source-line-no">1120</span><span id="line-1120">    }</span>
+<span class="source-line-no">1121</span><span id="line-1121"></span>
+<span class="source-line-no">1122</span><span id="line-1122">    Configuration c = new Configuration(this.conf);</span>
+<span class="source-line-no">1123</span><span id="line-1123">    this.hbaseCluster = new MiniHBaseCluster(c, option.getNumMasters(),</span>
+<span class="source-line-no">1124</span><span id="line-1124">      option.getNumAlwaysStandByMasters(), option.getNumRegionServers(), option.getRsPorts(),</span>
+<span class="source-line-no">1125</span><span id="line-1125">      option.getMasterClass(), option.getRsClass());</span>
+<span class="source-line-no">1126</span><span id="line-1126">    // Populate the master address configuration from mini cluster configuration.</span>
+<span class="source-line-no">1127</span><span id="line-1127">    conf.set(HConstants.MASTER_ADDRS_KEY, MasterRegistry.getMasterAddr(c));</span>
+<span class="source-line-no">1128</span><span id="line-1128">    // Don't leave here till we've done a successful scan of the hbase:meta</span>
+<span class="source-line-no">1129</span><span id="line-1129">    try (Table t = getConnection().getTable(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">1130</span><span id="line-1130">      ResultScanner s = t.getScanner(new Scan())) {</span>
+<span class="source-line-no">1131</span><span id="line-1131">      for (;;) {</span>
+<span class="source-line-no">1132</span><span id="line-1132">        if (s.next() == null) {</span>
+<span class="source-line-no">1133</span><span id="line-1133">          break;</span>
+<span class="source-line-no">1134</span><span id="line-1134">        }</span>
+<span class="source-line-no">1135</span><span id="line-1135">      }</span>
+<span class="source-line-no">1136</span><span id="line-1136">    }</span>
+<span class="source-line-no">1137</span><span id="line-1137"></span>
+<span class="source-line-no">1138</span><span id="line-1138">    getAdmin(); // create immediately the hbaseAdmin</span>
+<span class="source-line-no">1139</span><span id="line-1139">    LOG.info("Minicluster is up; activeMaster={}", getHBaseCluster().getMaster());</span>
 <span class="source-line-no">1140</span><span id="line-1140"></span>
-<span class="source-line-no">1141</span><span id="line-1141">  /**</span>
-<span class="source-line-no">1142</span><span id="line-1142">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
-<span class="source-line-no">1143</span><span id="line-1143">   * {@link #startMiniCluster()}. All other options will use default values, defined in</span>
-<span class="source-line-no">1144</span><span id="line-1144">   * {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1145</span><span id="line-1145">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">1146</span><span id="line-1146">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">1147</span><span id="line-1147">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">1141</span><span id="line-1141">    return (MiniHBaseCluster) hbaseCluster;</span>
+<span class="source-line-no">1142</span><span id="line-1142">  }</span>
+<span class="source-line-no">1143</span><span id="line-1143"></span>
+<span class="source-line-no">1144</span><span id="line-1144">  /**</span>
+<span class="source-line-no">1145</span><span id="line-1145">   * Starts up mini hbase cluster using default options. Default options can be found in</span>
+<span class="source-line-no">1146</span><span id="line-1146">   * {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1147</span><span id="line-1147">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
 <span class="source-line-no">1148</span><span id="line-1148">   * @see #shutdownMiniHBaseCluster()</span>
-<span class="source-line-no">1149</span><span id="line-1149">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">1150</span><span id="line-1150">   *             {@link #startMiniHBaseCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">1151</span><span id="line-1151">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1152</span><span id="line-1152">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">1153</span><span id="line-1153">   */</span>
-<span class="source-line-no">1154</span><span id="line-1154">  @Deprecated</span>
-<span class="source-line-no">1155</span><span id="line-1155">  public MiniHBaseCluster startMiniHBaseCluster(int numMasters, int numRegionServers)</span>
-<span class="source-line-no">1156</span><span id="line-1156">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">1157</span><span id="line-1157">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">1158</span><span id="line-1158">      .numRegionServers(numRegionServers).build();</span>
-<span class="source-line-no">1159</span><span id="line-1159">    return startMiniHBaseCluster(option);</span>
-<span class="source-line-no">1160</span><span id="line-1160">  }</span>
-<span class="source-line-no">1161</span><span id="line-1161"></span>
-<span class="source-line-no">1162</span><span id="line-1162">  /**</span>
-<span class="source-line-no">1163</span><span id="line-1163">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
-<span class="source-line-no">1164</span><span id="line-1164">   * {@link #startMiniCluster()}. All other options will use default values, defined in</span>
-<span class="source-line-no">1165</span><span id="line-1165">   * {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1166</span><span id="line-1166">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">1167</span><span id="line-1167">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">1168</span><span id="line-1168">   * @param rsPorts          Ports that RegionServer should use.</span>
-<span class="source-line-no">1169</span><span id="line-1169">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">1170</span><span id="line-1170">   * @see #shutdownMiniHBaseCluster()</span>
-<span class="source-line-no">1171</span><span id="line-1171">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">1172</span><span id="line-1172">   *             {@link #startMiniHBaseCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">1173</span><span id="line-1173">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1174</span><span id="line-1174">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">1175</span><span id="line-1175">   */</span>
-<span class="source-line-no">1176</span><span id="line-1176">  @Deprecated</span>
-<span class="source-line-no">1177</span><span id="line-1177">  public MiniHBaseCluster startMiniHBaseCluster(int numMasters, int numRegionServers,</span>
-<span class="source-line-no">1178</span><span id="line-1178">    List&lt;Integer&gt; rsPorts) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1179</span><span id="line-1179">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">1180</span><span id="line-1180">      .numRegionServers(numRegionServers).rsPorts(rsPorts).build();</span>
-<span class="source-line-no">1181</span><span id="line-1181">    return startMiniHBaseCluster(option);</span>
-<span class="source-line-no">1182</span><span id="line-1182">  }</span>
-<span class="source-line-no">1183</span><span id="line-1183"></span>
-<span class="source-line-no">1184</span><span id="line-1184">  /**</span>
-<span class="source-line-no">1185</span><span id="line-1185">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
-<span class="source-line-no">1186</span><span id="line-1186">   * {@link #startMiniCluster()}. All other options will use default values, defined in</span>
-<span class="source-line-no">1187</span><span id="line-1187">   * {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1188</span><span id="line-1188">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">1189</span><span id="line-1189">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">1190</span><span id="line-1190">   * @param rsPorts          Ports that RegionServer should use.</span>
-<span class="source-line-no">1191</span><span id="line-1191">   * @param masterClass      The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">1192</span><span id="line-1192">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">1193</span><span id="line-1193">   * @param createRootDir    Whether to create a new root or data directory path.</span>
-<span class="source-line-no">1194</span><span id="line-1194">   * @param createWALDir     Whether to create a new WAL directory.</span>
-<span class="source-line-no">1195</span><span id="line-1195">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">1196</span><span id="line-1196">   * @see #shutdownMiniHBaseCluster()</span>
-<span class="source-line-no">1197</span><span id="line-1197">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">1198</span><span id="line-1198">   *             {@link #startMiniHBaseCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">1199</span><span id="line-1199">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1200</span><span id="line-1200">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">1201</span><span id="line-1201">   */</span>
-<span class="source-line-no">1202</span><span id="line-1202">  @Deprecated</span>
-<span class="source-line-no">1203</span><span id="line-1203">  public MiniHBaseCluster startMiniHBaseCluster(int numMasters, int numRegionServers,</span>
-<span class="source-line-no">1204</span><span id="line-1204">    List&lt;Integer&gt; rsPorts, Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">1205</span><span id="line-1205">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass, boolean createRootDir,</span>
-<span class="source-line-no">1206</span><span id="line-1206">    boolean createWALDir) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1207</span><span id="line-1207">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">1208</span><span id="line-1208">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass).rsPorts(rsPorts)</span>
-<span class="source-line-no">1209</span><span id="line-1209">      .createRootDir(createRootDir).createWALDir(createWALDir).build();</span>
-<span class="source-line-no">1210</span><span id="line-1210">    return startMiniHBaseCluster(option);</span>
-<span class="source-line-no">1211</span><span id="line-1211">  }</span>
-<span class="source-line-no">1212</span><span id="line-1212"></span>
-<span class="source-line-no">1213</span><span id="line-1213">  /**</span>
-<span class="source-line-no">1214</span><span id="line-1214">   * Starts the hbase cluster up again after shutting it down previously in a test. Use this if you</span>
-<span class="source-line-no">1215</span><span id="line-1215">   * want to keep dfs/zk up and just stop/start hbase.</span>
-<span class="source-line-no">1216</span><span id="line-1216">   * @param servers number of region servers</span>
-<span class="source-line-no">1217</span><span id="line-1217">   */</span>
-<span class="source-line-no">1218</span><span id="line-1218">  public void restartHBaseCluster(int servers) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1219</span><span id="line-1219">    this.restartHBaseCluster(servers, null);</span>
-<span class="source-line-no">1220</span><span id="line-1220">  }</span>
-<span class="source-line-no">1221</span><span id="line-1221"></span>
-<span class="source-line-no">1222</span><span id="line-1222">  public void restartHBaseCluster(int servers, List&lt;Integer&gt; ports)</span>
-<span class="source-line-no">1223</span><span id="line-1223">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">1224</span><span id="line-1224">    StartMiniClusterOption option =</span>
-<span class="source-line-no">1225</span><span id="line-1225">      StartMiniClusterOption.builder().numRegionServers(servers).rsPorts(ports).build();</span>
-<span class="source-line-no">1226</span><span id="line-1226">    restartHBaseCluster(option);</span>
-<span class="source-line-no">1227</span><span id="line-1227">    invalidateConnection();</span>
-<span class="source-line-no">1228</span><span id="line-1228">  }</span>
-<span class="source-line-no">1229</span><span id="line-1229"></span>
-<span class="source-line-no">1230</span><span id="line-1230">  public void restartHBaseCluster(StartMiniClusterOption option)</span>
-<span class="source-line-no">1231</span><span id="line-1231">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">1232</span><span id="line-1232">    closeConnection();</span>
-<span class="source-line-no">1233</span><span id="line-1233">    this.hbaseCluster = new MiniHBaseCluster(this.conf, option.getNumMasters(),</span>
-<span class="source-line-no">1234</span><span id="line-1234">      option.getNumAlwaysStandByMasters(), option.getNumRegionServers(), option.getRsPorts(),</span>
-<span class="source-line-no">1235</span><span id="line-1235">      option.getMasterClass(), option.getRsClass());</span>
-<span class="source-line-no">1236</span><span id="line-1236">    // Don't leave here till we've done a successful scan of the hbase:meta</span>
-<span class="source-line-no">1237</span><span id="line-1237">    Connection conn = ConnectionFactory.createConnection(this.conf);</span>
-<span class="source-line-no">1238</span><span id="line-1238">    Table t = conn.getTable(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">1239</span><span id="line-1239">    ResultScanner s = t.getScanner(new Scan());</span>
-<span class="source-line-no">1240</span><span id="line-1240">    while (s.next() != null) {</span>
-<span class="source-line-no">1241</span><span id="line-1241">      // do nothing</span>
-<span class="source-line-no">1242</span><span id="line-1242">    }</span>
-<span class="source-line-no">1243</span><span id="line-1243">    LOG.info("HBase has been restarted");</span>
-<span class="source-line-no">1244</span><span id="line-1244">    s.close();</span>
-<span class="source-line-no">1245</span><span id="line-1245">    t.close();</span>
-<span class="source-line-no">1246</span><span id="line-1246">    conn.close();</span>
-<span class="source-line-no">1247</span><span id="line-1247">  }</span>
-<span class="source-line-no">1248</span><span id="line-1248"></span>
-<span class="source-line-no">1249</span><span id="line-1249">  /**</span>
-<span class="source-line-no">1250</span><span id="line-1250">   * @return Current mini hbase cluster. Only has something in it after a call to</span>
-<span class="source-line-no">1251</span><span id="line-1251">   *         {@link #startMiniCluster()}.</span>
-<span class="source-line-no">1252</span><span id="line-1252">   * @see #startMiniCluster()</span>
-<span class="source-line-no">1253</span><span id="line-1253">   */</span>
-<span class="source-line-no">1254</span><span id="line-1254">  public MiniHBaseCluster getMiniHBaseCluster() {</span>
-<span class="source-line-no">1255</span><span id="line-1255">    if (this.hbaseCluster == null || this.hbaseCluster instanceof MiniHBaseCluster) {</span>
-<span class="source-line-no">1256</span><span id="line-1256">      return (MiniHBaseCluster) this.hbaseCluster;</span>
-<span class="source-line-no">1257</span><span id="line-1257">    }</span>
-<span class="source-line-no">1258</span><span id="line-1258">    throw new RuntimeException(</span>
-<span class="source-line-no">1259</span><span id="line-1259">      hbaseCluster + " not an instance of " + MiniHBaseCluster.class.getName());</span>
+<span class="source-line-no">1149</span><span id="line-1149">   */</span>
+<span class="source-line-no">1150</span><span id="line-1150">  public MiniHBaseCluster startMiniHBaseCluster() throws IOException, InterruptedException {</span>
+<span class="source-line-no">1151</span><span id="line-1151">    return startMiniHBaseCluster(StartMiniClusterOption.builder().build());</span>
+<span class="source-line-no">1152</span><span id="line-1152">  }</span>
+<span class="source-line-no">1153</span><span id="line-1153"></span>
+<span class="source-line-no">1154</span><span id="line-1154">  /**</span>
+<span class="source-line-no">1155</span><span id="line-1155">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
+<span class="source-line-no">1156</span><span id="line-1156">   * {@link #startMiniCluster()}. All other options will use default values, defined in</span>
+<span class="source-line-no">1157</span><span id="line-1157">   * {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1158</span><span id="line-1158">   * @param numMasters       Master node number.</span>
+<span class="source-line-no">1159</span><span id="line-1159">   * @param numRegionServers Number of region servers.</span>
+<span class="source-line-no">1160</span><span id="line-1160">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">1161</span><span id="line-1161">   * @see #shutdownMiniHBaseCluster()</span>
+<span class="source-line-no">1162</span><span id="line-1162">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">1163</span><span id="line-1163">   *             {@link #startMiniHBaseCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">1164</span><span id="line-1164">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">1165</span><span id="line-1165">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">1166</span><span id="line-1166">   */</span>
+<span class="source-line-no">1167</span><span id="line-1167">  @Deprecated</span>
+<span class="source-line-no">1168</span><span id="line-1168">  public MiniHBaseCluster startMiniHBaseCluster(int numMasters, int numRegionServers)</span>
+<span class="source-line-no">1169</span><span id="line-1169">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">1170</span><span id="line-1170">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">1171</span><span id="line-1171">      .numRegionServers(numRegionServers).build();</span>
+<span class="source-line-no">1172</span><span id="line-1172">    return startMiniHBaseCluster(option);</span>
+<span class="source-line-no">1173</span><span id="line-1173">  }</span>
+<span class="source-line-no">1174</span><span id="line-1174"></span>
+<span class="source-line-no">1175</span><span id="line-1175">  /**</span>
+<span class="source-line-no">1176</span><span id="line-1176">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
+<span class="source-line-no">1177</span><span id="line-1177">   * {@link #startMiniCluster()}. All other options will use default values, defined in</span>
+<span class="source-line-no">1178</span><span id="line-1178">   * {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1179</span><span id="line-1179">   * @param numMasters       Master node number.</span>
+<span class="source-line-no">1180</span><span id="line-1180">   * @param numRegionServers Number of region servers.</span>
+<span class="source-line-no">1181</span><span id="line-1181">   * @param rsPorts          Ports that RegionServer should use.</span>
+<span class="source-line-no">1182</span><span id="line-1182">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">1183</span><span id="line-1183">   * @see #shutdownMiniHBaseCluster()</span>
+<span class="source-line-no">1184</span><span id="line-1184">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">1185</span><span id="line-1185">   *             {@link #startMiniHBaseCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">1186</span><span id="line-1186">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">1187</span><span id="line-1187">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">1188</span><span id="line-1188">   */</span>
+<span class="source-line-no">1189</span><span id="line-1189">  @Deprecated</span>
+<span class="source-line-no">1190</span><span id="line-1190">  public MiniHBaseCluster startMiniHBaseCluster(int numMasters, int numRegionServers,</span>
+<span class="source-line-no">1191</span><span id="line-1191">    List&lt;Integer&gt; rsPorts) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1192</span><span id="line-1192">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">1193</span><span id="line-1193">      .numRegionServers(numRegionServers).rsPorts(rsPorts).build();</span>
+<span class="source-line-no">1194</span><span id="line-1194">    return startMiniHBaseCluster(option);</span>
+<span class="source-line-no">1195</span><span id="line-1195">  }</span>
+<span class="source-line-no">1196</span><span id="line-1196"></span>
+<span class="source-line-no">1197</span><span id="line-1197">  /**</span>
+<span class="source-line-no">1198</span><span id="line-1198">   * Starts up mini hbase cluster. Usually you won't want this. You'll usually want</span>
+<span class="source-line-no">1199</span><span id="line-1199">   * {@link #startMiniCluster()}. All other options will use default values, defined in</span>
+<span class="source-line-no">1200</span><span id="line-1200">   * {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">1201</span><span id="line-1201">   * @param numMasters       Master node number.</span>
+<span class="source-line-no">1202</span><span id="line-1202">   * @param numRegionServers Number of region servers.</span>
+<span class="source-line-no">1203</span><span id="line-1203">   * @param rsPorts          Ports that RegionServer should use.</span>
+<span class="source-line-no">1204</span><span id="line-1204">   * @param masterClass      The class to use as HMaster, or null for default.</span>
+<span class="source-line-no">1205</span><span id="line-1205">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
+<span class="source-line-no">1206</span><span id="line-1206">   * @param createRootDir    Whether to create a new root or data directory path.</span>
+<span class="source-line-no">1207</span><span id="line-1207">   * @param createWALDir     Whether to create a new WAL directory.</span>
+<span class="source-line-no">1208</span><span id="line-1208">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">1209</span><span id="line-1209">   * @see #shutdownMiniHBaseCluster()</span>
+<span class="source-line-no">1210</span><span id="line-1210">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">1211</span><span id="line-1211">   *             {@link #startMiniHBaseCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">1212</span><span id="line-1212">   * @see #startMiniHBaseCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">1213</span><span id="line-1213">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">1214</span><span id="line-1214">   */</span>
+<span class="source-line-no">1215</span><span id="line-1215">  @Deprecated</span>
+<span class="source-line-no">1216</span><span id="line-1216">  public MiniHBaseCluster startMiniHBaseCluster(int numMasters, int numRegionServers,</span>
+<span class="source-line-no">1217</span><span id="line-1217">    List&lt;Integer&gt; rsPorts, Class&lt;? extends HMaster&gt; masterClass,</span>
+<span class="source-line-no">1218</span><span id="line-1218">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass, boolean createRootDir,</span>
+<span class="source-line-no">1219</span><span id="line-1219">    boolean createWALDir) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1220</span><span id="line-1220">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
+<span class="source-line-no">1221</span><span id="line-1221">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass).rsPorts(rsPorts)</span>
+<span class="source-line-no">1222</span><span id="line-1222">      .createRootDir(createRootDir).createWALDir(createWALDir).build();</span>
+<span class="source-line-no">1223</span><span id="line-1223">    return startMiniHBaseCluster(option);</span>
+<span class="source-line-no">1224</span><span id="line-1224">  }</span>
+<span class="source-line-no">1225</span><span id="line-1225"></span>
+<span class="source-line-no">1226</span><span id="line-1226">  /**</span>
+<span class="source-line-no">1227</span><span id="line-1227">   * Starts the hbase cluster up again after shutting it down previously in a test. Use this if you</span>
+<span class="source-line-no">1228</span><span id="line-1228">   * want to keep dfs/zk up and just stop/start hbase.</span>
+<span class="source-line-no">1229</span><span id="line-1229">   * @param servers number of region servers</span>
+<span class="source-line-no">1230</span><span id="line-1230">   */</span>
+<span class="source-line-no">1231</span><span id="line-1231">  public void restartHBaseCluster(int servers) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1232</span><span id="line-1232">    this.restartHBaseCluster(servers, null);</span>
+<span class="source-line-no">1233</span><span id="line-1233">  }</span>
+<span class="source-line-no">1234</span><span id="line-1234"></span>
+<span class="source-line-no">1235</span><span id="line-1235">  public void restartHBaseCluster(int servers, List&lt;Integer&gt; ports)</span>
+<span class="source-line-no">1236</span><span id="line-1236">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">1237</span><span id="line-1237">    StartMiniClusterOption option =</span>
+<span class="source-line-no">1238</span><span id="line-1238">      StartMiniClusterOption.builder().numRegionServers(servers).rsPorts(ports).build();</span>
+<span class="source-line-no">1239</span><span id="line-1239">    restartHBaseCluster(option);</span>
+<span class="source-line-no">1240</span><span id="line-1240">    invalidateConnection();</span>
+<span class="source-line-no">1241</span><span id="line-1241">  }</span>
+<span class="source-line-no">1242</span><span id="line-1242"></span>
+<span class="source-line-no">1243</span><span id="line-1243">  public void restartHBaseCluster(StartMiniClusterOption option)</span>
+<span class="source-line-no">1244</span><span id="line-1244">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">1245</span><span id="line-1245">    closeConnection();</span>
+<span class="source-line-no">1246</span><span id="line-1246">    this.hbaseCluster = new MiniHBaseCluster(this.conf, option.getNumMasters(),</span>
+<span class="source-line-no">1247</span><span id="line-1247">      option.getNumAlwaysStandByMasters(), option.getNumRegionServers(), option.getRsPorts(),</span>
+<span class="source-line-no">1248</span><span id="line-1248">      option.getMasterClass(), option.getRsClass());</span>
+<span class="source-line-no">1249</span><span id="line-1249">    // Don't leave here till we've done a successful scan of the hbase:meta</span>
+<span class="source-line-no">1250</span><span id="line-1250">    Connection conn = ConnectionFactory.createConnection(this.conf);</span>
+<span class="source-line-no">1251</span><span id="line-1251">    Table t = conn.getTable(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">1252</span><span id="line-1252">    ResultScanner s = t.getScanner(new Scan());</span>
+<span class="source-line-no">1253</span><span id="line-1253">    while (s.next() != null) {</span>
+<span class="source-line-no">1254</span><span id="line-1254">      // do nothing</span>
+<span class="source-line-no">1255</span><span id="line-1255">    }</span>
+<span class="source-line-no">1256</span><span id="line-1256">    LOG.info("HBase has been restarted");</span>
+<span class="source-line-no">1257</span><span id="line-1257">    s.close();</span>
+<span class="source-line-no">1258</span><span id="line-1258">    t.close();</span>
+<span class="source-line-no">1259</span><span id="line-1259">    conn.close();</span>
 <span class="source-line-no">1260</span><span id="line-1260">  }</span>
 <span class="source-line-no">1261</span><span id="line-1261"></span>
 <span class="source-line-no">1262</span><span id="line-1262">  /**</span>
-<span class="source-line-no">1263</span><span id="line-1263">   * Stops mini hbase, zk, and hdfs clusters.</span>
-<span class="source-line-no">1264</span><span id="line-1264">   * @see #startMiniCluster(int)</span>
-<span class="source-line-no">1265</span><span id="line-1265">   */</span>
-<span class="source-line-no">1266</span><span id="line-1266">  public void shutdownMiniCluster() throws IOException {</span>
-<span class="source-line-no">1267</span><span id="line-1267">    LOG.info("Shutting down minicluster");</span>
-<span class="source-line-no">1268</span><span id="line-1268">    shutdownMiniHBaseCluster();</span>
-<span class="source-line-no">1269</span><span id="line-1269">    shutdownMiniDFSCluster();</span>
-<span class="source-line-no">1270</span><span id="line-1270">    shutdownMiniZKCluster();</span>
-<span class="source-line-no">1271</span><span id="line-1271"></span>
-<span class="source-line-no">1272</span><span id="line-1272">    cleanupTestDir();</span>
-<span class="source-line-no">1273</span><span id="line-1273">    miniClusterRunning = false;</span>
-<span class="source-line-no">1274</span><span id="line-1274">    LOG.info("Minicluster is down");</span>
-<span class="source-line-no">1275</span><span id="line-1275">  }</span>
-<span class="source-line-no">1276</span><span id="line-1276"></span>
-<span class="source-line-no">1277</span><span id="line-1277">  /**</span>
-<span class="source-line-no">1278</span><span id="line-1278">   * Shutdown HBase mini cluster.Does not shutdown zk or dfs if running.</span>
-<span class="source-line-no">1279</span><span id="line-1279">   * @throws java.io.IOException in case command is unsuccessful</span>
-<span class="source-line-no">1280</span><span id="line-1280">   */</span>
-<span class="source-line-no">1281</span><span id="line-1281">  public void shutdownMiniHBaseCluster() throws IOException {</span>
-<span class="source-line-no">1282</span><span id="line-1282">    cleanup();</span>
-<span class="source-line-no">1283</span><span id="line-1283">    if (this.hbaseCluster != null) {</span>
-<span class="source-line-no">1284</span><span id="line-1284">      this.hbaseCluster.shutdown();</span>
-<span class="source-line-no">1285</span><span id="line-1285">      // Wait till hbase is down before going on to shutdown zk.</span>
-<span class="source-line-no">1286</span><span id="line-1286">      this.hbaseCluster.waitUntilShutDown();</span>
-<span class="source-line-no">1287</span><span id="line-1287">      this.hbaseCluster = null;</span>
-<span class="source-line-no">1288</span><span id="line-1288">    }</span>
-<span class="source-line-no">1289</span><span id="line-1289">    if (zooKeeperWatcher != null) {</span>
-<span class="source-line-no">1290</span><span id="line-1290">      zooKeeperWatcher.close();</span>
-<span class="source-line-no">1291</span><span id="line-1291">      zooKeeperWatcher = null;</span>
-<span class="source-line-no">1292</span><span id="line-1292">    }</span>
-<span class="source-line-no">1293</span><span id="line-1293">  }</span>
-<span class="source-line-no">1294</span><span id="line-1294"></span>
-<span class="source-line-no">1295</span><span id="line-1295">  /**</span>
-<span class="source-line-no">1296</span><span id="line-1296">   * Abruptly Shutdown HBase mini cluster. Does not shutdown zk or dfs if running.</span>
-<span class="source-line-no">1297</span><span id="line-1297">   * @throws java.io.IOException throws in case command is unsuccessful</span>
-<span class="source-line-no">1298</span><span id="line-1298">   */</span>
-<span class="source-line-no">1299</span><span id="line-1299">  public void killMiniHBaseCluster() throws IOException {</span>
-<span class="source-line-no">1300</span><span id="line-1300">    cleanup();</span>
-<span class="source-line-no">1301</span><span id="line-1301">    if (this.hbaseCluster != null) {</span>
-<span class="source-line-no">1302</span><span id="line-1302">      getMiniHBaseCluster().killAll();</span>
-<span class="source-line-no">1303</span><span id="line-1303">      this.hbaseCluster = null;</span>
-<span class="source-line-no">1304</span><span id="line-1304">    }</span>
-<span class="source-line-no">1305</span><span id="line-1305">    if (zooKeeperWatcher != null) {</span>
-<span class="source-line-no">1306</span><span id="line-1306">      zooKeeperWatcher.close();</span>
-<span class="source-line-no">1307</span><span id="line-1307">      zooKeeperWatcher = null;</span>
-<span class="source-line-no">1308</span><span id="line-1308">    }</span>
-<span class="source-line-no">1309</span><span id="line-1309">  }</span>
-<span class="source-line-no">1310</span><span id="line-1310"></span>
-<span class="source-line-no">1311</span><span id="line-1311">  // close hbase admin, close current connection and reset MIN MAX configs for RS.</span>
-<span class="source-line-no">1312</span><span id="line-1312">  private void cleanup() throws IOException {</span>
-<span class="source-line-no">1313</span><span id="line-1313">    closeConnection();</span>
-<span class="source-line-no">1314</span><span id="line-1314">    // unset the configuration for MIN and MAX RS to start</span>
-<span class="source-line-no">1315</span><span id="line-1315">    conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1);</span>
-<span class="source-line-no">1316</span><span id="line-1316">    conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, -1);</span>
-<span class="source-line-no">1317</span><span id="line-1317">  }</span>
-<span class="source-line-no">1318</span><span id="line-1318"></span>
-<span class="source-line-no">1319</span><span id="line-1319">  /**</span>
-<span class="source-line-no">1320</span><span id="line-1320">   * Returns the path to the default root dir the minicluster uses. If &lt;code&gt;create&lt;/code&gt; is true,</span>
-<span class="source-line-no">1321</span><span id="line-1321">   * a new root directory path is fetched irrespective of whether it has been fetched before or not.</span>
-<span class="source-line-no">1322</span><span id="line-1322">   * If false, previous path is used. Note: this does not cause the root dir to be created.</span>
-<span class="source-line-no">1323</span><span id="line-1323">   * @return Fully qualified path for the default hbase root dir</span>
-<span class="source-line-no">1324</span><span id="line-1324">   */</span>
-<span class="source-line-no">1325</span><span id="line-1325">  public Path getDefaultRootDirPath(boolean create) throws IOException {</span>
-<span class="source-line-no">1326</span><span id="line-1326">    if (!create) {</span>
-<span class="source-line-no">1327</span><span id="line-1327">      return getDataTestDirOnTestFS();</span>
-<span class="source-line-no">1328</span><span id="line-1328">    } else {</span>
-<span class="source-line-no">1329</span><span id="line-1329">      return getNewDataTestDirOnTestFS();</span>
-<span class="source-line-no">1330</span><span id="line-1330">    }</span>
-<span class="source-line-no">1331</span><span id="line-1331">  }</span>
-<span class="source-line-no">1332</span><span id="line-1332"></span>
-<span class="source-line-no">1333</span><span id="line-1333">  /**</span>
-<span class="source-line-no">1334</span><span id="line-1334">   * Same as {{@link HBaseTestingUtility#getDefaultRootDirPath(boolean create)} except that</span>
-<span class="source-line-no">1335</span><span id="line-1335">   * &lt;code&gt;create&lt;/code&gt; flag is false. Note: this does not cause the root dir to be created.</span>
+<span class="source-line-no">1263</span><span id="line-1263">   * @return Current mini hbase cluster. Only has something in it after a call to</span>
+<span class="source-line-no">1264</span><span id="line-1264">   *         {@link #startMiniCluster()}.</span>
+<span class="source-line-no">1265</span><span id="line-1265">   * @see #startMiniCluster()</span>
+<span class="source-line-no">1266</span><span id="line-1266">   */</span>
+<span class="source-line-no">1267</span><span id="line-1267">  public MiniHBaseCluster getMiniHBaseCluster() {</span>
+<span class="source-line-no">1268</span><span id="line-1268">    if (this.hbaseCluster == null || this.hbaseCluster instanceof MiniHBaseCluster) {</span>
+<span class="source-line-no">1269</span><span id="line-1269">      return (MiniHBaseCluster) this.hbaseCluster;</span>
+<span class="source-line-no">1270</span><span id="line-1270">    }</span>
+<span class="source-line-no">1271</span><span id="line-1271">    throw new RuntimeException(</span>
+<span class="source-line-no">1272</span><span id="line-1272">      hbaseCluster + " not an instance of " + MiniHBaseCluster.class.getName());</span>
+<span class="source-line-no">1273</span><span id="line-1273">  }</span>
+<span class="source-line-no">1274</span><span id="line-1274"></span>
+<span class="source-line-no">1275</span><span id="line-1275">  /**</span>
+<span class="source-line-no">1276</span><span id="line-1276">   * Stops mini hbase, zk, and hdfs clusters.</span>
+<span class="source-line-no">1277</span><span id="line-1277">   * @see #startMiniCluster(int)</span>
+<span class="source-line-no">1278</span><span id="line-1278">   */</span>
+<span class="source-line-no">1279</span><span id="line-1279">  public void shutdownMiniCluster() throws IOException {</span>
+<span class="source-line-no">1280</span><span id="line-1280">    LOG.info("Shutting down minicluster");</span>
+<span class="source-line-no">1281</span><span id="line-1281">    shutdownMiniHBaseCluster();</span>
+<span class="source-line-no">1282</span><span id="line-1282">    shutdownMiniDFSCluster();</span>
+<span class="source-line-no">1283</span><span id="line-1283">    shutdownMiniZKCluster();</span>
+<span class="source-line-no">1284</span><span id="line-1284"></span>
+<span class="source-line-no">1285</span><span id="line-1285">    cleanupTestDir();</span>
+<span class="source-line-no">1286</span><span id="line-1286">    miniClusterRunning = false;</span>
+<span class="source-line-no">1287</span><span id="line-1287">    LOG.info("Minicluster is down");</span>
+<span class="source-line-no">1288</span><span id="line-1288">  }</span>
+<span class="source-line-no">1289</span><span id="line-1289"></span>
+<span class="source-line-no">1290</span><span id="line-1290">  /**</span>
+<span class="source-line-no">1291</span><span id="line-1291">   * Shutdown HBase mini cluster.Does not shutdown zk or dfs if running.</span>
+<span class="source-line-no">1292</span><span id="line-1292">   * @throws java.io.IOException in case command is unsuccessful</span>
+<span class="source-line-no">1293</span><span id="line-1293">   */</span>
+<span class="source-line-no">1294</span><span id="line-1294">  public void shutdownMiniHBaseCluster() throws IOException {</span>
+<span class="source-line-no">1295</span><span id="line-1295">    cleanup();</span>
+<span class="source-line-no">1296</span><span id="line-1296">    if (this.hbaseCluster != null) {</span>
+<span class="source-line-no">1297</span><span id="line-1297">      this.hbaseCluster.shutdown();</span>
+<span class="source-line-no">1298</span><span id="line-1298">      // Wait till hbase is down before going on to shutdown zk.</span>
+<span class="source-line-no">1299</span><span id="line-1299">      this.hbaseCluster.waitUntilShutDown();</span>
+<span class="source-line-no">1300</span><span id="line-1300">      this.hbaseCluster = null;</span>
+<span class="source-line-no">1301</span><span id="line-1301">    }</span>
+<span class="source-line-no">1302</span><span id="line-1302">    if (zooKeeperWatcher != null) {</span>
+<span class="source-line-no">1303</span><span id="line-1303">      zooKeeperWatcher.close();</span>
+<span class="source-line-no">1304</span><span id="line-1304">      zooKeeperWatcher = null;</span>
+<span class="source-line-no">1305</span><span id="line-1305">    }</span>
+<span class="source-line-no">1306</span><span id="line-1306">  }</span>
+<span class="source-line-no">1307</span><span id="line-1307"></span>
+<span class="source-line-no">1308</span><span id="line-1308">  /**</span>
+<span class="source-line-no">1309</span><span id="line-1309">   * Abruptly Shutdown HBase mini cluster. Does not shutdown zk or dfs if running.</span>
+<span class="source-line-no">1310</span><span id="line-1310">   * @throws java.io.IOException throws in case command is unsuccessful</span>
+<span class="source-line-no">1311</span><span id="line-1311">   */</span>
+<span class="source-line-no">1312</span><span id="line-1312">  public void killMiniHBaseCluster() throws IOException {</span>
+<span class="source-line-no">1313</span><span id="line-1313">    cleanup();</span>
+<span class="source-line-no">1314</span><span id="line-1314">    if (this.hbaseCluster != null) {</span>
+<span class="source-line-no">1315</span><span id="line-1315">      getMiniHBaseCluster().killAll();</span>
+<span class="source-line-no">1316</span><span id="line-1316">      this.hbaseCluster = null;</span>
+<span class="source-line-no">1317</span><span id="line-1317">    }</span>
+<span class="source-line-no">1318</span><span id="line-1318">    if (zooKeeperWatcher != null) {</span>
+<span class="source-line-no">1319</span><span id="line-1319">      zooKeeperWatcher.close();</span>
+<span class="source-line-no">1320</span><span id="line-1320">      zooKeeperWatcher = null;</span>
+<span class="source-line-no">1321</span><span id="line-1321">    }</span>
+<span class="source-line-no">1322</span><span id="line-1322">  }</span>
+<span class="source-line-no">1323</span><span id="line-1323"></span>
+<span class="source-line-no">1324</span><span id="line-1324">  // close hbase admin, close current connection and reset MIN MAX configs for RS.</span>
+<span class="source-line-no">1325</span><span id="line-1325">  private void cleanup() throws IOException {</span>
+<span class="source-line-no">1326</span><span id="line-1326">    closeConnection();</span>
+<span class="source-line-no">1327</span><span id="line-1327">    // unset the configuration for MIN and MAX RS to start</span>
+<span class="source-line-no">1328</span><span id="line-1328">    conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1);</span>
+<span class="source-line-no">1329</span><span id="line-1329">    conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MAXTOSTART, -1);</span>
+<span class="source-line-no">1330</span><span id="line-1330">  }</span>
+<span class="source-line-no">1331</span><span id="line-1331"></span>
+<span class="source-line-no">1332</span><span id="line-1332">  /**</span>
+<span class="source-line-no">1333</span><span id="line-1333">   * Returns the path to the default root dir the minicluster uses. If &lt;code&gt;create&lt;/code&gt; is true,</span>
+<span class="source-line-no">1334</span><span id="line-1334">   * a new root directory path is fetched irrespective of whether it has been fetched before or not.</span>
+<span class="source-line-no">1335</span><span id="line-1335">   * If false, previous path is used. Note: this does not cause the root dir to be created.</span>
 <span class="source-line-no">1336</span><span id="line-1336">   * @return Fully qualified path for the default hbase root dir</span>
 <span class="source-line-no">1337</span><span id="line-1337">   */</span>
-<span class="source-line-no">1338</span><span id="line-1338">  public Path getDefaultRootDirPath() throws IOException {</span>
-<span class="source-line-no">1339</span><span id="line-1339">    return getDefaultRootDirPath(false);</span>
-<span class="source-line-no">1340</span><span id="line-1340">  }</span>
-<span class="source-line-no">1341</span><span id="line-1341"></span>
-<span class="source-line-no">1342</span><span id="line-1342">  /**</span>
-<span class="source-line-no">1343</span><span id="line-1343">   * Creates an hbase rootdir in user home directory. Also creates hbase version file. Normally you</span>
-<span class="source-line-no">1344</span><span id="line-1344">   * won't make use of this method. Root hbasedir is created for you as part of mini cluster</span>
-<span class="source-line-no">1345</span><span id="line-1345">   * startup. You'd only use this method if you were doing manual operation.</span>
-<span class="source-line-no">1346</span><span id="line-1346">   * @param create This flag decides whether to get a new root or data directory path or not, if it</span>
-<span class="source-line-no">1347</span><span id="line-1347">   *               has been fetched already. Note : Directory will be made irrespective of whether</span>
-<span class="source-line-no">1348</span><span id="line-1348">   *               path has been fetched or not. If directory already exists, it will be overwritten</span>
-<span class="source-line-no">1349</span><span id="line-1349">   * @return Fully qualified path to hbase root dir</span>
+<span class="source-line-no">1338</span><span id="line-1338">  public Path getDefaultRootDirPath(boolean create) throws IOException {</span>
+<span class="source-line-no">1339</span><span id="line-1339">    if (!create) {</span>
+<span class="source-line-no">1340</span><span id="line-1340">      return getDataTestDirOnTestFS();</span>
+<span class="source-line-no">1341</span><span id="line-1341">    } else {</span>
+<span class="source-line-no">1342</span><span id="line-1342">      return getNewDataTestDirOnTestFS();</span>
+<span class="source-line-no">1343</span><span id="line-1343">    }</span>
+<span class="source-line-no">1344</span><span id="line-1344">  }</span>
+<span class="source-line-no">1345</span><span id="line-1345"></span>
+<span class="source-line-no">1346</span><span id="line-1346">  /**</span>
+<span class="source-line-no">1347</span><span id="line-1347">   * Same as {{@link HBaseTestingUtility#getDefaultRootDirPath(boolean create)} except that</span>
+<span class="source-line-no">1348</span><span id="line-1348">   * &lt;code&gt;create&lt;/code&gt; flag is false. Note: this does not cause the root dir to be created.</span>
+<span class="source-line-no">1349</span><span id="line-1349">   * @return Fully qualified path for the default hbase root dir</span>
 <span class="source-line-no">1350</span><span id="line-1350">   */</span>
-<span class="source-line-no">1351</span><span id="line-1351">  public Path createRootDir(boolean create) throws IOException {</span>
-<span class="source-line-no">1352</span><span id="line-1352">    FileSystem fs = FileSystem.get(this.conf);</span>
-<span class="source-line-no">1353</span><span id="line-1353">    Path hbaseRootdir = getDefaultRootDirPath(create);</span>
-<span class="source-line-no">1354</span><span id="line-1354">    CommonFSUtils.setRootDir(this.conf, hbaseRootdir);</span>
-<span class="source-line-no">1355</span><span id="line-1355">    fs.mkdirs(hbaseRootdir);</span>
-<span class="source-line-no">1356</span><span id="line-1356">    FSUtils.setVersion(fs, hbaseRootdir);</span>
-<span class="source-line-no">1357</span><span id="line-1357">    return hbaseRootdir;</span>
-<span class="source-line-no">1358</span><span id="line-1358">  }</span>
-<span class="source-line-no">1359</span><span id="line-1359"></span>
-<span class="source-line-no">1360</span><span id="line-1360">  /**</span>
-<span class="source-line-no">1361</span><span id="line-1361">   * Same as {@link HBaseTestingUtility#createRootDir(boolean create)} except that</span>
-<span class="source-line-no">1362</span><span id="line-1362">   * &lt;code&gt;create&lt;/code&gt; flag is false.</span>
-<span class="source-line-no">1363</span><span id="line-1363">   * @return Fully qualified path to hbase root dir</span>
-<span class="source-line-no">1364</span><span id="line-1364">   */</span>
-<span class="source-line-no">1365</span><span id="line-1365">  public Path createRootDir() throws IOException {</span>
-<span class="source-line-no">1366</span><span id="line-1366">    return createRootDir(false);</span>
-<span class="source-line-no">1367</span><span id="line-1367">  }</span>
-<span class="source-line-no">1368</span><span id="line-1368"></span>
-<span class="source-line-no">1369</span><span id="line-1369">  /**</span>
-<span class="source-line-no">1370</span><span id="line-1370">   * Creates a hbase walDir in the user's home directory. Normally you won't make use of this</span>
-<span class="source-line-no">1371</span><span id="line-1371">   * method. Root hbaseWALDir is created for you as part of mini cluster startup. You'd only use</span>
-<span class="source-line-no">1372</span><span id="line-1372">   * this method if you were doing manual operation.</span>
-<span class="source-line-no">1373</span><span id="line-1373">   * @return Fully qualified path to hbase root dir</span>
-<span class="source-line-no">1374</span><span id="line-1374">   */</span>
-<span class="source-line-no">1375</span><span id="line-1375">  public Path createWALRootDir() throws IOException {</span>
-<span class="source-line-no">1376</span><span id="line-1376">    FileSystem fs = FileSystem.get(this.conf);</span>
-<span class="source-line-no">1377</span><span id="line-1377">    Path walDir = getNewDataTestDirOnTestFS();</span>
-<span class="source-line-no">1378</span><span id="line-1378">    CommonFSUtils.setWALRootDir(this.conf, walDir);</span>
-<span class="source-line-no">1379</span><span id="line-1379">    fs.mkdirs(walDir);</span>
-<span class="source-line-no">1380</span><span id="line-1380">    return walDir;</span>
-<span class="source-line-no">1381</span><span id="line-1381">  }</span>
-<span class="source-line-no">1382</span><span id="line-1382"></span>
-<span class="source-line-no">1383</span><span id="line-1383">  private void setHBaseFsTmpDir() throws IOException {</span>
-<span class="source-line-no">1384</span><span id="line-1384">    String hbaseFsTmpDirInString = this.conf.get("hbase.fs.tmp.dir");</span>
-<span class="source-line-no">1385</span><span id="line-1385">    if (hbaseFsTmpDirInString == null) {</span>
-<span class="source-line-no">1386</span><span id="line-1386">      this.conf.set("hbase.fs.tmp.dir", getDataTestDirOnTestFS("hbase-staging").toString());</span>
-<span class="source-line-no">1387</span><span id="line-1387">      LOG.info("Setting hbase.fs.tmp.dir to " + this.conf.get("hbase.fs.tmp.dir"));</span>
-<span class="source-line-no">1388</span><span id="line-1388">    } else {</span>
-<span class="source-line-no">1389</span><span id="line-1389">      LOG.info("The hbase.fs.tmp.dir is set to " + hbaseFsTmpDirInString);</span>
-<span class="source-line-no">1390</span><span id="line-1390">    }</span>
-<span class="source-line-no">1391</span><span id="line-1391">  }</span>
-<span class="source-line-no">1392</span><span id="line-1392"></span>
-<span class="source-line-no">1393</span><span id="line-1393">  /**</span>
-<span class="source-line-no">1394</span><span id="line-1394">   * Flushes all caches in the mini hbase cluster</span>
-<span class="source-line-no">1395</span><span id="line-1395">   */</span>
-<span class="source-line-no">1396</span><span id="line-1396">  public void flush() throws IOException {</span>
-<span class="source-line-no">1397</span><span id="line-1397">    getMiniHBaseCluster().flushcache();</span>
-<span class="source-line-no">1398</span><span id="line-1398">  }</span>
-<span class="source-line-no">1399</span><span id="line-1399"></span>
-<span class="source-line-no">1400</span><span id="line-1400">  /**</span>
-<span class="source-line-no">1401</span><span id="line-1401">   * Flushes all caches in the mini hbase cluster</span>
-<span class="source-line-no">1402</span><span id="line-1402">   */</span>
-<span class="source-line-no">1403</span><span id="line-1403">  public void flush(TableName tableName) throws IOException {</span>
-<span class="source-line-no">1404</span><span id="line-1404">    getMiniHBaseCluster().flushcache(tableName);</span>
-<span class="source-line-no">1405</span><span id="line-1405">  }</span>
-<span class="source-line-no">1406</span><span id="line-1406"></span>
-<span class="source-line-no">1407</span><span id="line-1407">  /**</span>
-<span class="source-line-no">1408</span><span id="line-1408">   * Compact all regions in the mini hbase cluster</span>
-<span class="source-line-no">1409</span><span id="line-1409">   */</span>
-<span class="source-line-no">1410</span><span id="line-1410">  public void compact(boolean major) throws IOException {</span>
-<span class="source-line-no">1411</span><span id="line-1411">    getMiniHBaseCluster().compact(major);</span>
-<span class="source-line-no">1412</span><span id="line-1412">  }</span>
-<span class="source-line-no">1413</span><span id="line-1413"></span>
-<span class="source-line-no">1414</span><span id="line-1414">  /**</span>
-<span class="source-line-no">1415</span><span id="line-1415">   * Compact all of a table's reagion in the mini hbase cluster</span>
-<span class="source-line-no">1416</span><span id="line-1416">   */</span>
-<span class="source-line-no">1417</span><span id="line-1417">  public void compact(TableName tableName, boolean major) throws IOException {</span>
-<span class="source-line-no">1418</span><span id="line-1418">    getMiniHBaseCluster().compact(tableName, major);</span>
-<span class="source-line-no">1419</span><span id="line-1419">  }</span>
-<span class="source-line-no">1420</span><span id="line-1420"></span>
-<span class="source-line-no">1421</span><span id="line-1421">  /**</span>
-<span class="source-line-no">1422</span><span id="line-1422">   * Create a table.</span>
-<span class="source-line-no">1423</span><span id="line-1423">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1424</span><span id="line-1424">   */</span>
-<span class="source-line-no">1425</span><span id="line-1425">  public Table createTable(TableName tableName, String family) throws IOException {</span>
-<span class="source-line-no">1426</span><span id="line-1426">    return createTable(tableName, new String[] { family });</span>
-<span class="source-line-no">1427</span><span id="line-1427">  }</span>
-<span class="source-line-no">1428</span><span id="line-1428"></span>
-<span class="source-line-no">1429</span><span id="line-1429">  /**</span>
-<span class="source-line-no">1430</span><span id="line-1430">   * Create a table.</span>
-<span class="source-line-no">1431</span><span id="line-1431">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1432</span><span id="line-1432">   */</span>
-<span class="source-line-no">1433</span><span id="line-1433">  public Table createTable(TableName tableName, String[] families) throws IOException {</span>
-<span class="source-line-no">1434</span><span id="line-1434">    List&lt;byte[]&gt; fams = new ArrayList&lt;&gt;(families.length);</span>
-<span class="source-line-no">1435</span><span id="line-1435">    for (String family : families) {</span>
-<span class="source-line-no">1436</span><span id="line-1436">      fams.add(Bytes.toBytes(family));</span>
-<span class="source-line-no">1437</span><span id="line-1437">    }</span>
-<span class="source-line-no">1438</span><span id="line-1438">    return createTable(tableName, fams.toArray(new byte[0][]));</span>
-<span class="source-line-no">1439</span><span id="line-1439">  }</span>
-<span class="source-line-no">1440</span><span id="line-1440"></span>
-<span class="source-line-no">1441</span><span id="line-1441">  /**</span>
-<span class="source-line-no">1442</span><span id="line-1442">   * Create a table.</span>
-<span class="source-line-no">1443</span><span id="line-1443">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1444</span><span id="line-1444">   */</span>
-<span class="source-line-no">1445</span><span id="line-1445">  public Table createTable(TableName tableName, byte[] family) throws IOException {</span>
-<span class="source-line-no">1446</span><span id="line-1446">    return createTable(tableName, new byte[][] { family });</span>
-<span class="source-line-no">1447</span><span id="line-1447">  }</span>
-<span class="source-line-no">1448</span><span id="line-1448"></span>
-<span class="source-line-no">1449</span><span id="line-1449">  /**</span>
-<span class="source-line-no">1450</span><span id="line-1450">   * Create a table with multiple regions.</span>
-<span class="source-line-no">1451</span><span id="line-1451">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1452</span><span id="line-1452">   */</span>
-<span class="source-line-no">1453</span><span id="line-1453">  public Table createMultiRegionTable(TableName tableName, byte[] family, int numRegions)</span>
-<span class="source-line-no">1454</span><span id="line-1454">    throws IOException {</span>
-<span class="source-line-no">1455</span><span id="line-1455">    if (numRegions &lt; 3) throw new IOException("Must create at least 3 regions");</span>
-<span class="source-line-no">1456</span><span id="line-1456">    byte[] startKey = Bytes.toBytes("aaaaa");</span>
-<span class="source-line-no">1457</span><span id="line-1457">    byte[] endKey = Bytes.toBytes("zzzzz");</span>
-<span class="source-line-no">1458</span><span id="line-1458">    byte[][] splitKeys = Bytes.split(startKey, endKey, numRegions - 3);</span>
-<span class="source-line-no">1459</span><span id="line-1459"></span>
-<span class="source-line-no">1460</span><span id="line-1460">    return createTable(tableName, new byte[][] { family }, splitKeys);</span>
-<span class="source-line-no">1461</span><span id="line-1461">  }</span>
-<span class="source-line-no">1462</span><span id="line-1462"></span>
-<span class="source-line-no">1463</span><span id="line-1463">  /**</span>
-<span class="source-line-no">1464</span><span id="line-1464">   * Create a table.</span>
-<span class="source-line-no">1465</span><span id="line-1465">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1466</span><span id="line-1466">   */</span>
-<span class="source-line-no">1467</span><span id="line-1467">  public Table createTable(TableName tableName, byte[][] families) throws IOException {</span>
-<span class="source-line-no">1468</span><span id="line-1468">    return createTable(tableName, families, (byte[][]) null);</span>
-<span class="source-line-no">1469</span><span id="line-1469">  }</span>
-<span class="source-line-no">1470</span><span id="line-1470"></span>
-<span class="source-line-no">1471</span><span id="line-1471">  /**</span>
-<span class="source-line-no">1472</span><span id="line-1472">   * Create a table with multiple regions.</span>
-<span class="source-line-no">1473</span><span id="line-1473">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1474</span><span id="line-1474">   */</span>
-<span class="source-line-no">1475</span><span id="line-1475">  public Table createMultiRegionTable(TableName tableName, byte[][] families) throws IOException {</span>
-<span class="source-line-no">1476</span><span id="line-1476">    return createTable(tableName, families, KEYS_FOR_HBA_CREATE_TABLE);</span>
-<span class="source-line-no">1477</span><span id="line-1477">  }</span>
-<span class="source-line-no">1478</span><span id="line-1478"></span>
-<span class="source-line-no">1479</span><span id="line-1479">  /**</span>
-<span class="source-line-no">1480</span><span id="line-1480">   * Create a table with multiple regions.</span>
-<span class="source-line-no">1481</span><span id="line-1481">   * @param replicaCount replica count.</span>
-<span class="source-line-no">1482</span><span id="line-1482">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1483</span><span id="line-1483">   */</span>
-<span class="source-line-no">1484</span><span id="line-1484">  public Table createMultiRegionTable(TableName tableName, int replicaCount, byte[][] families)</span>
-<span class="source-line-no">1485</span><span id="line-1485">    throws IOException {</span>
-<span class="source-line-no">1486</span><span id="line-1486">    return createTable(tableName, families, KEYS_FOR_HBA_CREATE_TABLE, replicaCount);</span>
-<span class="source-line-no">1487</span><span id="line-1487">  }</span>
-<span class="source-line-no">1488</span><span id="line-1488"></span>
-<span class="source-line-no">1489</span><span id="line-1489">  /**</span>
-<span class="source-line-no">1490</span><span id="line-1490">   * Create a table.</span>
-<span class="source-line-no">1491</span><span id="line-1491">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1492</span><span id="line-1492">   */</span>
-<span class="source-line-no">1493</span><span id="line-1493">  public Table createTable(TableName tableName, byte[][] families, byte[][] splitKeys)</span>
-<span class="source-line-no">1494</span><span id="line-1494">    throws IOException {</span>
-<span class="source-line-no">1495</span><span id="line-1495">    return createTable(tableName, families, splitKeys, 1, new Configuration(getConfiguration()));</span>
-<span class="source-line-no">1496</span><span id="line-1496">  }</span>
-<span class="source-line-no">1497</span><span id="line-1497"></span>
-<span class="source-line-no">1498</span><span id="line-1498">  /**</span>
-<span class="source-line-no">1499</span><span id="line-1499">   * Create a table.</span>
-<span class="source-line-no">1500</span><span id="line-1500">   * @param tableName    the table name</span>
-<span class="source-line-no">1501</span><span id="line-1501">   * @param families     the families</span>
-<span class="source-line-no">1502</span><span id="line-1502">   * @param splitKeys    the splitkeys</span>
-<span class="source-line-no">1503</span><span id="line-1503">   * @param replicaCount the region replica count</span>
+<span class="source-line-no">1351</span><span id="line-1351">  public Path getDefaultRootDirPath() throws IOException {</span>
+<span class="source-line-no">1352</span><span id="line-1352">    return getDefaultRootDirPath(false);</span>
+<span class="source-line-no">1353</span><span id="line-1353">  }</span>
+<span class="source-line-no">1354</span><span id="line-1354"></span>
+<span class="source-line-no">1355</span><span id="line-1355">  /**</span>
+<span class="source-line-no">1356</span><span id="line-1356">   * Creates an hbase rootdir in user home directory. Also creates hbase version file. Normally you</span>
+<span class="source-line-no">1357</span><span id="line-1357">   * won't make use of this method. Root hbasedir is created for you as part of mini cluster</span>
+<span class="source-line-no">1358</span><span id="line-1358">   * startup. You'd only use this method if you were doing manual operation.</span>
+<span class="source-line-no">1359</span><span id="line-1359">   * @param create This flag decides whether to get a new root or data directory path or not, if it</span>
+<span class="source-line-no">1360</span><span id="line-1360">   *               has been fetched already. Note : Directory will be made irrespective of whether</span>
+<span class="source-line-no">1361</span><span id="line-1361">   *               path has been fetched or not. If directory already exists, it will be overwritten</span>
+<span class="source-line-no">1362</span><span id="line-1362">   * @return Fully qualified path to hbase root dir</span>
+<span class="source-line-no">1363</span><span id="line-1363">   */</span>
+<span class="source-line-no">1364</span><span id="line-1364">  public Path createRootDir(boolean create) throws IOException {</span>
+<span class="source-line-no">1365</span><span id="line-1365">    FileSystem fs = FileSystem.get(this.conf);</span>
+<span class="source-line-no">1366</span><span id="line-1366">    Path hbaseRootdir = getDefaultRootDirPath(create);</span>
+<span class="source-line-no">1367</span><span id="line-1367">    CommonFSUtils.setRootDir(this.conf, hbaseRootdir);</span>
+<span class="source-line-no">1368</span><span id="line-1368">    fs.mkdirs(hbaseRootdir);</span>
+<span class="source-line-no">1369</span><span id="line-1369">    FSUtils.setVersion(fs, hbaseRootdir);</span>
+<span class="source-line-no">1370</span><span id="line-1370">    return hbaseRootdir;</span>
+<span class="source-line-no">1371</span><span id="line-1371">  }</span>
+<span class="source-line-no">1372</span><span id="line-1372"></span>
+<span class="source-line-no">1373</span><span id="line-1373">  /**</span>
+<span class="source-line-no">1374</span><span id="line-1374">   * Same as {@link HBaseTestingUtility#createRootDir(boolean create)} except that</span>
+<span class="source-line-no">1375</span><span id="line-1375">   * &lt;code&gt;create&lt;/code&gt; flag is false.</span>
+<span class="source-line-no">1376</span><span id="line-1376">   * @return Fully qualified path to hbase root dir</span>
+<span class="source-line-no">1377</span><span id="line-1377">   */</span>
+<span class="source-line-no">1378</span><span id="line-1378">  public Path createRootDir() throws IOException {</span>
+<span class="source-line-no">1379</span><span id="line-1379">    return createRootDir(false);</span>
+<span class="source-line-no">1380</span><span id="line-1380">  }</span>
+<span class="source-line-no">1381</span><span id="line-1381"></span>
+<span class="source-line-no">1382</span><span id="line-1382">  /**</span>
+<span class="source-line-no">1383</span><span id="line-1383">   * Creates a hbase walDir in the user's home directory. Normally you won't make use of this</span>
+<span class="source-line-no">1384</span><span id="line-1384">   * method. Root hbaseWALDir is created for you as part of mini cluster startup. You'd only use</span>
+<span class="source-line-no">1385</span><span id="line-1385">   * this method if you were doing manual operation.</span>
+<span class="source-line-no">1386</span><span id="line-1386">   * @return Fully qualified path to hbase root dir</span>
+<span class="source-line-no">1387</span><span id="line-1387">   */</span>
+<span class="source-line-no">1388</span><span id="line-1388">  public Path createWALRootDir() throws IOException {</span>
+<span class="source-line-no">1389</span><span id="line-1389">    FileSystem fs = FileSystem.get(this.conf);</span>
+<span class="source-line-no">1390</span><span id="line-1390">    Path walDir = getNewDataTestDirOnTestFS();</span>
+<span class="source-line-no">1391</span><span id="line-1391">    CommonFSUtils.setWALRootDir(this.conf, walDir);</span>
+<span class="source-line-no">1392</span><span id="line-1392">    fs.mkdirs(walDir);</span>
+<span class="source-line-no">1393</span><span id="line-1393">    return walDir;</span>
+<span class="source-line-no">1394</span><span id="line-1394">  }</span>
+<span class="source-line-no">1395</span><span id="line-1395"></span>
+<span class="source-line-no">1396</span><span id="line-1396">  private void setHBaseFsTmpDir() throws IOException {</span>
+<span class="source-line-no">1397</span><span id="line-1397">    String hbaseFsTmpDirInString = this.conf.get("hbase.fs.tmp.dir");</span>
+<span class="source-line-no">1398</span><span id="line-1398">    if (hbaseFsTmpDirInString == null) {</span>
+<span class="source-line-no">1399</span><span id="line-1399">      this.conf.set("hbase.fs.tmp.dir", getDataTestDirOnTestFS("hbase-staging").toString());</span>
+<span class="source-line-no">1400</span><span id="line-1400">      LOG.info("Setting hbase.fs.tmp.dir to " + this.conf.get("hbase.fs.tmp.dir"));</span>
+<span class="source-line-no">1401</span><span id="line-1401">    } else {</span>
+<span class="source-line-no">1402</span><span id="line-1402">      LOG.info("The hbase.fs.tmp.dir is set to " + hbaseFsTmpDirInString);</span>
+<span class="source-line-no">1403</span><span id="line-1403">    }</span>
+<span class="source-line-no">1404</span><span id="line-1404">  }</span>
+<span class="source-line-no">1405</span><span id="line-1405"></span>
+<span class="source-line-no">1406</span><span id="line-1406">  /**</span>
+<span class="source-line-no">1407</span><span id="line-1407">   * Flushes all caches in the mini hbase cluster</span>
+<span class="source-line-no">1408</span><span id="line-1408">   */</span>
+<span class="source-line-no">1409</span><span id="line-1409">  public void flush() throws IOException {</span>
+<span class="source-line-no">1410</span><span id="line-1410">    getMiniHBaseCluster().flushcache();</span>
+<span class="source-line-no">1411</span><span id="line-1411">  }</span>
+<span class="source-line-no">1412</span><span id="line-1412"></span>
+<span class="source-line-no">1413</span><span id="line-1413">  /**</span>
+<span class="source-line-no">1414</span><span id="line-1414">   * Flushes all caches in the mini hbase cluster</span>
+<span class="source-line-no">1415</span><span id="line-1415">   */</span>
+<span class="source-line-no">1416</span><span id="line-1416">  public void flush(TableName tableName) throws IOException {</span>
+<span class="source-line-no">1417</span><span id="line-1417">    getMiniHBaseCluster().flushcache(tableName);</span>
+<span class="source-line-no">1418</span><span id="line-1418">  }</span>
+<span class="source-line-no">1419</span><span id="line-1419"></span>
+<span class="source-line-no">1420</span><span id="line-1420">  /**</span>
+<span class="source-line-no">1421</span><span id="line-1421">   * Compact all regions in the mini hbase cluster</span>
+<span class="source-line-no">1422</span><span id="line-1422">   */</span>
+<span class="source-line-no">1423</span><span id="line-1423">  public void compact(boolean major) throws IOException {</span>
+<span class="source-line-no">1424</span><span id="line-1424">    getMiniHBaseCluster().compact(major);</span>
+<span class="source-line-no">1425</span><span id="line-1425">  }</span>
+<span class="source-line-no">1426</span><span id="line-1426"></span>
+<span class="source-line-no">1427</span><span id="line-1427">  /**</span>
+<span class="source-line-no">1428</span><span id="line-1428">   * Compact all of a table's reagion in the mini hbase cluster</span>
+<span class="source-line-no">1429</span><span id="line-1429">   */</span>
+<span class="source-line-no">1430</span><span id="line-1430">  public void compact(TableName tableName, boolean major) throws IOException {</span>
+<span class="source-line-no">1431</span><span id="line-1431">    getMiniHBaseCluster().compact(tableName, major);</span>
+<span class="source-line-no">1432</span><span id="line-1432">  }</span>
+<span class="source-line-no">1433</span><span id="line-1433"></span>
+<span class="source-line-no">1434</span><span id="line-1434">  /**</span>
+<span class="source-line-no">1435</span><span id="line-1435">   * Create a table.</span>
+<span class="source-line-no">1436</span><span id="line-1436">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1437</span><span id="line-1437">   */</span>
+<span class="source-line-no">1438</span><span id="line-1438">  public Table createTable(TableName tableName, String family) throws IOException {</span>
+<span class="source-line-no">1439</span><span id="line-1439">    return createTable(tableName, new String[] { family });</span>
+<span class="source-line-no">1440</span><span id="line-1440">  }</span>
+<span class="source-line-no">1441</span><span id="line-1441"></span>
+<span class="source-line-no">1442</span><span id="line-1442">  /**</span>
+<span class="source-line-no">1443</span><span id="line-1443">   * Create a table.</span>
+<span class="source-line-no">1444</span><span id="line-1444">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1445</span><span id="line-1445">   */</span>
+<span class="source-line-no">1446</span><span id="line-1446">  public Table createTable(TableName tableName, String[] families) throws IOException {</span>
+<span class="source-line-no">1447</span><span id="line-1447">    List&lt;byte[]&gt; fams = new ArrayList&lt;&gt;(families.length);</span>
+<span class="source-line-no">1448</span><span id="line-1448">    for (String family : families) {</span>
+<span class="source-line-no">1449</span><span id="line-1449">      fams.add(Bytes.toBytes(family));</span>
+<span class="source-line-no">1450</span><span id="line-1450">    }</span>
+<span class="source-line-no">1451</span><span id="line-1451">    return createTable(tableName, fams.toArray(new byte[0][]));</span>
+<span class="source-line-no">1452</span><span id="line-1452">  }</span>
+<span class="source-line-no">1453</span><span id="line-1453"></span>
+<span class="source-line-no">1454</span><span id="line-1454">  /**</span>
+<span class="source-line-no">1455</span><span id="line-1455">   * Create a table.</span>
+<span class="source-line-no">1456</span><span id="line-1456">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1457</span><span id="line-1457">   */</span>
+<span class="source-line-no">1458</span><span id="line-1458">  public Table createTable(TableName tableName, byte[] family) throws IOException {</span>
+<span class="source-line-no">1459</span><span id="line-1459">    return createTable(tableName, new byte[][] { family });</span>
+<span class="source-line-no">1460</span><span id="line-1460">  }</span>
+<span class="source-line-no">1461</span><span id="line-1461"></span>
+<span class="source-line-no">1462</span><span id="line-1462">  /**</span>
+<span class="source-line-no">1463</span><span id="line-1463">   * Create a table with multiple regions.</span>
+<span class="source-line-no">1464</span><span id="line-1464">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1465</span><span id="line-1465">   */</span>
+<span class="source-line-no">1466</span><span id="line-1466">  public Table createMultiRegionTable(TableName tableName, byte[] family, int numRegions)</span>
+<span class="source-line-no">1467</span><span id="line-1467">    throws IOException {</span>
+<span class="source-line-no">1468</span><span id="line-1468">    if (numRegions &lt; 3) throw new IOException("Must create at least 3 regions");</span>
+<span class="source-line-no">1469</span><span id="line-1469">    byte[] startKey = Bytes.toBytes("aaaaa");</span>
+<span class="source-line-no">1470</span><span id="line-1470">    byte[] endKey = Bytes.toBytes("zzzzz");</span>
+<span class="source-line-no">1471</span><span id="line-1471">    byte[][] splitKeys = Bytes.split(startKey, endKey, numRegions - 3);</span>
+<span class="source-line-no">1472</span><span id="line-1472"></span>
+<span class="source-line-no">1473</span><span id="line-1473">    return createTable(tableName, new byte[][] { family }, splitKeys);</span>
+<span class="source-line-no">1474</span><span id="line-1474">  }</span>
+<span class="source-line-no">1475</span><span id="line-1475"></span>
+<span class="source-line-no">1476</span><span id="line-1476">  /**</span>
+<span class="source-line-no">1477</span><span id="line-1477">   * Create a table.</span>
+<span class="source-line-no">1478</span><span id="line-1478">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1479</span><span id="line-1479">   */</span>
+<span class="source-line-no">1480</span><span id="line-1480">  public Table createTable(TableName tableName, byte[][] families) throws IOException {</span>
+<span class="source-line-no">1481</span><span id="line-1481">    return createTable(tableName, families, (byte[][]) null);</span>
+<span class="source-line-no">1482</span><span id="line-1482">  }</span>
+<span class="source-line-no">1483</span><span id="line-1483"></span>
+<span class="source-line-no">1484</span><span id="line-1484">  /**</span>
+<span class="source-line-no">1485</span><span id="line-1485">   * Create a table with multiple regions.</span>
+<span class="source-line-no">1486</span><span id="line-1486">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1487</span><span id="line-1487">   */</span>
+<span class="source-line-no">1488</span><span id="line-1488">  public Table createMultiRegionTable(TableName tableName, byte[][] families) throws IOException {</span>
+<span class="source-line-no">1489</span><span id="line-1489">    return createTable(tableName, families, KEYS_FOR_HBA_CREATE_TABLE);</span>
+<span class="source-line-no">1490</span><span id="line-1490">  }</span>
+<span class="source-line-no">1491</span><span id="line-1491"></span>
+<span class="source-line-no">1492</span><span id="line-1492">  /**</span>
+<span class="source-line-no">1493</span><span id="line-1493">   * Create a table with multiple regions.</span>
+<span class="source-line-no">1494</span><span id="line-1494">   * @param replicaCount replica count.</span>
+<span class="source-line-no">1495</span><span id="line-1495">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1496</span><span id="line-1496">   */</span>
+<span class="source-line-no">1497</span><span id="line-1497">  public Table createMultiRegionTable(TableName tableName, int replicaCount, byte[][] families)</span>
+<span class="source-line-no">1498</span><span id="line-1498">    throws IOException {</span>
+<span class="source-line-no">1499</span><span id="line-1499">    return createTable(tableName, families, KEYS_FOR_HBA_CREATE_TABLE, replicaCount);</span>
+<span class="source-line-no">1500</span><span id="line-1500">  }</span>
+<span class="source-line-no">1501</span><span id="line-1501"></span>
+<span class="source-line-no">1502</span><span id="line-1502">  /**</span>
+<span class="source-line-no">1503</span><span id="line-1503">   * Create a table.</span>
 <span class="source-line-no">1504</span><span id="line-1504">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1505</span><span id="line-1505">   * @throws IOException throws IOException</span>
-<span class="source-line-no">1506</span><span id="line-1506">   */</span>
-<span class="source-line-no">1507</span><span id="line-1507">  public Table createTable(TableName tableName, byte[][] families, byte[][] splitKeys,</span>
-<span class="source-line-no">1508</span><span id="line-1508">    int replicaCount) throws IOException {</span>
-<span class="source-line-no">1509</span><span id="line-1509">    return createTable(tableName, families, splitKeys, replicaCount,</span>
-<span class="source-line-no">1510</span><span id="line-1510">      new Configuration(getConfiguration()));</span>
-<span class="source-line-no">1511</span><span id="line-1511">  }</span>
-<span class="source-line-no">1512</span><span id="line-1512"></span>
-<span class="source-line-no">1513</span><span id="line-1513">  public Table createTable(TableName tableName, byte[][] families, int numVersions, byte[] startKey,</span>
-<span class="source-line-no">1514</span><span id="line-1514">    byte[] endKey, int numRegions) throws IOException {</span>
-<span class="source-line-no">1515</span><span id="line-1515">    TableDescriptor desc = createTableDescriptor(tableName, families, numVersions);</span>
-<span class="source-line-no">1516</span><span id="line-1516"></span>
-<span class="source-line-no">1517</span><span id="line-1517">    getAdmin().createTable(desc, startKey, endKey, numRegions);</span>
-<span class="source-line-no">1518</span><span id="line-1518">    // HBaseAdmin only waits for regions to appear in hbase:meta we</span>
-<span class="source-line-no">1519</span><span id="line-1519">    // should wait until they are assigned</span>
-<span class="source-line-no">1520</span><span id="line-1520">    waitUntilAllRegionsAssigned(tableName);</span>
-<span class="source-line-no">1521</span><span id="line-1521">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">1522</span><span id="line-1522">  }</span>
-<span class="source-line-no">1523</span><span id="line-1523"></span>
-<span class="source-line-no">1524</span><span id="line-1524">  /**</span>
-<span class="source-line-no">1525</span><span id="line-1525">   * Create a table.</span>
-<span class="source-line-no">1526</span><span id="line-1526">   * @param c Configuration to use</span>
-<span class="source-line-no">1527</span><span id="line-1527">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1528</span><span id="line-1528">   */</span>
-<span class="source-line-no">1529</span><span id="line-1529">  public Table createTable(TableDescriptor htd, byte[][] families, Configuration c)</span>
-<span class="source-line-no">1530</span><span id="line-1530">    throws IOException {</span>
-<span class="source-line-no">1531</span><span id="line-1531">    return createTable(htd, families, null, c);</span>
-<span class="source-line-no">1532</span><span id="line-1532">  }</span>
-<span class="source-line-no">1533</span><span id="line-1533"></span>
-<span class="source-line-no">1534</span><span id="line-1534">  /**</span>
-<span class="source-line-no">1535</span><span id="line-1535">   * Create a table.</span>
-<span class="source-line-no">1536</span><span id="line-1536">   * @param htd       table descriptor</span>
-<span class="source-line-no">1537</span><span id="line-1537">   * @param families  array of column families</span>
-<span class="source-line-no">1538</span><span id="line-1538">   * @param splitKeys array of split keys</span>
-<span class="source-line-no">1539</span><span id="line-1539">   * @param c         Configuration to use</span>
+<span class="source-line-no">1505</span><span id="line-1505">   */</span>
+<span class="source-line-no">1506</span><span id="line-1506">  public Table createTable(TableName tableName, byte[][] families, byte[][] splitKeys)</span>
+<span class="source-line-no">1507</span><span id="line-1507">    throws IOException {</span>
+<span class="source-line-no">1508</span><span id="line-1508">    return createTable(tableName, families, splitKeys, 1, new Configuration(getConfiguration()));</span>
+<span class="source-line-no">1509</span><span id="line-1509">  }</span>
+<span class="source-line-no">1510</span><span id="line-1510"></span>
+<span class="source-line-no">1511</span><span id="line-1511">  /**</span>
+<span class="source-line-no">1512</span><span id="line-1512">   * Create a table.</span>
+<span class="source-line-no">1513</span><span id="line-1513">   * @param tableName    the table name</span>
+<span class="source-line-no">1514</span><span id="line-1514">   * @param families     the families</span>
+<span class="source-line-no">1515</span><span id="line-1515">   * @param splitKeys    the splitkeys</span>
+<span class="source-line-no">1516</span><span id="line-1516">   * @param replicaCount the region replica count</span>
+<span class="source-line-no">1517</span><span id="line-1517">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1518</span><span id="line-1518">   * @throws IOException throws IOException</span>
+<span class="source-line-no">1519</span><span id="line-1519">   */</span>
+<span class="source-line-no">1520</span><span id="line-1520">  public Table createTable(TableName tableName, byte[][] families, byte[][] splitKeys,</span>
+<span class="source-line-no">1521</span><span id="line-1521">    int replicaCount) throws IOException {</span>
+<span class="source-line-no">1522</span><span id="line-1522">    return createTable(tableName, families, splitKeys, replicaCount,</span>
+<span class="source-line-no">1523</span><span id="line-1523">      new Configuration(getConfiguration()));</span>
+<span class="source-line-no">1524</span><span id="line-1524">  }</span>
+<span class="source-line-no">1525</span><span id="line-1525"></span>
+<span class="source-line-no">1526</span><span id="line-1526">  public Table createTable(TableName tableName, byte[][] families, int numVersions, byte[] startKey,</span>
+<span class="source-line-no">1527</span><span id="line-1527">    byte[] endKey, int numRegions) throws IOException {</span>
+<span class="source-line-no">1528</span><span id="line-1528">    TableDescriptor desc = createTableDescriptor(tableName, families, numVersions);</span>
+<span class="source-line-no">1529</span><span id="line-1529"></span>
+<span class="source-line-no">1530</span><span id="line-1530">    getAdmin().createTable(desc, startKey, endKey, numRegions);</span>
+<span class="source-line-no">1531</span><span id="line-1531">    // HBaseAdmin only waits for regions to appear in hbase:meta we</span>
+<span class="source-line-no">1532</span><span id="line-1532">    // should wait until they are assigned</span>
+<span class="source-line-no">1533</span><span id="line-1533">    waitUntilAllRegionsAssigned(tableName);</span>
+<span class="source-line-no">1534</span><span id="line-1534">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">1535</span><span id="line-1535">  }</span>
+<span class="source-line-no">1536</span><span id="line-1536"></span>
+<span class="source-line-no">1537</span><span id="line-1537">  /**</span>
+<span class="source-line-no">1538</span><span id="line-1538">   * Create a table.</span>
+<span class="source-line-no">1539</span><span id="line-1539">   * @param c Configuration to use</span>
 <span class="source-line-no">1540</span><span id="line-1540">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1541</span><span id="line-1541">   * @throws IOException if getAdmin or createTable fails</span>
-<span class="source-line-no">1542</span><span id="line-1542">   */</span>
-<span class="source-line-no">1543</span><span id="line-1543">  public Table createTable(TableDescriptor htd, byte[][] families, byte[][] splitKeys,</span>
-<span class="source-line-no">1544</span><span id="line-1544">    Configuration c) throws IOException {</span>
-<span class="source-line-no">1545</span><span id="line-1545">    // Disable blooms (they are on by default as of 0.95) but we disable them here because</span>
-<span class="source-line-no">1546</span><span id="line-1546">    // tests have hard coded counts of what to expect in block cache, etc., and blooms being</span>
-<span class="source-line-no">1547</span><span id="line-1547">    // on is interfering.</span>
-<span class="source-line-no">1548</span><span id="line-1548">    return createTable(htd, families, splitKeys, BloomType.NONE, HConstants.DEFAULT_BLOCKSIZE, c);</span>
-<span class="source-line-no">1549</span><span id="line-1549">  }</span>
-<span class="source-line-no">1550</span><span id="line-1550"></span>
-<span class="source-line-no">1551</span><span id="line-1551">  /**</span>
-<span class="source-line-no">1552</span><span id="line-1552">   * Create a table.</span>
-<span class="source-line-no">1553</span><span id="line-1553">   * @param htd       table descriptor</span>
-<span class="source-line-no">1554</span><span id="line-1554">   * @param families  array of column families</span>
-<span class="source-line-no">1555</span><span id="line-1555">   * @param splitKeys array of split keys</span>
-<span class="source-line-no">1556</span><span id="line-1556">   * @param type      Bloom type</span>
-<span class="source-line-no">1557</span><span id="line-1557">   * @param blockSize block size</span>
-<span class="source-line-no">1558</span><span id="line-1558">   * @param c         Configuration to use</span>
-<span class="source-line-no">1559</span><span id="line-1559">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1560</span><span id="line-1560">   * @throws IOException if getAdmin or createTable fails</span>
-<span class="source-line-no">1561</span><span id="line-1561">   */</span>
-<span class="source-line-no">1562</span><span id="line-1562"></span>
-<span class="source-line-no">1563</span><span id="line-1563">  public Table createTable(TableDescriptor htd, byte[][] families, byte[][] splitKeys,</span>
-<span class="source-line-no">1564</span><span id="line-1564">    BloomType type, int blockSize, Configuration c) throws IOException {</span>
-<span class="source-line-no">1565</span><span id="line-1565">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(htd);</span>
-<span class="source-line-no">1566</span><span id="line-1566">    for (byte[] family : families) {</span>
-<span class="source-line-no">1567</span><span id="line-1567">      ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(family)</span>
-<span class="source-line-no">1568</span><span id="line-1568">        .setBloomFilterType(type).setBlocksize(blockSize);</span>
-<span class="source-line-no">1569</span><span id="line-1569">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1570</span><span id="line-1570">        cfdb.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1571</span><span id="line-1571">      }</span>
-<span class="source-line-no">1572</span><span id="line-1572">      builder.setColumnFamily(cfdb.build());</span>
-<span class="source-line-no">1573</span><span id="line-1573">    }</span>
-<span class="source-line-no">1574</span><span id="line-1574">    TableDescriptor td = builder.build();</span>
-<span class="source-line-no">1575</span><span id="line-1575">    if (splitKeys != null) {</span>
-<span class="source-line-no">1576</span><span id="line-1576">      getAdmin().createTable(td, splitKeys);</span>
-<span class="source-line-no">1577</span><span id="line-1577">    } else {</span>
-<span class="source-line-no">1578</span><span id="line-1578">      getAdmin().createTable(td);</span>
-<span class="source-line-no">1579</span><span id="line-1579">    }</span>
-<span class="source-line-no">1580</span><span id="line-1580">    // HBaseAdmin only waits for regions to appear in hbase:meta</span>
-<span class="source-line-no">1581</span><span id="line-1581">    // we should wait until they are assigned</span>
-<span class="source-line-no">1582</span><span id="line-1582">    waitUntilAllRegionsAssigned(td.getTableName());</span>
-<span class="source-line-no">1583</span><span id="line-1583">    return getConnection().getTable(td.getTableName());</span>
-<span class="source-line-no">1584</span><span id="line-1584">  }</span>
-<span class="source-line-no">1585</span><span id="line-1585"></span>
-<span class="source-line-no">1586</span><span id="line-1586">  /**</span>
-<span class="source-line-no">1587</span><span id="line-1587">   * Create a table.</span>
-<span class="source-line-no">1588</span><span id="line-1588">   * @param htd       table descriptor</span>
-<span class="source-line-no">1589</span><span id="line-1589">   * @param splitRows array of split keys</span>
-<span class="source-line-no">1590</span><span id="line-1590">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1591</span><span id="line-1591">   */</span>
-<span class="source-line-no">1592</span><span id="line-1592">  public Table createTable(TableDescriptor htd, byte[][] splitRows) throws IOException {</span>
-<span class="source-line-no">1593</span><span id="line-1593">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(htd);</span>
-<span class="source-line-no">1594</span><span id="line-1594">    if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1595</span><span id="line-1595">      for (ColumnFamilyDescriptor family : htd.getColumnFamilies()) {</span>
-<span class="source-line-no">1596</span><span id="line-1596">        builder.setColumnFamily(</span>
-<span class="source-line-no">1597</span><span id="line-1597">          ColumnFamilyDescriptorBuilder.newBuilder(family).setNewVersionBehavior(true).build());</span>
-<span class="source-line-no">1598</span><span id="line-1598">      }</span>
-<span class="source-line-no">1599</span><span id="line-1599">    }</span>
-<span class="source-line-no">1600</span><span id="line-1600">    if (splitRows != null) {</span>
-<span class="source-line-no">1601</span><span id="line-1601">      getAdmin().createTable(builder.build(), splitRows);</span>
-<span class="source-line-no">1602</span><span id="line-1602">    } else {</span>
-<span class="source-line-no">1603</span><span id="line-1603">      getAdmin().createTable(builder.build());</span>
-<span class="source-line-no">1604</span><span id="line-1604">    }</span>
-<span class="source-line-no">1605</span><span id="line-1605">    // HBaseAdmin only waits for regions to appear in hbase:meta</span>
-<span class="source-line-no">1606</span><span id="line-1606">    // we should wait until they are assigned</span>
-<span class="source-line-no">1607</span><span id="line-1607">    waitUntilAllRegionsAssigned(htd.getTableName());</span>
-<span class="source-line-no">1608</span><span id="line-1608">    return getConnection().getTable(htd.getTableName());</span>
-<span class="source-line-no">1609</span><span id="line-1609">  }</span>
-<span class="source-line-no">1610</span><span id="line-1610"></span>
-<span class="source-line-no">1611</span><span id="line-1611">  /**</span>
-<span class="source-line-no">1612</span><span id="line-1612">   * Create a table.</span>
-<span class="source-line-no">1613</span><span id="line-1613">   * @param tableName    the table name</span>
-<span class="source-line-no">1614</span><span id="line-1614">   * @param families     the families</span>
-<span class="source-line-no">1615</span><span id="line-1615">   * @param splitKeys    the split keys</span>
-<span class="source-line-no">1616</span><span id="line-1616">   * @param replicaCount the replica count</span>
-<span class="source-line-no">1617</span><span id="line-1617">   * @param c            Configuration to use</span>
-<span class="source-line-no">1618</span><span id="line-1618">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1619</span><span id="line-1619">   */</span>
-<span class="source-line-no">1620</span><span id="line-1620">  public Table createTable(TableName tableName, byte[][] families, byte[][] splitKeys,</span>
-<span class="source-line-no">1621</span><span id="line-1621">    int replicaCount, final Configuration c) throws IOException {</span>
-<span class="source-line-no">1622</span><span id="line-1622">    TableDescriptor htd =</span>
-<span class="source-line-no">1623</span><span id="line-1623">      TableDescriptorBuilder.newBuilder(tableName).setRegionReplication(replicaCount).build();</span>
-<span class="source-line-no">1624</span><span id="line-1624">    return createTable(htd, families, splitKeys, c);</span>
-<span class="source-line-no">1625</span><span id="line-1625">  }</span>
-<span class="source-line-no">1626</span><span id="line-1626"></span>
-<span class="source-line-no">1627</span><span id="line-1627">  /**</span>
-<span class="source-line-no">1628</span><span id="line-1628">   * Create a table.</span>
-<span class="source-line-no">1629</span><span id="line-1629">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1630</span><span id="line-1630">   */</span>
-<span class="source-line-no">1631</span><span id="line-1631">  public Table createTable(TableName tableName, byte[] family, int numVersions) throws IOException {</span>
-<span class="source-line-no">1632</span><span id="line-1632">    return createTable(tableName, new byte[][] { family }, numVersions);</span>
-<span class="source-line-no">1633</span><span id="line-1633">  }</span>
-<span class="source-line-no">1634</span><span id="line-1634"></span>
-<span class="source-line-no">1635</span><span id="line-1635">  /**</span>
-<span class="source-line-no">1636</span><span id="line-1636">   * Create a table.</span>
-<span class="source-line-no">1637</span><span id="line-1637">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1638</span><span id="line-1638">   */</span>
-<span class="source-line-no">1639</span><span id="line-1639">  public Table createTable(TableName tableName, byte[][] families, int numVersions)</span>
-<span class="source-line-no">1640</span><span id="line-1640">    throws IOException {</span>
-<span class="source-line-no">1641</span><span id="line-1641">    return createTable(tableName, families, numVersions, (byte[][]) null);</span>
-<span class="source-line-no">1642</span><span id="line-1642">  }</span>
-<span class="source-line-no">1643</span><span id="line-1643"></span>
-<span class="source-line-no">1644</span><span id="line-1644">  /**</span>
-<span class="source-line-no">1645</span><span id="line-1645">   * Create a table.</span>
-<span class="source-line-no">1646</span><span id="line-1646">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1647</span><span id="line-1647">   */</span>
-<span class="source-line-no">1648</span><span id="line-1648">  public Table createTable(TableName tableName, byte[][] families, int numVersions,</span>
-<span class="source-line-no">1649</span><span id="line-1649">    byte[][] splitKeys) throws IOException {</span>
-<span class="source-line-no">1650</span><span id="line-1650">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1651</span><span id="line-1651">    for (byte[] family : families) {</span>
-<span class="source-line-no">1652</span><span id="line-1652">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">1653</span><span id="line-1653">        ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(numVersions);</span>
-<span class="source-line-no">1654</span><span id="line-1654">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1655</span><span id="line-1655">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1656</span><span id="line-1656">      }</span>
-<span class="source-line-no">1657</span><span id="line-1657">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1658</span><span id="line-1658">    }</span>
-<span class="source-line-no">1659</span><span id="line-1659">    if (splitKeys != null) {</span>
-<span class="source-line-no">1660</span><span id="line-1660">      getAdmin().createTable(builder.build(), splitKeys);</span>
-<span class="source-line-no">1661</span><span id="line-1661">    } else {</span>
-<span class="source-line-no">1662</span><span id="line-1662">      getAdmin().createTable(builder.build());</span>
-<span class="source-line-no">1663</span><span id="line-1663">    }</span>
-<span class="source-line-no">1664</span><span id="line-1664">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
-<span class="source-line-no">1665</span><span id="line-1665">    // assigned</span>
-<span class="source-line-no">1666</span><span id="line-1666">    waitUntilAllRegionsAssigned(tableName);</span>
-<span class="source-line-no">1667</span><span id="line-1667">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">1668</span><span id="line-1668">  }</span>
-<span class="source-line-no">1669</span><span id="line-1669"></span>
-<span class="source-line-no">1670</span><span id="line-1670">  /**</span>
-<span class="source-line-no">1671</span><span id="line-1671">   * Create a table with multiple regions.</span>
-<span class="source-line-no">1672</span><span id="line-1672">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1673</span><span id="line-1673">   */</span>
-<span class="source-line-no">1674</span><span id="line-1674">  public Table createMultiRegionTable(TableName tableName, byte[][] families, int numVersions)</span>
-<span class="source-line-no">1675</span><span id="line-1675">    throws IOException {</span>
-<span class="source-line-no">1676</span><span id="line-1676">    return createTable(tableName, families, numVersions, KEYS_FOR_HBA_CREATE_TABLE);</span>
-<span class="source-line-no">1677</span><span id="line-1677">  }</span>
-<span class="source-line-no">1678</span><span id="line-1678"></span>
-<span class="source-line-no">1679</span><span id="line-1679">  /**</span>
-<span class="source-line-no">1680</span><span id="line-1680">   * Create a table.</span>
-<span class="source-line-no">1681</span><span id="line-1681">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1682</span><span id="line-1682">   */</span>
-<span class="source-line-no">1683</span><span id="line-1683">  public Table createTable(TableName tableName, byte[][] families, int numVersions, int blockSize)</span>
-<span class="source-line-no">1684</span><span id="line-1684">    throws IOException {</span>
-<span class="source-line-no">1685</span><span id="line-1685">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1686</span><span id="line-1686">    for (byte[] family : families) {</span>
-<span class="source-line-no">1687</span><span id="line-1687">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family)</span>
-<span class="source-line-no">1688</span><span id="line-1688">        .setMaxVersions(numVersions).setBlocksize(blockSize);</span>
-<span class="source-line-no">1689</span><span id="line-1689">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1690</span><span id="line-1690">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1691</span><span id="line-1691">      }</span>
-<span class="source-line-no">1692</span><span id="line-1692">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1693</span><span id="line-1693">    }</span>
-<span class="source-line-no">1694</span><span id="line-1694">    getAdmin().createTable(builder.build());</span>
-<span class="source-line-no">1695</span><span id="line-1695">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
-<span class="source-line-no">1696</span><span id="line-1696">    // assigned</span>
-<span class="source-line-no">1697</span><span id="line-1697">    waitUntilAllRegionsAssigned(tableName);</span>
-<span class="source-line-no">1698</span><span id="line-1698">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">1699</span><span id="line-1699">  }</span>
-<span class="source-line-no">1700</span><span id="line-1700"></span>
-<span class="source-line-no">1701</span><span id="line-1701">  public Table createTable(TableName tableName, byte[][] families, int numVersions, int blockSize,</span>
-<span class="source-line-no">1702</span><span id="line-1702">    String cpName) throws IOException {</span>
-<span class="source-line-no">1703</span><span id="line-1703">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1704</span><span id="line-1704">    for (byte[] family : families) {</span>
-<span class="source-line-no">1705</span><span id="line-1705">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family)</span>
-<span class="source-line-no">1706</span><span id="line-1706">        .setMaxVersions(numVersions).setBlocksize(blockSize);</span>
-<span class="source-line-no">1707</span><span id="line-1707">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1708</span><span id="line-1708">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1709</span><span id="line-1709">      }</span>
-<span class="source-line-no">1710</span><span id="line-1710">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1711</span><span id="line-1711">    }</span>
-<span class="source-line-no">1712</span><span id="line-1712">    if (cpName != null) {</span>
-<span class="source-line-no">1713</span><span id="line-1713">      builder.setCoprocessor(cpName);</span>
-<span class="source-line-no">1714</span><span id="line-1714">    }</span>
-<span class="source-line-no">1715</span><span id="line-1715">    getAdmin().createTable(builder.build());</span>
-<span class="source-line-no">1716</span><span id="line-1716">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
-<span class="source-line-no">1717</span><span id="line-1717">    // assigned</span>
-<span class="source-line-no">1718</span><span id="line-1718">    waitUntilAllRegionsAssigned(tableName);</span>
-<span class="source-line-no">1719</span><span id="line-1719">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">1720</span><span id="line-1720">  }</span>
-<span class="source-line-no">1721</span><span id="line-1721"></span>
-<span class="source-line-no">1722</span><span id="line-1722">  /**</span>
-<span class="source-line-no">1723</span><span id="line-1723">   * Create a table.</span>
-<span class="source-line-no">1724</span><span id="line-1724">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1725</span><span id="line-1725">   */</span>
-<span class="source-line-no">1726</span><span id="line-1726">  public Table createTable(TableName tableName, byte[][] families, int[] numVersions)</span>
-<span class="source-line-no">1727</span><span id="line-1727">    throws IOException {</span>
-<span class="source-line-no">1728</span><span id="line-1728">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1729</span><span id="line-1729">    int i = 0;</span>
-<span class="source-line-no">1730</span><span id="line-1730">    for (byte[] family : families) {</span>
-<span class="source-line-no">1731</span><span id="line-1731">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">1732</span><span id="line-1732">        ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(numVersions[i]);</span>
-<span class="source-line-no">1733</span><span id="line-1733">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1734</span><span id="line-1734">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1735</span><span id="line-1735">      }</span>
-<span class="source-line-no">1736</span><span id="line-1736">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1737</span><span id="line-1737">      i++;</span>
-<span class="source-line-no">1738</span><span id="line-1738">    }</span>
-<span class="source-line-no">1739</span><span id="line-1739">    getAdmin().createTable(builder.build());</span>
-<span class="source-line-no">1740</span><span id="line-1740">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
-<span class="source-line-no">1741</span><span id="line-1741">    // assigned</span>
-<span class="source-line-no">1742</span><span id="line-1742">    waitUntilAllRegionsAssigned(tableName);</span>
-<span class="source-line-no">1743</span><span id="line-1743">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">1744</span><span id="line-1744">  }</span>
-<span class="source-line-no">1745</span><span id="line-1745"></span>
-<span class="source-line-no">1746</span><span id="line-1746">  /**</span>
-<span class="source-line-no">1747</span><span id="line-1747">   * Create a table.</span>
-<span class="source-line-no">1748</span><span id="line-1748">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1749</span><span id="line-1749">   */</span>
-<span class="source-line-no">1750</span><span id="line-1750">  public Table createTable(TableName tableName, byte[] family, byte[][] splitRows)</span>
-<span class="source-line-no">1751</span><span id="line-1751">    throws IOException {</span>
-<span class="source-line-no">1752</span><span id="line-1752">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1753</span><span id="line-1753">    ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family);</span>
-<span class="source-line-no">1754</span><span id="line-1754">    if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1755</span><span id="line-1755">      cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1756</span><span id="line-1756">    }</span>
-<span class="source-line-no">1757</span><span id="line-1757">    builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1758</span><span id="line-1758">    getAdmin().createTable(builder.build(), splitRows);</span>
-<span class="source-line-no">1759</span><span id="line-1759">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
-<span class="source-line-no">1760</span><span id="line-1760">    // assigned</span>
-<span class="source-line-no">1761</span><span id="line-1761">    waitUntilAllRegionsAssigned(tableName);</span>
-<span class="source-line-no">1762</span><span id="line-1762">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">1763</span><span id="line-1763">  }</span>
-<span class="source-line-no">1764</span><span id="line-1764"></span>
-<span class="source-line-no">1765</span><span id="line-1765">  /**</span>
-<span class="source-line-no">1766</span><span id="line-1766">   * Create a table with multiple regions.</span>
-<span class="source-line-no">1767</span><span id="line-1767">   * @return A Table instance for the created table.</span>
-<span class="source-line-no">1768</span><span id="line-1768">   */</span>
-<span class="source-line-no">1769</span><span id="line-1769">  public Table createMultiRegionTable(TableName tableName, byte[] family) throws IOException {</span>
-<span class="source-line-no">1770</span><span id="line-1770">    return createTable(tableName, family, KEYS_FOR_HBA_CREATE_TABLE);</span>
-<span class="source-line-no">1771</span><span id="line-1771">  }</span>
-<span class="source-line-no">1772</span><span id="line-1772"></span>
-<span class="source-line-no">1773</span><span id="line-1773">  /**</span>
-<span class="source-line-no">1774</span><span id="line-1774">   * Modify a table, synchronous.</span>
-<span class="source-line-no">1775</span><span id="line-1775">   * @deprecated since 3.0.0 and will be removed in 4.0.0. Just use</span>
-<span class="source-line-no">1776</span><span id="line-1776">   *             {@link Admin#modifyTable(TableDescriptor)} directly as it is synchronous now.</span>
-<span class="source-line-no">1777</span><span id="line-1777">   * @see Admin#modifyTable(TableDescriptor)</span>
-<span class="source-line-no">1778</span><span id="line-1778">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-22002"&gt;HBASE-22002&lt;/a&gt;</span>
-<span class="source-line-no">1779</span><span id="line-1779">   */</span>
-<span class="source-line-no">1780</span><span id="line-1780">  @Deprecated</span>
-<span class="source-line-no">1781</span><span id="line-1781">  public static void modifyTableSync(Admin admin, TableDescriptor desc)</span>
-<span class="source-line-no">1782</span><span id="line-1782">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">1783</span><span id="line-1783">    admin.modifyTable(desc);</span>
+<span class="source-line-no">1541</span><span id="line-1541">   */</span>
+<span class="source-line-no">1542</span><span id="line-1542">  public Table createTable(TableDescriptor htd, byte[][] families, Configuration c)</span>
+<span class="source-line-no">1543</span><span id="line-1543">    throws IOException {</span>
+<span class="source-line-no">1544</span><span id="line-1544">    return createTable(htd, families, null, c);</span>
+<span class="source-line-no">1545</span><span id="line-1545">  }</span>
+<span class="source-line-no">1546</span><span id="line-1546"></span>
+<span class="source-line-no">1547</span><span id="line-1547">  /**</span>
+<span class="source-line-no">1548</span><span id="line-1548">   * Create a table.</span>
+<span class="source-line-no">1549</span><span id="line-1549">   * @param htd       table descriptor</span>
+<span class="source-line-no">1550</span><span id="line-1550">   * @param families  array of column families</span>
+<span class="source-line-no">1551</span><span id="line-1551">   * @param splitKeys array of split keys</span>
+<span class="source-line-no">1552</span><span id="line-1552">   * @param c         Configuration to use</span>
+<span class="source-line-no">1553</span><span id="line-1553">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1554</span><span id="line-1554">   * @throws IOException if getAdmin or createTable fails</span>
+<span class="source-line-no">1555</span><span id="line-1555">   */</span>
+<span class="source-line-no">1556</span><span id="line-1556">  public Table createTable(TableDescriptor htd, byte[][] families, byte[][] splitKeys,</span>
+<span class="source-line-no">1557</span><span id="line-1557">    Configuration c) throws IOException {</span>
+<span class="source-line-no">1558</span><span id="line-1558">    // Disable blooms (they are on by default as of 0.95) but we disable them here because</span>
+<span class="source-line-no">1559</span><span id="line-1559">    // tests have hard coded counts of what to expect in block cache, etc., and blooms being</span>
+<span class="source-line-no">1560</span><span id="line-1560">    // on is interfering.</span>
+<span class="source-line-no">1561</span><span id="line-1561">    return createTable(htd, families, splitKeys, BloomType.NONE, HConstants.DEFAULT_BLOCKSIZE, c);</span>
+<span class="source-line-no">1562</span><span id="line-1562">  }</span>
+<span class="source-line-no">1563</span><span id="line-1563"></span>
+<span class="source-line-no">1564</span><span id="line-1564">  /**</span>
+<span class="source-line-no">1565</span><span id="line-1565">   * Create a table.</span>
+<span class="source-line-no">1566</span><span id="line-1566">   * @param htd       table descriptor</span>
+<span class="source-line-no">1567</span><span id="line-1567">   * @param families  array of column families</span>
+<span class="source-line-no">1568</span><span id="line-1568">   * @param splitKeys array of split keys</span>
+<span class="source-line-no">1569</span><span id="line-1569">   * @param type      Bloom type</span>
+<span class="source-line-no">1570</span><span id="line-1570">   * @param blockSize block size</span>
+<span class="source-line-no">1571</span><span id="line-1571">   * @param c         Configuration to use</span>
+<span class="source-line-no">1572</span><span id="line-1572">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1573</span><span id="line-1573">   * @throws IOException if getAdmin or createTable fails</span>
+<span class="source-line-no">1574</span><span id="line-1574">   */</span>
+<span class="source-line-no">1575</span><span id="line-1575"></span>
+<span class="source-line-no">1576</span><span id="line-1576">  public Table createTable(TableDescriptor htd, byte[][] families, byte[][] splitKeys,</span>
+<span class="source-line-no">1577</span><span id="line-1577">    BloomType type, int blockSize, Configuration c) throws IOException {</span>
+<span class="source-line-no">1578</span><span id="line-1578">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(htd);</span>
+<span class="source-line-no">1579</span><span id="line-1579">    for (byte[] family : families) {</span>
+<span class="source-line-no">1580</span><span id="line-1580">      ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(family)</span>
+<span class="source-line-no">1581</span><span id="line-1581">        .setBloomFilterType(type).setBlocksize(blockSize);</span>
+<span class="source-line-no">1582</span><span id="line-1582">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1583</span><span id="line-1583">        cfdb.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1584</span><span id="line-1584">      }</span>
+<span class="source-line-no">1585</span><span id="line-1585">      builder.setColumnFamily(cfdb.build());</span>
+<span class="source-line-no">1586</span><span id="line-1586">    }</span>
+<span class="source-line-no">1587</span><span id="line-1587">    TableDescriptor td = builder.build();</span>
+<span class="source-line-no">1588</span><span id="line-1588">    if (splitKeys != null) {</span>
+<span class="source-line-no">1589</span><span id="line-1589">      getAdmin().createTable(td, splitKeys);</span>
+<span class="source-line-no">1590</span><span id="line-1590">    } else {</span>
+<span class="source-line-no">1591</span><span id="line-1591">      getAdmin().createTable(td);</span>
+<span class="source-line-no">1592</span><span id="line-1592">    }</span>
+<span class="source-line-no">1593</span><span id="line-1593">    // HBaseAdmin only waits for regions to appear in hbase:meta</span>
+<span class="source-line-no">1594</span><span id="line-1594">    // we should wait until they are assigned</span>
+<span class="source-line-no">1595</span><span id="line-1595">    waitUntilAllRegionsAssigned(td.getTableName());</span>
+<span class="source-line-no">1596</span><span id="line-1596">    return getConnection().getTable(td.getTableName());</span>
+<span class="source-line-no">1597</span><span id="line-1597">  }</span>
+<span class="source-line-no">1598</span><span id="line-1598"></span>
+<span class="source-line-no">1599</span><span id="line-1599">  /**</span>
+<span class="source-line-no">1600</span><span id="line-1600">   * Create a table.</span>
+<span class="source-line-no">1601</span><span id="line-1601">   * @param htd       table descriptor</span>
+<span class="source-line-no">1602</span><span id="line-1602">   * @param splitRows array of split keys</span>
+<span class="source-line-no">1603</span><span id="line-1603">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1604</span><span id="line-1604">   */</span>
+<span class="source-line-no">1605</span><span id="line-1605">  public Table createTable(TableDescriptor htd, byte[][] splitRows) throws IOException {</span>
+<span class="source-line-no">1606</span><span id="line-1606">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(htd);</span>
+<span class="source-line-no">1607</span><span id="line-1607">    if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1608</span><span id="line-1608">      for (ColumnFamilyDescriptor family : htd.getColumnFamilies()) {</span>
+<span class="source-line-no">1609</span><span id="line-1609">        builder.setColumnFamily(</span>
+<span class="source-line-no">1610</span><span id="line-1610">          ColumnFamilyDescriptorBuilder.newBuilder(family).setNewVersionBehavior(true).build());</span>
+<span class="source-line-no">1611</span><span id="line-1611">      }</span>
+<span class="source-line-no">1612</span><span id="line-1612">    }</span>
+<span class="source-line-no">1613</span><span id="line-1613">    if (splitRows != null) {</span>
+<span class="source-line-no">1614</span><span id="line-1614">      getAdmin().createTable(builder.build(), splitRows);</span>
+<span class="source-line-no">1615</span><span id="line-1615">    } else {</span>
+<span class="source-line-no">1616</span><span id="line-1616">      getAdmin().createTable(builder.build());</span>
+<span class="source-line-no">1617</span><span id="line-1617">    }</span>
+<span class="source-line-no">1618</span><span id="line-1618">    // HBaseAdmin only waits for regions to appear in hbase:meta</span>
+<span class="source-line-no">1619</span><span id="line-1619">    // we should wait until they are assigned</span>
+<span class="source-line-no">1620</span><span id="line-1620">    waitUntilAllRegionsAssigned(htd.getTableName());</span>
+<span class="source-line-no">1621</span><span id="line-1621">    return getConnection().getTable(htd.getTableName());</span>
+<span class="source-line-no">1622</span><span id="line-1622">  }</span>
+<span class="source-line-no">1623</span><span id="line-1623"></span>
+<span class="source-line-no">1624</span><span id="line-1624">  /**</span>
+<span class="source-line-no">1625</span><span id="line-1625">   * Create a table.</span>
+<span class="source-line-no">1626</span><span id="line-1626">   * @param tableName    the table name</span>
+<span class="source-line-no">1627</span><span id="line-1627">   * @param families     the families</span>
+<span class="source-line-no">1628</span><span id="line-1628">   * @param splitKeys    the split keys</span>
+<span class="source-line-no">1629</span><span id="line-1629">   * @param replicaCount the replica count</span>
+<span class="source-line-no">1630</span><span id="line-1630">   * @param c            Configuration to use</span>
+<span class="source-line-no">1631</span><span id="line-1631">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1632</span><span id="line-1632">   */</span>
+<span class="source-line-no">1633</span><span id="line-1633">  public Table createTable(TableName tableName, byte[][] families, byte[][] splitKeys,</span>
+<span class="source-line-no">1634</span><span id="line-1634">    int replicaCount, final Configuration c) throws IOException {</span>
+<span class="source-line-no">1635</span><span id="line-1635">    TableDescriptor htd =</span>
+<span class="source-line-no">1636</span><span id="line-1636">      TableDescriptorBuilder.newBuilder(tableName).setRegionReplication(replicaCount).build();</span>
+<span class="source-line-no">1637</span><span id="line-1637">    return createTable(htd, families, splitKeys, c);</span>
+<span class="source-line-no">1638</span><span id="line-1638">  }</span>
+<span class="source-line-no">1639</span><span id="line-1639"></span>
+<span class="source-line-no">1640</span><span id="line-1640">  /**</span>
+<span class="source-line-no">1641</span><span id="line-1641">   * Create a table.</span>
+<span class="source-line-no">1642</span><span id="line-1642">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1643</span><span id="line-1643">   */</span>
+<span class="source-line-no">1644</span><span id="line-1644">  public Table createTable(TableName tableName, byte[] family, int numVersions) throws IOException {</span>
+<span class="source-line-no">1645</span><span id="line-1645">    return createTable(tableName, new byte[][] { family }, numVersions);</span>
+<span class="source-line-no">1646</span><span id="line-1646">  }</span>
+<span class="source-line-no">1647</span><span id="line-1647"></span>
+<span class="source-line-no">1648</span><span id="line-1648">  /**</span>
+<span class="source-line-no">1649</span><span id="line-1649">   * Create a table.</span>
+<span class="source-line-no">1650</span><span id="line-1650">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1651</span><span id="line-1651">   */</span>
+<span class="source-line-no">1652</span><span id="line-1652">  public Table createTable(TableName tableName, byte[][] families, int numVersions)</span>
+<span class="source-line-no">1653</span><span id="line-1653">    throws IOException {</span>
+<span class="source-line-no">1654</span><span id="line-1654">    return createTable(tableName, families, numVersions, (byte[][]) null);</span>
+<span class="source-line-no">1655</span><span id="line-1655">  }</span>
+<span class="source-line-no">1656</span><span id="line-1656"></span>
+<span class="source-line-no">1657</span><span id="line-1657">  /**</span>
+<span class="source-line-no">1658</span><span id="line-1658">   * Create a table.</span>
+<span class="source-line-no">1659</span><span id="line-1659">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1660</span><span id="line-1660">   */</span>
+<span class="source-line-no">1661</span><span id="line-1661">  public Table createTable(TableName tableName, byte[][] families, int numVersions,</span>
+<span class="source-line-no">1662</span><span id="line-1662">    byte[][] splitKeys) throws IOException {</span>
+<span class="source-line-no">1663</span><span id="line-1663">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1664</span><span id="line-1664">    for (byte[] family : families) {</span>
+<span class="source-line-no">1665</span><span id="line-1665">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">1666</span><span id="line-1666">        ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(numVersions);</span>
+<span class="source-line-no">1667</span><span id="line-1667">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1668</span><span id="line-1668">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1669</span><span id="line-1669">      }</span>
+<span class="source-line-no">1670</span><span id="line-1670">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1671</span><span id="line-1671">    }</span>
+<span class="source-line-no">1672</span><span id="line-1672">    if (splitKeys != null) {</span>
+<span class="source-line-no">1673</span><span id="line-1673">      getAdmin().createTable(builder.build(), splitKeys);</span>
+<span class="source-line-no">1674</span><span id="line-1674">    } else {</span>
+<span class="source-line-no">1675</span><span id="line-1675">      getAdmin().createTable(builder.build());</span>
+<span class="source-line-no">1676</span><span id="line-1676">    }</span>
+<span class="source-line-no">1677</span><span id="line-1677">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
+<span class="source-line-no">1678</span><span id="line-1678">    // assigned</span>
+<span class="source-line-no">1679</span><span id="line-1679">    waitUntilAllRegionsAssigned(tableName);</span>
+<span class="source-line-no">1680</span><span id="line-1680">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">1681</span><span id="line-1681">  }</span>
+<span class="source-line-no">1682</span><span id="line-1682"></span>
+<span class="source-line-no">1683</span><span id="line-1683">  /**</span>
+<span class="source-line-no">1684</span><span id="line-1684">   * Create a table with multiple regions.</span>
+<span class="source-line-no">1685</span><span id="line-1685">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1686</span><span id="line-1686">   */</span>
+<span class="source-line-no">1687</span><span id="line-1687">  public Table createMultiRegionTable(TableName tableName, byte[][] families, int numVersions)</span>
+<span class="source-line-no">1688</span><span id="line-1688">    throws IOException {</span>
+<span class="source-line-no">1689</span><span id="line-1689">    return createTable(tableName, families, numVersions, KEYS_FOR_HBA_CREATE_TABLE);</span>
+<span class="source-line-no">1690</span><span id="line-1690">  }</span>
+<span class="source-line-no">1691</span><span id="line-1691"></span>
+<span class="source-line-no">1692</span><span id="line-1692">  /**</span>
+<span class="source-line-no">1693</span><span id="line-1693">   * Create a table.</span>
+<span class="source-line-no">1694</span><span id="line-1694">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1695</span><span id="line-1695">   */</span>
+<span class="source-line-no">1696</span><span id="line-1696">  public Table createTable(TableName tableName, byte[][] families, int numVersions, int blockSize)</span>
+<span class="source-line-no">1697</span><span id="line-1697">    throws IOException {</span>
+<span class="source-line-no">1698</span><span id="line-1698">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1699</span><span id="line-1699">    for (byte[] family : families) {</span>
+<span class="source-line-no">1700</span><span id="line-1700">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family)</span>
+<span class="source-line-no">1701</span><span id="line-1701">        .setMaxVersions(numVersions).setBlocksize(blockSize);</span>
+<span class="source-line-no">1702</span><span id="line-1702">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1703</span><span id="line-1703">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1704</span><span id="line-1704">      }</span>
+<span class="source-line-no">1705</span><span id="line-1705">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1706</span><span id="line-1706">    }</span>
+<span class="source-line-no">1707</span><span id="line-1707">    getAdmin().createTable(builder.build());</span>
+<span class="source-line-no">1708</span><span id="line-1708">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
+<span class="source-line-no">1709</span><span id="line-1709">    // assigned</span>
+<span class="source-line-no">1710</span><span id="line-1710">    waitUntilAllRegionsAssigned(tableName);</span>
+<span class="source-line-no">1711</span><span id="line-1711">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">1712</span><span id="line-1712">  }</span>
+<span class="source-line-no">1713</span><span id="line-1713"></span>
+<span class="source-line-no">1714</span><span id="line-1714">  public Table createTable(TableName tableName, byte[][] families, int numVersions, int blockSize,</span>
+<span class="source-line-no">1715</span><span id="line-1715">    String cpName) throws IOException {</span>
+<span class="source-line-no">1716</span><span id="line-1716">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1717</span><span id="line-1717">    for (byte[] family : families) {</span>
+<span class="source-line-no">1718</span><span id="line-1718">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family)</span>
+<span class="source-line-no">1719</span><span id="line-1719">        .setMaxVersions(numVersions).setBlocksize(blockSize);</span>
+<span class="source-line-no">1720</span><span id="line-1720">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1721</span><span id="line-1721">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1722</span><span id="line-1722">      }</span>
+<span class="source-line-no">1723</span><span id="line-1723">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1724</span><span id="line-1724">    }</span>
+<span class="source-line-no">1725</span><span id="line-1725">    if (cpName != null) {</span>
+<span class="source-line-no">1726</span><span id="line-1726">      builder.setCoprocessor(cpName);</span>
+<span class="source-line-no">1727</span><span id="line-1727">    }</span>
+<span class="source-line-no">1728</span><span id="line-1728">    getAdmin().createTable(builder.build());</span>
+<span class="source-line-no">1729</span><span id="line-1729">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
+<span class="source-line-no">1730</span><span id="line-1730">    // assigned</span>
+<span class="source-line-no">1731</span><span id="line-1731">    waitUntilAllRegionsAssigned(tableName);</span>
+<span class="source-line-no">1732</span><span id="line-1732">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">1733</span><span id="line-1733">  }</span>
+<span class="source-line-no">1734</span><span id="line-1734"></span>
+<span class="source-line-no">1735</span><span id="line-1735">  /**</span>
+<span class="source-line-no">1736</span><span id="line-1736">   * Create a table.</span>
+<span class="source-line-no">1737</span><span id="line-1737">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1738</span><span id="line-1738">   */</span>
+<span class="source-line-no">1739</span><span id="line-1739">  public Table createTable(TableName tableName, byte[][] families, int[] numVersions)</span>
+<span class="source-line-no">1740</span><span id="line-1740">    throws IOException {</span>
+<span class="source-line-no">1741</span><span id="line-1741">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1742</span><span id="line-1742">    int i = 0;</span>
+<span class="source-line-no">1743</span><span id="line-1743">    for (byte[] family : families) {</span>
+<span class="source-line-no">1744</span><span id="line-1744">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">1745</span><span id="line-1745">        ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(numVersions[i]);</span>
+<span class="source-line-no">1746</span><span id="line-1746">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1747</span><span id="line-1747">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1748</span><span id="line-1748">      }</span>
+<span class="source-line-no">1749</span><span id="line-1749">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1750</span><span id="line-1750">      i++;</span>
+<span class="source-line-no">1751</span><span id="line-1751">    }</span>
+<span class="source-line-no">1752</span><span id="line-1752">    getAdmin().createTable(builder.build());</span>
+<span class="source-line-no">1753</span><span id="line-1753">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
+<span class="source-line-no">1754</span><span id="line-1754">    // assigned</span>
+<span class="source-line-no">1755</span><span id="line-1755">    waitUntilAllRegionsAssigned(tableName);</span>
+<span class="source-line-no">1756</span><span id="line-1756">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">1757</span><span id="line-1757">  }</span>
+<span class="source-line-no">1758</span><span id="line-1758"></span>
+<span class="source-line-no">1759</span><span id="line-1759">  /**</span>
+<span class="source-line-no">1760</span><span id="line-1760">   * Create a table.</span>
+<span class="source-line-no">1761</span><span id="line-1761">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1762</span><span id="line-1762">   */</span>
+<span class="source-line-no">1763</span><span id="line-1763">  public Table createTable(TableName tableName, byte[] family, byte[][] splitRows)</span>
+<span class="source-line-no">1764</span><span id="line-1764">    throws IOException {</span>
+<span class="source-line-no">1765</span><span id="line-1765">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1766</span><span id="line-1766">    ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family);</span>
+<span class="source-line-no">1767</span><span id="line-1767">    if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1768</span><span id="line-1768">      cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1769</span><span id="line-1769">    }</span>
+<span class="source-line-no">1770</span><span id="line-1770">    builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1771</span><span id="line-1771">    getAdmin().createTable(builder.build(), splitRows);</span>
+<span class="source-line-no">1772</span><span id="line-1772">    // HBaseAdmin only waits for regions to appear in hbase:meta we should wait until they are</span>
+<span class="source-line-no">1773</span><span id="line-1773">    // assigned</span>
+<span class="source-line-no">1774</span><span id="line-1774">    waitUntilAllRegionsAssigned(tableName);</span>
+<span class="source-line-no">1775</span><span id="line-1775">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">1776</span><span id="line-1776">  }</span>
+<span class="source-line-no">1777</span><span id="line-1777"></span>
+<span class="source-line-no">1778</span><span id="line-1778">  /**</span>
+<span class="source-line-no">1779</span><span id="line-1779">   * Create a table with multiple regions.</span>
+<span class="source-line-no">1780</span><span id="line-1780">   * @return A Table instance for the created table.</span>
+<span class="source-line-no">1781</span><span id="line-1781">   */</span>
+<span class="source-line-no">1782</span><span id="line-1782">  public Table createMultiRegionTable(TableName tableName, byte[] family) throws IOException {</span>
+<span class="source-line-no">1783</span><span id="line-1783">    return createTable(tableName, family, KEYS_FOR_HBA_CREATE_TABLE);</span>
 <span class="source-line-no">1784</span><span id="line-1784">  }</span>
 <span class="source-line-no">1785</span><span id="line-1785"></span>
 <span class="source-line-no">1786</span><span id="line-1786">  /**</span>
-<span class="source-line-no">1787</span><span id="line-1787">   * Set the number of Region replicas.</span>
-<span class="source-line-no">1788</span><span id="line-1788">   */</span>
-<span class="source-line-no">1789</span><span id="line-1789">  public static void setReplicas(Admin admin, TableName table, int replicaCount)</span>
-<span class="source-line-no">1790</span><span id="line-1790">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">1791</span><span id="line-1791">    TableDescriptor desc = TableDescriptorBuilder.newBuilder(admin.getDescriptor(table))</span>
-<span class="source-line-no">1792</span><span id="line-1792">      .setRegionReplication(replicaCount).build();</span>
-<span class="source-line-no">1793</span><span id="line-1793">    admin.modifyTable(desc);</span>
-<span class="source-line-no">1794</span><span id="line-1794">  }</span>
-<span class="source-line-no">1795</span><span id="line-1795"></span>
-<span class="source-line-no">1796</span><span id="line-1796">  /**</span>
-<span class="source-line-no">1797</span><span id="line-1797">   * Drop an existing table</span>
-<span class="source-line-no">1798</span><span id="line-1798">   * @param tableName existing table</span>
-<span class="source-line-no">1799</span><span id="line-1799">   */</span>
-<span class="source-line-no">1800</span><span id="line-1800">  public void deleteTable(TableName tableName) throws IOException {</span>
-<span class="source-line-no">1801</span><span id="line-1801">    try {</span>
-<span class="source-line-no">1802</span><span id="line-1802">      getAdmin().disableTable(tableName);</span>
-<span class="source-line-no">1803</span><span id="line-1803">    } catch (TableNotEnabledException e) {</span>
-<span class="source-line-no">1804</span><span id="line-1804">      LOG.debug("Table: " + tableName + " already disabled, so just deleting it.");</span>
-<span class="source-line-no">1805</span><span id="line-1805">    }</span>
-<span class="source-line-no">1806</span><span id="line-1806">    getAdmin().deleteTable(tableName);</span>
+<span class="source-line-no">1787</span><span id="line-1787">   * Modify a table, synchronous.</span>
+<span class="source-line-no">1788</span><span id="line-1788">   * @deprecated since 3.0.0 and will be removed in 4.0.0. Just use</span>
+<span class="source-line-no">1789</span><span id="line-1789">   *             {@link Admin#modifyTable(TableDescriptor)} directly as it is synchronous now.</span>
+<span class="source-line-no">1790</span><span id="line-1790">   * @see Admin#modifyTable(TableDescriptor)</span>
+<span class="source-line-no">1791</span><span id="line-1791">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-22002"&gt;HBASE-22002&lt;/a&gt;</span>
+<span class="source-line-no">1792</span><span id="line-1792">   */</span>
+<span class="source-line-no">1793</span><span id="line-1793">  @Deprecated</span>
+<span class="source-line-no">1794</span><span id="line-1794">  public static void modifyTableSync(Admin admin, TableDescriptor desc)</span>
+<span class="source-line-no">1795</span><span id="line-1795">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">1796</span><span id="line-1796">    admin.modifyTable(desc);</span>
+<span class="source-line-no">1797</span><span id="line-1797">  }</span>
+<span class="source-line-no">1798</span><span id="line-1798"></span>
+<span class="source-line-no">1799</span><span id="line-1799">  /**</span>
+<span class="source-line-no">1800</span><span id="line-1800">   * Set the number of Region replicas.</span>
+<span class="source-line-no">1801</span><span id="line-1801">   */</span>
+<span class="source-line-no">1802</span><span id="line-1802">  public static void setReplicas(Admin admin, TableName table, int replicaCount)</span>
+<span class="source-line-no">1803</span><span id="line-1803">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">1804</span><span id="line-1804">    TableDescriptor desc = TableDescriptorBuilder.newBuilder(admin.getDescriptor(table))</span>
+<span class="source-line-no">1805</span><span id="line-1805">      .setRegionReplication(replicaCount).build();</span>
+<span class="source-line-no">1806</span><span id="line-1806">    admin.modifyTable(desc);</span>
 <span class="source-line-no">1807</span><span id="line-1807">  }</span>
 <span class="source-line-no">1808</span><span id="line-1808"></span>
 <span class="source-line-no">1809</span><span id="line-1809">  /**</span>
 <span class="source-line-no">1810</span><span id="line-1810">   * Drop an existing table</span>
 <span class="source-line-no">1811</span><span id="line-1811">   * @param tableName existing table</span>
 <span class="source-line-no">1812</span><span id="line-1812">   */</span>
-<span class="source-line-no">1813</span><span id="line-1813">  public void deleteTableIfAny(TableName tableName) throws IOException {</span>
+<span class="source-line-no">1813</span><span id="line-1813">  public void deleteTable(TableName tableName) throws IOException {</span>
 <span class="source-line-no">1814</span><span id="line-1814">    try {</span>
-<span class="source-line-no">1815</span><span id="line-1815">      deleteTable(tableName);</span>
-<span class="source-line-no">1816</span><span id="line-1816">    } catch (TableNotFoundException e) {</span>
-<span class="source-line-no">1817</span><span id="line-1817">      // ignore</span>
+<span class="source-line-no">1815</span><span id="line-1815">      getAdmin().disableTable(tableName);</span>
+<span class="source-line-no">1816</span><span id="line-1816">    } catch (TableNotEnabledException e) {</span>
+<span class="source-line-no">1817</span><span id="line-1817">      LOG.debug("Table: " + tableName + " already disabled, so just deleting it.");</span>
 <span class="source-line-no">1818</span><span id="line-1818">    }</span>
-<span class="source-line-no">1819</span><span id="line-1819">  }</span>
-<span class="source-line-no">1820</span><span id="line-1820"></span>
-<span class="source-line-no">1821</span><span id="line-1821">  // ==========================================================================</span>
-<span class="source-line-no">1822</span><span id="line-1822">  // Canned table and table descriptor creation</span>
-<span class="source-line-no">1823</span><span id="line-1823"></span>
-<span class="source-line-no">1824</span><span id="line-1824">  public final static byte[] fam1 = Bytes.toBytes("colfamily11");</span>
-<span class="source-line-no">1825</span><span id="line-1825">  public final static byte[] fam2 = Bytes.toBytes("colfamily21");</span>
-<span class="source-line-no">1826</span><span id="line-1826">  public final static byte[] fam3 = Bytes.toBytes("colfamily31");</span>
-<span class="source-line-no">1827</span><span id="line-1827">  public static final byte[][] COLUMNS = { fam1, fam2, fam3 };</span>
-<span class="source-line-no">1828</span><span id="line-1828">  private static final int MAXVERSIONS = 3;</span>
-<span class="source-line-no">1829</span><span id="line-1829"></span>
-<span class="source-line-no">1830</span><span id="line-1830">  public static final char FIRST_CHAR = 'a';</span>
-<span class="source-line-no">1831</span><span id="line-1831">  public static final char LAST_CHAR = 'z';</span>
-<span class="source-line-no">1832</span><span id="line-1832">  public static final byte[] START_KEY_BYTES = { FIRST_CHAR, FIRST_CHAR, FIRST_CHAR };</span>
-<span class="source-line-no">1833</span><span id="line-1833">  public static final String START_KEY = new String(START_KEY_BYTES, HConstants.UTF8_CHARSET);</span>
-<span class="source-line-no">1834</span><span id="line-1834"></span>
-<span class="source-line-no">1835</span><span id="line-1835">  public TableDescriptorBuilder createModifyableTableDescriptor(final String name) {</span>
-<span class="source-line-no">1836</span><span id="line-1836">    return createModifyableTableDescriptor(TableName.valueOf(name),</span>
-<span class="source-line-no">1837</span><span id="line-1837">      ColumnFamilyDescriptorBuilder.DEFAULT_MIN_VERSIONS, MAXVERSIONS, HConstants.FOREVER,</span>
-<span class="source-line-no">1838</span><span id="line-1838">      ColumnFamilyDescriptorBuilder.DEFAULT_KEEP_DELETED);</span>
-<span class="source-line-no">1839</span><span id="line-1839">  }</span>
-<span class="source-line-no">1840</span><span id="line-1840"></span>
-<span class="source-line-no">1841</span><span id="line-1841">  public TableDescriptor createTableDescriptor(final TableName name, final int minVersions,</span>
-<span class="source-line-no">1842</span><span id="line-1842">    final int versions, final int ttl, KeepDeletedCells keepDeleted) {</span>
-<span class="source-line-no">1843</span><span id="line-1843">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(name);</span>
-<span class="source-line-no">1844</span><span id="line-1844">    for (byte[] cfName : new byte[][] { fam1, fam2, fam3 }) {</span>
-<span class="source-line-no">1845</span><span id="line-1845">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(cfName)</span>
-<span class="source-line-no">1846</span><span id="line-1846">        .setMinVersions(minVersions).setMaxVersions(versions).setKeepDeletedCells(keepDeleted)</span>
-<span class="source-line-no">1847</span><span id="line-1847">        .setBlockCacheEnabled(false).setTimeToLive(ttl);</span>
-<span class="source-line-no">1848</span><span id="line-1848">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1849</span><span id="line-1849">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1850</span><span id="line-1850">      }</span>
-<span class="source-line-no">1851</span><span id="line-1851">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1852</span><span id="line-1852">    }</span>
-<span class="source-line-no">1853</span><span id="line-1853">    return builder.build();</span>
-<span class="source-line-no">1854</span><span id="line-1854">  }</span>
-<span class="source-line-no">1855</span><span id="line-1855"></span>
-<span class="source-line-no">1856</span><span id="line-1856">  public TableDescriptorBuilder createModifyableTableDescriptor(final TableName name,</span>
-<span class="source-line-no">1857</span><span id="line-1857">    final int minVersions, final int versions, final int ttl, KeepDeletedCells keepDeleted) {</span>
-<span class="source-line-no">1858</span><span id="line-1858">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(name);</span>
-<span class="source-line-no">1859</span><span id="line-1859">    for (byte[] cfName : new byte[][] { fam1, fam2, fam3 }) {</span>
-<span class="source-line-no">1860</span><span id="line-1860">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(cfName)</span>
-<span class="source-line-no">1861</span><span id="line-1861">        .setMinVersions(minVersions).setMaxVersions(versions).setKeepDeletedCells(keepDeleted)</span>
-<span class="source-line-no">1862</span><span id="line-1862">        .setBlockCacheEnabled(false).setTimeToLive(ttl);</span>
-<span class="source-line-no">1863</span><span id="line-1863">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1864</span><span id="line-1864">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1865</span><span id="line-1865">      }</span>
-<span class="source-line-no">1866</span><span id="line-1866">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1867</span><span id="line-1867">    }</span>
-<span class="source-line-no">1868</span><span id="line-1868">    return builder;</span>
-<span class="source-line-no">1869</span><span id="line-1869">  }</span>
-<span class="source-line-no">1870</span><span id="line-1870"></span>
-<span class="source-line-no">1871</span><span id="line-1871">  /**</span>
-<span class="source-line-no">1872</span><span id="line-1872">   * Create a table of name &lt;code&gt;name&lt;/code&gt;.</span>
-<span class="source-line-no">1873</span><span id="line-1873">   * @param name Name to give table.</span>
-<span class="source-line-no">1874</span><span id="line-1874">   * @return Column descriptor.</span>
-<span class="source-line-no">1875</span><span id="line-1875">   */</span>
-<span class="source-line-no">1876</span><span id="line-1876">  public TableDescriptor createTableDescriptor(final TableName name) {</span>
-<span class="source-line-no">1877</span><span id="line-1877">    return createTableDescriptor(name, ColumnFamilyDescriptorBuilder.DEFAULT_MIN_VERSIONS,</span>
-<span class="source-line-no">1878</span><span id="line-1878">      MAXVERSIONS, HConstants.FOREVER, ColumnFamilyDescriptorBuilder.DEFAULT_KEEP_DELETED);</span>
-<span class="source-line-no">1879</span><span id="line-1879">  }</span>
-<span class="source-line-no">1880</span><span id="line-1880"></span>
-<span class="source-line-no">1881</span><span id="line-1881">  public TableDescriptor createTableDescriptor(final TableName tableName, byte[] family) {</span>
-<span class="source-line-no">1882</span><span id="line-1882">    return createTableDescriptor(tableName, new byte[][] { family }, 1);</span>
-<span class="source-line-no">1883</span><span id="line-1883">  }</span>
-<span class="source-line-no">1884</span><span id="line-1884"></span>
-<span class="source-line-no">1885</span><span id="line-1885">  public TableDescriptor createTableDescriptor(final TableName tableName, byte[][] families,</span>
-<span class="source-line-no">1886</span><span id="line-1886">    int maxVersions) {</span>
-<span class="source-line-no">1887</span><span id="line-1887">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1888</span><span id="line-1888">    for (byte[] family : families) {</span>
-<span class="source-line-no">1889</span><span id="line-1889">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">1890</span><span id="line-1890">        ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(maxVersions);</span>
-<span class="source-line-no">1891</span><span id="line-1891">      if (isNewVersionBehaviorEnabled()) {</span>
-<span class="source-line-no">1892</span><span id="line-1892">        cfBuilder.setNewVersionBehavior(true);</span>
-<span class="source-line-no">1893</span><span id="line-1893">      }</span>
-<span class="source-line-no">1894</span><span id="line-1894">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1895</span><span id="line-1895">    }</span>
-<span class="source-line-no">1896</span><span id="line-1896">    return builder.build();</span>
-<span class="source-line-no">1897</span><span id="line-1897">  }</span>
-<span class="source-line-no">1898</span><span id="line-1898"></span>
-<span class="source-line-no">1899</span><span id="line-1899">  /**</span>
-<span class="source-line-no">1900</span><span id="line-1900">   * Create an HRegion that writes to the local tmp dirs</span>
-<span class="source-line-no">1901</span><span id="line-1901">   * @param desc     a table descriptor indicating which table the region belongs to</span>
-<span class="source-line-no">1902</span><span id="line-1902">   * @param startKey the start boundary of the region</span>
-<span class="source-line-no">1903</span><span id="line-1903">   * @param endKey   the end boundary of the region</span>
-<span class="source-line-no">1904</span><span id="line-1904">   * @return a region that writes to local dir for testing</span>
-<span class="source-line-no">1905</span><span id="line-1905">   */</span>
-<span class="source-line-no">1906</span><span id="line-1906">  public HRegion createLocalHRegion(TableDescriptor desc, byte[] startKey, byte[] endKey)</span>
-<span class="source-line-no">1907</span><span id="line-1907">    throws IOException {</span>
-<span class="source-line-no">1908</span><span id="line-1908">    RegionInfo hri = RegionInfoBuilder.newBuilder(desc.getTableName()).setStartKey(startKey)</span>
-<span class="source-line-no">1909</span><span id="line-1909">      .setEndKey(endKey).build();</span>
-<span class="source-line-no">1910</span><span id="line-1910">    return createLocalHRegion(hri, desc);</span>
-<span class="source-line-no">1911</span><span id="line-1911">  }</span>
-<span class="source-line-no">1912</span><span id="line-1912"></span>
-<span class="source-line-no">1913</span><span id="line-1913">  /**</span>
-<span class="source-line-no">1914</span><span id="line-1914">   * Create an HRegion that writes to the local tmp dirs. Creates the WAL for you. Be sure to call</span>
-<span class="source-line-no">1915</span><span id="line-1915">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when you're finished with it.</span>
-<span class="source-line-no">1916</span><span id="line-1916">   */</span>
-<span class="source-line-no">1917</span><span id="line-1917">  public HRegion createLocalHRegion(RegionInfo info, TableDescriptor desc) throws IOException {</span>
-<span class="source-line-no">1918</span><span id="line-1918">    return createRegionAndWAL(info, getDataTestDir(), getConfiguration(), desc);</span>
-<span class="source-line-no">1919</span><span id="line-1919">  }</span>
-<span class="source-line-no">1920</span><span id="line-1920"></span>
-<span class="source-line-no">1921</span><span id="line-1921">  /**</span>
-<span class="source-line-no">1922</span><span id="line-1922">   * Create an HRegion that writes to the local tmp dirs with specified wal</span>
-<span class="source-line-no">1923</span><span id="line-1923">   * @param info regioninfo</span>
-<span class="source-line-no">1924</span><span id="line-1924">   * @param conf configuration</span>
-<span class="source-line-no">1925</span><span id="line-1925">   * @param desc table descriptor</span>
-<span class="source-line-no">1926</span><span id="line-1926">   * @param wal  wal for this region.</span>
-<span class="source-line-no">1927</span><span id="line-1927">   * @return created hregion</span>
-<span class="source-line-no">1928</span><span id="line-1928">   */</span>
-<span class="source-line-no">1929</span><span id="line-1929">  public HRegion createLocalHRegion(RegionInfo info, Configuration conf, TableDescriptor desc,</span>
-<span class="source-line-no">1930</span><span id="line-1930">    WAL wal) throws IOException {</span>
-<span class="source-line-no">1931</span><span id="line-1931">    return HRegion.createHRegion(info, getDataTestDir(), conf, desc, wal);</span>
+<span class="source-line-no">1819</span><span id="line-1819">    getAdmin().deleteTable(tableName);</span>
+<span class="source-line-no">1820</span><span id="line-1820">  }</span>
+<span class="source-line-no">1821</span><span id="line-1821"></span>
+<span class="source-line-no">1822</span><span id="line-1822">  /**</span>
+<span class="source-line-no">1823</span><span id="line-1823">   * Drop an existing table</span>
+<span class="source-line-no">1824</span><span id="line-1824">   * @param tableName existing table</span>
+<span class="source-line-no">1825</span><span id="line-1825">   */</span>
+<span class="source-line-no">1826</span><span id="line-1826">  public void deleteTableIfAny(TableName tableName) throws IOException {</span>
+<span class="source-line-no">1827</span><span id="line-1827">    try {</span>
+<span class="source-line-no">1828</span><span id="line-1828">      deleteTable(tableName);</span>
+<span class="source-line-no">1829</span><span id="line-1829">    } catch (TableNotFoundException e) {</span>
+<span class="source-line-no">1830</span><span id="line-1830">      // ignore</span>
+<span class="source-line-no">1831</span><span id="line-1831">    }</span>
+<span class="source-line-no">1832</span><span id="line-1832">  }</span>
+<span class="source-line-no">1833</span><span id="line-1833"></span>
+<span class="source-line-no">1834</span><span id="line-1834">  // ==========================================================================</span>
+<span class="source-line-no">1835</span><span id="line-1835">  // Canned table and table descriptor creation</span>
+<span class="source-line-no">1836</span><span id="line-1836"></span>
+<span class="source-line-no">1837</span><span id="line-1837">  public final static byte[] fam1 = Bytes.toBytes("colfamily11");</span>
+<span class="source-line-no">1838</span><span id="line-1838">  public final static byte[] fam2 = Bytes.toBytes("colfamily21");</span>
+<span class="source-line-no">1839</span><span id="line-1839">  public final static byte[] fam3 = Bytes.toBytes("colfamily31");</span>
+<span class="source-line-no">1840</span><span id="line-1840">  public static final byte[][] COLUMNS = { fam1, fam2, fam3 };</span>
+<span class="source-line-no">1841</span><span id="line-1841">  private static final int MAXVERSIONS = 3;</span>
+<span class="source-line-no">1842</span><span id="line-1842"></span>
+<span class="source-line-no">1843</span><span id="line-1843">  public static final char FIRST_CHAR = 'a';</span>
+<span class="source-line-no">1844</span><span id="line-1844">  public static final char LAST_CHAR = 'z';</span>
+<span class="source-line-no">1845</span><span id="line-1845">  public static final byte[] START_KEY_BYTES = { FIRST_CHAR, FIRST_CHAR, FIRST_CHAR };</span>
+<span class="source-line-no">1846</span><span id="line-1846">  public static final String START_KEY = new String(START_KEY_BYTES, HConstants.UTF8_CHARSET);</span>
+<span class="source-line-no">1847</span><span id="line-1847"></span>
+<span class="source-line-no">1848</span><span id="line-1848">  public TableDescriptorBuilder createModifyableTableDescriptor(final String name) {</span>
+<span class="source-line-no">1849</span><span id="line-1849">    return createModifyableTableDescriptor(TableName.valueOf(name),</span>
+<span class="source-line-no">1850</span><span id="line-1850">      ColumnFamilyDescriptorBuilder.DEFAULT_MIN_VERSIONS, MAXVERSIONS, HConstants.FOREVER,</span>
+<span class="source-line-no">1851</span><span id="line-1851">      ColumnFamilyDescriptorBuilder.DEFAULT_KEEP_DELETED);</span>
+<span class="source-line-no">1852</span><span id="line-1852">  }</span>
+<span class="source-line-no">1853</span><span id="line-1853"></span>
+<span class="source-line-no">1854</span><span id="line-1854">  public TableDescriptor createTableDescriptor(final TableName name, final int minVersions,</span>
+<span class="source-line-no">1855</span><span id="line-1855">    final int versions, final int ttl, KeepDeletedCells keepDeleted) {</span>
+<span class="source-line-no">1856</span><span id="line-1856">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(name);</span>
+<span class="source-line-no">1857</span><span id="line-1857">    for (byte[] cfName : new byte[][] { fam1, fam2, fam3 }) {</span>
+<span class="source-line-no">1858</span><span id="line-1858">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(cfName)</span>
+<span class="source-line-no">1859</span><span id="line-1859">        .setMinVersions(minVersions).setMaxVersions(versions).setKeepDeletedCells(keepDeleted)</span>
+<span class="source-line-no">1860</span><span id="line-1860">        .setBlockCacheEnabled(false).setTimeToLive(ttl);</span>
+<span class="source-line-no">1861</span><span id="line-1861">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1862</span><span id="line-1862">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1863</span><span id="line-1863">      }</span>
+<span class="source-line-no">1864</span><span id="line-1864">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1865</span><span id="line-1865">    }</span>
+<span class="source-line-no">1866</span><span id="line-1866">    return builder.build();</span>
+<span class="source-line-no">1867</span><span id="line-1867">  }</span>
+<span class="source-line-no">1868</span><span id="line-1868"></span>
+<span class="source-line-no">1869</span><span id="line-1869">  public TableDescriptorBuilder createModifyableTableDescriptor(final TableName name,</span>
+<span class="source-line-no">1870</span><span id="line-1870">    final int minVersions, final int versions, final int ttl, KeepDeletedCells keepDeleted) {</span>
+<span class="source-line-no">1871</span><span id="line-1871">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(name);</span>
+<span class="source-line-no">1872</span><span id="line-1872">    for (byte[] cfName : new byte[][] { fam1, fam2, fam3 }) {</span>
+<span class="source-line-no">1873</span><span id="line-1873">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(cfName)</span>
+<span class="source-line-no">1874</span><span id="line-1874">        .setMinVersions(minVersions).setMaxVersions(versions).setKeepDeletedCells(keepDeleted)</span>
+<span class="source-line-no">1875</span><span id="line-1875">        .setBlockCacheEnabled(false).setTimeToLive(ttl);</span>
+<span class="source-line-no">1876</span><span id="line-1876">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1877</span><span id="line-1877">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1878</span><span id="line-1878">      }</span>
+<span class="source-line-no">1879</span><span id="line-1879">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1880</span><span id="line-1880">    }</span>
+<span class="source-line-no">1881</span><span id="line-1881">    return builder;</span>
+<span class="source-line-no">1882</span><span id="line-1882">  }</span>
+<span class="source-line-no">1883</span><span id="line-1883"></span>
+<span class="source-line-no">1884</span><span id="line-1884">  /**</span>
+<span class="source-line-no">1885</span><span id="line-1885">   * Create a table of name &lt;code&gt;name&lt;/code&gt;.</span>
+<span class="source-line-no">1886</span><span id="line-1886">   * @param name Name to give table.</span>
+<span class="source-line-no">1887</span><span id="line-1887">   * @return Column descriptor.</span>
+<span class="source-line-no">1888</span><span id="line-1888">   */</span>
+<span class="source-line-no">1889</span><span id="line-1889">  public TableDescriptor createTableDescriptor(final TableName name) {</span>
+<span class="source-line-no">1890</span><span id="line-1890">    return createTableDescriptor(name, ColumnFamilyDescriptorBuilder.DEFAULT_MIN_VERSIONS,</span>
+<span class="source-line-no">1891</span><span id="line-1891">      MAXVERSIONS, HConstants.FOREVER, ColumnFamilyDescriptorBuilder.DEFAULT_KEEP_DELETED);</span>
+<span class="source-line-no">1892</span><span id="line-1892">  }</span>
+<span class="source-line-no">1893</span><span id="line-1893"></span>
+<span class="source-line-no">1894</span><span id="line-1894">  public TableDescriptor createTableDescriptor(final TableName tableName, byte[] family) {</span>
+<span class="source-line-no">1895</span><span id="line-1895">    return createTableDescriptor(tableName, new byte[][] { family }, 1);</span>
+<span class="source-line-no">1896</span><span id="line-1896">  }</span>
+<span class="source-line-no">1897</span><span id="line-1897"></span>
+<span class="source-line-no">1898</span><span id="line-1898">  public TableDescriptor createTableDescriptor(final TableName tableName, byte[][] families,</span>
+<span class="source-line-no">1899</span><span id="line-1899">    int maxVersions) {</span>
+<span class="source-line-no">1900</span><span id="line-1900">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1901</span><span id="line-1901">    for (byte[] family : families) {</span>
+<span class="source-line-no">1902</span><span id="line-1902">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">1903</span><span id="line-1903">        ColumnFamilyDescriptorBuilder.newBuilder(family).setMaxVersions(maxVersions);</span>
+<span class="source-line-no">1904</span><span id="line-1904">      if (isNewVersionBehaviorEnabled()) {</span>
+<span class="source-line-no">1905</span><span id="line-1905">        cfBuilder.setNewVersionBehavior(true);</span>
+<span class="source-line-no">1906</span><span id="line-1906">      }</span>
+<span class="source-line-no">1907</span><span id="line-1907">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1908</span><span id="line-1908">    }</span>
+<span class="source-line-no">1909</span><span id="line-1909">    return builder.build();</span>
+<span class="source-line-no">1910</span><span id="line-1910">  }</span>
+<span class="source-line-no">1911</span><span id="line-1911"></span>
+<span class="source-line-no">1912</span><span id="line-1912">  /**</span>
+<span class="source-line-no">1913</span><span id="line-1913">   * Create an HRegion that writes to the local tmp dirs</span>
+<span class="source-line-no">1914</span><span id="line-1914">   * @param desc     a table descriptor indicating which table the region belongs to</span>
+<span class="source-line-no">1915</span><span id="line-1915">   * @param startKey the start boundary of the region</span>
+<span class="source-line-no">1916</span><span id="line-1916">   * @param endKey   the end boundary of the region</span>
+<span class="source-line-no">1917</span><span id="line-1917">   * @return a region that writes to local dir for testing</span>
+<span class="source-line-no">1918</span><span id="line-1918">   */</span>
+<span class="source-line-no">1919</span><span id="line-1919">  public HRegion createLocalHRegion(TableDescriptor desc, byte[] startKey, byte[] endKey)</span>
+<span class="source-line-no">1920</span><span id="line-1920">    throws IOException {</span>
+<span class="source-line-no">1921</span><span id="line-1921">    RegionInfo hri = RegionInfoBuilder.newBuilder(desc.getTableName()).setStartKey(startKey)</span>
+<span class="source-line-no">1922</span><span id="line-1922">      .setEndKey(endKey).build();</span>
+<span class="source-line-no">1923</span><span id="line-1923">    return createLocalHRegion(hri, desc);</span>
+<span class="source-line-no">1924</span><span id="line-1924">  }</span>
+<span class="source-line-no">1925</span><span id="line-1925"></span>
+<span class="source-line-no">1926</span><span id="line-1926">  /**</span>
+<span class="source-line-no">1927</span><span id="line-1927">   * Create an HRegion that writes to the local tmp dirs. Creates the WAL for you. Be sure to call</span>
+<span class="source-line-no">1928</span><span id="line-1928">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when you're finished with it.</span>
+<span class="source-line-no">1929</span><span id="line-1929">   */</span>
+<span class="source-line-no">1930</span><span id="line-1930">  public HRegion createLocalHRegion(RegionInfo info, TableDescriptor desc) throws IOException {</span>
+<span class="source-line-no">1931</span><span id="line-1931">    return createRegionAndWAL(info, getDataTestDir(), getConfiguration(), desc);</span>
 <span class="source-line-no">1932</span><span id="line-1932">  }</span>
 <span class="source-line-no">1933</span><span id="line-1933"></span>
 <span class="source-line-no">1934</span><span id="line-1934">  /**</span>
-<span class="source-line-no">1935</span><span id="line-1935">   * Return a region on which you must call {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)}</span>
-<span class="source-line-no">1936</span><span id="line-1936">   * when done.</span>
-<span class="source-line-no">1937</span><span id="line-1937">   */</span>
-<span class="source-line-no">1938</span><span id="line-1938">  public HRegion createLocalHRegion(TableName tableName, byte[] startKey, byte[] stopKey,</span>
-<span class="source-line-no">1939</span><span id="line-1939">    Configuration conf, boolean isReadOnly, Durability durability, WAL wal, byte[]... families)</span>
-<span class="source-line-no">1940</span><span id="line-1940">    throws IOException {</span>
-<span class="source-line-no">1941</span><span id="line-1941">    return createLocalHRegionWithInMemoryFlags(tableName, startKey, stopKey, conf, isReadOnly,</span>
-<span class="source-line-no">1942</span><span id="line-1942">      durability, wal, null, families);</span>
-<span class="source-line-no">1943</span><span id="line-1943">  }</span>
-<span class="source-line-no">1944</span><span id="line-1944"></span>
-<span class="source-line-no">1945</span><span id="line-1945">  public HRegion createLocalHRegionWithInMemoryFlags(TableName tableName, byte[] startKey,</span>
-<span class="source-line-no">1946</span><span id="line-1946">    byte[] stopKey, Configuration conf, boolean isReadOnly, Durability durability, WAL wal,</span>
-<span class="source-line-no">1947</span><span id="line-1947">    boolean[] compactedMemStore, byte[]... families) throws IOException {</span>
-<span class="source-line-no">1948</span><span id="line-1948">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">1949</span><span id="line-1949">    builder.setReadOnly(isReadOnly);</span>
-<span class="source-line-no">1950</span><span id="line-1950">    int i = 0;</span>
-<span class="source-line-no">1951</span><span id="line-1951">    for (byte[] family : families) {</span>
-<span class="source-line-no">1952</span><span id="line-1952">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family);</span>
-<span class="source-line-no">1953</span><span id="line-1953">      if (compactedMemStore != null &amp;&amp; i &lt; compactedMemStore.length) {</span>
-<span class="source-line-no">1954</span><span id="line-1954">        cfBuilder.setInMemoryCompaction(MemoryCompactionPolicy.BASIC);</span>
-<span class="source-line-no">1955</span><span id="line-1955">      } else {</span>
-<span class="source-line-no">1956</span><span id="line-1956">        cfBuilder.setInMemoryCompaction(MemoryCompactionPolicy.NONE);</span>
+<span class="source-line-no">1935</span><span id="line-1935">   * Create an HRegion that writes to the local tmp dirs with specified wal</span>
+<span class="source-line-no">1936</span><span id="line-1936">   * @param info regioninfo</span>
+<span class="source-line-no">1937</span><span id="line-1937">   * @param conf configuration</span>
+<span class="source-line-no">1938</span><span id="line-1938">   * @param desc table descriptor</span>
+<span class="source-line-no">1939</span><span id="line-1939">   * @param wal  wal for this region.</span>
+<span class="source-line-no">1940</span><span id="line-1940">   * @return created hregion</span>
+<span class="source-line-no">1941</span><span id="line-1941">   */</span>
+<span class="source-line-no">1942</span><span id="line-1942">  public HRegion createLocalHRegion(RegionInfo info, Configuration conf, TableDescriptor desc,</span>
+<span class="source-line-no">1943</span><span id="line-1943">    WAL wal) throws IOException {</span>
+<span class="source-line-no">1944</span><span id="line-1944">    return HRegion.createHRegion(info, getDataTestDir(), conf, desc, wal);</span>
+<span class="source-line-no">1945</span><span id="line-1945">  }</span>
+<span class="source-line-no">1946</span><span id="line-1946"></span>
+<span class="source-line-no">1947</span><span id="line-1947">  /**</span>
+<span class="source-line-no">1948</span><span id="line-1948">   * Return a region on which you must call {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)}</span>
+<span class="source-line-no">1949</span><span id="line-1949">   * when done.</span>
+<span class="source-line-no">1950</span><span id="line-1950">   */</span>
+<span class="source-line-no">1951</span><span id="line-1951">  public HRegion createLocalHRegion(TableName tableName, byte[] startKey, byte[] stopKey,</span>
+<span class="source-line-no">1952</span><span id="line-1952">    Configuration conf, boolean isReadOnly, Durability durability, WAL wal, byte[]... families)</span>
+<span class="source-line-no">1953</span><span id="line-1953">    throws IOException {</span>
+<span class="source-line-no">1954</span><span id="line-1954">    return createLocalHRegionWithInMemoryFlags(tableName, startKey, stopKey, conf, isReadOnly,</span>
+<span class="source-line-no">1955</span><span id="line-1955">      durability, wal, null, families);</span>
+<span class="source-line-no">1956</span><span id="line-1956">  }</span>
 <span class="source-line-no">1957</span><span id="line-1957"></span>
-<span class="source-line-no">1958</span><span id="line-1958">      }</span>
-<span class="source-line-no">1959</span><span id="line-1959">      i++;</span>
-<span class="source-line-no">1960</span><span id="line-1960">      // Set default to be three versions.</span>
-<span class="source-line-no">1961</span><span id="line-1961">      cfBuilder.setMaxVersions(Integer.MAX_VALUE);</span>
-<span class="source-line-no">1962</span><span id="line-1962">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">1963</span><span id="line-1963">    }</span>
-<span class="source-line-no">1964</span><span id="line-1964">    builder.setDurability(durability);</span>
-<span class="source-line-no">1965</span><span id="line-1965">    RegionInfo info =</span>
-<span class="source-line-no">1966</span><span id="line-1966">      RegionInfoBuilder.newBuilder(tableName).setStartKey(startKey).setEndKey(stopKey).build();</span>
-<span class="source-line-no">1967</span><span id="line-1967">    return createLocalHRegion(info, conf, builder.build(), wal);</span>
-<span class="source-line-no">1968</span><span id="line-1968">  }</span>
-<span class="source-line-no">1969</span><span id="line-1969"></span>
-<span class="source-line-no">1970</span><span id="line-1970">  //</span>
-<span class="source-line-no">1971</span><span id="line-1971">  // ==========================================================================</span>
-<span class="source-line-no">1972</span><span id="line-1972"></span>
-<span class="source-line-no">1973</span><span id="line-1973">  /**</span>
-<span class="source-line-no">1974</span><span id="line-1974">   * Provide an existing table name to truncate. Scans the table and issues a delete for each row</span>
-<span class="source-line-no">1975</span><span id="line-1975">   * read.</span>
-<span class="source-line-no">1976</span><span id="line-1976">   * @param tableName existing table</span>
-<span class="source-line-no">1977</span><span id="line-1977">   * @return HTable to that new table</span>
-<span class="source-line-no">1978</span><span id="line-1978">   */</span>
-<span class="source-line-no">1979</span><span id="line-1979">  public Table deleteTableData(TableName tableName) throws IOException {</span>
-<span class="source-line-no">1980</span><span id="line-1980">    Table table = getConnection().getTable(tableName);</span>
-<span class="source-line-no">1981</span><span id="line-1981">    Scan scan = new Scan();</span>
-<span class="source-line-no">1982</span><span id="line-1982">    ResultScanner resScan = table.getScanner(scan);</span>
-<span class="source-line-no">1983</span><span id="line-1983">    for (Result res : resScan) {</span>
-<span class="source-line-no">1984</span><span id="line-1984">      Delete del = new Delete(res.getRow());</span>
-<span class="source-line-no">1985</span><span id="line-1985">      table.delete(del);</span>
-<span class="source-line-no">1986</span><span id="line-1986">    }</span>
-<span class="source-line-no">1987</span><span id="line-1987">    resScan = table.getScanner(scan);</span>
-<span class="source-line-no">1988</span><span id="line-1988">    resScan.close();</span>
-<span class="source-line-no">1989</span><span id="line-1989">    return table;</span>
-<span class="source-line-no">1990</span><span id="line-1990">  }</span>
-<span class="source-line-no">1991</span><span id="line-1991"></span>
-<span class="source-line-no">1992</span><span id="line-1992">  /**</span>
-<span class="source-line-no">1993</span><span id="line-1993">   * Truncate a table using the admin command. Effectively disables, deletes, and recreates the</span>
-<span class="source-line-no">1994</span><span id="line-1994">   * table.</span>
-<span class="source-line-no">1995</span><span id="line-1995">   * @param tableName       table which must exist.</span>
-<span class="source-line-no">1996</span><span id="line-1996">   * @param preserveRegions keep the existing split points</span>
-<span class="source-line-no">1997</span><span id="line-1997">   * @return HTable for the new table</span>
-<span class="source-line-no">1998</span><span id="line-1998">   */</span>
-<span class="source-line-no">1999</span><span id="line-1999">  public Table truncateTable(final TableName tableName, final boolean preserveRegions)</span>
-<span class="source-line-no">2000</span><span id="line-2000">    throws IOException {</span>
-<span class="source-line-no">2001</span><span id="line-2001">    Admin admin = getAdmin();</span>
-<span class="source-line-no">2002</span><span id="line-2002">    if (!admin.isTableDisabled(tableName)) {</span>
-<span class="source-line-no">2003</span><span id="line-2003">      admin.disableTable(tableName);</span>
-<span class="source-line-no">2004</span><span id="line-2004">    }</span>
-<span class="source-line-no">2005</span><span id="line-2005">    admin.truncateTable(tableName, preserveRegions);</span>
-<span class="source-line-no">2006</span><span id="line-2006">    return getConnection().getTable(tableName);</span>
-<span class="source-line-no">2007</span><span id="line-2007">  }</span>
-<span class="source-line-no">2008</span><span id="line-2008"></span>
-<span class="source-line-no">2009</span><span id="line-2009">  /**</span>
-<span class="source-line-no">2010</span><span id="line-2010">   * Truncate a table using the admin command. Effectively disables, deletes, and recreates the</span>
-<span class="source-line-no">2011</span><span id="line-2011">   * table. For previous behavior of issuing row deletes, see deleteTableData. Expressly does not</span>
-<span class="source-line-no">2012</span><span id="line-2012">   * preserve regions of existing table.</span>
-<span class="source-line-no">2013</span><span id="line-2013">   * @param tableName table which must exist.</span>
-<span class="source-line-no">2014</span><span id="line-2014">   * @return HTable for the new table</span>
-<span class="source-line-no">2015</span><span id="line-2015">   */</span>
-<span class="source-line-no">2016</span><span id="line-2016">  public Table truncateTable(final TableName tableName) throws IOException {</span>
-<span class="source-line-no">2017</span><span id="line-2017">    return truncateTable(tableName, false);</span>
-<span class="source-line-no">2018</span><span id="line-2018">  }</span>
-<span class="source-line-no">2019</span><span id="line-2019"></span>
-<span class="source-line-no">2020</span><span id="line-2020">  /**</span>
-<span class="source-line-no">2021</span><span id="line-2021">   * Load table with rows from 'aaa' to 'zzz'.</span>
-<span class="source-line-no">2022</span><span id="line-2022">   * @param t Table</span>
-<span class="source-line-no">2023</span><span id="line-2023">   * @param f Family</span>
-<span class="source-line-no">2024</span><span id="line-2024">   * @return Count of rows loaded.</span>
-<span class="source-line-no">2025</span><span id="line-2025">   */</span>
-<span class="source-line-no">2026</span><span id="line-2026">  public int loadTable(final Table t, final byte[] f) throws IOException {</span>
-<span class="source-line-no">2027</span><span id="line-2027">    return loadTable(t, new byte[][] { f });</span>
-<span class="source-line-no">2028</span><span id="line-2028">  }</span>
-<span class="source-line-no">2029</span><span id="line-2029"></span>
-<span class="source-line-no">2030</span><span id="line-2030">  /**</span>
-<span class="source-line-no">2031</span><span id="line-2031">   * Load table with rows from 'aaa' to 'zzz'.</span>
-<span class="source-line-no">2032</span><span id="line-2032">   * @param t Table</span>
-<span class="source-line-no">2033</span><span id="line-2033">   * @param f Family</span>
-<span class="source-line-no">2034</span><span id="line-2034">   * @return Count of rows loaded.</span>
-<span class="source-line-no">2035</span><span id="line-2035">   */</span>
-<span class="source-line-no">2036</span><span id="line-2036">  public int loadTable(final Table t, final byte[] f, boolean writeToWAL) throws IOException {</span>
-<span class="source-line-no">2037</span><span id="line-2037">    return loadTable(t, new byte[][] { f }, null, writeToWAL);</span>
-<span class="source-line-no">2038</span><span id="line-2038">  }</span>
-<span class="source-line-no">2039</span><span id="line-2039"></span>
-<span class="source-line-no">2040</span><span id="line-2040">  /**</span>
-<span class="source-line-no">2041</span><span id="line-2041">   * Load table of multiple column families with rows from 'aaa' to 'zzz'.</span>
-<span class="source-line-no">2042</span><span id="line-2042">   * @param t Table</span>
-<span class="source-line-no">2043</span><span id="line-2043">   * @param f Array of Families to load</span>
-<span class="source-line-no">2044</span><span id="line-2044">   * @return Count of rows loaded.</span>
-<span class="source-line-no">2045</span><span id="line-2045">   */</span>
-<span class="source-line-no">2046</span><span id="line-2046">  public int loadTable(final Table t, final byte[][] f) throws IOException {</span>
-<span class="source-line-no">2047</span><span id="line-2047">    return loadTable(t, f, null);</span>
-<span class="source-line-no">2048</span><span id="line-2048">  }</span>
-<span class="source-line-no">2049</span><span id="line-2049"></span>
-<span class="source-line-no">2050</span><span id="line-2050">  /**</span>
-<span class="source-line-no">2051</span><span id="line-2051">   * Load table of multiple column families with rows from 'aaa' to 'zzz'.</span>
-<span class="source-line-no">2052</span><span id="line-2052">   * @param t     Table</span>
-<span class="source-line-no">2053</span><span id="line-2053">   * @param f     Array of Families to load</span>
-<span class="source-line-no">2054</span><span id="line-2054">   * @param value the values of the cells. If null is passed, the row key is used as value</span>
-<span class="source-line-no">2055</span><span id="line-2055">   * @return Count of rows loaded.</span>
-<span class="source-line-no">2056</span><span id="line-2056">   */</span>
-<span class="source-line-no">2057</span><span id="line-2057">  public int loadTable(final Table t, final byte[][] f, byte[] value) throws IOException {</span>
-<span class="source-line-no">2058</span><span id="line-2058">    return loadTable(t, f, value, true);</span>
-<span class="source-line-no">2059</span><span id="line-2059">  }</span>
-<span class="source-line-no">2060</span><span id="line-2060"></span>
-<span class="source-line-no">2061</span><span id="line-2061">  /**</span>
-<span class="source-line-no">2062</span><span id="line-2062">   * Load table of multiple column families with rows from 'aaa' to 'zzz'.</span>
-<span class="source-line-no">2063</span><span id="line-2063">   * @param t     Table</span>
-<span class="source-line-no">2064</span><span id="line-2064">   * @param f     Array of Families to load</span>
-<span class="source-line-no">2065</span><span id="line-2065">   * @param value the values of the cells. If null is passed, the row key is used as value</span>
-<span class="source-line-no">2066</span><span id="line-2066">   * @return Count of rows loaded.</span>
-<span class="source-line-no">2067</span><span id="line-2067">   */</span>
-<span class="source-line-no">2068</span><span id="line-2068">  public int loadTable(final Table t, final byte[][] f, byte[] value, boolean writeToWAL)</span>
-<span class="source-line-no">2069</span><span id="line-2069">    throws IOException {</span>
-<span class="source-line-no">2070</span><span id="line-2070">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">2071</span><span id="line-2071">    for (byte[] row : HBaseTestingUtility.ROWS) {</span>
-<span class="source-line-no">2072</span><span id="line-2072">      Put put = new Put(row);</span>
-<span class="source-line-no">2073</span><span id="line-2073">      put.setDurability(writeToWAL ? Durability.USE_DEFAULT : Durability.SKIP_WAL);</span>
-<span class="source-line-no">2074</span><span id="line-2074">      for (int i = 0; i &lt; f.length; i++) {</span>
-<span class="source-line-no">2075</span><span id="line-2075">        byte[] value1 = value != null ? value : row;</span>
-<span class="source-line-no">2076</span><span id="line-2076">        put.addColumn(f[i], f[i], value1);</span>
-<span class="source-line-no">2077</span><span id="line-2077">      }</span>
-<span class="source-line-no">2078</span><span id="line-2078">      puts.add(put);</span>
-<span class="source-line-no">2079</span><span id="line-2079">    }</span>
-<span class="source-line-no">2080</span><span id="line-2080">    t.put(puts);</span>
-<span class="source-line-no">2081</span><span id="line-2081">    return puts.size();</span>
-<span class="source-line-no">2082</span><span id="line-2082">  }</span>
-<span class="source-line-no">2083</span><span id="line-2083"></span>
-<span class="source-line-no">2084</span><span id="line-2084">  /**</span>
-<span class="source-line-no">2085</span><span id="line-2085">   * A tracker for tracking and validating table rows generated with</span>
-<span class="source-line-no">2086</span><span id="line-2086">   * {@link HBaseTestingUtility#loadTable(Table, byte[])}</span>
-<span class="source-line-no">2087</span><span id="line-2087">   */</span>
-<span class="source-line-no">2088</span><span id="line-2088">  public static class SeenRowTracker {</span>
-<span class="source-line-no">2089</span><span id="line-2089">    int dim = 'z' - 'a' + 1;</span>
-<span class="source-line-no">2090</span><span id="line-2090">    int[][][] seenRows = new int[dim][dim][dim]; // count of how many times the row is seen</span>
-<span class="source-line-no">2091</span><span id="line-2091">    byte[] startRow;</span>
-<span class="source-line-no">2092</span><span id="line-2092">    byte[] stopRow;</span>
-<span class="source-line-no">2093</span><span id="line-2093"></span>
-<span class="source-line-no">2094</span><span id="line-2094">    public SeenRowTracker(byte[] startRow, byte[] stopRow) {</span>
-<span class="source-line-no">2095</span><span id="line-2095">      this.startRow = startRow;</span>
-<span class="source-line-no">2096</span><span id="line-2096">      this.stopRow = stopRow;</span>
-<span class="source-line-no">2097</span><span id="line-2097">    }</span>
-<span class="source-line-no">2098</span><span id="line-2098"></span>
-<span class="source-line-no">2099</span><span id="line-2099">    void reset() {</span>
-<span class="source-line-no">2100</span><span id="line-2100">      for (byte[] row : ROWS) {</span>
-<span class="source-line-no">2101</span><span id="line-2101">        seenRows[i(row[0])][i(row[1])][i(row[2])] = 0;</span>
-<span class="source-line-no">2102</span><span id="line-2102">      }</span>
-<span class="source-line-no">2103</span><span id="line-2103">    }</span>
-<span class="source-line-no">2104</span><span id="line-2104"></span>
-<span class="source-line-no">2105</span><span id="line-2105">    int i(byte b) {</span>
-<span class="source-line-no">2106</span><span id="line-2106">      return b - 'a';</span>
-<span class="source-line-no">2107</span><span id="line-2107">    }</span>
-<span class="source-line-no">2108</span><span id="line-2108"></span>
-<span class="source-line-no">2109</span><span id="line-2109">    public void addRow(byte[] row) {</span>
-<span class="source-line-no">2110</span><span id="line-2110">      seenRows[i(row[0])][i(row[1])][i(row[2])]++;</span>
-<span class="source-line-no">2111</span><span id="line-2111">    }</span>
-<span class="source-line-no">2112</span><span id="line-2112"></span>
-<span class="source-line-no">2113</span><span id="line-2113">    /**</span>
-<span class="source-line-no">2114</span><span id="line-2114">     * Validate that all the rows between startRow and stopRow are seen exactly once, and all other</span>
-<span class="source-line-no">2115</span><span id="line-2115">     * rows none</span>
-<span class="source-line-no">2116</span><span id="line-2116">     */</span>
-<span class="source-line-no">2117</span><span id="line-2117">    public void validate() {</span>
-<span class="source-line-no">2118</span><span id="line-2118">      for (byte b1 = 'a'; b1 &lt;= 'z'; b1++) {</span>
-<span class="source-line-no">2119</span><span id="line-2119">        for (byte b2 = 'a'; b2 &lt;= 'z'; b2++) {</span>
-<span class="source-line-no">2120</span><span id="line-2120">          for (byte b3 = 'a'; b3 &lt;= 'z'; b3++) {</span>
-<span class="source-line-no">2121</span><span id="line-2121">            int count = seenRows[i(b1)][i(b2)][i(b3)];</span>
-<span class="source-line-no">2122</span><span id="line-2122">            int expectedCount = 0;</span>
-<span class="source-line-no">2123</span><span id="line-2123">            if (</span>
-<span class="source-line-no">2124</span><span id="line-2124">              Bytes.compareTo(new byte[] { b1, b2, b3 }, startRow) &gt;= 0</span>
-<span class="source-line-no">2125</span><span id="line-2125">                &amp;&amp; Bytes.compareTo(new byte[] { b1, b2, b3 }, stopRow) &lt; 0</span>
-<span class="source-line-no">2126</span><span id="line-2126">            ) {</span>
-<span class="source-line-no">2127</span><span id="line-2127">              expectedCount = 1;</span>
-<span class="source-line-no">2128</span><span id="line-2128">            }</span>
-<span class="source-line-no">2129</span><span id="line-2129">            if (count != expectedCount) {</span>
-<span class="source-line-no">2130</span><span id="line-2130">              String row = new String(new byte[] { b1, b2, b3 }, StandardCharsets.UTF_8);</span>
-<span class="source-line-no">2131</span><span id="line-2131">              throw new RuntimeException("Row:" + row + " has a seen count of " + count + " "</span>
-<span class="source-line-no">2132</span><span id="line-2132">                + "instead of " + expectedCount);</span>
-<span class="source-line-no">2133</span><span id="line-2133">            }</span>
-<span class="source-line-no">2134</span><span id="line-2134">          }</span>
-<span class="source-line-no">2135</span><span id="line-2135">        }</span>
-<span class="source-line-no">2136</span><span id="line-2136">      }</span>
-<span class="source-line-no">2137</span><span id="line-2137">    }</span>
-<span class="source-line-no">2138</span><span id="line-2138">  }</span>
-<span class="source-line-no">2139</span><span id="line-2139"></span>
-<span class="source-line-no">2140</span><span id="line-2140">  public int loadRegion(final HRegion r, final byte[] f) throws IOException {</span>
-<span class="source-line-no">2141</span><span id="line-2141">    return loadRegion(r, f, false);</span>
-<span class="source-line-no">2142</span><span id="line-2142">  }</span>
-<span class="source-line-no">2143</span><span id="line-2143"></span>
-<span class="source-line-no">2144</span><span id="line-2144">  public int loadRegion(final Region r, final byte[] f) throws IOException {</span>
-<span class="source-line-no">2145</span><span id="line-2145">    return loadRegion((HRegion) r, f);</span>
-<span class="source-line-no">2146</span><span id="line-2146">  }</span>
-<span class="source-line-no">2147</span><span id="line-2147"></span>
-<span class="source-line-no">2148</span><span id="line-2148">  /**</span>
-<span class="source-line-no">2149</span><span id="line-2149">   * Load region with rows from 'aaa' to 'zzz'.</span>
-<span class="source-line-no">2150</span><span id="line-2150">   * @param r     Region</span>
-<span class="source-line-no">2151</span><span id="line-2151">   * @param f     Family</span>
-<span class="source-line-no">2152</span><span id="line-2152">   * @param flush flush the cache if true</span>
-<span class="source-line-no">2153</span><span id="line-2153">   * @return Count of rows loaded.</span>
-<span class="source-line-no">2154</span><span id="line-2154">   */</span>
-<span class="source-line-no">2155</span><span id="line-2155">  public int loadRegion(final HRegion r, final byte[] f, final boolean flush) throws IOException {</span>
-<span class="source-line-no">2156</span><span id="line-2156">    byte[] k = new byte[3];</span>
-<span class="source-line-no">2157</span><span id="line-2157">    int rowCount = 0;</span>
-<span class="source-line-no">2158</span><span id="line-2158">    for (byte b1 = 'a'; b1 &lt;= 'z'; b1++) {</span>
-<span class="source-line-no">2159</span><span id="line-2159">      for (byte b2 = 'a'; b2 &lt;= 'z'; b2++) {</span>
-<span class="source-line-no">2160</span><span id="line-2160">        for (byte b3 = 'a'; b3 &lt;= 'z'; b3++) {</span>
-<span class="source-line-no">2161</span><span id="line-2161">          k[0] = b1;</span>
-<span class="source-line-no">2162</span><span id="line-2162">          k[1] = b2;</span>
-<span class="source-line-no">2163</span><span id="line-2163">          k[2] = b3;</span>
-<span class="source-line-no">2164</span><span id="line-2164">          Put put = new Put(k);</span>
-<span class="source-line-no">2165</span><span id="line-2165">          put.setDurability(Durability.SKIP_WAL);</span>
-<span class="source-line-no">2166</span><span id="line-2166">          put.addColumn(f, null, k);</span>
-<span class="source-line-no">2167</span><span id="line-2167">          if (r.getWAL() == null) {</span>
-<span class="source-line-no">2168</span><span id="line-2168">            put.setDurability(Durability.SKIP_WAL);</span>
-<span class="source-line-no">2169</span><span id="line-2169">          }</span>
-<span class="source-line-no">2170</span><span id="line-2170">          int preRowCount = rowCount;</span>
-<span class="source-line-no">2171</span><span id="line-2171">          int pause = 10;</span>
-<span class="source-line-no">2172</span><span id="line-2172">          int maxPause = 1000;</span>
-<span class="source-line-no">2173</span><span id="line-2173">          while (rowCount == preRowCount) {</span>
-<span class="source-line-no">2174</span><span id="line-2174">            try {</span>
-<span class="source-line-no">2175</span><span id="line-2175">              r.put(put);</span>
-<span class="source-line-no">2176</span><span id="line-2176">              rowCount++;</span>
-<span class="source-line-no">2177</span><span id="line-2177">            } catch (RegionTooBusyException e) {</span>
-<span class="source-line-no">2178</span><span id="line-2178">              pause = (pause * 2 &gt;= maxPause) ? maxPause : pause * 2;</span>
-<span class="source-line-no">2179</span><span id="line-2179">              Threads.sleep(pause);</span>
-<span class="source-line-no">2180</span><span id="line-2180">            }</span>
-<span class="source-line-no">2181</span><span id="line-2181">          }</span>
-<span class="source-line-no">2182</span><span id="line-2182">        }</span>
-<span class="source-line-no">2183</span><span id="line-2183">      }</span>
-<span class="source-line-no">2184</span><span id="line-2184">      if (flush) {</span>
-<span class="source-line-no">2185</span><span id="line-2185">        r.flush(true);</span>
-<span class="source-line-no">2186</span><span id="line-2186">      }</span>
-<span class="source-line-no">2187</span><span id="line-2187">    }</span>
-<span class="source-line-no">2188</span><span id="line-2188">    return rowCount;</span>
-<span class="source-line-no">2189</span><span id="line-2189">  }</span>
-<span class="source-line-no">2190</span><span id="line-2190"></span>
-<span class="source-line-no">2191</span><span id="line-2191">  public void loadNumericRows(final Table t, final byte[] f, int startRow, int endRow)</span>
-<span class="source-line-no">2192</span><span id="line-2192">    throws IOException {</span>
-<span class="source-line-no">2193</span><span id="line-2193">    for (int i = startRow; i &lt; endRow; i++) {</span>
-<span class="source-line-no">2194</span><span id="line-2194">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
-<span class="source-line-no">2195</span><span id="line-2195">      Put put = new Put(data);</span>
-<span class="source-line-no">2196</span><span id="line-2196">      put.addColumn(f, null, data);</span>
-<span class="source-line-no">2197</span><span id="line-2197">      t.put(put);</span>
-<span class="source-line-no">2198</span><span id="line-2198">    }</span>
-<span class="source-line-no">2199</span><span id="line-2199">  }</span>
-<span class="source-line-no">2200</span><span id="line-2200"></span>
-<span class="source-line-no">2201</span><span id="line-2201">  public void loadRandomRows(final Table t, final byte[] f, int rowSize, int totalRows)</span>
-<span class="source-line-no">2202</span><span id="line-2202">    throws IOException {</span>
-<span class="source-line-no">2203</span><span id="line-2203">    byte[] row = new byte[rowSize];</span>
-<span class="source-line-no">2204</span><span id="line-2204">    for (int i = 0; i &lt; totalRows; i++) {</span>
-<span class="source-line-no">2205</span><span id="line-2205">      Bytes.random(row);</span>
-<span class="source-line-no">2206</span><span id="line-2206">      Put put = new Put(row);</span>
-<span class="source-line-no">2207</span><span id="line-2207">      put.addColumn(f, new byte[] { 0 }, new byte[] { 0 });</span>
-<span class="source-line-no">2208</span><span id="line-2208">      t.put(put);</span>
-<span class="source-line-no">2209</span><span id="line-2209">    }</span>
-<span class="source-line-no">2210</span><span id="line-2210">  }</span>
-<span class="source-line-no">2211</span><span id="line-2211"></span>
-<span class="source-line-no">2212</span><span id="line-2212">  public void verifyNumericRows(Table table, final byte[] f, int startRow, int endRow,</span>
-<span class="source-line-no">2213</span><span id="line-2213">    int replicaId) throws IOException {</span>
-<span class="source-line-no">2214</span><span id="line-2214">    for (int i = startRow; i &lt; endRow; i++) {</span>
-<span class="source-line-no">2215</span><span id="line-2215">      String failMsg = "Failed verification of row :" + i;</span>
-<span class="source-line-no">2216</span><span id="line-2216">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
-<span class="source-line-no">2217</span><span id="line-2217">      Get get = new Get(data);</span>
-<span class="source-line-no">2218</span><span id="line-2218">      get.setReplicaId(replicaId);</span>
-<span class="source-line-no">2219</span><span id="line-2219">      get.setConsistency(Consistency.TIMELINE);</span>
-<span class="source-line-no">2220</span><span id="line-2220">      Result result = table.get(get);</span>
-<span class="source-line-no">2221</span><span id="line-2221">      if (!result.containsColumn(f, null)) {</span>
-<span class="source-line-no">2222</span><span id="line-2222">        throw new AssertionError(failMsg);</span>
-<span class="source-line-no">2223</span><span id="line-2223">      }</span>
-<span class="source-line-no">2224</span><span id="line-2224">      assertEquals(failMsg, 1, result.getColumnCells(f, null).size());</span>
-<span class="source-line-no">2225</span><span id="line-2225">      Cell cell = result.getColumnLatestCell(f, null);</span>
-<span class="source-line-no">2226</span><span id="line-2226">      if (</span>
-<span class="source-line-no">2227</span><span id="line-2227">        !Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),</span>
-<span class="source-line-no">2228</span><span id="line-2228">          cell.getValueLength())</span>
-<span class="source-line-no">2229</span><span id="line-2229">      ) {</span>
-<span class="source-line-no">2230</span><span id="line-2230">        throw new AssertionError(failMsg);</span>
-<span class="source-line-no">2231</span><span id="line-2231">      }</span>
-<span class="source-line-no">2232</span><span id="line-2232">    }</span>
-<span class="source-line-no">2233</span><span id="line-2233">  }</span>
-<span class="source-line-no">2234</span><span id="line-2234"></span>
-<span class="source-line-no">2235</span><span id="line-2235">  public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow)</span>
-<span class="source-line-no">2236</span><span id="line-2236">    throws IOException {</span>
-<span class="source-line-no">2237</span><span id="line-2237">    verifyNumericRows((HRegion) region, f, startRow, endRow);</span>
-<span class="source-line-no">2238</span><span id="line-2238">  }</span>
-<span class="source-line-no">2239</span><span id="line-2239"></span>
-<span class="source-line-no">2240</span><span id="line-2240">  public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow)</span>
-<span class="source-line-no">2241</span><span id="line-2241">    throws IOException {</span>
-<span class="source-line-no">2242</span><span id="line-2242">    verifyNumericRows(region, f, startRow, endRow, true);</span>
-<span class="source-line-no">2243</span><span id="line-2243">  }</span>
-<span class="source-line-no">2244</span><span id="line-2244"></span>
-<span class="source-line-no">2245</span><span id="line-2245">  public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow,</span>
-<span class="source-line-no">2246</span><span id="line-2246">    final boolean present) throws IOException {</span>
-<span class="source-line-no">2247</span><span id="line-2247">    verifyNumericRows((HRegion) region, f, startRow, endRow, present);</span>
-<span class="source-line-no">2248</span><span id="line-2248">  }</span>
-<span class="source-line-no">2249</span><span id="line-2249"></span>
-<span class="source-line-no">2250</span><span id="line-2250">  public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow,</span>
-<span class="source-line-no">2251</span><span id="line-2251">    final boolean present) throws IOException {</span>
-<span class="source-line-no">2252</span><span id="line-2252">    for (int i = startRow; i &lt; endRow; i++) {</span>
-<span class="source-line-no">2253</span><span id="line-2253">      String failMsg = "Failed verification of row :" + i;</span>
-<span class="source-line-no">2254</span><span id="line-2254">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
-<span class="source-line-no">2255</span><span id="line-2255">      Result result = region.get(new Get(data));</span>
-<span class="source-line-no">2256</span><span id="line-2256"></span>
-<span class="source-line-no">2257</span><span id="line-2257">      boolean hasResult = result != null &amp;&amp; !result.isEmpty();</span>
-<span class="source-line-no">2258</span><span id="line-2258">      if (present != hasResult) {</span>
-<span class="source-line-no">2259</span><span id="line-2259">        throw new AssertionError(</span>
-<span class="source-line-no">2260</span><span id="line-2260">          failMsg + result + " expected:&lt;" + present + "&gt; but was:&lt;" + hasResult + "&gt;");</span>
-<span class="source-line-no">2261</span><span id="line-2261">      }</span>
-<span class="source-line-no">2262</span><span id="line-2262">      if (!present) continue;</span>
-<span class="source-line-no">2263</span><span id="line-2263"></span>
-<span class="source-line-no">2264</span><span id="line-2264">      if (!result.containsColumn(f, null)) {</span>
-<span class="source-line-no">2265</span><span id="line-2265">        throw new AssertionError(failMsg);</span>
-<span class="source-line-no">2266</span><span id="line-2266">      }</span>
-<span class="source-line-no">2267</span><span id="line-2267">      assertEquals(failMsg, 1, result.getColumnCells(f, null).size());</span>
-<span class="source-line-no">2268</span><span id="line-2268">      Cell cell = result.getColumnLatestCell(f, null);</span>
-<span class="source-line-no">2269</span><span id="line-2269">      if (</span>
-<span class="source-line-no">2270</span><span id="line-2270">        !Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),</span>
-<span class="source-line-no">2271</span><span id="line-2271">          cell.getValueLength())</span>
-<span class="source-line-no">2272</span><span id="line-2272">      ) {</span>
-<span class="source-line-no">2273</span><span id="line-2273">        throw new AssertionError(failMsg);</span>
+<span class="source-line-no">1958</span><span id="line-1958">  public HRegion createLocalHRegionWithInMemoryFlags(TableName tableName, byte[] startKey,</span>
+<span class="source-line-no">1959</span><span id="line-1959">    byte[] stopKey, Configuration conf, boolean isReadOnly, Durability durability, WAL wal,</span>
+<span class="source-line-no">1960</span><span id="line-1960">    boolean[] compactedMemStore, byte[]... families) throws IOException {</span>
+<span class="source-line-no">1961</span><span id="line-1961">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">1962</span><span id="line-1962">    builder.setReadOnly(isReadOnly);</span>
+<span class="source-line-no">1963</span><span id="line-1963">    int i = 0;</span>
+<span class="source-line-no">1964</span><span id="line-1964">    for (byte[] family : families) {</span>
+<span class="source-line-no">1965</span><span id="line-1965">      ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(family);</span>
+<span class="source-line-no">1966</span><span id="line-1966">      if (compactedMemStore != null &amp;&amp; i &lt; compactedMemStore.length) {</span>
+<span class="source-line-no">1967</span><span id="line-1967">        cfBuilder.setInMemoryCompaction(MemoryCompactionPolicy.BASIC);</span>
+<span class="source-line-no">1968</span><span id="line-1968">      } else {</span>
+<span class="source-line-no">1969</span><span id="line-1969">        cfBuilder.setInMemoryCompaction(MemoryCompactionPolicy.NONE);</span>
+<span class="source-line-no">1970</span><span id="line-1970"></span>
+<span class="source-line-no">1971</span><span id="line-1971">      }</span>
+<span class="source-line-no">1972</span><span id="line-1972">      i++;</span>
+<span class="source-line-no">1973</span><span id="line-1973">      // Set default to be three versions.</span>
+<span class="source-line-no">1974</span><span id="line-1974">      cfBuilder.setMaxVersions(Integer.MAX_VALUE);</span>
+<span class="source-line-no">1975</span><span id="line-1975">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">1976</span><span id="line-1976">    }</span>
+<span class="source-line-no">1977</span><span id="line-1977">    builder.setDurability(durability);</span>
+<span class="source-line-no">1978</span><span id="line-1978">    RegionInfo info =</span>
+<span class="source-line-no">1979</span><span id="line-1979">      RegionInfoBuilder.newBuilder(tableName).setStartKey(startKey).setEndKey(stopKey).build();</span>
+<span class="source-line-no">1980</span><span id="line-1980">    return createLocalHRegion(info, conf, builder.build(), wal);</span>
+<span class="source-line-no">1981</span><span id="line-1981">  }</span>
+<span class="source-line-no">1982</span><span id="line-1982"></span>
+<span class="source-line-no">1983</span><span id="line-1983">  //</span>
+<span class="source-line-no">1984</span><span id="line-1984">  // ==========================================================================</span>
+<span class="source-line-no">1985</span><span id="line-1985"></span>
+<span class="source-line-no">1986</span><span id="line-1986">  /**</span>
+<span class="source-line-no">1987</span><span id="line-1987">   * Provide an existing table name to truncate. Scans the table and issues a delete for each row</span>
+<span class="source-line-no">1988</span><span id="line-1988">   * read.</span>
+<span class="source-line-no">1989</span><span id="line-1989">   * @param tableName existing table</span>
+<span class="source-line-no">1990</span><span id="line-1990">   * @return HTable to that new table</span>
+<span class="source-line-no">1991</span><span id="line-1991">   */</span>
+<span class="source-line-no">1992</span><span id="line-1992">  public Table deleteTableData(TableName tableName) throws IOException {</span>
+<span class="source-line-no">1993</span><span id="line-1993">    Table table = getConnection().getTable(tableName);</span>
+<span class="source-line-no">1994</span><span id="line-1994">    Scan scan = new Scan();</span>
+<span class="source-line-no">1995</span><span id="line-1995">    ResultScanner resScan = table.getScanner(scan);</span>
+<span class="source-line-no">1996</span><span id="line-1996">    for (Result res : resScan) {</span>
+<span class="source-line-no">1997</span><span id="line-1997">      Delete del = new Delete(res.getRow());</span>
+<span class="source-line-no">1998</span><span id="line-1998">      table.delete(del);</span>
+<span class="source-line-no">1999</span><span id="line-1999">    }</span>
+<span class="source-line-no">2000</span><span id="line-2000">    resScan = table.getScanner(scan);</span>
+<span class="source-line-no">2001</span><span id="line-2001">    resScan.close();</span>
+<span class="source-line-no">2002</span><span id="line-2002">    return table;</span>
+<span class="source-line-no">2003</span><span id="line-2003">  }</span>
+<span class="source-line-no">2004</span><span id="line-2004"></span>
+<span class="source-line-no">2005</span><span id="line-2005">  /**</span>
+<span class="source-line-no">2006</span><span id="line-2006">   * Truncate a table using the admin command. Effectively disables, deletes, and recreates the</span>
+<span class="source-line-no">2007</span><span id="line-2007">   * table.</span>
+<span class="source-line-no">2008</span><span id="line-2008">   * @param tableName       table which must exist.</span>
+<span class="source-line-no">2009</span><span id="line-2009">   * @param preserveRegions keep the existing split points</span>
+<span class="source-line-no">2010</span><span id="line-2010">   * @return HTable for the new table</span>
+<span class="source-line-no">2011</span><span id="line-2011">   */</span>
+<span class="source-line-no">2012</span><span id="line-2012">  public Table truncateTable(final TableName tableName, final boolean preserveRegions)</span>
+<span class="source-line-no">2013</span><span id="line-2013">    throws IOException {</span>
+<span class="source-line-no">2014</span><span id="line-2014">    Admin admin = getAdmin();</span>
+<span class="source-line-no">2015</span><span id="line-2015">    if (!admin.isTableDisabled(tableName)) {</span>
+<span class="source-line-no">2016</span><span id="line-2016">      admin.disableTable(tableName);</span>
+<span class="source-line-no">2017</span><span id="line-2017">    }</span>
+<span class="source-line-no">2018</span><span id="line-2018">    admin.truncateTable(tableName, preserveRegions);</span>
+<span class="source-line-no">2019</span><span id="line-2019">    return getConnection().getTable(tableName);</span>
+<span class="source-line-no">2020</span><span id="line-2020">  }</span>
+<span class="source-line-no">2021</span><span id="line-2021"></span>
+<span class="source-line-no">2022</span><span id="line-2022">  /**</span>
+<span class="source-line-no">2023</span><span id="line-2023">   * Truncate a table using the admin command. Effectively disables, deletes, and recreates the</span>
+<span class="source-line-no">2024</span><span id="line-2024">   * table. For previous behavior of issuing row deletes, see deleteTableData. Expressly does not</span>
+<span class="source-line-no">2025</span><span id="line-2025">   * preserve regions of existing table.</span>
+<span class="source-line-no">2026</span><span id="line-2026">   * @param tableName table which must exist.</span>
+<span class="source-line-no">2027</span><span id="line-2027">   * @return HTable for the new table</span>
+<span class="source-line-no">2028</span><span id="line-2028">   */</span>
+<span class="source-line-no">2029</span><span id="line-2029">  public Table truncateTable(final TableName tableName) throws IOException {</span>
+<span class="source-line-no">2030</span><span id="line-2030">    return truncateTable(tableName, false);</span>
+<span class="source-line-no">2031</span><span id="line-2031">  }</span>
+<span class="source-line-no">2032</span><span id="line-2032"></span>
+<span class="source-line-no">2033</span><span id="line-2033">  /**</span>
+<span class="source-line-no">2034</span><span id="line-2034">   * Load table with rows from 'aaa' to 'zzz'.</span>
+<span class="source-line-no">2035</span><span id="line-2035">   * @param t Table</span>
+<span class="source-line-no">2036</span><span id="line-2036">   * @param f Family</span>
+<span class="source-line-no">2037</span><span id="line-2037">   * @return Count of rows loaded.</span>
+<span class="source-line-no">2038</span><span id="line-2038">   */</span>
+<span class="source-line-no">2039</span><span id="line-2039">  public int loadTable(final Table t, final byte[] f) throws IOException {</span>
+<span class="source-line-no">2040</span><span id="line-2040">    return loadTable(t, new byte[][] { f });</span>
+<span class="source-line-no">2041</span><span id="line-2041">  }</span>
+<span class="source-line-no">2042</span><span id="line-2042"></span>
+<span class="source-line-no">2043</span><span id="line-2043">  /**</span>
+<span class="source-line-no">2044</span><span id="line-2044">   * Load table with rows from 'aaa' to 'zzz'.</span>
+<span class="source-line-no">2045</span><span id="line-2045">   * @param t Table</span>
+<span class="source-line-no">2046</span><span id="line-2046">   * @param f Family</span>
+<span class="source-line-no">2047</span><span id="line-2047">   * @return Count of rows loaded.</span>
+<span class="source-line-no">2048</span><span id="line-2048">   */</span>
+<span class="source-line-no">2049</span><span id="line-2049">  public int loadTable(final Table t, final byte[] f, boolean writeToWAL) throws IOException {</span>
+<span class="source-line-no">2050</span><span id="line-2050">    return loadTable(t, new byte[][] { f }, null, writeToWAL);</span>
+<span class="source-line-no">2051</span><span id="line-2051">  }</span>
+<span class="source-line-no">2052</span><span id="line-2052"></span>
+<span class="source-line-no">2053</span><span id="line-2053">  /**</span>
+<span class="source-line-no">2054</span><span id="line-2054">   * Load table of multiple column families with rows from 'aaa' to 'zzz'.</span>
+<span class="source-line-no">2055</span><span id="line-2055">   * @param t Table</span>
+<span class="source-line-no">2056</span><span id="line-2056">   * @param f Array of Families to load</span>
+<span class="source-line-no">2057</span><span id="line-2057">   * @return Count of rows loaded.</span>
+<span class="source-line-no">2058</span><span id="line-2058">   */</span>
+<span class="source-line-no">2059</span><span id="line-2059">  public int loadTable(final Table t, final byte[][] f) throws IOException {</span>
+<span class="source-line-no">2060</span><span id="line-2060">    return loadTable(t, f, null);</span>
+<span class="source-line-no">2061</span><span id="line-2061">  }</span>
+<span class="source-line-no">2062</span><span id="line-2062"></span>
+<span class="source-line-no">2063</span><span id="line-2063">  /**</span>
+<span class="source-line-no">2064</span><span id="line-2064">   * Load table of multiple column families with rows from 'aaa' to 'zzz'.</span>
+<span class="source-line-no">2065</span><span id="line-2065">   * @param t     Table</span>
+<span class="source-line-no">2066</span><span id="line-2066">   * @param f     Array of Families to load</span>
+<span class="source-line-no">2067</span><span id="line-2067">   * @param value the values of the cells. If null is passed, the row key is used as value</span>
+<span class="source-line-no">2068</span><span id="line-2068">   * @return Count of rows loaded.</span>
+<span class="source-line-no">2069</span><span id="line-2069">   */</span>
+<span class="source-line-no">2070</span><span id="line-2070">  public int loadTable(final Table t, final byte[][] f, byte[] value) throws IOException {</span>
+<span class="source-line-no">2071</span><span id="line-2071">    return loadTable(t, f, value, true);</span>
+<span class="source-line-no">2072</span><span id="line-2072">  }</span>
+<span class="source-line-no">2073</span><span id="line-2073"></span>
+<span class="source-line-no">2074</span><span id="line-2074">  /**</span>
+<span class="source-line-no">2075</span><span id="line-2075">   * Load table of multiple column families with rows from 'aaa' to 'zzz'.</span>
+<span class="source-line-no">2076</span><span id="line-2076">   * @param t     Table</span>
+<span class="source-line-no">2077</span><span id="line-2077">   * @param f     Array of Families to load</span>
+<span class="source-line-no">2078</span><span id="line-2078">   * @param value the values of the cells. If null is passed, the row key is used as value</span>
+<span class="source-line-no">2079</span><span id="line-2079">   * @return Count of rows loaded.</span>
+<span class="source-line-no">2080</span><span id="line-2080">   */</span>
+<span class="source-line-no">2081</span><span id="line-2081">  public int loadTable(final Table t, final byte[][] f, byte[] value, boolean writeToWAL)</span>
+<span class="source-line-no">2082</span><span id="line-2082">    throws IOException {</span>
+<span class="source-line-no">2083</span><span id="line-2083">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">2084</span><span id="line-2084">    for (byte[] row : HBaseTestingUtility.ROWS) {</span>
+<span class="source-line-no">2085</span><span id="line-2085">      Put put = new Put(row);</span>
+<span class="source-line-no">2086</span><span id="line-2086">      put.setDurability(writeToWAL ? Durability.USE_DEFAULT : Durability.SKIP_WAL);</span>
+<span class="source-line-no">2087</span><span id="line-2087">      for (int i = 0; i &lt; f.length; i++) {</span>
+<span class="source-line-no">2088</span><span id="line-2088">        byte[] value1 = value != null ? value : row;</span>
+<span class="source-line-no">2089</span><span id="line-2089">        put.addColumn(f[i], f[i], value1);</span>
+<span class="source-line-no">2090</span><span id="line-2090">      }</span>
+<span class="source-line-no">2091</span><span id="line-2091">      puts.add(put);</span>
+<span class="source-line-no">2092</span><span id="line-2092">    }</span>
+<span class="source-line-no">2093</span><span id="line-2093">    t.put(puts);</span>
+<span class="source-line-no">2094</span><span id="line-2094">    return puts.size();</span>
+<span class="source-line-no">2095</span><span id="line-2095">  }</span>
+<span class="source-line-no">2096</span><span id="line-2096"></span>
+<span class="source-line-no">2097</span><span id="line-2097">  /**</span>
+<span class="source-line-no">2098</span><span id="line-2098">   * A tracker for tracking and validating table rows generated with</span>
+<span class="source-line-no">2099</span><span id="line-2099">   * {@link HBaseTestingUtility#loadTable(Table, byte[])}</span>
+<span class="source-line-no">2100</span><span id="line-2100">   */</span>
+<span class="source-line-no">2101</span><span id="line-2101">  public static class SeenRowTracker {</span>
+<span class="source-line-no">2102</span><span id="line-2102">    int dim = 'z' - 'a' + 1;</span>
+<span class="source-line-no">2103</span><span id="line-2103">    int[][][] seenRows = new int[dim][dim][dim]; // count of how many times the row is seen</span>
+<span class="source-line-no">2104</span><span id="line-2104">    byte[] startRow;</span>
+<span class="source-line-no">2105</span><span id="line-2105">    byte[] stopRow;</span>
+<span class="source-line-no">2106</span><span id="line-2106"></span>
+<span class="source-line-no">2107</span><span id="line-2107">    public SeenRowTracker(byte[] startRow, byte[] stopRow) {</span>
+<span class="source-line-no">2108</span><span id="line-2108">      this.startRow = startRow;</span>
+<span class="source-line-no">2109</span><span id="line-2109">      this.stopRow = stopRow;</span>
+<span class="source-line-no">2110</span><span id="line-2110">    }</span>
+<span class="source-line-no">2111</span><span id="line-2111"></span>
+<span class="source-line-no">2112</span><span id="line-2112">    void reset() {</span>
+<span class="source-line-no">2113</span><span id="line-2113">      for (byte[] row : ROWS) {</span>
+<span class="source-line-no">2114</span><span id="line-2114">        seenRows[i(row[0])][i(row[1])][i(row[2])] = 0;</span>
+<span class="source-line-no">2115</span><span id="line-2115">      }</span>
+<span class="source-line-no">2116</span><span id="line-2116">    }</span>
+<span class="source-line-no">2117</span><span id="line-2117"></span>
+<span class="source-line-no">2118</span><span id="line-2118">    int i(byte b) {</span>
+<span class="source-line-no">2119</span><span id="line-2119">      return b - 'a';</span>
+<span class="source-line-no">2120</span><span id="line-2120">    }</span>
+<span class="source-line-no">2121</span><span id="line-2121"></span>
+<span class="source-line-no">2122</span><span id="line-2122">    public void addRow(byte[] row) {</span>
+<span class="source-line-no">2123</span><span id="line-2123">      seenRows[i(row[0])][i(row[1])][i(row[2])]++;</span>
+<span class="source-line-no">2124</span><span id="line-2124">    }</span>
+<span class="source-line-no">2125</span><span id="line-2125"></span>
+<span class="source-line-no">2126</span><span id="line-2126">    /**</span>
+<span class="source-line-no">2127</span><span id="line-2127">     * Validate that all the rows between startRow and stopRow are seen exactly once, and all other</span>
+<span class="source-line-no">2128</span><span id="line-2128">     * rows none</span>
+<span class="source-line-no">2129</span><span id="line-2129">     */</span>
+<span class="source-line-no">2130</span><span id="line-2130">    public void validate() {</span>
+<span class="source-line-no">2131</span><span id="line-2131">      for (byte b1 = 'a'; b1 &lt;= 'z'; b1++) {</span>
+<span class="source-line-no">2132</span><span id="line-2132">        for (byte b2 = 'a'; b2 &lt;= 'z'; b2++) {</span>
+<span class="source-line-no">2133</span><span id="line-2133">          for (byte b3 = 'a'; b3 &lt;= 'z'; b3++) {</span>
+<span class="source-line-no">2134</span><span id="line-2134">            int count = seenRows[i(b1)][i(b2)][i(b3)];</span>
+<span class="source-line-no">2135</span><span id="line-2135">            int expectedCount = 0;</span>
+<span class="source-line-no">2136</span><span id="line-2136">            if (</span>
+<span class="source-line-no">2137</span><span id="line-2137">              Bytes.compareTo(new byte[] { b1, b2, b3 }, startRow) &gt;= 0</span>
+<span class="source-line-no">2138</span><span id="line-2138">                &amp;&amp; Bytes.compareTo(new byte[] { b1, b2, b3 }, stopRow) &lt; 0</span>
+<span class="source-line-no">2139</span><span id="line-2139">            ) {</span>
+<span class="source-line-no">2140</span><span id="line-2140">              expectedCount = 1;</span>
+<span class="source-line-no">2141</span><span id="line-2141">            }</span>
+<span class="source-line-no">2142</span><span id="line-2142">            if (count != expectedCount) {</span>
+<span class="source-line-no">2143</span><span id="line-2143">              String row = new String(new byte[] { b1, b2, b3 }, StandardCharsets.UTF_8);</span>
+<span class="source-line-no">2144</span><span id="line-2144">              throw new RuntimeException("Row:" + row + " has a seen count of " + count + " "</span>
+<span class="source-line-no">2145</span><span id="line-2145">                + "instead of " + expectedCount);</span>
+<span class="source-line-no">2146</span><span id="line-2146">            }</span>
+<span class="source-line-no">2147</span><span id="line-2147">          }</span>
+<span class="source-line-no">2148</span><span id="line-2148">        }</span>
+<span class="source-line-no">2149</span><span id="line-2149">      }</span>
+<span class="source-line-no">2150</span><span id="line-2150">    }</span>
+<span class="source-line-no">2151</span><span id="line-2151">  }</span>
+<span class="source-line-no">2152</span><span id="line-2152"></span>
+<span class="source-line-no">2153</span><span id="line-2153">  public int loadRegion(final HRegion r, final byte[] f) throws IOException {</span>
+<span class="source-line-no">2154</span><span id="line-2154">    return loadRegion(r, f, false);</span>
+<span class="source-line-no">2155</span><span id="line-2155">  }</span>
+<span class="source-line-no">2156</span><span id="line-2156"></span>
+<span class="source-line-no">2157</span><span id="line-2157">  public int loadRegion(final Region r, final byte[] f) throws IOException {</span>
+<span class="source-line-no">2158</span><span id="line-2158">    return loadRegion((HRegion) r, f);</span>
+<span class="source-line-no">2159</span><span id="line-2159">  }</span>
+<span class="source-line-no">2160</span><span id="line-2160"></span>
+<span class="source-line-no">2161</span><span id="line-2161">  /**</span>
+<span class="source-line-no">2162</span><span id="line-2162">   * Load region with rows from 'aaa' to 'zzz'.</span>
+<span class="source-line-no">2163</span><span id="line-2163">   * @param r     Region</span>
+<span class="source-line-no">2164</span><span id="line-2164">   * @param f     Family</span>
+<span class="source-line-no">2165</span><span id="line-2165">   * @param flush flush the cache if true</span>
+<span class="source-line-no">2166</span><span id="line-2166">   * @return Count of rows loaded.</span>
+<span class="source-line-no">2167</span><span id="line-2167">   */</span>
+<span class="source-line-no">2168</span><span id="line-2168">  public int loadRegion(final HRegion r, final byte[] f, final boolean flush) throws IOException {</span>
+<span class="source-line-no">2169</span><span id="line-2169">    byte[] k = new byte[3];</span>
+<span class="source-line-no">2170</span><span id="line-2170">    int rowCount = 0;</span>
+<span class="source-line-no">2171</span><span id="line-2171">    for (byte b1 = 'a'; b1 &lt;= 'z'; b1++) {</span>
+<span class="source-line-no">2172</span><span id="line-2172">      for (byte b2 = 'a'; b2 &lt;= 'z'; b2++) {</span>
+<span class="source-line-no">2173</span><span id="line-2173">        for (byte b3 = 'a'; b3 &lt;= 'z'; b3++) {</span>
+<span class="source-line-no">2174</span><span id="line-2174">          k[0] = b1;</span>
+<span class="source-line-no">2175</span><span id="line-2175">          k[1] = b2;</span>
+<span class="source-line-no">2176</span><span id="line-2176">          k[2] = b3;</span>
+<span class="source-line-no">2177</span><span id="line-2177">          Put put = new Put(k);</span>
+<span class="source-line-no">2178</span><span id="line-2178">          put.setDurability(Durability.SKIP_WAL);</span>
+<span class="source-line-no">2179</span><span id="line-2179">          put.addColumn(f, null, k);</span>
+<span class="source-line-no">2180</span><span id="line-2180">          if (r.getWAL() == null) {</span>
+<span class="source-line-no">2181</span><span id="line-2181">            put.setDurability(Durability.SKIP_WAL);</span>
+<span class="source-line-no">2182</span><span id="line-2182">          }</span>
+<span class="source-line-no">2183</span><span id="line-2183">          int preRowCount = rowCount;</span>
+<span class="source-line-no">2184</span><span id="line-2184">          int pause = 10;</span>
+<span class="source-line-no">2185</span><span id="line-2185">          int maxPause = 1000;</span>
+<span class="source-line-no">2186</span><span id="line-2186">          while (rowCount == preRowCount) {</span>
+<span class="source-line-no">2187</span><span id="line-2187">            try {</span>
+<span class="source-line-no">2188</span><span id="line-2188">              r.put(put);</span>
+<span class="source-line-no">2189</span><span id="line-2189">              rowCount++;</span>
+<span class="source-line-no">2190</span><span id="line-2190">            } catch (RegionTooBusyException e) {</span>
+<span class="source-line-no">2191</span><span id="line-2191">              pause = (pause * 2 &gt;= maxPause) ? maxPause : pause * 2;</span>
+<span class="source-line-no">2192</span><span id="line-2192">              Threads.sleep(pause);</span>
+<span class="source-line-no">2193</span><span id="line-2193">            }</span>
+<span class="source-line-no">2194</span><span id="line-2194">          }</span>
+<span class="source-line-no">2195</span><span id="line-2195">        }</span>
+<span class="source-line-no">2196</span><span id="line-2196">      }</span>
+<span class="source-line-no">2197</span><span id="line-2197">      if (flush) {</span>
+<span class="source-line-no">2198</span><span id="line-2198">        r.flush(true);</span>
+<span class="source-line-no">2199</span><span id="line-2199">      }</span>
+<span class="source-line-no">2200</span><span id="line-2200">    }</span>
+<span class="source-line-no">2201</span><span id="line-2201">    return rowCount;</span>
+<span class="source-line-no">2202</span><span id="line-2202">  }</span>
+<span class="source-line-no">2203</span><span id="line-2203"></span>
+<span class="source-line-no">2204</span><span id="line-2204">  public void loadNumericRows(final Table t, final byte[] f, int startRow, int endRow)</span>
+<span class="source-line-no">2205</span><span id="line-2205">    throws IOException {</span>
+<span class="source-line-no">2206</span><span id="line-2206">    for (int i = startRow; i &lt; endRow; i++) {</span>
+<span class="source-line-no">2207</span><span id="line-2207">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
+<span class="source-line-no">2208</span><span id="line-2208">      Put put = new Put(data);</span>
+<span class="source-line-no">2209</span><span id="line-2209">      put.addColumn(f, null, data);</span>
+<span class="source-line-no">2210</span><span id="line-2210">      t.put(put);</span>
+<span class="source-line-no">2211</span><span id="line-2211">    }</span>
+<span class="source-line-no">2212</span><span id="line-2212">  }</span>
+<span class="source-line-no">2213</span><span id="line-2213"></span>
+<span class="source-line-no">2214</span><span id="line-2214">  public void loadRandomRows(final Table t, final byte[] f, int rowSize, int totalRows)</span>
+<span class="source-line-no">2215</span><span id="line-2215">    throws IOException {</span>
+<span class="source-line-no">2216</span><span id="line-2216">    byte[] row = new byte[rowSize];</span>
+<span class="source-line-no">2217</span><span id="line-2217">    for (int i = 0; i &lt; totalRows; i++) {</span>
+<span class="source-line-no">2218</span><span id="line-2218">      Bytes.random(row);</span>
+<span class="source-line-no">2219</span><span id="line-2219">      Put put = new Put(row);</span>
+<span class="source-line-no">2220</span><span id="line-2220">      put.addColumn(f, new byte[] { 0 }, new byte[] { 0 });</span>
+<span class="source-line-no">2221</span><span id="line-2221">      t.put(put);</span>
+<span class="source-line-no">2222</span><span id="line-2222">    }</span>
+<span class="source-line-no">2223</span><span id="line-2223">  }</span>
+<span class="source-line-no">2224</span><span id="line-2224"></span>
+<span class="source-line-no">2225</span><span id="line-2225">  public void verifyNumericRows(Table table, final byte[] f, int startRow, int endRow,</span>
+<span class="source-line-no">2226</span><span id="line-2226">    int replicaId) throws IOException {</span>
+<span class="source-line-no">2227</span><span id="line-2227">    for (int i = startRow; i &lt; endRow; i++) {</span>
+<span class="source-line-no">2228</span><span id="line-2228">      String failMsg = "Failed verification of row :" + i;</span>
+<span class="source-line-no">2229</span><span id="line-2229">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
+<span class="source-line-no">2230</span><span id="line-2230">      Get get = new Get(data);</span>
+<span class="source-line-no">2231</span><span id="line-2231">      get.setReplicaId(replicaId);</span>
+<span class="source-line-no">2232</span><span id="line-2232">      get.setConsistency(Consistency.TIMELINE);</span>
+<span class="source-line-no">2233</span><span id="line-2233">      Result result = table.get(get);</span>
+<span class="source-line-no">2234</span><span id="line-2234">      if (!result.containsColumn(f, null)) {</span>
+<span class="source-line-no">2235</span><span id="line-2235">        throw new AssertionError(failMsg);</span>
+<span class="source-line-no">2236</span><span id="line-2236">      }</span>
+<span class="source-line-no">2237</span><span id="line-2237">      assertEquals(failMsg, 1, result.getColumnCells(f, null).size());</span>
+<span class="source-line-no">2238</span><span id="line-2238">      Cell cell = result.getColumnLatestCell(f, null);</span>
+<span class="source-line-no">2239</span><span id="line-2239">      if (</span>
+<span class="source-line-no">2240</span><span id="line-2240">        !Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),</span>
+<span class="source-line-no">2241</span><span id="line-2241">          cell.getValueLength())</span>
+<span class="source-line-no">2242</span><span id="line-2242">      ) {</span>
+<span class="source-line-no">2243</span><span id="line-2243">        throw new AssertionError(failMsg);</span>
+<span class="source-line-no">2244</span><span id="line-2244">      }</span>
+<span class="source-line-no">2245</span><span id="line-2245">    }</span>
+<span class="source-line-no">2246</span><span id="line-2246">  }</span>
+<span class="source-line-no">2247</span><span id="line-2247"></span>
+<span class="source-line-no">2248</span><span id="line-2248">  public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow)</span>
+<span class="source-line-no">2249</span><span id="line-2249">    throws IOException {</span>
+<span class="source-line-no">2250</span><span id="line-2250">    verifyNumericRows((HRegion) region, f, startRow, endRow);</span>
+<span class="source-line-no">2251</span><span id="line-2251">  }</span>
+<span class="source-line-no">2252</span><span id="line-2252"></span>
+<span class="source-line-no">2253</span><span id="line-2253">  public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow)</span>
+<span class="source-line-no">2254</span><span id="line-2254">    throws IOException {</span>
+<span class="source-line-no">2255</span><span id="line-2255">    verifyNumericRows(region, f, startRow, endRow, true);</span>
+<span class="source-line-no">2256</span><span id="line-2256">  }</span>
+<span class="source-line-no">2257</span><span id="line-2257"></span>
+<span class="source-line-no">2258</span><span id="line-2258">  public void verifyNumericRows(Region region, final byte[] f, int startRow, int endRow,</span>
+<span class="source-line-no">2259</span><span id="line-2259">    final boolean present) throws IOException {</span>
+<span class="source-line-no">2260</span><span id="line-2260">    verifyNumericRows((HRegion) region, f, startRow, endRow, present);</span>
+<span class="source-line-no">2261</span><span id="line-2261">  }</span>
+<span class="source-line-no">2262</span><span id="line-2262"></span>
+<span class="source-line-no">2263</span><span id="line-2263">  public void verifyNumericRows(HRegion region, final byte[] f, int startRow, int endRow,</span>
+<span class="source-line-no">2264</span><span id="line-2264">    final boolean present) throws IOException {</span>
+<span class="source-line-no">2265</span><span id="line-2265">    for (int i = startRow; i &lt; endRow; i++) {</span>
+<span class="source-line-no">2266</span><span id="line-2266">      String failMsg = "Failed verification of row :" + i;</span>
+<span class="source-line-no">2267</span><span id="line-2267">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
+<span class="source-line-no">2268</span><span id="line-2268">      Result result = region.get(new Get(data));</span>
+<span class="source-line-no">2269</span><span id="line-2269"></span>
+<span class="source-line-no">2270</span><span id="line-2270">      boolean hasResult = result != null &amp;&amp; !result.isEmpty();</span>
+<span class="source-line-no">2271</span><span id="line-2271">      if (present != hasResult) {</span>
+<span class="source-line-no">2272</span><span id="line-2272">        throw new AssertionError(</span>
+<span class="source-line-no">2273</span><span id="line-2273">          failMsg + result + " expected:&lt;" + present + "&gt; but was:&lt;" + hasResult + "&gt;");</span>
 <span class="source-line-no">2274</span><span id="line-2274">      }</span>
-<span class="source-line-no">2275</span><span id="line-2275">    }</span>
-<span class="source-line-no">2276</span><span id="line-2276">  }</span>
-<span class="source-line-no">2277</span><span id="line-2277"></span>
-<span class="source-line-no">2278</span><span id="line-2278">  public void deleteNumericRows(final Table t, final byte[] f, int startRow, int endRow)</span>
-<span class="source-line-no">2279</span><span id="line-2279">    throws IOException {</span>
-<span class="source-line-no">2280</span><span id="line-2280">    for (int i = startRow; i &lt; endRow; i++) {</span>
-<span class="source-line-no">2281</span><span id="line-2281">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
-<span class="source-line-no">2282</span><span id="line-2282">      Delete delete = new Delete(data);</span>
-<span class="source-line-no">2283</span><span id="line-2283">      delete.addFamily(f);</span>
-<span class="source-line-no">2284</span><span id="line-2284">      t.delete(delete);</span>
-<span class="source-line-no">2285</span><span id="line-2285">    }</span>
-<span class="source-line-no">2286</span><span id="line-2286">  }</span>
-<span class="source-line-no">2287</span><span id="line-2287"></span>
-<span class="source-line-no">2288</span><span id="line-2288">  /**</span>
-<span class="source-line-no">2289</span><span id="line-2289">   * Return the number of rows in the given table.</span>
-<span class="source-line-no">2290</span><span id="line-2290">   * @param table to count rows</span>
-<span class="source-line-no">2291</span><span id="line-2291">   * @return count of rows</span>
-<span class="source-line-no">2292</span><span id="line-2292">   */</span>
-<span class="source-line-no">2293</span><span id="line-2293">  public static int countRows(final Table table) throws IOException {</span>
-<span class="source-line-no">2294</span><span id="line-2294">    return countRows(table, new Scan());</span>
-<span class="source-line-no">2295</span><span id="line-2295">  }</span>
-<span class="source-line-no">2296</span><span id="line-2296"></span>
-<span class="source-line-no">2297</span><span id="line-2297">  public static int countRows(final Table table, final Scan scan) throws IOException {</span>
-<span class="source-line-no">2298</span><span id="line-2298">    try (ResultScanner results = table.getScanner(scan)) {</span>
-<span class="source-line-no">2299</span><span id="line-2299">      int count = 0;</span>
-<span class="source-line-no">2300</span><span id="line-2300">      while (results.next() != null) {</span>
-<span class="source-line-no">2301</span><span id="line-2301">        count++;</span>
-<span class="source-line-no">2302</span><span id="line-2302">      }</span>
-<span class="source-line-no">2303</span><span id="line-2303">      return count;</span>
-<span class="source-line-no">2304</span><span id="line-2304">    }</span>
-<span class="source-line-no">2305</span><span id="line-2305">  }</span>
-<span class="source-line-no">2306</span><span id="line-2306"></span>
-<span class="source-line-no">2307</span><span id="line-2307">  public int countRows(final Table table, final byte[]... families) throws IOException {</span>
-<span class="source-line-no">2308</span><span id="line-2308">    Scan scan = new Scan();</span>
-<span class="source-line-no">2309</span><span id="line-2309">    for (byte[] family : families) {</span>
-<span class="source-line-no">2310</span><span id="line-2310">      scan.addFamily(family);</span>
-<span class="source-line-no">2311</span><span id="line-2311">    }</span>
-<span class="source-line-no">2312</span><span id="line-2312">    return countRows(table, scan);</span>
-<span class="source-line-no">2313</span><span id="line-2313">  }</span>
-<span class="source-line-no">2314</span><span id="line-2314"></span>
-<span class="source-line-no">2315</span><span id="line-2315">  /**</span>
-<span class="source-line-no">2316</span><span id="line-2316">   * Return the number of rows in the given table.</span>
-<span class="source-line-no">2317</span><span id="line-2317">   */</span>
-<span class="source-line-no">2318</span><span id="line-2318">  public int countRows(final TableName tableName) throws IOException {</span>
-<span class="source-line-no">2319</span><span id="line-2319">    Table table = getConnection().getTable(tableName);</span>
-<span class="source-line-no">2320</span><span id="line-2320">    try {</span>
-<span class="source-line-no">2321</span><span id="line-2321">      return countRows(table);</span>
-<span class="source-line-no">2322</span><span id="line-2322">    } finally {</span>
-<span class="source-line-no">2323</span><span id="line-2323">      table.close();</span>
+<span class="source-line-no">2275</span><span id="line-2275">      if (!present) continue;</span>
+<span class="source-line-no">2276</span><span id="line-2276"></span>
+<span class="source-line-no">2277</span><span id="line-2277">      if (!result.containsColumn(f, null)) {</span>
+<span class="source-line-no">2278</span><span id="line-2278">        throw new AssertionError(failMsg);</span>
+<span class="source-line-no">2279</span><span id="line-2279">      }</span>
+<span class="source-line-no">2280</span><span id="line-2280">      assertEquals(failMsg, 1, result.getColumnCells(f, null).size());</span>
+<span class="source-line-no">2281</span><span id="line-2281">      Cell cell = result.getColumnLatestCell(f, null);</span>
+<span class="source-line-no">2282</span><span id="line-2282">      if (</span>
+<span class="source-line-no">2283</span><span id="line-2283">        !Bytes.equals(data, 0, data.length, cell.getValueArray(), cell.getValueOffset(),</span>
+<span class="source-line-no">2284</span><span id="line-2284">          cell.getValueLength())</span>
+<span class="source-line-no">2285</span><span id="line-2285">      ) {</span>
+<span class="source-line-no">2286</span><span id="line-2286">        throw new AssertionError(failMsg);</span>
+<span class="source-line-no">2287</span><span id="line-2287">      }</span>
+<span class="source-line-no">2288</span><span id="line-2288">    }</span>
+<span class="source-line-no">2289</span><span id="line-2289">  }</span>
+<span class="source-line-no">2290</span><span id="line-2290"></span>
+<span class="source-line-no">2291</span><span id="line-2291">  public void deleteNumericRows(final Table t, final byte[] f, int startRow, int endRow)</span>
+<span class="source-line-no">2292</span><span id="line-2292">    throws IOException {</span>
+<span class="source-line-no">2293</span><span id="line-2293">    for (int i = startRow; i &lt; endRow; i++) {</span>
+<span class="source-line-no">2294</span><span id="line-2294">      byte[] data = Bytes.toBytes(String.valueOf(i));</span>
+<span class="source-line-no">2295</span><span id="line-2295">      Delete delete = new Delete(data);</span>
+<span class="source-line-no">2296</span><span id="line-2296">      delete.addFamily(f);</span>
+<span class="source-line-no">2297</span><span id="line-2297">      t.delete(delete);</span>
+<span class="source-line-no">2298</span><span id="line-2298">    }</span>
+<span class="source-line-no">2299</span><span id="line-2299">  }</span>
+<span class="source-line-no">2300</span><span id="line-2300"></span>
+<span class="source-line-no">2301</span><span id="line-2301">  /**</span>
+<span class="source-line-no">2302</span><span id="line-2302">   * Return the number of rows in the given table.</span>
+<span class="source-line-no">2303</span><span id="line-2303">   * @param table to count rows</span>
+<span class="source-line-no">2304</span><span id="line-2304">   * @return count of rows</span>
+<span class="source-line-no">2305</span><span id="line-2305">   */</span>
+<span class="source-line-no">2306</span><span id="line-2306">  public static int countRows(final Table table) throws IOException {</span>
+<span class="source-line-no">2307</span><span id="line-2307">    return countRows(table, new Scan());</span>
+<span class="source-line-no">2308</span><span id="line-2308">  }</span>
+<span class="source-line-no">2309</span><span id="line-2309"></span>
+<span class="source-line-no">2310</span><span id="line-2310">  public static int countRows(final Table table, final Scan scan) throws IOException {</span>
+<span class="source-line-no">2311</span><span id="line-2311">    try (ResultScanner results = table.getScanner(scan)) {</span>
+<span class="source-line-no">2312</span><span id="line-2312">      int count = 0;</span>
+<span class="source-line-no">2313</span><span id="line-2313">      while (results.next() != null) {</span>
+<span class="source-line-no">2314</span><span id="line-2314">        count++;</span>
+<span class="source-line-no">2315</span><span id="line-2315">      }</span>
+<span class="source-line-no">2316</span><span id="line-2316">      return count;</span>
+<span class="source-line-no">2317</span><span id="line-2317">    }</span>
+<span class="source-line-no">2318</span><span id="line-2318">  }</span>
+<span class="source-line-no">2319</span><span id="line-2319"></span>
+<span class="source-line-no">2320</span><span id="line-2320">  public int countRows(final Table table, final byte[]... families) throws IOException {</span>
+<span class="source-line-no">2321</span><span id="line-2321">    Scan scan = new Scan();</span>
+<span class="source-line-no">2322</span><span id="line-2322">    for (byte[] family : families) {</span>
+<span class="source-line-no">2323</span><span id="line-2323">      scan.addFamily(family);</span>
 <span class="source-line-no">2324</span><span id="line-2324">    }</span>
-<span class="source-line-no">2325</span><span id="line-2325">  }</span>
-<span class="source-line-no">2326</span><span id="line-2326"></span>
-<span class="source-line-no">2327</span><span id="line-2327">  public int countRows(final Region region) throws IOException {</span>
-<span class="source-line-no">2328</span><span id="line-2328">    return countRows(region, new Scan());</span>
-<span class="source-line-no">2329</span><span id="line-2329">  }</span>
-<span class="source-line-no">2330</span><span id="line-2330"></span>
-<span class="source-line-no">2331</span><span id="line-2331">  public int countRows(final Region region, final Scan scan) throws IOException {</span>
-<span class="source-line-no">2332</span><span id="line-2332">    InternalScanner scanner = region.getScanner(scan);</span>
+<span class="source-line-no">2325</span><span id="line-2325">    return countRows(table, scan);</span>
+<span class="source-line-no">2326</span><span id="line-2326">  }</span>
+<span class="source-line-no">2327</span><span id="line-2327"></span>
+<span class="source-line-no">2328</span><span id="line-2328">  /**</span>
+<span class="source-line-no">2329</span><span id="line-2329">   * Return the number of rows in the given table.</span>
+<span class="source-line-no">2330</span><span id="line-2330">   */</span>
+<span class="source-line-no">2331</span><span id="line-2331">  public int countRows(final TableName tableName) throws IOException {</span>
+<span class="source-line-no">2332</span><span id="line-2332">    Table table = getConnection().getTable(tableName);</span>
 <span class="source-line-no">2333</span><span id="line-2333">    try {</span>
-<span class="source-line-no">2334</span><span id="line-2334">      return countRows(scanner);</span>
+<span class="source-line-no">2334</span><span id="line-2334">      return countRows(table);</span>
 <span class="source-line-no">2335</span><span id="line-2335">    } finally {</span>
-<span class="source-line-no">2336</span><span id="line-2336">      scanner.close();</span>
+<span class="source-line-no">2336</span><span id="line-2336">      table.close();</span>
 <span class="source-line-no">2337</span><span id="line-2337">    }</span>
 <span class="source-line-no">2338</span><span id="line-2338">  }</span>
 <span class="source-line-no">2339</span><span id="line-2339"></span>
-<span class="source-line-no">2340</span><span id="line-2340">  public int countRows(final InternalScanner scanner) throws IOException {</span>
-<span class="source-line-no">2341</span><span id="line-2341">    int scannedCount = 0;</span>
-<span class="source-line-no">2342</span><span id="line-2342">    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">2343</span><span id="line-2343">    boolean hasMore = true;</span>
-<span class="source-line-no">2344</span><span id="line-2344">    while (hasMore) {</span>
-<span class="source-line-no">2345</span><span id="line-2345">      hasMore = scanner.next(results);</span>
-<span class="source-line-no">2346</span><span id="line-2346">      scannedCount += results.size();</span>
-<span class="source-line-no">2347</span><span id="line-2347">      results.clear();</span>
-<span class="source-line-no">2348</span><span id="line-2348">    }</span>
-<span class="source-line-no">2349</span><span id="line-2349">    return scannedCount;</span>
-<span class="source-line-no">2350</span><span id="line-2350">  }</span>
-<span class="source-line-no">2351</span><span id="line-2351"></span>
-<span class="source-line-no">2352</span><span id="line-2352">  /**</span>
-<span class="source-line-no">2353</span><span id="line-2353">   * Return an md5 digest of the entire contents of a table.</span>
-<span class="source-line-no">2354</span><span id="line-2354">   */</span>
-<span class="source-line-no">2355</span><span id="line-2355">  public String checksumRows(final Table table) throws Exception {</span>
-<span class="source-line-no">2356</span><span id="line-2356"></span>
-<span class="source-line-no">2357</span><span id="line-2357">    Scan scan = new Scan();</span>
-<span class="source-line-no">2358</span><span id="line-2358">    ResultScanner results = table.getScanner(scan);</span>
-<span class="source-line-no">2359</span><span id="line-2359">    MessageDigest digest = MessageDigest.getInstance("MD5");</span>
-<span class="source-line-no">2360</span><span id="line-2360">    for (Result res : results) {</span>
-<span class="source-line-no">2361</span><span id="line-2361">      digest.update(res.getRow());</span>
-<span class="source-line-no">2362</span><span id="line-2362">    }</span>
-<span class="source-line-no">2363</span><span id="line-2363">    results.close();</span>
-<span class="source-line-no">2364</span><span id="line-2364">    return digest.toString();</span>
-<span class="source-line-no">2365</span><span id="line-2365">  }</span>
-<span class="source-line-no">2366</span><span id="line-2366"></span>
-<span class="source-line-no">2367</span><span id="line-2367">  /** All the row values for the data loaded by {@link #loadTable(Table, byte[])} */</span>
-<span class="source-line-no">2368</span><span id="line-2368">  public static final byte[][] ROWS = new byte[(int) Math.pow('z' - 'a' + 1, 3)][3]; // ~52KB</span>
-<span class="source-line-no">2369</span><span id="line-2369">  static {</span>
-<span class="source-line-no">2370</span><span id="line-2370">    int i = 0;</span>
-<span class="source-line-no">2371</span><span id="line-2371">    for (byte b1 = 'a'; b1 &lt;= 'z'; b1++) {</span>
-<span class="source-line-no">2372</span><span id="line-2372">      for (byte b2 = 'a'; b2 &lt;= 'z'; b2++) {</span>
-<span class="source-line-no">2373</span><span id="line-2373">        for (byte b3 = 'a'; b3 &lt;= 'z'; b3++) {</span>
-<span class="source-line-no">2374</span><span id="line-2374">          ROWS[i][0] = b1;</span>
-<span class="source-line-no">2375</span><span id="line-2375">          ROWS[i][1] = b2;</span>
-<span class="source-line-no">2376</span><span id="line-2376">          ROWS[i][2] = b3;</span>
-<span class="source-line-no">2377</span><span id="line-2377">          i++;</span>
-<span class="source-line-no">2378</span><span id="line-2378">        }</span>
-<span class="source-line-no">2379</span><span id="line-2379">      }</span>
-<span class="source-line-no">2380</span><span id="line-2380">    }</span>
-<span class="source-line-no">2381</span><span id="line-2381">  }</span>
-<span class="source-line-no">2382</span><span id="line-2382"></span>
-<span class="source-line-no">2383</span><span id="line-2383">  public static final byte[][] KEYS = { HConstants.EMPTY_BYTE_ARRAY, Bytes.toBytes("bbb"),</span>
-<span class="source-line-no">2384</span><span id="line-2384">    Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"), Bytes.toBytes("fff"),</span>
-<span class="source-line-no">2385</span><span id="line-2385">    Bytes.toBytes("ggg"), Bytes.toBytes("hhh"), Bytes.toBytes("iii"), Bytes.toBytes("jjj"),</span>
-<span class="source-line-no">2386</span><span id="line-2386">    Bytes.toBytes("kkk"), Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),</span>
-<span class="source-line-no">2387</span><span id="line-2387">    Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"), Bytes.toBytes("rrr"),</span>
-<span class="source-line-no">2388</span><span id="line-2388">    Bytes.toBytes("sss"), Bytes.toBytes("ttt"), Bytes.toBytes("uuu"), Bytes.toBytes("vvv"),</span>
-<span class="source-line-no">2389</span><span id="line-2389">    Bytes.toBytes("www"), Bytes.toBytes("xxx"), Bytes.toBytes("yyy") };</span>
-<span class="source-line-no">2390</span><span id="line-2390"></span>
-<span class="source-line-no">2391</span><span id="line-2391">  public static final byte[][] KEYS_FOR_HBA_CREATE_TABLE = { Bytes.toBytes("bbb"),</span>
-<span class="source-line-no">2392</span><span id="line-2392">    Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"), Bytes.toBytes("fff"),</span>
-<span class="source-line-no">2393</span><span id="line-2393">    Bytes.toBytes("ggg"), Bytes.toBytes("hhh"), Bytes.toBytes("iii"), Bytes.toBytes("jjj"),</span>
-<span class="source-line-no">2394</span><span id="line-2394">    Bytes.toBytes("kkk"), Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),</span>
-<span class="source-line-no">2395</span><span id="line-2395">    Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"), Bytes.toBytes("rrr"),</span>
-<span class="source-line-no">2396</span><span id="line-2396">    Bytes.toBytes("sss"), Bytes.toBytes("ttt"), Bytes.toBytes("uuu"), Bytes.toBytes("vvv"),</span>
-<span class="source-line-no">2397</span><span id="line-2397">    Bytes.toBytes("www"), Bytes.toBytes("xxx"), Bytes.toBytes("yyy"), Bytes.toBytes("zzz") };</span>
-<span class="source-line-no">2398</span><span id="line-2398"></span>
-<span class="source-line-no">2399</span><span id="line-2399">  /**</span>
-<span class="source-line-no">2400</span><span id="line-2400">   * Create rows in hbase:meta for regions of the specified table with the specified start keys. The</span>
-<span class="source-line-no">2401</span><span id="line-2401">   * first startKey should be a 0 length byte array if you want to form a proper range of regions.</span>
-<span class="source-line-no">2402</span><span id="line-2402">   * @return list of region info for regions added to meta</span>
-<span class="source-line-no">2403</span><span id="line-2403">   */</span>
-<span class="source-line-no">2404</span><span id="line-2404">  public List&lt;RegionInfo&gt; createMultiRegionsInMeta(final Configuration conf,</span>
-<span class="source-line-no">2405</span><span id="line-2405">    final TableDescriptor htd, byte[][] startKeys) throws IOException {</span>
-<span class="source-line-no">2406</span><span id="line-2406">    Table meta = getConnection().getTable(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">2407</span><span id="line-2407">    Arrays.sort(startKeys, Bytes.BYTES_COMPARATOR);</span>
-<span class="source-line-no">2408</span><span id="line-2408">    List&lt;RegionInfo&gt; newRegions = new ArrayList&lt;&gt;(startKeys.length);</span>
-<span class="source-line-no">2409</span><span id="line-2409">    MetaTableAccessor.updateTableState(getConnection(), htd.getTableName(),</span>
-<span class="source-line-no">2410</span><span id="line-2410">      TableState.State.ENABLED);</span>
-<span class="source-line-no">2411</span><span id="line-2411">    // add custom ones</span>
-<span class="source-line-no">2412</span><span id="line-2412">    for (int i = 0; i &lt; startKeys.length; i++) {</span>
-<span class="source-line-no">2413</span><span id="line-2413">      int j = (i + 1) % startKeys.length;</span>
-<span class="source-line-no">2414</span><span id="line-2414">      RegionInfo hri = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(startKeys[i])</span>
-<span class="source-line-no">2415</span><span id="line-2415">        .setEndKey(startKeys[j]).build();</span>
-<span class="source-line-no">2416</span><span id="line-2416">      MetaTableAccessor.addRegionsToMeta(getConnection(), Collections.singletonList(hri), 1);</span>
-<span class="source-line-no">2417</span><span id="line-2417">      newRegions.add(hri);</span>
-<span class="source-line-no">2418</span><span id="line-2418">    }</span>
-<span class="source-line-no">2419</span><span id="line-2419"></span>
-<span class="source-line-no">2420</span><span id="line-2420">    meta.close();</span>
-<span class="source-line-no">2421</span><span id="line-2421">    return newRegions;</span>
-<span class="source-line-no">2422</span><span id="line-2422">  }</span>
-<span class="source-line-no">2423</span><span id="line-2423"></span>
-<span class="source-line-no">2424</span><span id="line-2424">  /**</span>
-<span class="source-line-no">2425</span><span id="line-2425">   * Create an unmanaged WAL. Be sure to close it when you're through.</span>
-<span class="source-line-no">2426</span><span id="line-2426">   */</span>
-<span class="source-line-no">2427</span><span id="line-2427">  public static WAL createWal(final Configuration conf, final Path rootDir, final RegionInfo hri)</span>
-<span class="source-line-no">2428</span><span id="line-2428">    throws IOException {</span>
-<span class="source-line-no">2429</span><span id="line-2429">    // The WAL subsystem will use the default rootDir rather than the passed in rootDir</span>
-<span class="source-line-no">2430</span><span id="line-2430">    // unless I pass along via the conf.</span>
-<span class="source-line-no">2431</span><span id="line-2431">    Configuration confForWAL = new Configuration(conf);</span>
-<span class="source-line-no">2432</span><span id="line-2432">    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());</span>
-<span class="source-line-no">2433</span><span id="line-2433">    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8)).getWAL(hri);</span>
-<span class="source-line-no">2434</span><span id="line-2434">  }</span>
-<span class="source-line-no">2435</span><span id="line-2435"></span>
-<span class="source-line-no">2436</span><span id="line-2436">  /**</span>
-<span class="source-line-no">2437</span><span id="line-2437">   * Create a region with it's own WAL. Be sure to call</span>
-<span class="source-line-no">2438</span><span id="line-2438">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
+<span class="source-line-no">2340</span><span id="line-2340">  public int countRows(final Region region) throws IOException {</span>
+<span class="source-line-no">2341</span><span id="line-2341">    return countRows(region, new Scan());</span>
+<span class="source-line-no">2342</span><span id="line-2342">  }</span>
+<span class="source-line-no">2343</span><span id="line-2343"></span>
+<span class="source-line-no">2344</span><span id="line-2344">  public int countRows(final Region region, final Scan scan) throws IOException {</span>
+<span class="source-line-no">2345</span><span id="line-2345">    InternalScanner scanner = region.getScanner(scan);</span>
+<span class="source-line-no">2346</span><span id="line-2346">    try {</span>
+<span class="source-line-no">2347</span><span id="line-2347">      return countRows(scanner);</span>
+<span class="source-line-no">2348</span><span id="line-2348">    } finally {</span>
+<span class="source-line-no">2349</span><span id="line-2349">      scanner.close();</span>
+<span class="source-line-no">2350</span><span id="line-2350">    }</span>
+<span class="source-line-no">2351</span><span id="line-2351">  }</span>
+<span class="source-line-no">2352</span><span id="line-2352"></span>
+<span class="source-line-no">2353</span><span id="line-2353">  public int countRows(final InternalScanner scanner) throws IOException {</span>
+<span class="source-line-no">2354</span><span id="line-2354">    int scannedCount = 0;</span>
+<span class="source-line-no">2355</span><span id="line-2355">    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">2356</span><span id="line-2356">    boolean hasMore = true;</span>
+<span class="source-line-no">2357</span><span id="line-2357">    while (hasMore) {</span>
+<span class="source-line-no">2358</span><span id="line-2358">      hasMore = scanner.next(results);</span>
+<span class="source-line-no">2359</span><span id="line-2359">      scannedCount += results.size();</span>
+<span class="source-line-no">2360</span><span id="line-2360">      results.clear();</span>
+<span class="source-line-no">2361</span><span id="line-2361">    }</span>
+<span class="source-line-no">2362</span><span id="line-2362">    return scannedCount;</span>
+<span class="source-line-no">2363</span><span id="line-2363">  }</span>
+<span class="source-line-no">2364</span><span id="line-2364"></span>
+<span class="source-line-no">2365</span><span id="line-2365">  /**</span>
+<span class="source-line-no">2366</span><span id="line-2366">   * Return an md5 digest of the entire contents of a table.</span>
+<span class="source-line-no">2367</span><span id="line-2367">   */</span>
+<span class="source-line-no">2368</span><span id="line-2368">  public String checksumRows(final Table table) throws Exception {</span>
+<span class="source-line-no">2369</span><span id="line-2369"></span>
+<span class="source-line-no">2370</span><span id="line-2370">    Scan scan = new Scan();</span>
+<span class="source-line-no">2371</span><span id="line-2371">    ResultScanner results = table.getScanner(scan);</span>
+<span class="source-line-no">2372</span><span id="line-2372">    MessageDigest digest = MessageDigest.getInstance("MD5");</span>
+<span class="source-line-no">2373</span><span id="line-2373">    for (Result res : results) {</span>
+<span class="source-line-no">2374</span><span id="line-2374">      digest.update(res.getRow());</span>
+<span class="source-line-no">2375</span><span id="line-2375">    }</span>
+<span class="source-line-no">2376</span><span id="line-2376">    results.close();</span>
+<span class="source-line-no">2377</span><span id="line-2377">    return digest.toString();</span>
+<span class="source-line-no">2378</span><span id="line-2378">  }</span>
+<span class="source-line-no">2379</span><span id="line-2379"></span>
+<span class="source-line-no">2380</span><span id="line-2380">  /** All the row values for the data loaded by {@link #loadTable(Table, byte[])} */</span>
+<span class="source-line-no">2381</span><span id="line-2381">  public static final byte[][] ROWS = new byte[(int) Math.pow('z' - 'a' + 1, 3)][3]; // ~52KB</span>
+<span class="source-line-no">2382</span><span id="line-2382">  static {</span>
+<span class="source-line-no">2383</span><span id="line-2383">    int i = 0;</span>
+<span class="source-line-no">2384</span><span id="line-2384">    for (byte b1 = 'a'; b1 &lt;= 'z'; b1++) {</span>
+<span class="source-line-no">2385</span><span id="line-2385">      for (byte b2 = 'a'; b2 &lt;= 'z'; b2++) {</span>
+<span class="source-line-no">2386</span><span id="line-2386">        for (byte b3 = 'a'; b3 &lt;= 'z'; b3++) {</span>
+<span class="source-line-no">2387</span><span id="line-2387">          ROWS[i][0] = b1;</span>
+<span class="source-line-no">2388</span><span id="line-2388">          ROWS[i][1] = b2;</span>
+<span class="source-line-no">2389</span><span id="line-2389">          ROWS[i][2] = b3;</span>
+<span class="source-line-no">2390</span><span id="line-2390">          i++;</span>
+<span class="source-line-no">2391</span><span id="line-2391">        }</span>
+<span class="source-line-no">2392</span><span id="line-2392">      }</span>
+<span class="source-line-no">2393</span><span id="line-2393">    }</span>
+<span class="source-line-no">2394</span><span id="line-2394">  }</span>
+<span class="source-line-no">2395</span><span id="line-2395"></span>
+<span class="source-line-no">2396</span><span id="line-2396">  public static final byte[][] KEYS = { HConstants.EMPTY_BYTE_ARRAY, Bytes.toBytes("bbb"),</span>
+<span class="source-line-no">2397</span><span id="line-2397">    Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"), Bytes.toBytes("fff"),</span>
+<span class="source-line-no">2398</span><span id="line-2398">    Bytes.toBytes("ggg"), Bytes.toBytes("hhh"), Bytes.toBytes("iii"), Bytes.toBytes("jjj"),</span>
+<span class="source-line-no">2399</span><span id="line-2399">    Bytes.toBytes("kkk"), Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),</span>
+<span class="source-line-no">2400</span><span id="line-2400">    Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"), Bytes.toBytes("rrr"),</span>
+<span class="source-line-no">2401</span><span id="line-2401">    Bytes.toBytes("sss"), Bytes.toBytes("ttt"), Bytes.toBytes("uuu"), Bytes.toBytes("vvv"),</span>
+<span class="source-line-no">2402</span><span id="line-2402">    Bytes.toBytes("www"), Bytes.toBytes("xxx"), Bytes.toBytes("yyy") };</span>
+<span class="source-line-no">2403</span><span id="line-2403"></span>
+<span class="source-line-no">2404</span><span id="line-2404">  public static final byte[][] KEYS_FOR_HBA_CREATE_TABLE = { Bytes.toBytes("bbb"),</span>
+<span class="source-line-no">2405</span><span id="line-2405">    Bytes.toBytes("ccc"), Bytes.toBytes("ddd"), Bytes.toBytes("eee"), Bytes.toBytes("fff"),</span>
+<span class="source-line-no">2406</span><span id="line-2406">    Bytes.toBytes("ggg"), Bytes.toBytes("hhh"), Bytes.toBytes("iii"), Bytes.toBytes("jjj"),</span>
+<span class="source-line-no">2407</span><span id="line-2407">    Bytes.toBytes("kkk"), Bytes.toBytes("lll"), Bytes.toBytes("mmm"), Bytes.toBytes("nnn"),</span>
+<span class="source-line-no">2408</span><span id="line-2408">    Bytes.toBytes("ooo"), Bytes.toBytes("ppp"), Bytes.toBytes("qqq"), Bytes.toBytes("rrr"),</span>
+<span class="source-line-no">2409</span><span id="line-2409">    Bytes.toBytes("sss"), Bytes.toBytes("ttt"), Bytes.toBytes("uuu"), Bytes.toBytes("vvv"),</span>
+<span class="source-line-no">2410</span><span id="line-2410">    Bytes.toBytes("www"), Bytes.toBytes("xxx"), Bytes.toBytes("yyy"), Bytes.toBytes("zzz") };</span>
+<span class="source-line-no">2411</span><span id="line-2411"></span>
+<span class="source-line-no">2412</span><span id="line-2412">  /**</span>
+<span class="source-line-no">2413</span><span id="line-2413">   * Create rows in hbase:meta for regions of the specified table with the specified start keys. The</span>
+<span class="source-line-no">2414</span><span id="line-2414">   * first startKey should be a 0 length byte array if you want to form a proper range of regions.</span>
+<span class="source-line-no">2415</span><span id="line-2415">   * @return list of region info for regions added to meta</span>
+<span class="source-line-no">2416</span><span id="line-2416">   */</span>
+<span class="source-line-no">2417</span><span id="line-2417">  public List&lt;RegionInfo&gt; createMultiRegionsInMeta(final Configuration conf,</span>
+<span class="source-line-no">2418</span><span id="line-2418">    final TableDescriptor htd, byte[][] startKeys) throws IOException {</span>
+<span class="source-line-no">2419</span><span id="line-2419">    Table meta = getConnection().getTable(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">2420</span><span id="line-2420">    Arrays.sort(startKeys, Bytes.BYTES_COMPARATOR);</span>
+<span class="source-line-no">2421</span><span id="line-2421">    List&lt;RegionInfo&gt; newRegions = new ArrayList&lt;&gt;(startKeys.length);</span>
+<span class="source-line-no">2422</span><span id="line-2422">    MetaTableAccessor.updateTableState(getConnection(), htd.getTableName(),</span>
+<span class="source-line-no">2423</span><span id="line-2423">      TableState.State.ENABLED);</span>
+<span class="source-line-no">2424</span><span id="line-2424">    // add custom ones</span>
+<span class="source-line-no">2425</span><span id="line-2425">    for (int i = 0; i &lt; startKeys.length; i++) {</span>
+<span class="source-line-no">2426</span><span id="line-2426">      int j = (i + 1) % startKeys.length;</span>
+<span class="source-line-no">2427</span><span id="line-2427">      RegionInfo hri = RegionInfoBuilder.newBuilder(htd.getTableName()).setStartKey(startKeys[i])</span>
+<span class="source-line-no">2428</span><span id="line-2428">        .setEndKey(startKeys[j]).build();</span>
+<span class="source-line-no">2429</span><span id="line-2429">      MetaTableAccessor.addRegionsToMeta(getConnection(), Collections.singletonList(hri), 1);</span>
+<span class="source-line-no">2430</span><span id="line-2430">      newRegions.add(hri);</span>
+<span class="source-line-no">2431</span><span id="line-2431">    }</span>
+<span class="source-line-no">2432</span><span id="line-2432"></span>
+<span class="source-line-no">2433</span><span id="line-2433">    meta.close();</span>
+<span class="source-line-no">2434</span><span id="line-2434">    return newRegions;</span>
+<span class="source-line-no">2435</span><span id="line-2435">  }</span>
+<span class="source-line-no">2436</span><span id="line-2436"></span>
+<span class="source-line-no">2437</span><span id="line-2437">  /**</span>
+<span class="source-line-no">2438</span><span id="line-2438">   * Create an unmanaged WAL. Be sure to close it when you're through.</span>
 <span class="source-line-no">2439</span><span id="line-2439">   */</span>
-<span class="source-line-no">2440</span><span id="line-2440">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">2441</span><span id="line-2441">    final Configuration conf, final TableDescriptor htd) throws IOException {</span>
-<span class="source-line-no">2442</span><span id="line-2442">    return createRegionAndWAL(info, rootDir, conf, htd, true);</span>
-<span class="source-line-no">2443</span><span id="line-2443">  }</span>
-<span class="source-line-no">2444</span><span id="line-2444"></span>
-<span class="source-line-no">2445</span><span id="line-2445">  /**</span>
-<span class="source-line-no">2446</span><span id="line-2446">   * Create a region with it's own WAL. Be sure to call</span>
-<span class="source-line-no">2447</span><span id="line-2447">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
-<span class="source-line-no">2448</span><span id="line-2448">   */</span>
-<span class="source-line-no">2449</span><span id="line-2449">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">2450</span><span id="line-2450">    final Configuration conf, final TableDescriptor htd, BlockCache blockCache) throws IOException {</span>
-<span class="source-line-no">2451</span><span id="line-2451">    HRegion region = createRegionAndWAL(info, rootDir, conf, htd, false);</span>
-<span class="source-line-no">2452</span><span id="line-2452">    region.setBlockCache(blockCache);</span>
-<span class="source-line-no">2453</span><span id="line-2453">    region.initialize();</span>
-<span class="source-line-no">2454</span><span id="line-2454">    return region;</span>
-<span class="source-line-no">2455</span><span id="line-2455">  }</span>
-<span class="source-line-no">2456</span><span id="line-2456"></span>
-<span class="source-line-no">2457</span><span id="line-2457">  /**</span>
-<span class="source-line-no">2458</span><span id="line-2458">   * Create a region with it's own WAL. Be sure to call</span>
-<span class="source-line-no">2459</span><span id="line-2459">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
-<span class="source-line-no">2460</span><span id="line-2460">   */</span>
-<span class="source-line-no">2461</span><span id="line-2461">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">2462</span><span id="line-2462">    final Configuration conf, final TableDescriptor htd, MobFileCache mobFileCache)</span>
-<span class="source-line-no">2463</span><span id="line-2463">    throws IOException {</span>
+<span class="source-line-no">2440</span><span id="line-2440">  public static WAL createWal(final Configuration conf, final Path rootDir, final RegionInfo hri)</span>
+<span class="source-line-no">2441</span><span id="line-2441">    throws IOException {</span>
+<span class="source-line-no">2442</span><span id="line-2442">    // The WAL subsystem will use the default rootDir rather than the passed in rootDir</span>
+<span class="source-line-no">2443</span><span id="line-2443">    // unless I pass along via the conf.</span>
+<span class="source-line-no">2444</span><span id="line-2444">    Configuration confForWAL = new Configuration(conf);</span>
+<span class="source-line-no">2445</span><span id="line-2445">    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());</span>
+<span class="source-line-no">2446</span><span id="line-2446">    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8)).getWAL(hri);</span>
+<span class="source-line-no">2447</span><span id="line-2447">  }</span>
+<span class="source-line-no">2448</span><span id="line-2448"></span>
+<span class="source-line-no">2449</span><span id="line-2449">  /**</span>
+<span class="source-line-no">2450</span><span id="line-2450">   * Create a region with it's own WAL. Be sure to call</span>
+<span class="source-line-no">2451</span><span id="line-2451">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
+<span class="source-line-no">2452</span><span id="line-2452">   */</span>
+<span class="source-line-no">2453</span><span id="line-2453">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
+<span class="source-line-no">2454</span><span id="line-2454">    final Configuration conf, final TableDescriptor htd) throws IOException {</span>
+<span class="source-line-no">2455</span><span id="line-2455">    return createRegionAndWAL(info, rootDir, conf, htd, true);</span>
+<span class="source-line-no">2456</span><span id="line-2456">  }</span>
+<span class="source-line-no">2457</span><span id="line-2457"></span>
+<span class="source-line-no">2458</span><span id="line-2458">  /**</span>
+<span class="source-line-no">2459</span><span id="line-2459">   * Create a region with it's own WAL. Be sure to call</span>
+<span class="source-line-no">2460</span><span id="line-2460">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
+<span class="source-line-no">2461</span><span id="line-2461">   */</span>
+<span class="source-line-no">2462</span><span id="line-2462">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
+<span class="source-line-no">2463</span><span id="line-2463">    final Configuration conf, final TableDescriptor htd, BlockCache blockCache) throws IOException {</span>
 <span class="source-line-no">2464</span><span id="line-2464">    HRegion region = createRegionAndWAL(info, rootDir, conf, htd, false);</span>
-<span class="source-line-no">2465</span><span id="line-2465">    region.setMobFileCache(mobFileCache);</span>
+<span class="source-line-no">2465</span><span id="line-2465">    region.setBlockCache(blockCache);</span>
 <span class="source-line-no">2466</span><span id="line-2466">    region.initialize();</span>
 <span class="source-line-no">2467</span><span id="line-2467">    return region;</span>
 <span class="source-line-no">2468</span><span id="line-2468">  }</span>
@@ -2485,1728 +2485,1741 @@
 <span class="source-line-no">2472</span><span id="line-2472">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
 <span class="source-line-no">2473</span><span id="line-2473">   */</span>
 <span class="source-line-no">2474</span><span id="line-2474">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
-<span class="source-line-no">2475</span><span id="line-2475">    final Configuration conf, final TableDescriptor htd, boolean initialize) throws IOException {</span>
-<span class="source-line-no">2476</span><span id="line-2476">    ChunkCreator.initialize(MemStoreLAB.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null,</span>
-<span class="source-line-no">2477</span><span id="line-2477">      MemStoreLAB.INDEX_CHUNK_SIZE_PERCENTAGE_DEFAULT);</span>
-<span class="source-line-no">2478</span><span id="line-2478">    WAL wal = createWal(conf, rootDir, info);</span>
-<span class="source-line-no">2479</span><span id="line-2479">    return HRegion.createHRegion(info, rootDir, conf, htd, wal, initialize);</span>
-<span class="source-line-no">2480</span><span id="line-2480">  }</span>
-<span class="source-line-no">2481</span><span id="line-2481"></span>
-<span class="source-line-no">2482</span><span id="line-2482">  /**</span>
-<span class="source-line-no">2483</span><span id="line-2483">   * Returns all rows from the hbase:meta table.</span>
-<span class="source-line-no">2484</span><span id="line-2484">   * @throws IOException When reading the rows fails.</span>
-<span class="source-line-no">2485</span><span id="line-2485">   */</span>
-<span class="source-line-no">2486</span><span id="line-2486">  public List&lt;byte[]&gt; getMetaTableRows() throws IOException {</span>
-<span class="source-line-no">2487</span><span id="line-2487">    // TODO: Redo using MetaTableAccessor class</span>
-<span class="source-line-no">2488</span><span id="line-2488">    Table t = getConnection().getTable(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">2489</span><span id="line-2489">    List&lt;byte[]&gt; rows = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">2490</span><span id="line-2490">    ResultScanner s = t.getScanner(new Scan());</span>
-<span class="source-line-no">2491</span><span id="line-2491">    for (Result result : s) {</span>
-<span class="source-line-no">2492</span><span id="line-2492">      LOG.info("getMetaTableRows: row -&gt; " + Bytes.toStringBinary(result.getRow()));</span>
-<span class="source-line-no">2493</span><span id="line-2493">      rows.add(result.getRow());</span>
-<span class="source-line-no">2494</span><span id="line-2494">    }</span>
-<span class="source-line-no">2495</span><span id="line-2495">    s.close();</span>
-<span class="source-line-no">2496</span><span id="line-2496">    t.close();</span>
-<span class="source-line-no">2497</span><span id="line-2497">    return rows;</span>
-<span class="source-line-no">2498</span><span id="line-2498">  }</span>
-<span class="source-line-no">2499</span><span id="line-2499"></span>
-<span class="source-line-no">2500</span><span id="line-2500">  /**</span>
-<span class="source-line-no">2501</span><span id="line-2501">   * Returns all rows from the hbase:meta table for a given user table</span>
-<span class="source-line-no">2502</span><span id="line-2502">   * @throws IOException When reading the rows fails.</span>
-<span class="source-line-no">2503</span><span id="line-2503">   */</span>
-<span class="source-line-no">2504</span><span id="line-2504">  public List&lt;byte[]&gt; getMetaTableRows(TableName tableName) throws IOException {</span>
-<span class="source-line-no">2505</span><span id="line-2505">    // TODO: Redo using MetaTableAccessor.</span>
-<span class="source-line-no">2506</span><span id="line-2506">    Table t = getConnection().getTable(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">2507</span><span id="line-2507">    List&lt;byte[]&gt; rows = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">2508</span><span id="line-2508">    ResultScanner s = t.getScanner(new Scan());</span>
-<span class="source-line-no">2509</span><span id="line-2509">    for (Result result : s) {</span>
-<span class="source-line-no">2510</span><span id="line-2510">      RegionInfo info = CatalogFamilyFormat.getRegionInfo(result);</span>
-<span class="source-line-no">2511</span><span id="line-2511">      if (info == null) {</span>
-<span class="source-line-no">2512</span><span id="line-2512">        LOG.error("No region info for row " + Bytes.toString(result.getRow()));</span>
-<span class="source-line-no">2513</span><span id="line-2513">        // TODO figure out what to do for this new hosed case.</span>
-<span class="source-line-no">2514</span><span id="line-2514">        continue;</span>
-<span class="source-line-no">2515</span><span id="line-2515">      }</span>
-<span class="source-line-no">2516</span><span id="line-2516"></span>
-<span class="source-line-no">2517</span><span id="line-2517">      if (info.getTable().equals(tableName)) {</span>
-<span class="source-line-no">2518</span><span id="line-2518">        LOG.info("getMetaTableRows: row -&gt; " + Bytes.toStringBinary(result.getRow()) + info);</span>
-<span class="source-line-no">2519</span><span id="line-2519">        rows.add(result.getRow());</span>
-<span class="source-line-no">2520</span><span id="line-2520">      }</span>
-<span class="source-line-no">2521</span><span id="line-2521">    }</span>
-<span class="source-line-no">2522</span><span id="line-2522">    s.close();</span>
-<span class="source-line-no">2523</span><span id="line-2523">    t.close();</span>
-<span class="source-line-no">2524</span><span id="line-2524">    return rows;</span>
-<span class="source-line-no">2525</span><span id="line-2525">  }</span>
-<span class="source-line-no">2526</span><span id="line-2526"></span>
-<span class="source-line-no">2527</span><span id="line-2527">  /**</span>
-<span class="source-line-no">2528</span><span id="line-2528">   * Returns all regions of the specified table</span>
-<span class="source-line-no">2529</span><span id="line-2529">   * @param tableName the table name</span>
-<span class="source-line-no">2530</span><span id="line-2530">   * @return all regions of the specified table</span>
-<span class="source-line-no">2531</span><span id="line-2531">   * @throws IOException when getting the regions fails.</span>
-<span class="source-line-no">2532</span><span id="line-2532">   */</span>
-<span class="source-line-no">2533</span><span id="line-2533">  private List&lt;RegionInfo&gt; getRegions(TableName tableName) throws IOException {</span>
-<span class="source-line-no">2534</span><span id="line-2534">    try (Admin admin = getConnection().getAdmin()) {</span>
-<span class="source-line-no">2535</span><span id="line-2535">      return admin.getRegions(tableName);</span>
-<span class="source-line-no">2536</span><span id="line-2536">    }</span>
-<span class="source-line-no">2537</span><span id="line-2537">  }</span>
-<span class="source-line-no">2538</span><span id="line-2538"></span>
-<span class="source-line-no">2539</span><span id="line-2539">  /**</span>
-<span class="source-line-no">2540</span><span id="line-2540">   * Find any other region server which is different from the one identified by parameter</span>
-<span class="source-line-no">2541</span><span id="line-2541">   * @return another region server</span>
-<span class="source-line-no">2542</span><span id="line-2542">   */</span>
-<span class="source-line-no">2543</span><span id="line-2543">  public HRegionServer getOtherRegionServer(HRegionServer rs) {</span>
-<span class="source-line-no">2544</span><span id="line-2544">    for (JVMClusterUtil.RegionServerThread rst : getMiniHBaseCluster().getRegionServerThreads()) {</span>
-<span class="source-line-no">2545</span><span id="line-2545">      if (!(rst.getRegionServer() == rs)) {</span>
-<span class="source-line-no">2546</span><span id="line-2546">        return rst.getRegionServer();</span>
-<span class="source-line-no">2547</span><span id="line-2547">      }</span>
-<span class="source-line-no">2548</span><span id="line-2548">    }</span>
-<span class="source-line-no">2549</span><span id="line-2549">    return null;</span>
+<span class="source-line-no">2475</span><span id="line-2475">    final Configuration conf, final TableDescriptor htd, MobFileCache mobFileCache)</span>
+<span class="source-line-no">2476</span><span id="line-2476">    throws IOException {</span>
+<span class="source-line-no">2477</span><span id="line-2477">    HRegion region = createRegionAndWAL(info, rootDir, conf, htd, false);</span>
+<span class="source-line-no">2478</span><span id="line-2478">    region.setMobFileCache(mobFileCache);</span>
+<span class="source-line-no">2479</span><span id="line-2479">    region.initialize();</span>
+<span class="source-line-no">2480</span><span id="line-2480">    return region;</span>
+<span class="source-line-no">2481</span><span id="line-2481">  }</span>
+<span class="source-line-no">2482</span><span id="line-2482"></span>
+<span class="source-line-no">2483</span><span id="line-2483">  /**</span>
+<span class="source-line-no">2484</span><span id="line-2484">   * Create a region with it's own WAL. Be sure to call</span>
+<span class="source-line-no">2485</span><span id="line-2485">   * {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} to clean up all resources.</span>
+<span class="source-line-no">2486</span><span id="line-2486">   */</span>
+<span class="source-line-no">2487</span><span id="line-2487">  public static HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir,</span>
+<span class="source-line-no">2488</span><span id="line-2488">    final Configuration conf, final TableDescriptor htd, boolean initialize) throws IOException {</span>
+<span class="source-line-no">2489</span><span id="line-2489">    ChunkCreator.initialize(MemStoreLAB.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null,</span>
+<span class="source-line-no">2490</span><span id="line-2490">      MemStoreLAB.INDEX_CHUNK_SIZE_PERCENTAGE_DEFAULT);</span>
+<span class="source-line-no">2491</span><span id="line-2491">    WAL wal = createWal(conf, rootDir, info);</span>
+<span class="source-line-no">2492</span><span id="line-2492">    return HRegion.createHRegion(info, rootDir, conf, htd, wal, initialize);</span>
+<span class="source-line-no">2493</span><span id="line-2493">  }</span>
+<span class="source-line-no">2494</span><span id="line-2494"></span>
+<span class="source-line-no">2495</span><span id="line-2495">  /**</span>
+<span class="source-line-no">2496</span><span id="line-2496">   * Returns all rows from the hbase:meta table.</span>
+<span class="source-line-no">2497</span><span id="line-2497">   * @throws IOException When reading the rows fails.</span>
+<span class="source-line-no">2498</span><span id="line-2498">   */</span>
+<span class="source-line-no">2499</span><span id="line-2499">  public List&lt;byte[]&gt; getMetaTableRows() throws IOException {</span>
+<span class="source-line-no">2500</span><span id="line-2500">    // TODO: Redo using MetaTableAccessor class</span>
+<span class="source-line-no">2501</span><span id="line-2501">    Table t = getConnection().getTable(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">2502</span><span id="line-2502">    List&lt;byte[]&gt; rows = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">2503</span><span id="line-2503">    ResultScanner s = t.getScanner(new Scan());</span>
+<span class="source-line-no">2504</span><span id="line-2504">    for (Result result : s) {</span>
+<span class="source-line-no">2505</span><span id="line-2505">      LOG.info("getMetaTableRows: row -&gt; " + Bytes.toStringBinary(result.getRow()));</span>
+<span class="source-line-no">2506</span><span id="line-2506">      rows.add(result.getRow());</span>
+<span class="source-line-no">2507</span><span id="line-2507">    }</span>
+<span class="source-line-no">2508</span><span id="line-2508">    s.close();</span>
+<span class="source-line-no">2509</span><span id="line-2509">    t.close();</span>
+<span class="source-line-no">2510</span><span id="line-2510">    return rows;</span>
+<span class="source-line-no">2511</span><span id="line-2511">  }</span>
+<span class="source-line-no">2512</span><span id="line-2512"></span>
+<span class="source-line-no">2513</span><span id="line-2513">  /**</span>
+<span class="source-line-no">2514</span><span id="line-2514">   * Returns all rows from the hbase:meta table for a given user table</span>
+<span class="source-line-no">2515</span><span id="line-2515">   * @throws IOException When reading the rows fails.</span>
+<span class="source-line-no">2516</span><span id="line-2516">   */</span>
+<span class="source-line-no">2517</span><span id="line-2517">  public List&lt;byte[]&gt; getMetaTableRows(TableName tableName) throws IOException {</span>
+<span class="source-line-no">2518</span><span id="line-2518">    // TODO: Redo using MetaTableAccessor.</span>
+<span class="source-line-no">2519</span><span id="line-2519">    Table t = getConnection().getTable(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">2520</span><span id="line-2520">    List&lt;byte[]&gt; rows = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">2521</span><span id="line-2521">    ResultScanner s = t.getScanner(new Scan());</span>
+<span class="source-line-no">2522</span><span id="line-2522">    for (Result result : s) {</span>
+<span class="source-line-no">2523</span><span id="line-2523">      RegionInfo info = CatalogFamilyFormat.getRegionInfo(result);</span>
+<span class="source-line-no">2524</span><span id="line-2524">      if (info == null) {</span>
+<span class="source-line-no">2525</span><span id="line-2525">        LOG.error("No region info for row " + Bytes.toString(result.getRow()));</span>
+<span class="source-line-no">2526</span><span id="line-2526">        // TODO figure out what to do for this new hosed case.</span>
+<span class="source-line-no">2527</span><span id="line-2527">        continue;</span>
+<span class="source-line-no">2528</span><span id="line-2528">      }</span>
+<span class="source-line-no">2529</span><span id="line-2529"></span>
+<span class="source-line-no">2530</span><span id="line-2530">      if (info.getTable().equals(tableName)) {</span>
+<span class="source-line-no">2531</span><span id="line-2531">        LOG.info("getMetaTableRows: row -&gt; " + Bytes.toStringBinary(result.getRow()) + info);</span>
+<span class="source-line-no">2532</span><span id="line-2532">        rows.add(result.getRow());</span>
+<span class="source-line-no">2533</span><span id="line-2533">      }</span>
+<span class="source-line-no">2534</span><span id="line-2534">    }</span>
+<span class="source-line-no">2535</span><span id="line-2535">    s.close();</span>
+<span class="source-line-no">2536</span><span id="line-2536">    t.close();</span>
+<span class="source-line-no">2537</span><span id="line-2537">    return rows;</span>
+<span class="source-line-no">2538</span><span id="line-2538">  }</span>
+<span class="source-line-no">2539</span><span id="line-2539"></span>
+<span class="source-line-no">2540</span><span id="line-2540">  /**</span>
+<span class="source-line-no">2541</span><span id="line-2541">   * Returns all regions of the specified table</span>
+<span class="source-line-no">2542</span><span id="line-2542">   * @param tableName the table name</span>
+<span class="source-line-no">2543</span><span id="line-2543">   * @return all regions of the specified table</span>
+<span class="source-line-no">2544</span><span id="line-2544">   * @throws IOException when getting the regions fails.</span>
+<span class="source-line-no">2545</span><span id="line-2545">   */</span>
+<span class="source-line-no">2546</span><span id="line-2546">  private List&lt;RegionInfo&gt; getRegions(TableName tableName) throws IOException {</span>
+<span class="source-line-no">2547</span><span id="line-2547">    try (Admin admin = getConnection().getAdmin()) {</span>
+<span class="source-line-no">2548</span><span id="line-2548">      return admin.getRegions(tableName);</span>
+<span class="source-line-no">2549</span><span id="line-2549">    }</span>
 <span class="source-line-no">2550</span><span id="line-2550">  }</span>
 <span class="source-line-no">2551</span><span id="line-2551"></span>
 <span class="source-line-no">2552</span><span id="line-2552">  /**</span>
-<span class="source-line-no">2553</span><span id="line-2553">   * Tool to get the reference to the region server object that holds the region of the specified</span>
-<span class="source-line-no">2554</span><span id="line-2554">   * user table.</span>
-<span class="source-line-no">2555</span><span id="line-2555">   * @param tableName user table to lookup in hbase:meta</span>
-<span class="source-line-no">2556</span><span id="line-2556">   * @return region server that holds it, null if the row doesn't exist</span>
-<span class="source-line-no">2557</span><span id="line-2557">   */</span>
-<span class="source-line-no">2558</span><span id="line-2558">  public HRegionServer getRSForFirstRegionInTable(TableName tableName)</span>
-<span class="source-line-no">2559</span><span id="line-2559">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">2560</span><span id="line-2560">    List&lt;RegionInfo&gt; regions = getRegions(tableName);</span>
-<span class="source-line-no">2561</span><span id="line-2561">    if (regions == null || regions.isEmpty()) {</span>
-<span class="source-line-no">2562</span><span id="line-2562">      return null;</span>
-<span class="source-line-no">2563</span><span id="line-2563">    }</span>
-<span class="source-line-no">2564</span><span id="line-2564">    LOG.debug("Found " + regions.size() + " regions for table " + tableName);</span>
-<span class="source-line-no">2565</span><span id="line-2565"></span>
-<span class="source-line-no">2566</span><span id="line-2566">    byte[] firstRegionName =</span>
-<span class="source-line-no">2567</span><span id="line-2567">      regions.stream().filter(r -&gt; !r.isOffline()).map(RegionInfo::getRegionName).findFirst()</span>
-<span class="source-line-no">2568</span><span id="line-2568">        .orElseThrow(() -&gt; new IOException("online regions not found in table " + tableName));</span>
-<span class="source-line-no">2569</span><span id="line-2569"></span>
-<span class="source-line-no">2570</span><span id="line-2570">    LOG.debug("firstRegionName=" + Bytes.toString(firstRegionName));</span>
-<span class="source-line-no">2571</span><span id="line-2571">    long pause = getConfiguration().getLong(HConstants.HBASE_CLIENT_PAUSE,</span>
-<span class="source-line-no">2572</span><span id="line-2572">      HConstants.DEFAULT_HBASE_CLIENT_PAUSE);</span>
-<span class="source-line-no">2573</span><span id="line-2573">    int numRetries = getConfiguration().getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,</span>
-<span class="source-line-no">2574</span><span id="line-2574">      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);</span>
-<span class="source-line-no">2575</span><span id="line-2575">    RetryCounter retrier = new RetryCounter(numRetries + 1, (int) pause, TimeUnit.MICROSECONDS);</span>
-<span class="source-line-no">2576</span><span id="line-2576">    while (retrier.shouldRetry()) {</span>
-<span class="source-line-no">2577</span><span id="line-2577">      int index = getMiniHBaseCluster().getServerWith(firstRegionName);</span>
-<span class="source-line-no">2578</span><span id="line-2578">      if (index != -1) {</span>
-<span class="source-line-no">2579</span><span id="line-2579">        return getMiniHBaseCluster().getRegionServerThreads().get(index).getRegionServer();</span>
-<span class="source-line-no">2580</span><span id="line-2580">      }</span>
-<span class="source-line-no">2581</span><span id="line-2581">      // Came back -1. Region may not be online yet. Sleep a while.</span>
-<span class="source-line-no">2582</span><span id="line-2582">      retrier.sleepUntilNextRetry();</span>
-<span class="source-line-no">2583</span><span id="line-2583">    }</span>
-<span class="source-line-no">2584</span><span id="line-2584">    return null;</span>
-<span class="source-line-no">2585</span><span id="line-2585">  }</span>
-<span class="source-line-no">2586</span><span id="line-2586"></span>
-<span class="source-line-no">2587</span><span id="line-2587">  /**</span>
-<span class="source-line-no">2588</span><span id="line-2588">   * Starts a &lt;code&gt;MiniMRCluster&lt;/code&gt; with a default number of &lt;code&gt;TaskTracker&lt;/code&gt;'s.</span>
-<span class="source-line-no">2589</span><span id="line-2589">   * @throws IOException When starting the cluster fails.</span>
-<span class="source-line-no">2590</span><span id="line-2590">   */</span>
-<span class="source-line-no">2591</span><span id="line-2591">  public MiniMRCluster startMiniMapReduceCluster() throws IOException {</span>
-<span class="source-line-no">2592</span><span id="line-2592">    // Set a very high max-disk-utilization percentage to avoid the NodeManagers from failing.</span>
-<span class="source-line-no">2593</span><span id="line-2593">    conf.setIfUnset("yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage",</span>
-<span class="source-line-no">2594</span><span id="line-2594">      "99.0");</span>
-<span class="source-line-no">2595</span><span id="line-2595">    startMiniMapReduceCluster(2);</span>
-<span class="source-line-no">2596</span><span id="line-2596">    return mrCluster;</span>
-<span class="source-line-no">2597</span><span id="line-2597">  }</span>
-<span class="source-line-no">2598</span><span id="line-2598"></span>
-<span class="source-line-no">2599</span><span id="line-2599">  /**</span>
-<span class="source-line-no">2600</span><span id="line-2600">   * Tasktracker has a bug where changing the hadoop.log.dir system property will not change its</span>
-<span class="source-line-no">2601</span><span id="line-2601">   * internal static LOG_DIR variable.</span>
-<span class="source-line-no">2602</span><span id="line-2602">   */</span>
-<span class="source-line-no">2603</span><span id="line-2603">  private void forceChangeTaskLogDir() {</span>
-<span class="source-line-no">2604</span><span id="line-2604">    Field logDirField;</span>
-<span class="source-line-no">2605</span><span id="line-2605">    try {</span>
-<span class="source-line-no">2606</span><span id="line-2606">      logDirField = TaskLog.class.getDeclaredField("LOG_DIR");</span>
-<span class="source-line-no">2607</span><span id="line-2607">      logDirField.setAccessible(true);</span>
-<span class="source-line-no">2608</span><span id="line-2608"></span>
-<span class="source-line-no">2609</span><span id="line-2609">      Field modifiersField = ReflectionUtils.getModifiersField();</span>
-<span class="source-line-no">2610</span><span id="line-2610">      modifiersField.setAccessible(true);</span>
-<span class="source-line-no">2611</span><span id="line-2611">      modifiersField.setInt(logDirField, logDirField.getModifiers() &amp; ~Modifier.FINAL);</span>
-<span class="source-line-no">2612</span><span id="line-2612"></span>
-<span class="source-line-no">2613</span><span id="line-2613">      logDirField.set(null, new File(hadoopLogDir, "userlogs"));</span>
-<span class="source-line-no">2614</span><span id="line-2614">    } catch (SecurityException e) {</span>
-<span class="source-line-no">2615</span><span id="line-2615">      throw new RuntimeException(e);</span>
-<span class="source-line-no">2616</span><span id="line-2616">    } catch (NoSuchFieldException e) {</span>
-<span class="source-line-no">2617</span><span id="line-2617">      throw new RuntimeException(e);</span>
-<span class="source-line-no">2618</span><span id="line-2618">    } catch (IllegalArgumentException e) {</span>
-<span class="source-line-no">2619</span><span id="line-2619">      throw new RuntimeException(e);</span>
-<span class="source-line-no">2620</span><span id="line-2620">    } catch (IllegalAccessException e) {</span>
-<span class="source-line-no">2621</span><span id="line-2621">      throw new RuntimeException(e);</span>
-<span class="source-line-no">2622</span><span id="line-2622">    }</span>
-<span class="source-line-no">2623</span><span id="line-2623">  }</span>
-<span class="source-line-no">2624</span><span id="line-2624"></span>
-<span class="source-line-no">2625</span><span id="line-2625">  /**</span>
-<span class="source-line-no">2626</span><span id="line-2626">   * Starts a &lt;code&gt;MiniMRCluster&lt;/code&gt;. Call {@link #setFileSystemURI(String)} to use a different</span>
-<span class="source-line-no">2627</span><span id="line-2627">   * filesystem.</span>
-<span class="source-line-no">2628</span><span id="line-2628">   * @param servers The number of &lt;code&gt;TaskTracker&lt;/code&gt;'s to start.</span>
-<span class="source-line-no">2629</span><span id="line-2629">   * @throws IOException When starting the cluster fails.</span>
-<span class="source-line-no">2630</span><span id="line-2630">   */</span>
-<span class="source-line-no">2631</span><span id="line-2631">  private void startMiniMapReduceCluster(final int servers) throws IOException {</span>
-<span class="source-line-no">2632</span><span id="line-2632">    if (mrCluster != null) {</span>
-<span class="source-line-no">2633</span><span id="line-2633">      throw new IllegalStateException("MiniMRCluster is already running");</span>
-<span class="source-line-no">2634</span><span id="line-2634">    }</span>
-<span class="source-line-no">2635</span><span id="line-2635">    LOG.info("Starting mini mapreduce cluster...");</span>
-<span class="source-line-no">2636</span><span id="line-2636">    setupClusterTestDir();</span>
-<span class="source-line-no">2637</span><span id="line-2637">    createDirsAndSetProperties();</span>
-<span class="source-line-no">2638</span><span id="line-2638"></span>
-<span class="source-line-no">2639</span><span id="line-2639">    forceChangeTaskLogDir();</span>
-<span class="source-line-no">2640</span><span id="line-2640"></span>
-<span class="source-line-no">2641</span><span id="line-2641">    //// hadoop2 specific settings</span>
-<span class="source-line-no">2642</span><span id="line-2642">    // Tests were failing because this process used 6GB of virtual memory and was getting killed.</span>
-<span class="source-line-no">2643</span><span id="line-2643">    // we up the VM usable so that processes don't get killed.</span>
-<span class="source-line-no">2644</span><span id="line-2644">    conf.setFloat("yarn.nodemanager.vmem-pmem-ratio", 8.0f);</span>
-<span class="source-line-no">2645</span><span id="line-2645"></span>
-<span class="source-line-no">2646</span><span id="line-2646">    // Tests were failing due to MAPREDUCE-4880 / MAPREDUCE-4607 against hadoop 2.0.2-alpha and</span>
-<span class="source-line-no">2647</span><span id="line-2647">    // this avoids the problem by disabling speculative task execution in tests.</span>
-<span class="source-line-no">2648</span><span id="line-2648">    conf.setBoolean("mapreduce.map.speculative", false);</span>
-<span class="source-line-no">2649</span><span id="line-2649">    conf.setBoolean("mapreduce.reduce.speculative", false);</span>
-<span class="source-line-no">2650</span><span id="line-2650">    ////</span>
+<span class="source-line-no">2553</span><span id="line-2553">   * Find any other region server which is different from the one identified by parameter</span>
+<span class="source-line-no">2554</span><span id="line-2554">   * @return another region server</span>
+<span class="source-line-no">2555</span><span id="line-2555">   */</span>
+<span class="source-line-no">2556</span><span id="line-2556">  public HRegionServer getOtherRegionServer(HRegionServer rs) {</span>
+<span class="source-line-no">2557</span><span id="line-2557">    for (JVMClusterUtil.RegionServerThread rst : getMiniHBaseCluster().getRegionServerThreads()) {</span>
+<span class="source-line-no">2558</span><span id="line-2558">      if (!(rst.getRegionServer() == rs)) {</span>
+<span class="source-line-no">2559</span><span id="line-2559">        return rst.getRegionServer();</span>
+<span class="source-line-no">2560</span><span id="line-2560">      }</span>
+<span class="source-line-no">2561</span><span id="line-2561">    }</span>
+<span class="source-line-no">2562</span><span id="line-2562">    return null;</span>
+<span class="source-line-no">2563</span><span id="line-2563">  }</span>
+<span class="source-line-no">2564</span><span id="line-2564"></span>
+<span class="source-line-no">2565</span><span id="line-2565">  /**</span>
+<span class="source-line-no">2566</span><span id="line-2566">   * Tool to get the reference to the region server object that holds the region of the specified</span>
+<span class="source-line-no">2567</span><span id="line-2567">   * user table.</span>
+<span class="source-line-no">2568</span><span id="line-2568">   * @param tableName user table to lookup in hbase:meta</span>
+<span class="source-line-no">2569</span><span id="line-2569">   * @return region server that holds it, null if the row doesn't exist</span>
+<span class="source-line-no">2570</span><span id="line-2570">   */</span>
+<span class="source-line-no">2571</span><span id="line-2571">  public HRegionServer getRSForFirstRegionInTable(TableName tableName)</span>
+<span class="source-line-no">2572</span><span id="line-2572">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">2573</span><span id="line-2573">    List&lt;RegionInfo&gt; regions = getRegions(tableName);</span>
+<span class="source-line-no">2574</span><span id="line-2574">    if (regions == null || regions.isEmpty()) {</span>
+<span class="source-line-no">2575</span><span id="line-2575">      return null;</span>
+<span class="source-line-no">2576</span><span id="line-2576">    }</span>
+<span class="source-line-no">2577</span><span id="line-2577">    LOG.debug("Found " + regions.size() + " regions for table " + tableName);</span>
+<span class="source-line-no">2578</span><span id="line-2578"></span>
+<span class="source-line-no">2579</span><span id="line-2579">    byte[] firstRegionName =</span>
+<span class="source-line-no">2580</span><span id="line-2580">      regions.stream().filter(r -&gt; !r.isOffline()).map(RegionInfo::getRegionName).findFirst()</span>
+<span class="source-line-no">2581</span><span id="line-2581">        .orElseThrow(() -&gt; new IOException("online regions not found in table " + tableName));</span>
+<span class="source-line-no">2582</span><span id="line-2582"></span>
+<span class="source-line-no">2583</span><span id="line-2583">    LOG.debug("firstRegionName=" + Bytes.toString(firstRegionName));</span>
+<span class="source-line-no">2584</span><span id="line-2584">    long pause = getConfiguration().getLong(HConstants.HBASE_CLIENT_PAUSE,</span>
+<span class="source-line-no">2585</span><span id="line-2585">      HConstants.DEFAULT_HBASE_CLIENT_PAUSE);</span>
+<span class="source-line-no">2586</span><span id="line-2586">    int numRetries = getConfiguration().getInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER,</span>
+<span class="source-line-no">2587</span><span id="line-2587">      HConstants.DEFAULT_HBASE_CLIENT_RETRIES_NUMBER);</span>
+<span class="source-line-no">2588</span><span id="line-2588">    RetryCounter retrier = new RetryCounter(numRetries + 1, (int) pause, TimeUnit.MICROSECONDS);</span>
+<span class="source-line-no">2589</span><span id="line-2589">    while (retrier.shouldRetry()) {</span>
+<span class="source-line-no">2590</span><span id="line-2590">      int index = getMiniHBaseCluster().getServerWith(firstRegionName);</span>
+<span class="source-line-no">2591</span><span id="line-2591">      if (index != -1) {</span>
+<span class="source-line-no">2592</span><span id="line-2592">        return getMiniHBaseCluster().getRegionServerThreads().get(index).getRegionServer();</span>
+<span class="source-line-no">2593</span><span id="line-2593">      }</span>
+<span class="source-line-no">2594</span><span id="line-2594">      // Came back -1. Region may not be online yet. Sleep a while.</span>
+<span class="source-line-no">2595</span><span id="line-2595">      retrier.sleepUntilNextRetry();</span>
+<span class="source-line-no">2596</span><span id="line-2596">    }</span>
+<span class="source-line-no">2597</span><span id="line-2597">    return null;</span>
+<span class="source-line-no">2598</span><span id="line-2598">  }</span>
+<span class="source-line-no">2599</span><span id="line-2599"></span>
+<span class="source-line-no">2600</span><span id="line-2600">  /**</span>
+<span class="source-line-no">2601</span><span id="line-2601">   * Starts a &lt;code&gt;MiniMRCluster&lt;/code&gt; with a default number of &lt;code&gt;TaskTracker&lt;/code&gt;'s.</span>
+<span class="source-line-no">2602</span><span id="line-2602">   * @throws IOException When starting the cluster fails.</span>
+<span class="source-line-no">2603</span><span id="line-2603">   */</span>
+<span class="source-line-no">2604</span><span id="line-2604">  public MiniMRCluster startMiniMapReduceCluster() throws IOException {</span>
+<span class="source-line-no">2605</span><span id="line-2605">    // Set a very high max-disk-utilization percentage to avoid the NodeManagers from failing.</span>
+<span class="source-line-no">2606</span><span id="line-2606">    conf.setIfUnset("yarn.nodemanager.disk-health-checker.max-disk-utilization-per-disk-percentage",</span>
+<span class="source-line-no">2607</span><span id="line-2607">      "99.0");</span>
+<span class="source-line-no">2608</span><span id="line-2608">    startMiniMapReduceCluster(2);</span>
+<span class="source-line-no">2609</span><span id="line-2609">    return mrCluster;</span>
+<span class="source-line-no">2610</span><span id="line-2610">  }</span>
+<span class="source-line-no">2611</span><span id="line-2611"></span>
+<span class="source-line-no">2612</span><span id="line-2612">  /**</span>
+<span class="source-line-no">2613</span><span id="line-2613">   * Tasktracker has a bug where changing the hadoop.log.dir system property will not change its</span>
+<span class="source-line-no">2614</span><span id="line-2614">   * internal static LOG_DIR variable.</span>
+<span class="source-line-no">2615</span><span id="line-2615">   */</span>
+<span class="source-line-no">2616</span><span id="line-2616">  private void forceChangeTaskLogDir() {</span>
+<span class="source-line-no">2617</span><span id="line-2617">    Field logDirField;</span>
+<span class="source-line-no">2618</span><span id="line-2618">    try {</span>
+<span class="source-line-no">2619</span><span id="line-2619">      logDirField = TaskLog.class.getDeclaredField("LOG_DIR");</span>
+<span class="source-line-no">2620</span><span id="line-2620">      logDirField.setAccessible(true);</span>
+<span class="source-line-no">2621</span><span id="line-2621"></span>
+<span class="source-line-no">2622</span><span id="line-2622">      Field modifiersField = ReflectionUtils.getModifiersField();</span>
+<span class="source-line-no">2623</span><span id="line-2623">      modifiersField.setAccessible(true);</span>
+<span class="source-line-no">2624</span><span id="line-2624">      modifiersField.setInt(logDirField, logDirField.getModifiers() &amp; ~Modifier.FINAL);</span>
+<span class="source-line-no">2625</span><span id="line-2625"></span>
+<span class="source-line-no">2626</span><span id="line-2626">      logDirField.set(null, new File(hadoopLogDir, "userlogs"));</span>
+<span class="source-line-no">2627</span><span id="line-2627">    } catch (SecurityException e) {</span>
+<span class="source-line-no">2628</span><span id="line-2628">      throw new RuntimeException(e);</span>
+<span class="source-line-no">2629</span><span id="line-2629">    } catch (NoSuchFieldException e) {</span>
+<span class="source-line-no">2630</span><span id="line-2630">      throw new RuntimeException(e);</span>
+<span class="source-line-no">2631</span><span id="line-2631">    } catch (IllegalArgumentException e) {</span>
+<span class="source-line-no">2632</span><span id="line-2632">      throw new RuntimeException(e);</span>
+<span class="source-line-no">2633</span><span id="line-2633">    } catch (IllegalAccessException e) {</span>
+<span class="source-line-no">2634</span><span id="line-2634">      throw new RuntimeException(e);</span>
+<span class="source-line-no">2635</span><span id="line-2635">    }</span>
+<span class="source-line-no">2636</span><span id="line-2636">  }</span>
+<span class="source-line-no">2637</span><span id="line-2637"></span>
+<span class="source-line-no">2638</span><span id="line-2638">  /**</span>
+<span class="source-line-no">2639</span><span id="line-2639">   * Starts a &lt;code&gt;MiniMRCluster&lt;/code&gt;. Call {@link #setFileSystemURI(String)} to use a different</span>
+<span class="source-line-no">2640</span><span id="line-2640">   * filesystem.</span>
+<span class="source-line-no">2641</span><span id="line-2641">   * @param servers The number of &lt;code&gt;TaskTracker&lt;/code&gt;'s to start.</span>
+<span class="source-line-no">2642</span><span id="line-2642">   * @throws IOException When starting the cluster fails.</span>
+<span class="source-line-no">2643</span><span id="line-2643">   */</span>
+<span class="source-line-no">2644</span><span id="line-2644">  private void startMiniMapReduceCluster(final int servers) throws IOException {</span>
+<span class="source-line-no">2645</span><span id="line-2645">    if (mrCluster != null) {</span>
+<span class="source-line-no">2646</span><span id="line-2646">      throw new IllegalStateException("MiniMRCluster is already running");</span>
+<span class="source-line-no">2647</span><span id="line-2647">    }</span>
+<span class="source-line-no">2648</span><span id="line-2648">    LOG.info("Starting mini mapreduce cluster...");</span>
+<span class="source-line-no">2649</span><span id="line-2649">    setupClusterTestDir();</span>
+<span class="source-line-no">2650</span><span id="line-2650">    createDirsAndSetProperties();</span>
 <span class="source-line-no">2651</span><span id="line-2651"></span>
-<span class="source-line-no">2652</span><span id="line-2652">    // Allow the user to override FS URI for this map-reduce cluster to use.</span>
-<span class="source-line-no">2653</span><span id="line-2653">    mrCluster =</span>
-<span class="source-line-no">2654</span><span id="line-2654">      new MiniMRCluster(servers, FS_URI != null ? FS_URI : FileSystem.get(conf).getUri().toString(),</span>
-<span class="source-line-no">2655</span><span id="line-2655">        1, null, null, new JobConf(this.conf));</span>
-<span class="source-line-no">2656</span><span id="line-2656">    JobConf jobConf = MapreduceTestingShim.getJobConf(mrCluster);</span>
-<span class="source-line-no">2657</span><span id="line-2657">    if (jobConf == null) {</span>
-<span class="source-line-no">2658</span><span id="line-2658">      jobConf = mrCluster.createJobConf();</span>
-<span class="source-line-no">2659</span><span id="line-2659">    }</span>
-<span class="source-line-no">2660</span><span id="line-2660">    // Hadoop MiniMR overwrites this while it should not</span>
-<span class="source-line-no">2661</span><span id="line-2661">    jobConf.set("mapreduce.cluster.local.dir", conf.get("mapreduce.cluster.local.dir"));</span>
-<span class="source-line-no">2662</span><span id="line-2662">    LOG.info("Mini mapreduce cluster started");</span>
-<span class="source-line-no">2663</span><span id="line-2663"></span>
-<span class="source-line-no">2664</span><span id="line-2664">    // In hadoop2, YARN/MR2 starts a mini cluster with its own conf instance and updates settings.</span>
-<span class="source-line-no">2665</span><span id="line-2665">    // Our HBase MR jobs need several of these settings in order to properly run. So we copy the</span>
-<span class="source-line-no">2666</span><span id="line-2666">    // necessary config properties here. YARN-129 required adding a few properties.</span>
-<span class="source-line-no">2667</span><span id="line-2667">    conf.set("mapreduce.jobtracker.address", jobConf.get("mapreduce.jobtracker.address"));</span>
-<span class="source-line-no">2668</span><span id="line-2668">    // this for mrv2 support; mr1 ignores this</span>
-<span class="source-line-no">2669</span><span id="line-2669">    conf.set("mapreduce.framework.name", "yarn");</span>
-<span class="source-line-no">2670</span><span id="line-2670">    conf.setBoolean("yarn.is.minicluster", true);</span>
-<span class="source-line-no">2671</span><span id="line-2671">    String rmAddress = jobConf.get("yarn.resourcemanager.address");</span>
-<span class="source-line-no">2672</span><span id="line-2672">    if (rmAddress != null) {</span>
-<span class="source-line-no">2673</span><span id="line-2673">      conf.set("yarn.resourcemanager.address", rmAddress);</span>
-<span class="source-line-no">2674</span><span id="line-2674">    }</span>
-<span class="source-line-no">2675</span><span id="line-2675">    String historyAddress = jobConf.get("mapreduce.jobhistory.address");</span>
-<span class="source-line-no">2676</span><span id="line-2676">    if (historyAddress != null) {</span>
-<span class="source-line-no">2677</span><span id="line-2677">      conf.set("mapreduce.jobhistory.address", historyAddress);</span>
-<span class="source-line-no">2678</span><span id="line-2678">    }</span>
-<span class="source-line-no">2679</span><span id="line-2679">    String schedulerAddress = jobConf.get("yarn.resourcemanager.scheduler.address");</span>
-<span class="source-line-no">2680</span><span id="line-2680">    if (schedulerAddress != null) {</span>
-<span class="source-line-no">2681</span><span id="line-2681">      conf.set("yarn.resourcemanager.scheduler.address", schedulerAddress);</span>
-<span class="source-line-no">2682</span><span id="line-2682">    }</span>
-<span class="source-line-no">2683</span><span id="line-2683">    String mrJobHistoryWebappAddress = jobConf.get("mapreduce.jobhistory.webapp.address");</span>
-<span class="source-line-no">2684</span><span id="line-2684">    if (mrJobHistoryWebappAddress != null) {</span>
-<span class="source-line-no">2685</span><span id="line-2685">      conf.set("mapreduce.jobhistory.webapp.address", mrJobHistoryWebappAddress);</span>
-<span class="source-line-no">2686</span><span id="line-2686">    }</span>
-<span class="source-line-no">2687</span><span id="line-2687">    String yarnRMWebappAddress = jobConf.get("yarn.resourcemanager.webapp.address");</span>
-<span class="source-line-no">2688</span><span id="line-2688">    if (yarnRMWebappAddress != null) {</span>
-<span class="source-line-no">2689</span><span id="line-2689">      conf.set("yarn.resourcemanager.webapp.address", yarnRMWebappAddress);</span>
-<span class="source-line-no">2690</span><span id="line-2690">    }</span>
-<span class="source-line-no">2691</span><span id="line-2691">  }</span>
-<span class="source-line-no">2692</span><span id="line-2692"></span>
-<span class="source-line-no">2693</span><span id="line-2693">  /**</span>
-<span class="source-line-no">2694</span><span id="line-2694">   * Stops the previously started &lt;code&gt;MiniMRCluster&lt;/code&gt;.</span>
-<span class="source-line-no">2695</span><span id="line-2695">   */</span>
-<span class="source-line-no">2696</span><span id="line-2696">  public void shutdownMiniMapReduceCluster() {</span>
-<span class="source-line-no">2697</span><span id="line-2697">    if (mrCluster != null) {</span>
-<span class="source-line-no">2698</span><span id="line-2698">      LOG.info("Stopping mini mapreduce cluster...");</span>
-<span class="source-line-no">2699</span><span id="line-2699">      mrCluster.shutdown();</span>
-<span class="source-line-no">2700</span><span id="line-2700">      mrCluster = null;</span>
-<span class="source-line-no">2701</span><span id="line-2701">      LOG.info("Mini mapreduce cluster stopped");</span>
-<span class="source-line-no">2702</span><span id="line-2702">    }</span>
-<span class="source-line-no">2703</span><span id="line-2703">    // Restore configuration to point to local jobtracker</span>
-<span class="source-line-no">2704</span><span id="line-2704">    conf.set("mapreduce.jobtracker.address", "local");</span>
-<span class="source-line-no">2705</span><span id="line-2705">  }</span>
-<span class="source-line-no">2706</span><span id="line-2706"></span>
-<span class="source-line-no">2707</span><span id="line-2707">  /**</span>
-<span class="source-line-no">2708</span><span id="line-2708">   * Create a stubbed out RegionServerService, mainly for getting FS.</span>
-<span class="source-line-no">2709</span><span id="line-2709">   */</span>
-<span class="source-line-no">2710</span><span id="line-2710">  public RegionServerServices createMockRegionServerService() throws IOException {</span>
-<span class="source-line-no">2711</span><span id="line-2711">    return createMockRegionServerService((ServerName) null);</span>
-<span class="source-line-no">2712</span><span id="line-2712">  }</span>
-<span class="source-line-no">2713</span><span id="line-2713"></span>
-<span class="source-line-no">2714</span><span id="line-2714">  /**</span>
-<span class="source-line-no">2715</span><span id="line-2715">   * Create a stubbed out RegionServerService, mainly for getting FS. This version is used by</span>
-<span class="source-line-no">2716</span><span id="line-2716">   * TestTokenAuthentication</span>
-<span class="source-line-no">2717</span><span id="line-2717">   */</span>
-<span class="source-line-no">2718</span><span id="line-2718">  public RegionServerServices createMockRegionServerService(RpcServerInterface rpc)</span>
-<span class="source-line-no">2719</span><span id="line-2719">    throws IOException {</span>
-<span class="source-line-no">2720</span><span id="line-2720">    final MockRegionServerServices rss = new MockRegionServerServices(getZooKeeperWatcher());</span>
-<span class="source-line-no">2721</span><span id="line-2721">    rss.setFileSystem(getTestFileSystem());</span>
-<span class="source-line-no">2722</span><span id="line-2722">    rss.setRpcServer(rpc);</span>
-<span class="source-line-no">2723</span><span id="line-2723">    return rss;</span>
-<span class="source-line-no">2724</span><span id="line-2724">  }</span>
-<span class="source-line-no">2725</span><span id="line-2725"></span>
-<span class="source-line-no">2726</span><span id="line-2726">  /**</span>
-<span class="source-line-no">2727</span><span id="line-2727">   * Create a stubbed out RegionServerService, mainly for getting FS. This version is used by</span>
-<span class="source-line-no">2728</span><span id="line-2728">   * TestOpenRegionHandler</span>
-<span class="source-line-no">2729</span><span id="line-2729">   */</span>
-<span class="source-line-no">2730</span><span id="line-2730">  public RegionServerServices createMockRegionServerService(ServerName name) throws IOException {</span>
-<span class="source-line-no">2731</span><span id="line-2731">    final MockRegionServerServices rss = new MockRegionServerServices(getZooKeeperWatcher(), name);</span>
-<span class="source-line-no">2732</span><span id="line-2732">    rss.setFileSystem(getTestFileSystem());</span>
-<span class="source-line-no">2733</span><span id="line-2733">    return rss;</span>
-<span class="source-line-no">2734</span><span id="line-2734">  }</span>
-<span class="source-line-no">2735</span><span id="line-2735"></span>
-<span class="source-line-no">2736</span><span id="line-2736">  /**</span>
-<span class="source-line-no">2737</span><span id="line-2737">   * Switches the logger for the given class to DEBUG level.</span>
-<span class="source-line-no">2738</span><span id="line-2738">   * @param clazz The class for which to switch to debug logging.</span>
-<span class="source-line-no">2739</span><span id="line-2739">   * @deprecated In 2.3.0, will be removed in 4.0.0. Only support changing log level on log4j now as</span>
-<span class="source-line-no">2740</span><span id="line-2740">   *             HBase only uses log4j. You should do this by your own as it you know which log</span>
-<span class="source-line-no">2741</span><span id="line-2741">   *             framework you are using then set the log level to debug is very easy.</span>
+<span class="source-line-no">2652</span><span id="line-2652">    forceChangeTaskLogDir();</span>
+<span class="source-line-no">2653</span><span id="line-2653"></span>
+<span class="source-line-no">2654</span><span id="line-2654">    //// hadoop2 specific settings</span>
+<span class="source-line-no">2655</span><span id="line-2655">    // Tests were failing because this process used 6GB of virtual memory and was getting killed.</span>
+<span class="source-line-no">2656</span><span id="line-2656">    // we up the VM usable so that processes don't get killed.</span>
+<span class="source-line-no">2657</span><span id="line-2657">    conf.setFloat("yarn.nodemanager.vmem-pmem-ratio", 8.0f);</span>
+<span class="source-line-no">2658</span><span id="line-2658"></span>
+<span class="source-line-no">2659</span><span id="line-2659">    // Tests were failing due to MAPREDUCE-4880 / MAPREDUCE-4607 against hadoop 2.0.2-alpha and</span>
+<span class="source-line-no">2660</span><span id="line-2660">    // this avoids the problem by disabling speculative task execution in tests.</span>
+<span class="source-line-no">2661</span><span id="line-2661">    conf.setBoolean("mapreduce.map.speculative", false);</span>
+<span class="source-line-no">2662</span><span id="line-2662">    conf.setBoolean("mapreduce.reduce.speculative", false);</span>
+<span class="source-line-no">2663</span><span id="line-2663">    ////</span>
+<span class="source-line-no">2664</span><span id="line-2664"></span>
+<span class="source-line-no">2665</span><span id="line-2665">    // Allow the user to override FS URI for this map-reduce cluster to use.</span>
+<span class="source-line-no">2666</span><span id="line-2666">    mrCluster =</span>
+<span class="source-line-no">2667</span><span id="line-2667">      new MiniMRCluster(servers, FS_URI != null ? FS_URI : FileSystem.get(conf).getUri().toString(),</span>
+<span class="source-line-no">2668</span><span id="line-2668">        1, null, null, new JobConf(this.conf));</span>
+<span class="source-line-no">2669</span><span id="line-2669">    JobConf jobConf = MapreduceTestingShim.getJobConf(mrCluster);</span>
+<span class="source-line-no">2670</span><span id="line-2670">    if (jobConf == null) {</span>
+<span class="source-line-no">2671</span><span id="line-2671">      jobConf = mrCluster.createJobConf();</span>
+<span class="source-line-no">2672</span><span id="line-2672">    }</span>
+<span class="source-line-no">2673</span><span id="line-2673">    // Hadoop MiniMR overwrites this while it should not</span>
+<span class="source-line-no">2674</span><span id="line-2674">    jobConf.set("mapreduce.cluster.local.dir", conf.get("mapreduce.cluster.local.dir"));</span>
+<span class="source-line-no">2675</span><span id="line-2675">    LOG.info("Mini mapreduce cluster started");</span>
+<span class="source-line-no">2676</span><span id="line-2676"></span>
+<span class="source-line-no">2677</span><span id="line-2677">    // In hadoop2, YARN/MR2 starts a mini cluster with its own conf instance and updates settings.</span>
+<span class="source-line-no">2678</span><span id="line-2678">    // Our HBase MR jobs need several of these settings in order to properly run. So we copy the</span>
+<span class="source-line-no">2679</span><span id="line-2679">    // necessary config properties here. YARN-129 required adding a few properties.</span>
+<span class="source-line-no">2680</span><span id="line-2680">    conf.set("mapreduce.jobtracker.address", jobConf.get("mapreduce.jobtracker.address"));</span>
+<span class="source-line-no">2681</span><span id="line-2681">    // this for mrv2 support; mr1 ignores this</span>
+<span class="source-line-no">2682</span><span id="line-2682">    conf.set("mapreduce.framework.name", "yarn");</span>
+<span class="source-line-no">2683</span><span id="line-2683">    conf.setBoolean("yarn.is.minicluster", true);</span>
+<span class="source-line-no">2684</span><span id="line-2684">    String rmAddress = jobConf.get("yarn.resourcemanager.address");</span>
+<span class="source-line-no">2685</span><span id="line-2685">    if (rmAddress != null) {</span>
+<span class="source-line-no">2686</span><span id="line-2686">      conf.set("yarn.resourcemanager.address", rmAddress);</span>
+<span class="source-line-no">2687</span><span id="line-2687">    }</span>
+<span class="source-line-no">2688</span><span id="line-2688">    String historyAddress = jobConf.get("mapreduce.jobhistory.address");</span>
+<span class="source-line-no">2689</span><span id="line-2689">    if (historyAddress != null) {</span>
+<span class="source-line-no">2690</span><span id="line-2690">      conf.set("mapreduce.jobhistory.address", historyAddress);</span>
+<span class="source-line-no">2691</span><span id="line-2691">    }</span>
+<span class="source-line-no">2692</span><span id="line-2692">    String schedulerAddress = jobConf.get("yarn.resourcemanager.scheduler.address");</span>
+<span class="source-line-no">2693</span><span id="line-2693">    if (schedulerAddress != null) {</span>
+<span class="source-line-no">2694</span><span id="line-2694">      conf.set("yarn.resourcemanager.scheduler.address", schedulerAddress);</span>
+<span class="source-line-no">2695</span><span id="line-2695">    }</span>
+<span class="source-line-no">2696</span><span id="line-2696">    String mrJobHistoryWebappAddress = jobConf.get("mapreduce.jobhistory.webapp.address");</span>
+<span class="source-line-no">2697</span><span id="line-2697">    if (mrJobHistoryWebappAddress != null) {</span>
+<span class="source-line-no">2698</span><span id="line-2698">      conf.set("mapreduce.jobhistory.webapp.address", mrJobHistoryWebappAddress);</span>
+<span class="source-line-no">2699</span><span id="line-2699">    }</span>
+<span class="source-line-no">2700</span><span id="line-2700">    String yarnRMWebappAddress = jobConf.get("yarn.resourcemanager.webapp.address");</span>
+<span class="source-line-no">2701</span><span id="line-2701">    if (yarnRMWebappAddress != null) {</span>
+<span class="source-line-no">2702</span><span id="line-2702">      conf.set("yarn.resourcemanager.webapp.address", yarnRMWebappAddress);</span>
+<span class="source-line-no">2703</span><span id="line-2703">    }</span>
+<span class="source-line-no">2704</span><span id="line-2704">  }</span>
+<span class="source-line-no">2705</span><span id="line-2705"></span>
+<span class="source-line-no">2706</span><span id="line-2706">  /**</span>
+<span class="source-line-no">2707</span><span id="line-2707">   * Stops the previously started &lt;code&gt;MiniMRCluster&lt;/code&gt;.</span>
+<span class="source-line-no">2708</span><span id="line-2708">   */</span>
+<span class="source-line-no">2709</span><span id="line-2709">  public void shutdownMiniMapReduceCluster() {</span>
+<span class="source-line-no">2710</span><span id="line-2710">    if (mrCluster != null) {</span>
+<span class="source-line-no">2711</span><span id="line-2711">      LOG.info("Stopping mini mapreduce cluster...");</span>
+<span class="source-line-no">2712</span><span id="line-2712">      mrCluster.shutdown();</span>
+<span class="source-line-no">2713</span><span id="line-2713">      mrCluster = null;</span>
+<span class="source-line-no">2714</span><span id="line-2714">      LOG.info("Mini mapreduce cluster stopped");</span>
+<span class="source-line-no">2715</span><span id="line-2715">    }</span>
+<span class="source-line-no">2716</span><span id="line-2716">    // Restore configuration to point to local jobtracker</span>
+<span class="source-line-no">2717</span><span id="line-2717">    conf.set("mapreduce.jobtracker.address", "local");</span>
+<span class="source-line-no">2718</span><span id="line-2718">  }</span>
+<span class="source-line-no">2719</span><span id="line-2719"></span>
+<span class="source-line-no">2720</span><span id="line-2720">  /**</span>
+<span class="source-line-no">2721</span><span id="line-2721">   * Create a stubbed out RegionServerService, mainly for getting FS.</span>
+<span class="source-line-no">2722</span><span id="line-2722">   */</span>
+<span class="source-line-no">2723</span><span id="line-2723">  public RegionServerServices createMockRegionServerService() throws IOException {</span>
+<span class="source-line-no">2724</span><span id="line-2724">    return createMockRegionServerService((ServerName) null);</span>
+<span class="source-line-no">2725</span><span id="line-2725">  }</span>
+<span class="source-line-no">2726</span><span id="line-2726"></span>
+<span class="source-line-no">2727</span><span id="line-2727">  /**</span>
+<span class="source-line-no">2728</span><span id="line-2728">   * Create a stubbed out RegionServerService, mainly for getting FS. This version is used by</span>
+<span class="source-line-no">2729</span><span id="line-2729">   * TestTokenAuthentication</span>
+<span class="source-line-no">2730</span><span id="line-2730">   */</span>
+<span class="source-line-no">2731</span><span id="line-2731">  public RegionServerServices createMockRegionServerService(RpcServerInterface rpc)</span>
+<span class="source-line-no">2732</span><span id="line-2732">    throws IOException {</span>
+<span class="source-line-no">2733</span><span id="line-2733">    final MockRegionServerServices rss = new MockRegionServerServices(getZooKeeperWatcher());</span>
+<span class="source-line-no">2734</span><span id="line-2734">    rss.setFileSystem(getTestFileSystem());</span>
+<span class="source-line-no">2735</span><span id="line-2735">    rss.setRpcServer(rpc);</span>
+<span class="source-line-no">2736</span><span id="line-2736">    return rss;</span>
+<span class="source-line-no">2737</span><span id="line-2737">  }</span>
+<span class="source-line-no">2738</span><span id="line-2738"></span>
+<span class="source-line-no">2739</span><span id="line-2739">  /**</span>
+<span class="source-line-no">2740</span><span id="line-2740">   * Create a stubbed out RegionServerService, mainly for getting FS. This version is used by</span>
+<span class="source-line-no">2741</span><span id="line-2741">   * TestOpenRegionHandler</span>
 <span class="source-line-no">2742</span><span id="line-2742">   */</span>
-<span class="source-line-no">2743</span><span id="line-2743">  @Deprecated</span>
-<span class="source-line-no">2744</span><span id="line-2744">  public void enableDebug(Class&lt;?&gt; clazz) {</span>
-<span class="source-line-no">2745</span><span id="line-2745">    Log4jUtils.enableDebug(clazz);</span>
-<span class="source-line-no">2746</span><span id="line-2746">  }</span>
-<span class="source-line-no">2747</span><span id="line-2747"></span>
-<span class="source-line-no">2748</span><span id="line-2748">  /**</span>
-<span class="source-line-no">2749</span><span id="line-2749">   * Expire the Master's session</span>
-<span class="source-line-no">2750</span><span id="line-2750">   */</span>
-<span class="source-line-no">2751</span><span id="line-2751">  public void expireMasterSession() throws Exception {</span>
-<span class="source-line-no">2752</span><span id="line-2752">    HMaster master = getMiniHBaseCluster().getMaster();</span>
-<span class="source-line-no">2753</span><span id="line-2753">    expireSession(master.getZooKeeper(), false);</span>
-<span class="source-line-no">2754</span><span id="line-2754">  }</span>
-<span class="source-line-no">2755</span><span id="line-2755"></span>
-<span class="source-line-no">2756</span><span id="line-2756">  /**</span>
-<span class="source-line-no">2757</span><span id="line-2757">   * Expire a region server's session</span>
-<span class="source-line-no">2758</span><span id="line-2758">   * @param index which RS</span>
-<span class="source-line-no">2759</span><span id="line-2759">   */</span>
-<span class="source-line-no">2760</span><span id="line-2760">  public void expireRegionServerSession(int index) throws Exception {</span>
-<span class="source-line-no">2761</span><span id="line-2761">    HRegionServer rs = getMiniHBaseCluster().getRegionServer(index);</span>
-<span class="source-line-no">2762</span><span id="line-2762">    expireSession(rs.getZooKeeper(), false);</span>
-<span class="source-line-no">2763</span><span id="line-2763">    decrementMinRegionServerCount();</span>
-<span class="source-line-no">2764</span><span id="line-2764">  }</span>
-<span class="source-line-no">2765</span><span id="line-2765"></span>
-<span class="source-line-no">2766</span><span id="line-2766">  private void decrementMinRegionServerCount() {</span>
-<span class="source-line-no">2767</span><span id="line-2767">    // decrement the count for this.conf, for newly spwaned master</span>
-<span class="source-line-no">2768</span><span id="line-2768">    // this.hbaseCluster shares this configuration too</span>
-<span class="source-line-no">2769</span><span id="line-2769">    decrementMinRegionServerCount(getConfiguration());</span>
-<span class="source-line-no">2770</span><span id="line-2770"></span>
-<span class="source-line-no">2771</span><span id="line-2771">    // each master thread keeps a copy of configuration</span>
-<span class="source-line-no">2772</span><span id="line-2772">    for (MasterThread master : getHBaseCluster().getMasterThreads()) {</span>
-<span class="source-line-no">2773</span><span id="line-2773">      decrementMinRegionServerCount(master.getMaster().getConfiguration());</span>
-<span class="source-line-no">2774</span><span id="line-2774">    }</span>
-<span class="source-line-no">2775</span><span id="line-2775">  }</span>
-<span class="source-line-no">2776</span><span id="line-2776"></span>
-<span class="source-line-no">2777</span><span id="line-2777">  private void decrementMinRegionServerCount(Configuration conf) {</span>
-<span class="source-line-no">2778</span><span id="line-2778">    int currentCount = conf.getInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1);</span>
-<span class="source-line-no">2779</span><span id="line-2779">    if (currentCount != -1) {</span>
-<span class="source-line-no">2780</span><span id="line-2780">      conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, Math.max(currentCount - 1, 1));</span>
-<span class="source-line-no">2781</span><span id="line-2781">    }</span>
-<span class="source-line-no">2782</span><span id="line-2782">  }</span>
+<span class="source-line-no">2743</span><span id="line-2743">  public RegionServerServices createMockRegionServerService(ServerName name) throws IOException {</span>
+<span class="source-line-no">2744</span><span id="line-2744">    final MockRegionServerServices rss = new MockRegionServerServices(getZooKeeperWatcher(), name);</span>
+<span class="source-line-no">2745</span><span id="line-2745">    rss.setFileSystem(getTestFileSystem());</span>
+<span class="source-line-no">2746</span><span id="line-2746">    return rss;</span>
+<span class="source-line-no">2747</span><span id="line-2747">  }</span>
+<span class="source-line-no">2748</span><span id="line-2748"></span>
+<span class="source-line-no">2749</span><span id="line-2749">  /**</span>
+<span class="source-line-no">2750</span><span id="line-2750">   * Switches the logger for the given class to DEBUG level.</span>
+<span class="source-line-no">2751</span><span id="line-2751">   * @param clazz The class for which to switch to debug logging.</span>
+<span class="source-line-no">2752</span><span id="line-2752">   * @deprecated In 2.3.0, will be removed in 4.0.0. Only support changing log level on log4j now as</span>
+<span class="source-line-no">2753</span><span id="line-2753">   *             HBase only uses log4j. You should do this by your own as it you know which log</span>
+<span class="source-line-no">2754</span><span id="line-2754">   *             framework you are using then set the log level to debug is very easy.</span>
+<span class="source-line-no">2755</span><span id="line-2755">   */</span>
+<span class="source-line-no">2756</span><span id="line-2756">  @Deprecated</span>
+<span class="source-line-no">2757</span><span id="line-2757">  public void enableDebug(Class&lt;?&gt; clazz) {</span>
+<span class="source-line-no">2758</span><span id="line-2758">    Log4jUtils.enableDebug(clazz);</span>
+<span class="source-line-no">2759</span><span id="line-2759">  }</span>
+<span class="source-line-no">2760</span><span id="line-2760"></span>
+<span class="source-line-no">2761</span><span id="line-2761">  /**</span>
+<span class="source-line-no">2762</span><span id="line-2762">   * Expire the Master's session</span>
+<span class="source-line-no">2763</span><span id="line-2763">   */</span>
+<span class="source-line-no">2764</span><span id="line-2764">  public void expireMasterSession() throws Exception {</span>
+<span class="source-line-no">2765</span><span id="line-2765">    HMaster master = getMiniHBaseCluster().getMaster();</span>
+<span class="source-line-no">2766</span><span id="line-2766">    expireSession(master.getZooKeeper(), false);</span>
+<span class="source-line-no">2767</span><span id="line-2767">  }</span>
+<span class="source-line-no">2768</span><span id="line-2768"></span>
+<span class="source-line-no">2769</span><span id="line-2769">  /**</span>
+<span class="source-line-no">2770</span><span id="line-2770">   * Expire a region server's session</span>
+<span class="source-line-no">2771</span><span id="line-2771">   * @param index which RS</span>
+<span class="source-line-no">2772</span><span id="line-2772">   */</span>
+<span class="source-line-no">2773</span><span id="line-2773">  public void expireRegionServerSession(int index) throws Exception {</span>
+<span class="source-line-no">2774</span><span id="line-2774">    HRegionServer rs = getMiniHBaseCluster().getRegionServer(index);</span>
+<span class="source-line-no">2775</span><span id="line-2775">    expireSession(rs.getZooKeeper(), false);</span>
+<span class="source-line-no">2776</span><span id="line-2776">    decrementMinRegionServerCount();</span>
+<span class="source-line-no">2777</span><span id="line-2777">  }</span>
+<span class="source-line-no">2778</span><span id="line-2778"></span>
+<span class="source-line-no">2779</span><span id="line-2779">  private void decrementMinRegionServerCount() {</span>
+<span class="source-line-no">2780</span><span id="line-2780">    // decrement the count for this.conf, for newly spwaned master</span>
+<span class="source-line-no">2781</span><span id="line-2781">    // this.hbaseCluster shares this configuration too</span>
+<span class="source-line-no">2782</span><span id="line-2782">    decrementMinRegionServerCount(getConfiguration());</span>
 <span class="source-line-no">2783</span><span id="line-2783"></span>
-<span class="source-line-no">2784</span><span id="line-2784">  public void expireSession(ZKWatcher nodeZK) throws Exception {</span>
-<span class="source-line-no">2785</span><span id="line-2785">    expireSession(nodeZK, false);</span>
-<span class="source-line-no">2786</span><span id="line-2786">  }</span>
-<span class="source-line-no">2787</span><span id="line-2787"></span>
-<span class="source-line-no">2788</span><span id="line-2788">  /**</span>
-<span class="source-line-no">2789</span><span id="line-2789">   * Expire a ZooKeeper session as recommended in ZooKeeper documentation &lt;a href=</span>
-<span class="source-line-no">2790</span><span id="line-2790">   * "https://hbase.apache.org/docs/troubleshooting#troubleshooting-zookeeper"&gt;Troubleshooting</span>
-<span class="source-line-no">2791</span><span id="line-2791">   * ZooKeeper&lt;/a&gt;</span>
-<span class="source-line-no">2792</span><span id="line-2792">   * &lt;p/&gt;</span>
-<span class="source-line-no">2793</span><span id="line-2793">   * There are issues when doing this:</span>
-<span class="source-line-no">2794</span><span id="line-2794">   * &lt;ol&gt;</span>
-<span class="source-line-no">2795</span><span id="line-2795">   * &lt;li&gt;http://www.mail-archive.com/dev@zookeeper.apache.org/msg01942.html&lt;/li&gt;</span>
-<span class="source-line-no">2796</span><span id="line-2796">   * &lt;li&gt;https://issues.apache.org/jira/browse/ZOOKEEPER-1105&lt;/li&gt;</span>
-<span class="source-line-no">2797</span><span id="line-2797">   * &lt;/ol&gt;</span>
-<span class="source-line-no">2798</span><span id="line-2798">   * @param nodeZK      - the ZK watcher to expire</span>
-<span class="source-line-no">2799</span><span id="line-2799">   * @param checkStatus - true to check if we can create a Table with the current configuration.</span>
-<span class="source-line-no">2800</span><span id="line-2800">   */</span>
-<span class="source-line-no">2801</span><span id="line-2801">  public void expireSession(ZKWatcher nodeZK, boolean checkStatus) throws Exception {</span>
-<span class="source-line-no">2802</span><span id="line-2802">    Configuration c = new Configuration(this.conf);</span>
-<span class="source-line-no">2803</span><span id="line-2803">    String quorumServers = ZKConfig.getZKQuorumServersString(c);</span>
-<span class="source-line-no">2804</span><span id="line-2804">    ZooKeeper zk = nodeZK.getRecoverableZooKeeper().getZooKeeper();</span>
-<span class="source-line-no">2805</span><span id="line-2805">    byte[] password = zk.getSessionPasswd();</span>
-<span class="source-line-no">2806</span><span id="line-2806">    long sessionID = zk.getSessionId();</span>
-<span class="source-line-no">2807</span><span id="line-2807"></span>
-<span class="source-line-no">2808</span><span id="line-2808">    // Expiry seems to be asynchronous (see comment from P. Hunt in [1]),</span>
-<span class="source-line-no">2809</span><span id="line-2809">    // so we create a first watcher to be sure that the</span>
-<span class="source-line-no">2810</span><span id="line-2810">    // event was sent. We expect that if our watcher receives the event</span>
-<span class="source-line-no">2811</span><span id="line-2811">    // other watchers on the same machine will get is as well.</span>
-<span class="source-line-no">2812</span><span id="line-2812">    // When we ask to close the connection, ZK does not close it before</span>
-<span class="source-line-no">2813</span><span id="line-2813">    // we receive all the events, so don't have to capture the event, just</span>
-<span class="source-line-no">2814</span><span id="line-2814">    // closing the connection should be enough.</span>
-<span class="source-line-no">2815</span><span id="line-2815">    ZooKeeper monitor = new ZooKeeper(quorumServers, 1000, new org.apache.zookeeper.Watcher() {</span>
-<span class="source-line-no">2816</span><span id="line-2816">      @Override</span>
-<span class="source-line-no">2817</span><span id="line-2817">      public void process(WatchedEvent watchedEvent) {</span>
-<span class="source-line-no">2818</span><span id="line-2818">        LOG.info("Monitor ZKW received event=" + watchedEvent);</span>
-<span class="source-line-no">2819</span><span id="line-2819">      }</span>
-<span class="source-line-no">2820</span><span id="line-2820">    }, sessionID, password);</span>
-<span class="source-line-no">2821</span><span id="line-2821"></span>
-<span class="source-line-no">2822</span><span id="line-2822">    // Making it expire</span>
-<span class="source-line-no">2823</span><span id="line-2823">    ZooKeeper newZK =</span>
-<span class="source-line-no">2824</span><span id="line-2824">      new ZooKeeper(quorumServers, 1000, EmptyWatcher.instance, sessionID, password);</span>
-<span class="source-line-no">2825</span><span id="line-2825"></span>
-<span class="source-line-no">2826</span><span id="line-2826">    // ensure that we have connection to the server before closing down, otherwise</span>
-<span class="source-line-no">2827</span><span id="line-2827">    // the close session event will be eaten out before we start CONNECTING state</span>
-<span class="source-line-no">2828</span><span id="line-2828">    long start = EnvironmentEdgeManager.currentTime();</span>
-<span class="source-line-no">2829</span><span id="line-2829">    while (</span>
-<span class="source-line-no">2830</span><span id="line-2830">      newZK.getState() != States.CONNECTED &amp;&amp; EnvironmentEdgeManager.currentTime() - start &lt; 1000</span>
-<span class="source-line-no">2831</span><span id="line-2831">    ) {</span>
-<span class="source-line-no">2832</span><span id="line-2832">      Thread.sleep(1);</span>
-<span class="source-line-no">2833</span><span id="line-2833">    }</span>
-<span class="source-line-no">2834</span><span id="line-2834">    newZK.close();</span>
-<span class="source-line-no">2835</span><span id="line-2835">    LOG.info("ZK Closed Session 0x" + Long.toHexString(sessionID));</span>
-<span class="source-line-no">2836</span><span id="line-2836"></span>
-<span class="source-line-no">2837</span><span id="line-2837">    // Now closing &amp; waiting to be sure that the clients get it.</span>
-<span class="source-line-no">2838</span><span id="line-2838">    monitor.close();</span>
-<span class="source-line-no">2839</span><span id="line-2839"></span>
-<span class="source-line-no">2840</span><span id="line-2840">    if (checkStatus) {</span>
-<span class="source-line-no">2841</span><span id="line-2841">      getConnection().getTable(TableName.META_TABLE_NAME).close();</span>
-<span class="source-line-no">2842</span><span id="line-2842">    }</span>
-<span class="source-line-no">2843</span><span id="line-2843">  }</span>
-<span class="source-line-no">2844</span><span id="line-2844"></span>
-<span class="source-line-no">2845</span><span id="line-2845">  /**</span>
-<span class="source-line-no">2846</span><span id="line-2846">   * Get the Mini HBase cluster.</span>
-<span class="source-line-no">2847</span><span id="line-2847">   * @return hbase cluster</span>
-<span class="source-line-no">2848</span><span id="line-2848">   * @see #getHBaseClusterInterface()</span>
-<span class="source-line-no">2849</span><span id="line-2849">   */</span>
-<span class="source-line-no">2850</span><span id="line-2850">  public MiniHBaseCluster getHBaseCluster() {</span>
-<span class="source-line-no">2851</span><span id="line-2851">    return getMiniHBaseCluster();</span>
-<span class="source-line-no">2852</span><span id="line-2852">  }</span>
-<span class="source-line-no">2853</span><span id="line-2853"></span>
-<span class="source-line-no">2854</span><span id="line-2854">  /**</span>
-<span class="source-line-no">2855</span><span id="line-2855">   * Returns the HBaseCluster instance.</span>
-<span class="source-line-no">2856</span><span id="line-2856">   * &lt;p&gt;</span>
-<span class="source-line-no">2857</span><span id="line-2857">   * Returned object can be any of the subclasses of HBaseCluster, and the tests referring this</span>
-<span class="source-line-no">2858</span><span id="line-2858">   * should not assume that the cluster is a mini cluster or a distributed one. If the test only</span>
-<span class="source-line-no">2859</span><span id="line-2859">   * works on a mini cluster, then specific method {@link #getMiniHBaseCluster()} can be used</span>
-<span class="source-line-no">2860</span><span id="line-2860">   * instead w/o the need to type-cast.</span>
-<span class="source-line-no">2861</span><span id="line-2861">   */</span>
-<span class="source-line-no">2862</span><span id="line-2862">  public HBaseCluster getHBaseClusterInterface() {</span>
-<span class="source-line-no">2863</span><span id="line-2863">    // implementation note: we should rename this method as #getHBaseCluster(),</span>
-<span class="source-line-no">2864</span><span id="line-2864">    // but this would require refactoring 90+ calls.</span>
-<span class="source-line-no">2865</span><span id="line-2865">    return hbaseCluster;</span>
-<span class="source-line-no">2866</span><span id="line-2866">  }</span>
-<span class="source-line-no">2867</span><span id="line-2867"></span>
-<span class="source-line-no">2868</span><span id="line-2868">  /**</span>
-<span class="source-line-no">2869</span><span id="line-2869">   * Resets the connections so that the next time getConnection() is called, a new connection is</span>
-<span class="source-line-no">2870</span><span id="line-2870">   * created. This is needed in cases where the entire cluster / all the masters are shutdown and</span>
-<span class="source-line-no">2871</span><span id="line-2871">   * the connection is not valid anymore. TODO: There should be a more coherent way of doing this.</span>
-<span class="source-line-no">2872</span><span id="line-2872">   * Unfortunately the way tests are written, not all start() stop() calls go through this class.</span>
-<span class="source-line-no">2873</span><span id="line-2873">   * Most tests directly operate on the underlying mini/local hbase cluster. That makes it difficult</span>
-<span class="source-line-no">2874</span><span id="line-2874">   * for this wrapper class to maintain the connection state automatically. Cleaning this is a much</span>
-<span class="source-line-no">2875</span><span id="line-2875">   * bigger refactor.</span>
-<span class="source-line-no">2876</span><span id="line-2876">   */</span>
-<span class="source-line-no">2877</span><span id="line-2877">  public void invalidateConnection() throws IOException {</span>
-<span class="source-line-no">2878</span><span id="line-2878">    closeConnection();</span>
-<span class="source-line-no">2879</span><span id="line-2879">    // Update the master addresses if they changed.</span>
-<span class="source-line-no">2880</span><span id="line-2880">    final String masterConfigBefore = conf.get(HConstants.MASTER_ADDRS_KEY);</span>
-<span class="source-line-no">2881</span><span id="line-2881">    final String masterConfAfter = getMiniHBaseCluster().conf.get(HConstants.MASTER_ADDRS_KEY);</span>
-<span class="source-line-no">2882</span><span id="line-2882">    LOG.info("Invalidated connection. Updating master addresses before: {} after: {}",</span>
-<span class="source-line-no">2883</span><span id="line-2883">      masterConfigBefore, masterConfAfter);</span>
-<span class="source-line-no">2884</span><span id="line-2884">    conf.set(HConstants.MASTER_ADDRS_KEY,</span>
-<span class="source-line-no">2885</span><span id="line-2885">      getMiniHBaseCluster().conf.get(HConstants.MASTER_ADDRS_KEY));</span>
-<span class="source-line-no">2886</span><span id="line-2886">  }</span>
-<span class="source-line-no">2887</span><span id="line-2887"></span>
-<span class="source-line-no">2888</span><span id="line-2888">  /**</span>
-<span class="source-line-no">2889</span><span id="line-2889">   * Get a shared Connection to the cluster. this method is thread safe.</span>
-<span class="source-line-no">2890</span><span id="line-2890">   * @return A Connection that can be shared. Don't close. Will be closed on shutdown of cluster.</span>
-<span class="source-line-no">2891</span><span id="line-2891">   */</span>
-<span class="source-line-no">2892</span><span id="line-2892">  public Connection getConnection() throws IOException {</span>
-<span class="source-line-no">2893</span><span id="line-2893">    return getAsyncConnection().toConnection();</span>
-<span class="source-line-no">2894</span><span id="line-2894">  }</span>
-<span class="source-line-no">2895</span><span id="line-2895"></span>
-<span class="source-line-no">2896</span><span id="line-2896">  /**</span>
-<span class="source-line-no">2897</span><span id="line-2897">   * Get a assigned Connection to the cluster. this method is thread safe.</span>
-<span class="source-line-no">2898</span><span id="line-2898">   * @param user assigned user</span>
-<span class="source-line-no">2899</span><span id="line-2899">   * @return A Connection with assigned user.</span>
-<span class="source-line-no">2900</span><span id="line-2900">   */</span>
-<span class="source-line-no">2901</span><span id="line-2901">  public Connection getConnection(User user) throws IOException {</span>
-<span class="source-line-no">2902</span><span id="line-2902">    return getAsyncConnection(user).toConnection();</span>
-<span class="source-line-no">2903</span><span id="line-2903">  }</span>
-<span class="source-line-no">2904</span><span id="line-2904"></span>
-<span class="source-line-no">2905</span><span id="line-2905">  /**</span>
-<span class="source-line-no">2906</span><span id="line-2906">   * Get a shared AsyncClusterConnection to the cluster. this method is thread safe.</span>
-<span class="source-line-no">2907</span><span id="line-2907">   * @return An AsyncClusterConnection that can be shared. Don't close. Will be closed on shutdown</span>
-<span class="source-line-no">2908</span><span id="line-2908">   *         of cluster.</span>
-<span class="source-line-no">2909</span><span id="line-2909">   */</span>
-<span class="source-line-no">2910</span><span id="line-2910">  public AsyncClusterConnection getAsyncConnection() throws IOException {</span>
-<span class="source-line-no">2911</span><span id="line-2911">    try {</span>
-<span class="source-line-no">2912</span><span id="line-2912">      return asyncConnection.updateAndGet(connection -&gt; {</span>
-<span class="source-line-no">2913</span><span id="line-2913">        if (connection == null) {</span>
-<span class="source-line-no">2914</span><span id="line-2914">          try {</span>
-<span class="source-line-no">2915</span><span id="line-2915">            User user = UserProvider.instantiate(conf).getCurrent();</span>
-<span class="source-line-no">2916</span><span id="line-2916">            connection = getAsyncConnection(user);</span>
-<span class="source-line-no">2917</span><span id="line-2917">          } catch (IOException ioe) {</span>
-<span class="source-line-no">2918</span><span id="line-2918">            throw new UncheckedIOException("Failed to create connection", ioe);</span>
-<span class="source-line-no">2919</span><span id="line-2919">          }</span>
-<span class="source-line-no">2920</span><span id="line-2920">        }</span>
-<span class="source-line-no">2921</span><span id="line-2921">        return connection;</span>
-<span class="source-line-no">2922</span><span id="line-2922">      });</span>
-<span class="source-line-no">2923</span><span id="line-2923">    } catch (UncheckedIOException exception) {</span>
-<span class="source-line-no">2924</span><span id="line-2924">      throw exception.getCause();</span>
-<span class="source-line-no">2925</span><span id="line-2925">    }</span>
-<span class="source-line-no">2926</span><span id="line-2926">  }</span>
-<span class="source-line-no">2927</span><span id="line-2927"></span>
-<span class="source-line-no">2928</span><span id="line-2928">  /**</span>
-<span class="source-line-no">2929</span><span id="line-2929">   * Get a assigned AsyncClusterConnection to the cluster. this method is thread safe.</span>
-<span class="source-line-no">2930</span><span id="line-2930">   * @param user assigned user</span>
-<span class="source-line-no">2931</span><span id="line-2931">   * @return An AsyncClusterConnection with assigned user.</span>
-<span class="source-line-no">2932</span><span id="line-2932">   */</span>
-<span class="source-line-no">2933</span><span id="line-2933">  public AsyncClusterConnection getAsyncConnection(User user) throws IOException {</span>
-<span class="source-line-no">2934</span><span id="line-2934">    return ClusterConnectionFactory.createAsyncClusterConnection(conf, null, user);</span>
-<span class="source-line-no">2935</span><span id="line-2935">  }</span>
-<span class="source-line-no">2936</span><span id="line-2936"></span>
-<span class="source-line-no">2937</span><span id="line-2937">  public void closeConnection() throws IOException {</span>
-<span class="source-line-no">2938</span><span id="line-2938">    if (hbaseAdmin != null) {</span>
-<span class="source-line-no">2939</span><span id="line-2939">      Closeables.close(hbaseAdmin, true);</span>
-<span class="source-line-no">2940</span><span id="line-2940">      hbaseAdmin = null;</span>
-<span class="source-line-no">2941</span><span id="line-2941">    }</span>
-<span class="source-line-no">2942</span><span id="line-2942">    AsyncClusterConnection asyncConnection = this.asyncConnection.getAndSet(null);</span>
-<span class="source-line-no">2943</span><span id="line-2943">    if (asyncConnection != null) {</span>
-<span class="source-line-no">2944</span><span id="line-2944">      Closeables.close(asyncConnection, true);</span>
-<span class="source-line-no">2945</span><span id="line-2945">    }</span>
-<span class="source-line-no">2946</span><span id="line-2946">  }</span>
-<span class="source-line-no">2947</span><span id="line-2947"></span>
-<span class="source-line-no">2948</span><span id="line-2948">  /**</span>
-<span class="source-line-no">2949</span><span id="line-2949">   * Returns an Admin instance which is shared between HBaseTestingUtility instance users. Closing</span>
-<span class="source-line-no">2950</span><span id="line-2950">   * it has no effect, it will be closed automatically when the cluster shutdowns</span>
-<span class="source-line-no">2951</span><span id="line-2951">   */</span>
-<span class="source-line-no">2952</span><span id="line-2952">  public Admin getAdmin() throws IOException {</span>
-<span class="source-line-no">2953</span><span id="line-2953">    if (hbaseAdmin == null) {</span>
-<span class="source-line-no">2954</span><span id="line-2954">      this.hbaseAdmin = getConnection().getAdmin();</span>
-<span class="source-line-no">2955</span><span id="line-2955">    }</span>
-<span class="source-line-no">2956</span><span id="line-2956">    return hbaseAdmin;</span>
-<span class="source-line-no">2957</span><span id="line-2957">  }</span>
-<span class="source-line-no">2958</span><span id="line-2958"></span>
-<span class="source-line-no">2959</span><span id="line-2959">  public KeymetaAdminClient getKeymetaAdmin() throws IOException {</span>
-<span class="source-line-no">2960</span><span id="line-2960">    return new KeymetaAdminClient(getConnection());</span>
-<span class="source-line-no">2961</span><span id="line-2961">  }</span>
-<span class="source-line-no">2962</span><span id="line-2962"></span>
-<span class="source-line-no">2963</span><span id="line-2963">  /**</span>
-<span class="source-line-no">2964</span><span id="line-2964">   * Returns an {@link Hbck} instance. Needs be closed when done.</span>
-<span class="source-line-no">2965</span><span id="line-2965">   */</span>
-<span class="source-line-no">2966</span><span id="line-2966">  public Hbck getHbck() throws IOException {</span>
-<span class="source-line-no">2967</span><span id="line-2967">    return getConnection().getHbck();</span>
-<span class="source-line-no">2968</span><span id="line-2968">  }</span>
-<span class="source-line-no">2969</span><span id="line-2969"></span>
-<span class="source-line-no">2970</span><span id="line-2970">  /**</span>
-<span class="source-line-no">2971</span><span id="line-2971">   * Unassign the named region.</span>
-<span class="source-line-no">2972</span><span id="line-2972">   * @param regionName The region to unassign.</span>
-<span class="source-line-no">2973</span><span id="line-2973">   */</span>
-<span class="source-line-no">2974</span><span id="line-2974">  public void unassignRegion(String regionName) throws IOException {</span>
-<span class="source-line-no">2975</span><span id="line-2975">    unassignRegion(Bytes.toBytes(regionName));</span>
-<span class="source-line-no">2976</span><span id="line-2976">  }</span>
-<span class="source-line-no">2977</span><span id="line-2977"></span>
-<span class="source-line-no">2978</span><span id="line-2978">  /**</span>
-<span class="source-line-no">2979</span><span id="line-2979">   * Unassign the named region.</span>
-<span class="source-line-no">2980</span><span id="line-2980">   * @param regionName The region to unassign.</span>
-<span class="source-line-no">2981</span><span id="line-2981">   */</span>
-<span class="source-line-no">2982</span><span id="line-2982">  public void unassignRegion(byte[] regionName) throws IOException {</span>
-<span class="source-line-no">2983</span><span id="line-2983">    getAdmin().unassign(regionName, true);</span>
-<span class="source-line-no">2984</span><span id="line-2984">  }</span>
-<span class="source-line-no">2985</span><span id="line-2985"></span>
-<span class="source-line-no">2986</span><span id="line-2986">  /**</span>
-<span class="source-line-no">2987</span><span id="line-2987">   * Closes the region containing the given row.</span>
-<span class="source-line-no">2988</span><span id="line-2988">   * @param row   The row to find the containing region.</span>
-<span class="source-line-no">2989</span><span id="line-2989">   * @param table The table to find the region.</span>
-<span class="source-line-no">2990</span><span id="line-2990">   */</span>
-<span class="source-line-no">2991</span><span id="line-2991">  public void unassignRegionByRow(String row, RegionLocator table) throws IOException {</span>
-<span class="source-line-no">2992</span><span id="line-2992">    unassignRegionByRow(Bytes.toBytes(row), table);</span>
-<span class="source-line-no">2993</span><span id="line-2993">  }</span>
-<span class="source-line-no">2994</span><span id="line-2994"></span>
-<span class="source-line-no">2995</span><span id="line-2995">  /**</span>
-<span class="source-line-no">2996</span><span id="line-2996">   * Closes the region containing the given row.</span>
-<span class="source-line-no">2997</span><span id="line-2997">   * @param row   The row to find the containing region.</span>
-<span class="source-line-no">2998</span><span id="line-2998">   * @param table The table to find the region.</span>
-<span class="source-line-no">2999</span><span id="line-2999">   */</span>
-<span class="source-line-no">3000</span><span id="line-3000">  public void unassignRegionByRow(byte[] row, RegionLocator table) throws IOException {</span>
-<span class="source-line-no">3001</span><span id="line-3001">    HRegionLocation hrl = table.getRegionLocation(row);</span>
-<span class="source-line-no">3002</span><span id="line-3002">    unassignRegion(hrl.getRegion().getRegionName());</span>
-<span class="source-line-no">3003</span><span id="line-3003">  }</span>
-<span class="source-line-no">3004</span><span id="line-3004"></span>
-<span class="source-line-no">3005</span><span id="line-3005">  /**</span>
-<span class="source-line-no">3006</span><span id="line-3006">   * Retrieves a splittable region randomly from tableName</span>
-<span class="source-line-no">3007</span><span id="line-3007">   * @param tableName   name of table</span>
-<span class="source-line-no">3008</span><span id="line-3008">   * @param maxAttempts maximum number of attempts, unlimited for value of -1</span>
-<span class="source-line-no">3009</span><span id="line-3009">   * @return the HRegion chosen, null if none was found within limit of maxAttempts</span>
-<span class="source-line-no">3010</span><span id="line-3010">   */</span>
-<span class="source-line-no">3011</span><span id="line-3011">  public HRegion getSplittableRegion(TableName tableName, int maxAttempts) {</span>
-<span class="source-line-no">3012</span><span id="line-3012">    List&lt;HRegion&gt; regions = getHBaseCluster().getRegions(tableName);</span>
-<span class="source-line-no">3013</span><span id="line-3013">    int regCount = regions.size();</span>
-<span class="source-line-no">3014</span><span id="line-3014">    Set&lt;Integer&gt; attempted = new HashSet&lt;&gt;();</span>
-<span class="source-line-no">3015</span><span id="line-3015">    int idx;</span>
-<span class="source-line-no">3016</span><span id="line-3016">    int attempts = 0;</span>
-<span class="source-line-no">3017</span><span id="line-3017">    do {</span>
-<span class="source-line-no">3018</span><span id="line-3018">      regions = getHBaseCluster().getRegions(tableName);</span>
-<span class="source-line-no">3019</span><span id="line-3019">      if (regCount != regions.size()) {</span>
-<span class="source-line-no">3020</span><span id="line-3020">        // if there was region movement, clear attempted Set</span>
-<span class="source-line-no">3021</span><span id="line-3021">        attempted.clear();</span>
-<span class="source-line-no">3022</span><span id="line-3022">      }</span>
-<span class="source-line-no">3023</span><span id="line-3023">      regCount = regions.size();</span>
-<span class="source-line-no">3024</span><span id="line-3024">      // There are chances that before we get the region for the table from an RS the region may</span>
-<span class="source-line-no">3025</span><span id="line-3025">      // be going for CLOSE. This may be because online schema change is enabled</span>
-<span class="source-line-no">3026</span><span id="line-3026">      if (regCount &gt; 0) {</span>
-<span class="source-line-no">3027</span><span id="line-3027">        idx = ThreadLocalRandom.current().nextInt(regCount);</span>
-<span class="source-line-no">3028</span><span id="line-3028">        // if we have just tried this region, there is no need to try again</span>
-<span class="source-line-no">3029</span><span id="line-3029">        if (attempted.contains(idx)) {</span>
-<span class="source-line-no">3030</span><span id="line-3030">          continue;</span>
-<span class="source-line-no">3031</span><span id="line-3031">        }</span>
-<span class="source-line-no">3032</span><span id="line-3032">        HRegion region = regions.get(idx);</span>
-<span class="source-line-no">3033</span><span id="line-3033">        if (region.checkSplit().isPresent()) {</span>
-<span class="source-line-no">3034</span><span id="line-3034">          return region;</span>
-<span class="source-line-no">3035</span><span id="line-3035">        }</span>
-<span class="source-line-no">3036</span><span id="line-3036">        attempted.add(idx);</span>
-<span class="source-line-no">3037</span><span id="line-3037">      }</span>
-<span class="source-line-no">3038</span><span id="line-3038">      attempts++;</span>
-<span class="source-line-no">3039</span><span id="line-3039">    } while (maxAttempts == -1 || attempts &lt; maxAttempts);</span>
-<span class="source-line-no">3040</span><span id="line-3040">    return null;</span>
-<span class="source-line-no">3041</span><span id="line-3041">  }</span>
-<span class="source-line-no">3042</span><span id="line-3042"></span>
-<span class="source-line-no">3043</span><span id="line-3043">  public MiniDFSCluster getDFSCluster() {</span>
-<span class="source-line-no">3044</span><span id="line-3044">    return dfsCluster;</span>
-<span class="source-line-no">3045</span><span id="line-3045">  }</span>
-<span class="source-line-no">3046</span><span id="line-3046"></span>
-<span class="source-line-no">3047</span><span id="line-3047">  public void setDFSCluster(MiniDFSCluster cluster) throws IllegalStateException, IOException {</span>
-<span class="source-line-no">3048</span><span id="line-3048">    setDFSCluster(cluster, true);</span>
-<span class="source-line-no">3049</span><span id="line-3049">  }</span>
-<span class="source-line-no">3050</span><span id="line-3050"></span>
-<span class="source-line-no">3051</span><span id="line-3051">  /**</span>
-<span class="source-line-no">3052</span><span id="line-3052">   * Set the MiniDFSCluster</span>
-<span class="source-line-no">3053</span><span id="line-3053">   * @param cluster     cluster to use</span>
-<span class="source-line-no">3054</span><span id="line-3054">   * @param requireDown require the that cluster not be "up" (MiniDFSCluster#isClusterUp) before it</span>
-<span class="source-line-no">3055</span><span id="line-3055">   *                    is set.</span>
-<span class="source-line-no">3056</span><span id="line-3056">   * @throws IllegalStateException if the passed cluster is up when it is required to be down</span>
-<span class="source-line-no">3057</span><span id="line-3057">   * @throws IOException           if the FileSystem could not be set from the passed dfs cluster</span>
-<span class="source-line-no">3058</span><span id="line-3058">   */</span>
-<span class="source-line-no">3059</span><span id="line-3059">  public void setDFSCluster(MiniDFSCluster cluster, boolean requireDown)</span>
-<span class="source-line-no">3060</span><span id="line-3060">    throws IllegalStateException, IOException {</span>
-<span class="source-line-no">3061</span><span id="line-3061">    if (dfsCluster != null &amp;&amp; requireDown &amp;&amp; dfsCluster.isClusterUp()) {</span>
-<span class="source-line-no">3062</span><span id="line-3062">      throw new IllegalStateException("DFSCluster is already running! Shut it down first.");</span>
-<span class="source-line-no">3063</span><span id="line-3063">    }</span>
-<span class="source-line-no">3064</span><span id="line-3064">    this.dfsCluster = cluster;</span>
-<span class="source-line-no">3065</span><span id="line-3065">    this.setFs();</span>
-<span class="source-line-no">3066</span><span id="line-3066">  }</span>
-<span class="source-line-no">3067</span><span id="line-3067"></span>
-<span class="source-line-no">3068</span><span id="line-3068">  public FileSystem getTestFileSystem() throws IOException {</span>
-<span class="source-line-no">3069</span><span id="line-3069">    return HFileSystem.get(conf);</span>
-<span class="source-line-no">3070</span><span id="line-3070">  }</span>
-<span class="source-line-no">3071</span><span id="line-3071"></span>
-<span class="source-line-no">3072</span><span id="line-3072">  /**</span>
-<span class="source-line-no">3073</span><span id="line-3073">   * Wait until all regions in a table have been assigned. Waits default timeout before giving up</span>
-<span class="source-line-no">3074</span><span id="line-3074">   * (30 seconds).</span>
-<span class="source-line-no">3075</span><span id="line-3075">   * @param table Table to wait on.</span>
-<span class="source-line-no">3076</span><span id="line-3076">   */</span>
-<span class="source-line-no">3077</span><span id="line-3077">  public void waitTableAvailable(TableName table) throws InterruptedException, IOException {</span>
-<span class="source-line-no">3078</span><span id="line-3078">    waitTableAvailable(table.getName(), 30000);</span>
+<span class="source-line-no">2784</span><span id="line-2784">    // each master thread keeps a copy of configuration</span>
+<span class="source-line-no">2785</span><span id="line-2785">    for (MasterThread master : getHBaseCluster().getMasterThreads()) {</span>
+<span class="source-line-no">2786</span><span id="line-2786">      decrementMinRegionServerCount(master.getMaster().getConfiguration());</span>
+<span class="source-line-no">2787</span><span id="line-2787">    }</span>
+<span class="source-line-no">2788</span><span id="line-2788">  }</span>
+<span class="source-line-no">2789</span><span id="line-2789"></span>
+<span class="source-line-no">2790</span><span id="line-2790">  private void decrementMinRegionServerCount(Configuration conf) {</span>
+<span class="source-line-no">2791</span><span id="line-2791">    int currentCount = conf.getInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, -1);</span>
+<span class="source-line-no">2792</span><span id="line-2792">    if (currentCount != -1) {</span>
+<span class="source-line-no">2793</span><span id="line-2793">      conf.setInt(ServerManager.WAIT_ON_REGIONSERVERS_MINTOSTART, Math.max(currentCount - 1, 1));</span>
+<span class="source-line-no">2794</span><span id="line-2794">    }</span>
+<span class="source-line-no">2795</span><span id="line-2795">  }</span>
+<span class="source-line-no">2796</span><span id="line-2796"></span>
+<span class="source-line-no">2797</span><span id="line-2797">  public void expireSession(ZKWatcher nodeZK) throws Exception {</span>
+<span class="source-line-no">2798</span><span id="line-2798">    expireSession(nodeZK, false);</span>
+<span class="source-line-no">2799</span><span id="line-2799">  }</span>
+<span class="source-line-no">2800</span><span id="line-2800"></span>
+<span class="source-line-no">2801</span><span id="line-2801">  /**</span>
+<span class="source-line-no">2802</span><span id="line-2802">   * Expire a ZooKeeper session as recommended in ZooKeeper documentation &lt;a href=</span>
+<span class="source-line-no">2803</span><span id="line-2803">   * "https://hbase.apache.org/docs/troubleshooting#troubleshooting-zookeeper"&gt;Troubleshooting</span>
+<span class="source-line-no">2804</span><span id="line-2804">   * ZooKeeper&lt;/a&gt;</span>
+<span class="source-line-no">2805</span><span id="line-2805">   * &lt;p/&gt;</span>
+<span class="source-line-no">2806</span><span id="line-2806">   * There are issues when doing this:</span>
+<span class="source-line-no">2807</span><span id="line-2807">   * &lt;ol&gt;</span>
+<span class="source-line-no">2808</span><span id="line-2808">   * &lt;li&gt;http://www.mail-archive.com/dev@zookeeper.apache.org/msg01942.html&lt;/li&gt;</span>
+<span class="source-line-no">2809</span><span id="line-2809">   * &lt;li&gt;https://issues.apache.org/jira/browse/ZOOKEEPER-1105&lt;/li&gt;</span>
+<span class="source-line-no">2810</span><span id="line-2810">   * &lt;/ol&gt;</span>
+<span class="source-line-no">2811</span><span id="line-2811">   * @param nodeZK      - the ZK watcher to expire</span>
+<span class="source-line-no">2812</span><span id="line-2812">   * @param checkStatus - true to check if we can create a Table with the current configuration.</span>
+<span class="source-line-no">2813</span><span id="line-2813">   */</span>
+<span class="source-line-no">2814</span><span id="line-2814">  public void expireSession(ZKWatcher nodeZK, boolean checkStatus) throws Exception {</span>
+<span class="source-line-no">2815</span><span id="line-2815">    Configuration c = new Configuration(this.conf);</span>
+<span class="source-line-no">2816</span><span id="line-2816">    String quorumServers = ZKConfig.getZKQuorumServersString(c);</span>
+<span class="source-line-no">2817</span><span id="line-2817">    ZooKeeper zk = nodeZK.getRecoverableZooKeeper().getZooKeeper();</span>
+<span class="source-line-no">2818</span><span id="line-2818">    byte[] password = zk.getSessionPasswd();</span>
+<span class="source-line-no">2819</span><span id="line-2819">    long sessionID = zk.getSessionId();</span>
+<span class="source-line-no">2820</span><span id="line-2820"></span>
+<span class="source-line-no">2821</span><span id="line-2821">    // Expiry seems to be asynchronous (see comment from P. Hunt in [1]),</span>
+<span class="source-line-no">2822</span><span id="line-2822">    // so we create a first watcher to be sure that the</span>
+<span class="source-line-no">2823</span><span id="line-2823">    // event was sent. We expect that if our watcher receives the event</span>
+<span class="source-line-no">2824</span><span id="line-2824">    // other watchers on the same machine will get is as well.</span>
+<span class="source-line-no">2825</span><span id="line-2825">    // When we ask to close the connection, ZK does not close it before</span>
+<span class="source-line-no">2826</span><span id="line-2826">    // we receive all the events, so don't have to capture the event, just</span>
+<span class="source-line-no">2827</span><span id="line-2827">    // closing the connection should be enough.</span>
+<span class="source-line-no">2828</span><span id="line-2828">    ZooKeeper monitor = new ZooKeeper(quorumServers, 1000, new org.apache.zookeeper.Watcher() {</span>
+<span class="source-line-no">2829</span><span id="line-2829">      @Override</span>
+<span class="source-line-no">2830</span><span id="line-2830">      public void process(WatchedEvent watchedEvent) {</span>
+<span class="source-line-no">2831</span><span id="line-2831">        LOG.info("Monitor ZKW received event=" + watchedEvent);</span>
+<span class="source-line-no">2832</span><span id="line-2832">      }</span>
+<span class="source-line-no">2833</span><span id="line-2833">    }, sessionID, password);</span>
+<span class="source-line-no">2834</span><span id="line-2834"></span>
+<span class="source-line-no">2835</span><span id="line-2835">    // Making it expire</span>
+<span class="source-line-no">2836</span><span id="line-2836">    ZooKeeper newZK =</span>
+<span class="source-line-no">2837</span><span id="line-2837">      new ZooKeeper(quorumServers, 1000, EmptyWatcher.instance, sessionID, password);</span>
+<span class="source-line-no">2838</span><span id="line-2838"></span>
+<span class="source-line-no">2839</span><span id="line-2839">    // ensure that we have connection to the server before closing down, otherwise</span>
+<span class="source-line-no">2840</span><span id="line-2840">    // the close session event will be eaten out before we start CONNECTING state</span>
+<span class="source-line-no">2841</span><span id="line-2841">    long start = EnvironmentEdgeManager.currentTime();</span>
+<span class="source-line-no">2842</span><span id="line-2842">    while (</span>
+<span class="source-line-no">2843</span><span id="line-2843">      newZK.getState() != States.CONNECTED &amp;&amp; EnvironmentEdgeManager.currentTime() - start &lt; 1000</span>
+<span class="source-line-no">2844</span><span id="line-2844">    ) {</span>
+<span class="source-line-no">2845</span><span id="line-2845">      Thread.sleep(1);</span>
+<span class="source-line-no">2846</span><span id="line-2846">    }</span>
+<span class="source-line-no">2847</span><span id="line-2847">    newZK.close();</span>
+<span class="source-line-no">2848</span><span id="line-2848">    LOG.info("ZK Closed Session 0x" + Long.toHexString(sessionID));</span>
+<span class="source-line-no">2849</span><span id="line-2849"></span>
+<span class="source-line-no">2850</span><span id="line-2850">    // Now closing &amp; waiting to be sure that the clients get it.</span>
+<span class="source-line-no">2851</span><span id="line-2851">    monitor.close();</span>
+<span class="source-line-no">2852</span><span id="line-2852"></span>
+<span class="source-line-no">2853</span><span id="line-2853">    if (checkStatus) {</span>
+<span class="source-line-no">2854</span><span id="line-2854">      getConnection().getTable(TableName.META_TABLE_NAME).close();</span>
+<span class="source-line-no">2855</span><span id="line-2855">    }</span>
+<span class="source-line-no">2856</span><span id="line-2856">  }</span>
+<span class="source-line-no">2857</span><span id="line-2857"></span>
+<span class="source-line-no">2858</span><span id="line-2858">  /**</span>
+<span class="source-line-no">2859</span><span id="line-2859">   * Get the Mini HBase cluster.</span>
+<span class="source-line-no">2860</span><span id="line-2860">   * @return hbase cluster</span>
+<span class="source-line-no">2861</span><span id="line-2861">   * @see #getHBaseClusterInterface()</span>
+<span class="source-line-no">2862</span><span id="line-2862">   */</span>
+<span class="source-line-no">2863</span><span id="line-2863">  public MiniHBaseCluster getHBaseCluster() {</span>
+<span class="source-line-no">2864</span><span id="line-2864">    return getMiniHBaseCluster();</span>
+<span class="source-line-no">2865</span><span id="line-2865">  }</span>
+<span class="source-line-no">2866</span><span id="line-2866"></span>
+<span class="source-line-no">2867</span><span id="line-2867">  /**</span>
+<span class="source-line-no">2868</span><span id="line-2868">   * Returns the HBaseCluster instance.</span>
+<span class="source-line-no">2869</span><span id="line-2869">   * &lt;p&gt;</span>
+<span class="source-line-no">2870</span><span id="line-2870">   * Returned object can be any of the subclasses of HBaseCluster, and the tests referring this</span>
+<span class="source-line-no">2871</span><span id="line-2871">   * should not assume that the cluster is a mini cluster or a distributed one. If the test only</span>
+<span class="source-line-no">2872</span><span id="line-2872">   * works on a mini cluster, then specific method {@link #getMiniHBaseCluster()} can be used</span>
+<span class="source-line-no">2873</span><span id="line-2873">   * instead w/o the need to type-cast.</span>
+<span class="source-line-no">2874</span><span id="line-2874">   */</span>
+<span class="source-line-no">2875</span><span id="line-2875">  public HBaseCluster getHBaseClusterInterface() {</span>
+<span class="source-line-no">2876</span><span id="line-2876">    // implementation note: we should rename this method as #getHBaseCluster(),</span>
+<span class="source-line-no">2877</span><span id="line-2877">    // but this would require refactoring 90+ calls.</span>
+<span class="source-line-no">2878</span><span id="line-2878">    return hbaseCluster;</span>
+<span class="source-line-no">2879</span><span id="line-2879">  }</span>
+<span class="source-line-no">2880</span><span id="line-2880"></span>
+<span class="source-line-no">2881</span><span id="line-2881">  /**</span>
+<span class="source-line-no">2882</span><span id="line-2882">   * Resets the connections so that the next time getConnection() is called, a new connection is</span>
+<span class="source-line-no">2883</span><span id="line-2883">   * created. This is needed in cases where the entire cluster / all the masters are shutdown and</span>
+<span class="source-line-no">2884</span><span id="line-2884">   * the connection is not valid anymore. TODO: There should be a more coherent way of doing this.</span>
+<span class="source-line-no">2885</span><span id="line-2885">   * Unfortunately the way tests are written, not all start() stop() calls go through this class.</span>
+<span class="source-line-no">2886</span><span id="line-2886">   * Most tests directly operate on the underlying mini/local hbase cluster. That makes it difficult</span>
+<span class="source-line-no">2887</span><span id="line-2887">   * for this wrapper class to maintain the connection state automatically. Cleaning this is a much</span>
+<span class="source-line-no">2888</span><span id="line-2888">   * bigger refactor.</span>
+<span class="source-line-no">2889</span><span id="line-2889">   */</span>
+<span class="source-line-no">2890</span><span id="line-2890">  public void invalidateConnection() throws IOException {</span>
+<span class="source-line-no">2891</span><span id="line-2891">    closeConnection();</span>
+<span class="source-line-no">2892</span><span id="line-2892">    // Update the master addresses if they changed.</span>
+<span class="source-line-no">2893</span><span id="line-2893">    final String masterConfigBefore = conf.get(HConstants.MASTER_ADDRS_KEY);</span>
+<span class="source-line-no">2894</span><span id="line-2894">    final String masterConfAfter = getMiniHBaseCluster().conf.get(HConstants.MASTER_ADDRS_KEY);</span>
+<span class="source-line-no">2895</span><span id="line-2895">    LOG.info("Invalidated connection. Updating master addresses before: {} after: {}",</span>
+<span class="source-line-no">2896</span><span id="line-2896">      masterConfigBefore, masterConfAfter);</span>
+<span class="source-line-no">2897</span><span id="line-2897">    conf.set(HConstants.MASTER_ADDRS_KEY,</span>
+<span class="source-line-no">2898</span><span id="line-2898">      getMiniHBaseCluster().conf.get(HConstants.MASTER_ADDRS_KEY));</span>
+<span class="source-line-no">2899</span><span id="line-2899">  }</span>
+<span class="source-line-no">2900</span><span id="line-2900"></span>
+<span class="source-line-no">2901</span><span id="line-2901">  /**</span>
+<span class="source-line-no">2902</span><span id="line-2902">   * Get a shared Connection to the cluster. this method is thread safe.</span>
+<span class="source-line-no">2903</span><span id="line-2903">   * @return A Connection that can be shared. Don't close. Will be closed on shutdown of cluster.</span>
+<span class="source-line-no">2904</span><span id="line-2904">   */</span>
+<span class="source-line-no">2905</span><span id="line-2905">  public Connection getConnection() throws IOException {</span>
+<span class="source-line-no">2906</span><span id="line-2906">    return getAsyncConnection().toConnection();</span>
+<span class="source-line-no">2907</span><span id="line-2907">  }</span>
+<span class="source-line-no">2908</span><span id="line-2908"></span>
+<span class="source-line-no">2909</span><span id="line-2909">  /**</span>
+<span class="source-line-no">2910</span><span id="line-2910">   * Get a assigned Connection to the cluster. this method is thread safe.</span>
+<span class="source-line-no">2911</span><span id="line-2911">   * @param user assigned user</span>
+<span class="source-line-no">2912</span><span id="line-2912">   * @return A Connection with assigned user.</span>
+<span class="source-line-no">2913</span><span id="line-2913">   */</span>
+<span class="source-line-no">2914</span><span id="line-2914">  public Connection getConnection(User user) throws IOException {</span>
+<span class="source-line-no">2915</span><span id="line-2915">    return getAsyncConnection(user).toConnection();</span>
+<span class="source-line-no">2916</span><span id="line-2916">  }</span>
+<span class="source-line-no">2917</span><span id="line-2917"></span>
+<span class="source-line-no">2918</span><span id="line-2918">  /**</span>
+<span class="source-line-no">2919</span><span id="line-2919">   * Get a shared AsyncClusterConnection to the cluster. this method is thread safe.</span>
+<span class="source-line-no">2920</span><span id="line-2920">   * @return An AsyncClusterConnection that can be shared. Don't close. Will be closed on shutdown</span>
+<span class="source-line-no">2921</span><span id="line-2921">   *         of cluster.</span>
+<span class="source-line-no">2922</span><span id="line-2922">   */</span>
+<span class="source-line-no">2923</span><span id="line-2923">  public AsyncClusterConnection getAsyncConnection() throws IOException {</span>
+<span class="source-line-no">2924</span><span id="line-2924">    try {</span>
+<span class="source-line-no">2925</span><span id="line-2925">      return asyncConnection.updateAndGet(connection -&gt; {</span>
+<span class="source-line-no">2926</span><span id="line-2926">        if (connection == null) {</span>
+<span class="source-line-no">2927</span><span id="line-2927">          try {</span>
+<span class="source-line-no">2928</span><span id="line-2928">            User user = UserProvider.instantiate(conf).getCurrent();</span>
+<span class="source-line-no">2929</span><span id="line-2929">            connection = getAsyncConnection(user);</span>
+<span class="source-line-no">2930</span><span id="line-2930">          } catch (IOException ioe) {</span>
+<span class="source-line-no">2931</span><span id="line-2931">            throw new UncheckedIOException("Failed to create connection", ioe);</span>
+<span class="source-line-no">2932</span><span id="line-2932">          }</span>
+<span class="source-line-no">2933</span><span id="line-2933">        }</span>
+<span class="source-line-no">2934</span><span id="line-2934">        return connection;</span>
+<span class="source-line-no">2935</span><span id="line-2935">      });</span>
+<span class="source-line-no">2936</span><span id="line-2936">    } catch (UncheckedIOException exception) {</span>
+<span class="source-line-no">2937</span><span id="line-2937">      throw exception.getCause();</span>
+<span class="source-line-no">2938</span><span id="line-2938">    }</span>
+<span class="source-line-no">2939</span><span id="line-2939">  }</span>
+<span class="source-line-no">2940</span><span id="line-2940"></span>
+<span class="source-line-no">2941</span><span id="line-2941">  /**</span>
+<span class="source-line-no">2942</span><span id="line-2942">   * Get a assigned AsyncClusterConnection to the cluster. this method is thread safe.</span>
+<span class="source-line-no">2943</span><span id="line-2943">   * @param user assigned user</span>
+<span class="source-line-no">2944</span><span id="line-2944">   * @return An AsyncClusterConnection with assigned user.</span>
+<span class="source-line-no">2945</span><span id="line-2945">   */</span>
+<span class="source-line-no">2946</span><span id="line-2946">  public AsyncClusterConnection getAsyncConnection(User user) throws IOException {</span>
+<span class="source-line-no">2947</span><span id="line-2947">    return ClusterConnectionFactory.createAsyncClusterConnection(conf, null, user);</span>
+<span class="source-line-no">2948</span><span id="line-2948">  }</span>
+<span class="source-line-no">2949</span><span id="line-2949"></span>
+<span class="source-line-no">2950</span><span id="line-2950">  public void closeConnection() throws IOException {</span>
+<span class="source-line-no">2951</span><span id="line-2951">    if (hbaseAdmin != null) {</span>
+<span class="source-line-no">2952</span><span id="line-2952">      Closeables.close(hbaseAdmin, true);</span>
+<span class="source-line-no">2953</span><span id="line-2953">      hbaseAdmin = null;</span>
+<span class="source-line-no">2954</span><span id="line-2954">    }</span>
+<span class="source-line-no">2955</span><span id="line-2955">    AsyncClusterConnection asyncConnection = this.asyncConnection.getAndSet(null);</span>
+<span class="source-line-no">2956</span><span id="line-2956">    if (asyncConnection != null) {</span>
+<span class="source-line-no">2957</span><span id="line-2957">      Closeables.close(asyncConnection, true);</span>
+<span class="source-line-no">2958</span><span id="line-2958">    }</span>
+<span class="source-line-no">2959</span><span id="line-2959">  }</span>
+<span class="source-line-no">2960</span><span id="line-2960"></span>
+<span class="source-line-no">2961</span><span id="line-2961">  /**</span>
+<span class="source-line-no">2962</span><span id="line-2962">   * Returns an Admin instance which is shared between HBaseTestingUtility instance users. Closing</span>
+<span class="source-line-no">2963</span><span id="line-2963">   * it has no effect, it will be closed automatically when the cluster shutdowns</span>
+<span class="source-line-no">2964</span><span id="line-2964">   */</span>
+<span class="source-line-no">2965</span><span id="line-2965">  public Admin getAdmin() throws IOException {</span>
+<span class="source-line-no">2966</span><span id="line-2966">    if (hbaseAdmin == null) {</span>
+<span class="source-line-no">2967</span><span id="line-2967">      this.hbaseAdmin = getConnection().getAdmin();</span>
+<span class="source-line-no">2968</span><span id="line-2968">    }</span>
+<span class="source-line-no">2969</span><span id="line-2969">    return hbaseAdmin;</span>
+<span class="source-line-no">2970</span><span id="line-2970">  }</span>
+<span class="source-line-no">2971</span><span id="line-2971"></span>
+<span class="source-line-no">2972</span><span id="line-2972">  public KeymetaAdminClient getKeymetaAdmin() throws IOException {</span>
+<span class="source-line-no">2973</span><span id="line-2973">    return new KeymetaAdminClient(getConnection());</span>
+<span class="source-line-no">2974</span><span id="line-2974">  }</span>
+<span class="source-line-no">2975</span><span id="line-2975"></span>
+<span class="source-line-no">2976</span><span id="line-2976">  /**</span>
+<span class="source-line-no">2977</span><span id="line-2977">   * Returns an {@link Hbck} instance. Needs be closed when done.</span>
+<span class="source-line-no">2978</span><span id="line-2978">   */</span>
+<span class="source-line-no">2979</span><span id="line-2979">  public Hbck getHbck() throws IOException {</span>
+<span class="source-line-no">2980</span><span id="line-2980">    return getConnection().getHbck();</span>
+<span class="source-line-no">2981</span><span id="line-2981">  }</span>
+<span class="source-line-no">2982</span><span id="line-2982"></span>
+<span class="source-line-no">2983</span><span id="line-2983">  /**</span>
+<span class="source-line-no">2984</span><span id="line-2984">   * Unassign the named region.</span>
+<span class="source-line-no">2985</span><span id="line-2985">   * @param regionName The region to unassign.</span>
+<span class="source-line-no">2986</span><span id="line-2986">   */</span>
+<span class="source-line-no">2987</span><span id="line-2987">  public void unassignRegion(String regionName) throws IOException {</span>
+<span class="source-line-no">2988</span><span id="line-2988">    unassignRegion(Bytes.toBytes(regionName));</span>
+<span class="source-line-no">2989</span><span id="line-2989">  }</span>
+<span class="source-line-no">2990</span><span id="line-2990"></span>
+<span class="source-line-no">2991</span><span id="line-2991">  /**</span>
+<span class="source-line-no">2992</span><span id="line-2992">   * Unassign the named region.</span>
+<span class="source-line-no">2993</span><span id="line-2993">   * @param regionName The region to unassign.</span>
+<span class="source-line-no">2994</span><span id="line-2994">   */</span>
+<span class="source-line-no">2995</span><span id="line-2995">  public void unassignRegion(byte[] regionName) throws IOException {</span>
+<span class="source-line-no">2996</span><span id="line-2996">    getAdmin().unassign(regionName, true);</span>
+<span class="source-line-no">2997</span><span id="line-2997">  }</span>
+<span class="source-line-no">2998</span><span id="line-2998"></span>
+<span class="source-line-no">2999</span><span id="line-2999">  /**</span>
+<span class="source-line-no">3000</span><span id="line-3000">   * Closes the region containing the given row.</span>
+<span class="source-line-no">3001</span><span id="line-3001">   * @param row   The row to find the containing region.</span>
+<span class="source-line-no">3002</span><span id="line-3002">   * @param table The table to find the region.</span>
+<span class="source-line-no">3003</span><span id="line-3003">   */</span>
+<span class="source-line-no">3004</span><span id="line-3004">  public void unassignRegionByRow(String row, RegionLocator table) throws IOException {</span>
+<span class="source-line-no">3005</span><span id="line-3005">    unassignRegionByRow(Bytes.toBytes(row), table);</span>
+<span class="source-line-no">3006</span><span id="line-3006">  }</span>
+<span class="source-line-no">3007</span><span id="line-3007"></span>
+<span class="source-line-no">3008</span><span id="line-3008">  /**</span>
+<span class="source-line-no">3009</span><span id="line-3009">   * Closes the region containing the given row.</span>
+<span class="source-line-no">3010</span><span id="line-3010">   * @param row   The row to find the containing region.</span>
+<span class="source-line-no">3011</span><span id="line-3011">   * @param table The table to find the region.</span>
+<span class="source-line-no">3012</span><span id="line-3012">   */</span>
+<span class="source-line-no">3013</span><span id="line-3013">  public void unassignRegionByRow(byte[] row, RegionLocator table) throws IOException {</span>
+<span class="source-line-no">3014</span><span id="line-3014">    HRegionLocation hrl = table.getRegionLocation(row);</span>
+<span class="source-line-no">3015</span><span id="line-3015">    unassignRegion(hrl.getRegion().getRegionName());</span>
+<span class="source-line-no">3016</span><span id="line-3016">  }</span>
+<span class="source-line-no">3017</span><span id="line-3017"></span>
+<span class="source-line-no">3018</span><span id="line-3018">  /**</span>
+<span class="source-line-no">3019</span><span id="line-3019">   * Retrieves a splittable region randomly from tableName</span>
+<span class="source-line-no">3020</span><span id="line-3020">   * @param tableName   name of table</span>
+<span class="source-line-no">3021</span><span id="line-3021">   * @param maxAttempts maximum number of attempts, unlimited for value of -1</span>
+<span class="source-line-no">3022</span><span id="line-3022">   * @return the HRegion chosen, null if none was found within limit of maxAttempts</span>
+<span class="source-line-no">3023</span><span id="line-3023">   */</span>
+<span class="source-line-no">3024</span><span id="line-3024">  public HRegion getSplittableRegion(TableName tableName, int maxAttempts) {</span>
+<span class="source-line-no">3025</span><span id="line-3025">    List&lt;HRegion&gt; regions = getHBaseCluster().getRegions(tableName);</span>
+<span class="source-line-no">3026</span><span id="line-3026">    int regCount = regions.size();</span>
+<span class="source-line-no">3027</span><span id="line-3027">    Set&lt;Integer&gt; attempted = new HashSet&lt;&gt;();</span>
+<span class="source-line-no">3028</span><span id="line-3028">    int idx;</span>
+<span class="source-line-no">3029</span><span id="line-3029">    int attempts = 0;</span>
+<span class="source-line-no">3030</span><span id="line-3030">    do {</span>
+<span class="source-line-no">3031</span><span id="line-3031">      regions = getHBaseCluster().getRegions(tableName);</span>
+<span class="source-line-no">3032</span><span id="line-3032">      if (regCount != regions.size()) {</span>
+<span class="source-line-no">3033</span><span id="line-3033">        // if there was region movement, clear attempted Set</span>
+<span class="source-line-no">3034</span><span id="line-3034">        attempted.clear();</span>
+<span class="source-line-no">3035</span><span id="line-3035">      }</span>
+<span class="source-line-no">3036</span><span id="line-3036">      regCount = regions.size();</span>
+<span class="source-line-no">3037</span><span id="line-3037">      // There are chances that before we get the region for the table from an RS the region may</span>
+<span class="source-line-no">3038</span><span id="line-3038">      // be going for CLOSE. This may be because online schema change is enabled</span>
+<span class="source-line-no">3039</span><span id="line-3039">      if (regCount &gt; 0) {</span>
+<span class="source-line-no">3040</span><span id="line-3040">        idx = ThreadLocalRandom.current().nextInt(regCount);</span>
+<span class="source-line-no">3041</span><span id="line-3041">        // if we have just tried this region, there is no need to try again</span>
+<span class="source-line-no">3042</span><span id="line-3042">        if (attempted.contains(idx)) {</span>
+<span class="source-line-no">3043</span><span id="line-3043">          continue;</span>
+<span class="source-line-no">3044</span><span id="line-3044">        }</span>
+<span class="source-line-no">3045</span><span id="line-3045">        HRegion region = regions.get(idx);</span>
+<span class="source-line-no">3046</span><span id="line-3046">        if (region.checkSplit().isPresent()) {</span>
+<span class="source-line-no">3047</span><span id="line-3047">          return region;</span>
+<span class="source-line-no">3048</span><span id="line-3048">        }</span>
+<span class="source-line-no">3049</span><span id="line-3049">        attempted.add(idx);</span>
+<span class="source-line-no">3050</span><span id="line-3050">      }</span>
+<span class="source-line-no">3051</span><span id="line-3051">      attempts++;</span>
+<span class="source-line-no">3052</span><span id="line-3052">    } while (maxAttempts == -1 || attempts &lt; maxAttempts);</span>
+<span class="source-line-no">3053</span><span id="line-3053">    return null;</span>
+<span class="source-line-no">3054</span><span id="line-3054">  }</span>
+<span class="source-line-no">3055</span><span id="line-3055"></span>
+<span class="source-line-no">3056</span><span id="line-3056">  public MiniDFSCluster getDFSCluster() {</span>
+<span class="source-line-no">3057</span><span id="line-3057">    return dfsCluster;</span>
+<span class="source-line-no">3058</span><span id="line-3058">  }</span>
+<span class="source-line-no">3059</span><span id="line-3059"></span>
+<span class="source-line-no">3060</span><span id="line-3060">  public void setDFSCluster(MiniDFSCluster cluster) throws IllegalStateException, IOException {</span>
+<span class="source-line-no">3061</span><span id="line-3061">    setDFSCluster(cluster, true);</span>
+<span class="source-line-no">3062</span><span id="line-3062">  }</span>
+<span class="source-line-no">3063</span><span id="line-3063"></span>
+<span class="source-line-no">3064</span><span id="line-3064">  /**</span>
+<span class="source-line-no">3065</span><span id="line-3065">   * Set the MiniDFSCluster</span>
+<span class="source-line-no">3066</span><span id="line-3066">   * @param cluster     cluster to use</span>
+<span class="source-line-no">3067</span><span id="line-3067">   * @param requireDown require the that cluster not be "up" (MiniDFSCluster#isClusterUp) before it</span>
+<span class="source-line-no">3068</span><span id="line-3068">   *                    is set.</span>
+<span class="source-line-no">3069</span><span id="line-3069">   * @throws IllegalStateException if the passed cluster is up when it is required to be down</span>
+<span class="source-line-no">3070</span><span id="line-3070">   * @throws IOException           if the FileSystem could not be set from the passed dfs cluster</span>
+<span class="source-line-no">3071</span><span id="line-3071">   */</span>
+<span class="source-line-no">3072</span><span id="line-3072">  public void setDFSCluster(MiniDFSCluster cluster, boolean requireDown)</span>
+<span class="source-line-no">3073</span><span id="line-3073">    throws IllegalStateException, IOException {</span>
+<span class="source-line-no">3074</span><span id="line-3074">    if (dfsCluster != null &amp;&amp; requireDown &amp;&amp; dfsCluster.isClusterUp()) {</span>
+<span class="source-line-no">3075</span><span id="line-3075">      throw new IllegalStateException("DFSCluster is already running! Shut it down first.");</span>
+<span class="source-line-no">3076</span><span id="line-3076">    }</span>
+<span class="source-line-no">3077</span><span id="line-3077">    this.dfsCluster = cluster;</span>
+<span class="source-line-no">3078</span><span id="line-3078">    this.setFs();</span>
 <span class="source-line-no">3079</span><span id="line-3079">  }</span>
 <span class="source-line-no">3080</span><span id="line-3080"></span>
-<span class="source-line-no">3081</span><span id="line-3081">  public void waitTableAvailable(TableName table, long timeoutMillis)</span>
-<span class="source-line-no">3082</span><span id="line-3082">    throws InterruptedException, IOException {</span>
-<span class="source-line-no">3083</span><span id="line-3083">    waitFor(timeoutMillis, predicateTableAvailable(table));</span>
-<span class="source-line-no">3084</span><span id="line-3084">  }</span>
-<span class="source-line-no">3085</span><span id="line-3085"></span>
-<span class="source-line-no">3086</span><span id="line-3086">  /**</span>
-<span class="source-line-no">3087</span><span id="line-3087">   * Wait until all regions in a table have been assigned</span>
-<span class="source-line-no">3088</span><span id="line-3088">   * @param table         Table to wait on.</span>
-<span class="source-line-no">3089</span><span id="line-3089">   * @param timeoutMillis Timeout.</span>
-<span class="source-line-no">3090</span><span id="line-3090">   */</span>
-<span class="source-line-no">3091</span><span id="line-3091">  public void waitTableAvailable(byte[] table, long timeoutMillis)</span>
-<span class="source-line-no">3092</span><span id="line-3092">    throws InterruptedException, IOException {</span>
-<span class="source-line-no">3093</span><span id="line-3093">    waitFor(timeoutMillis, predicateTableAvailable(TableName.valueOf(table)));</span>
-<span class="source-line-no">3094</span><span id="line-3094">  }</span>
-<span class="source-line-no">3095</span><span id="line-3095"></span>
-<span class="source-line-no">3096</span><span id="line-3096">  public String explainTableAvailability(TableName tableName) throws IOException {</span>
-<span class="source-line-no">3097</span><span id="line-3097">    StringBuilder msg =</span>
-<span class="source-line-no">3098</span><span id="line-3098">      new StringBuilder(explainTableState(tableName, TableState.State.ENABLED)).append(", ");</span>
-<span class="source-line-no">3099</span><span id="line-3099">    if (getHBaseCluster().getMaster().isAlive()) {</span>
-<span class="source-line-no">3100</span><span id="line-3100">      Map&lt;RegionInfo, ServerName&gt; assignments = getHBaseCluster().getMaster().getAssignmentManager()</span>
-<span class="source-line-no">3101</span><span id="line-3101">        .getRegionStates().getRegionAssignments();</span>
-<span class="source-line-no">3102</span><span id="line-3102">      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; metaLocations =</span>
-<span class="source-line-no">3103</span><span id="line-3103">        MetaTableAccessor.getTableRegionsAndLocations(getConnection(), tableName);</span>
-<span class="source-line-no">3104</span><span id="line-3104">      for (Pair&lt;RegionInfo, ServerName&gt; metaLocation : metaLocations) {</span>
-<span class="source-line-no">3105</span><span id="line-3105">        RegionInfo hri = metaLocation.getFirst();</span>
-<span class="source-line-no">3106</span><span id="line-3106">        ServerName sn = metaLocation.getSecond();</span>
-<span class="source-line-no">3107</span><span id="line-3107">        if (!assignments.containsKey(hri)) {</span>
-<span class="source-line-no">3108</span><span id="line-3108">          msg.append(", region ").append(hri)</span>
-<span class="source-line-no">3109</span><span id="line-3109">            .append(" not assigned, but found in meta, it expected to be on ").append(sn);</span>
-<span class="source-line-no">3110</span><span id="line-3110">        } else if (sn == null) {</span>
-<span class="source-line-no">3111</span><span id="line-3111">          msg.append(",  region ").append(hri).append(" assigned,  but has no server in meta");</span>
-<span class="source-line-no">3112</span><span id="line-3112">        } else if (!sn.equals(assignments.get(hri))) {</span>
-<span class="source-line-no">3113</span><span id="line-3113">          msg.append(",  region ").append(hri)</span>
-<span class="source-line-no">3114</span><span id="line-3114">            .append(" assigned,  but has different servers in meta and AM ( ").append(sn)</span>
-<span class="source-line-no">3115</span><span id="line-3115">            .append(" &lt;&gt; ").append(assignments.get(hri));</span>
-<span class="source-line-no">3116</span><span id="line-3116">        }</span>
-<span class="source-line-no">3117</span><span id="line-3117">      }</span>
-<span class="source-line-no">3118</span><span id="line-3118">    }</span>
-<span class="source-line-no">3119</span><span id="line-3119">    return msg.toString();</span>
-<span class="source-line-no">3120</span><span id="line-3120">  }</span>
-<span class="source-line-no">3121</span><span id="line-3121"></span>
-<span class="source-line-no">3122</span><span id="line-3122">  public String explainTableState(final TableName table, TableState.State state)</span>
-<span class="source-line-no">3123</span><span id="line-3123">    throws IOException {</span>
-<span class="source-line-no">3124</span><span id="line-3124">    TableState tableState = MetaTableAccessor.getTableState(getConnection(), table);</span>
-<span class="source-line-no">3125</span><span id="line-3125">    if (tableState == null) {</span>
-<span class="source-line-no">3126</span><span id="line-3126">      return "TableState in META: No table state in META for table " + table</span>
-<span class="source-line-no">3127</span><span id="line-3127">        + " last state in meta (including deleted is " + findLastTableState(table) + ")";</span>
-<span class="source-line-no">3128</span><span id="line-3128">    } else if (!tableState.inStates(state)) {</span>
-<span class="source-line-no">3129</span><span id="line-3129">      return "TableState in META: Not " + state + " state, but " + tableState;</span>
-<span class="source-line-no">3130</span><span id="line-3130">    } else {</span>
-<span class="source-line-no">3131</span><span id="line-3131">      return "TableState in META: OK";</span>
-<span class="source-line-no">3132</span><span id="line-3132">    }</span>
+<span class="source-line-no">3081</span><span id="line-3081">  public FileSystem getTestFileSystem() throws IOException {</span>
+<span class="source-line-no">3082</span><span id="line-3082">    return HFileSystem.get(conf);</span>
+<span class="source-line-no">3083</span><span id="line-3083">  }</span>
+<span class="source-line-no">3084</span><span id="line-3084"></span>
+<span class="source-line-no">3085</span><span id="line-3085">  /**</span>
+<span class="source-line-no">3086</span><span id="line-3086">   * Wait until all regions in a table have been assigned. Waits default timeout before giving up</span>
+<span class="source-line-no">3087</span><span id="line-3087">   * (30 seconds).</span>
+<span class="source-line-no">3088</span><span id="line-3088">   * @param table Table to wait on.</span>
+<span class="source-line-no">3089</span><span id="line-3089">   */</span>
+<span class="source-line-no">3090</span><span id="line-3090">  public void waitTableAvailable(TableName table) throws InterruptedException, IOException {</span>
+<span class="source-line-no">3091</span><span id="line-3091">    waitTableAvailable(table.getName(), 30000);</span>
+<span class="source-line-no">3092</span><span id="line-3092">  }</span>
+<span class="source-line-no">3093</span><span id="line-3093"></span>
+<span class="source-line-no">3094</span><span id="line-3094">  public void waitTableAvailable(TableName table, long timeoutMillis)</span>
+<span class="source-line-no">3095</span><span id="line-3095">    throws InterruptedException, IOException {</span>
+<span class="source-line-no">3096</span><span id="line-3096">    waitFor(timeoutMillis, predicateTableAvailable(table));</span>
+<span class="source-line-no">3097</span><span id="line-3097">  }</span>
+<span class="source-line-no">3098</span><span id="line-3098"></span>
+<span class="source-line-no">3099</span><span id="line-3099">  /**</span>
+<span class="source-line-no">3100</span><span id="line-3100">   * Wait until all regions in a table have been assigned</span>
+<span class="source-line-no">3101</span><span id="line-3101">   * @param table         Table to wait on.</span>
+<span class="source-line-no">3102</span><span id="line-3102">   * @param timeoutMillis Timeout.</span>
+<span class="source-line-no">3103</span><span id="line-3103">   */</span>
+<span class="source-line-no">3104</span><span id="line-3104">  public void waitTableAvailable(byte[] table, long timeoutMillis)</span>
+<span class="source-line-no">3105</span><span id="line-3105">    throws InterruptedException, IOException {</span>
+<span class="source-line-no">3106</span><span id="line-3106">    waitFor(timeoutMillis, predicateTableAvailable(TableName.valueOf(table)));</span>
+<span class="source-line-no">3107</span><span id="line-3107">  }</span>
+<span class="source-line-no">3108</span><span id="line-3108"></span>
+<span class="source-line-no">3109</span><span id="line-3109">  public String explainTableAvailability(TableName tableName) throws IOException {</span>
+<span class="source-line-no">3110</span><span id="line-3110">    StringBuilder msg =</span>
+<span class="source-line-no">3111</span><span id="line-3111">      new StringBuilder(explainTableState(tableName, TableState.State.ENABLED)).append(", ");</span>
+<span class="source-line-no">3112</span><span id="line-3112">    if (getHBaseCluster().getMaster().isAlive()) {</span>
+<span class="source-line-no">3113</span><span id="line-3113">      Map&lt;RegionInfo, ServerName&gt; assignments = getHBaseCluster().getMaster().getAssignmentManager()</span>
+<span class="source-line-no">3114</span><span id="line-3114">        .getRegionStates().getRegionAssignments();</span>
+<span class="source-line-no">3115</span><span id="line-3115">      final List&lt;Pair&lt;RegionInfo, ServerName&gt;&gt; metaLocations =</span>
+<span class="source-line-no">3116</span><span id="line-3116">        MetaTableAccessor.getTableRegionsAndLocations(getConnection(), tableName);</span>
+<span class="source-line-no">3117</span><span id="line-3117">      for (Pair&lt;RegionInfo, ServerName&gt; metaLocation : metaLocations) {</span>
+<span class="source-line-no">3118</span><span id="line-3118">        RegionInfo hri = metaLocation.getFirst();</span>
+<span class="source-line-no">3119</span><span id="line-3119">        ServerName sn = metaLocation.getSecond();</span>
+<span class="source-line-no">3120</span><span id="line-3120">        if (!assignments.containsKey(hri)) {</span>
+<span class="source-line-no">3121</span><span id="line-3121">          msg.append(", region ").append(hri)</span>
+<span class="source-line-no">3122</span><span id="line-3122">            .append(" not assigned, but found in meta, it expected to be on ").append(sn);</span>
+<span class="source-line-no">3123</span><span id="line-3123">        } else if (sn == null) {</span>
+<span class="source-line-no">3124</span><span id="line-3124">          msg.append(",  region ").append(hri).append(" assigned,  but has no server in meta");</span>
+<span class="source-line-no">3125</span><span id="line-3125">        } else if (!sn.equals(assignments.get(hri))) {</span>
+<span class="source-line-no">3126</span><span id="line-3126">          msg.append(",  region ").append(hri)</span>
+<span class="source-line-no">3127</span><span id="line-3127">            .append(" assigned,  but has different servers in meta and AM ( ").append(sn)</span>
+<span class="source-line-no">3128</span><span id="line-3128">            .append(" &lt;&gt; ").append(assignments.get(hri));</span>
+<span class="source-line-no">3129</span><span id="line-3129">        }</span>
+<span class="source-line-no">3130</span><span id="line-3130">      }</span>
+<span class="source-line-no">3131</span><span id="line-3131">    }</span>
+<span class="source-line-no">3132</span><span id="line-3132">    return msg.toString();</span>
 <span class="source-line-no">3133</span><span id="line-3133">  }</span>
 <span class="source-line-no">3134</span><span id="line-3134"></span>
-<span class="source-line-no">3135</span><span id="line-3135">  public TableState findLastTableState(final TableName table) throws IOException {</span>
-<span class="source-line-no">3136</span><span id="line-3136">    final AtomicReference&lt;TableState&gt; lastTableState = new AtomicReference&lt;&gt;(null);</span>
-<span class="source-line-no">3137</span><span id="line-3137">    ClientMetaTableAccessor.Visitor visitor = new ClientMetaTableAccessor.Visitor() {</span>
-<span class="source-line-no">3138</span><span id="line-3138">      @Override</span>
-<span class="source-line-no">3139</span><span id="line-3139">      public boolean visit(Result r) throws IOException {</span>
-<span class="source-line-no">3140</span><span id="line-3140">        if (!Arrays.equals(r.getRow(), table.getName())) {</span>
-<span class="source-line-no">3141</span><span id="line-3141">          return false;</span>
-<span class="source-line-no">3142</span><span id="line-3142">        }</span>
-<span class="source-line-no">3143</span><span id="line-3143">        TableState state = CatalogFamilyFormat.getTableState(r);</span>
-<span class="source-line-no">3144</span><span id="line-3144">        if (state != null) {</span>
-<span class="source-line-no">3145</span><span id="line-3145">          lastTableState.set(state);</span>
-<span class="source-line-no">3146</span><span id="line-3146">        }</span>
-<span class="source-line-no">3147</span><span id="line-3147">        return true;</span>
-<span class="source-line-no">3148</span><span id="line-3148">      }</span>
-<span class="source-line-no">3149</span><span id="line-3149">    };</span>
-<span class="source-line-no">3150</span><span id="line-3150">    MetaTableAccessor.scanMeta(getConnection(), null, null, ClientMetaTableAccessor.QueryType.TABLE,</span>
-<span class="source-line-no">3151</span><span id="line-3151">      Integer.MAX_VALUE, visitor);</span>
-<span class="source-line-no">3152</span><span id="line-3152">    return lastTableState.get();</span>
-<span class="source-line-no">3153</span><span id="line-3153">  }</span>
-<span class="source-line-no">3154</span><span id="line-3154"></span>
-<span class="source-line-no">3155</span><span id="line-3155">  /**</span>
-<span class="source-line-no">3156</span><span id="line-3156">   * Waits for a table to be 'enabled'. Enabled means that table is set as 'enabled' and the regions</span>
-<span class="source-line-no">3157</span><span id="line-3157">   * have been all assigned. Will timeout after default period (30 seconds) Tolerates nonexistent</span>
-<span class="source-line-no">3158</span><span id="line-3158">   * table.</span>
-<span class="source-line-no">3159</span><span id="line-3159">   * @param table the table to wait on.</span>
-<span class="source-line-no">3160</span><span id="line-3160">   * @throws InterruptedException if interrupted while waiting</span>
-<span class="source-line-no">3161</span><span id="line-3161">   * @throws IOException          if an IO problem is encountered</span>
-<span class="source-line-no">3162</span><span id="line-3162">   */</span>
-<span class="source-line-no">3163</span><span id="line-3163">  public void waitTableEnabled(TableName table) throws InterruptedException, IOException {</span>
-<span class="source-line-no">3164</span><span id="line-3164">    waitTableEnabled(table, 30000);</span>
-<span class="source-line-no">3165</span><span id="line-3165">  }</span>
-<span class="source-line-no">3166</span><span id="line-3166"></span>
-<span class="source-line-no">3167</span><span id="line-3167">  /**</span>
-<span class="source-line-no">3168</span><span id="line-3168">   * Waits for a table to be 'enabled'. Enabled means that table is set as 'enabled' and the regions</span>
-<span class="source-line-no">3169</span><span id="line-3169">   * have been all assigned.</span>
-<span class="source-line-no">3170</span><span id="line-3170">   * @see #waitTableEnabled(TableName, long)</span>
-<span class="source-line-no">3171</span><span id="line-3171">   * @param table         Table to wait on.</span>
-<span class="source-line-no">3172</span><span id="line-3172">   * @param timeoutMillis Time to wait on it being marked enabled.</span>
-<span class="source-line-no">3173</span><span id="line-3173">   */</span>
-<span class="source-line-no">3174</span><span id="line-3174">  public void waitTableEnabled(byte[] table, long timeoutMillis)</span>
-<span class="source-line-no">3175</span><span id="line-3175">    throws InterruptedException, IOException {</span>
-<span class="source-line-no">3176</span><span id="line-3176">    waitTableEnabled(TableName.valueOf(table), timeoutMillis);</span>
-<span class="source-line-no">3177</span><span id="line-3177">  }</span>
-<span class="source-line-no">3178</span><span id="line-3178"></span>
-<span class="source-line-no">3179</span><span id="line-3179">  public void waitTableEnabled(TableName table, long timeoutMillis) throws IOException {</span>
-<span class="source-line-no">3180</span><span id="line-3180">    waitFor(timeoutMillis, predicateTableEnabled(table));</span>
-<span class="source-line-no">3181</span><span id="line-3181">  }</span>
-<span class="source-line-no">3182</span><span id="line-3182"></span>
-<span class="source-line-no">3183</span><span id="line-3183">  /**</span>
-<span class="source-line-no">3184</span><span id="line-3184">   * Waits for a table to be 'disabled'. Disabled means that table is set as 'disabled' Will timeout</span>
-<span class="source-line-no">3185</span><span id="line-3185">   * after default period (30 seconds)</span>
-<span class="source-line-no">3186</span><span id="line-3186">   * @param table Table to wait on.</span>
-<span class="source-line-no">3187</span><span id="line-3187">   */</span>
-<span class="source-line-no">3188</span><span id="line-3188">  public void waitTableDisabled(byte[] table) throws InterruptedException, IOException {</span>
-<span class="source-line-no">3189</span><span id="line-3189">    waitTableDisabled(table, 30000);</span>
+<span class="source-line-no">3135</span><span id="line-3135">  public String explainTableState(final TableName table, TableState.State state)</span>
+<span class="source-line-no">3136</span><span id="line-3136">    throws IOException {</span>
+<span class="source-line-no">3137</span><span id="line-3137">    TableState tableState = MetaTableAccessor.getTableState(getConnection(), table);</span>
+<span class="source-line-no">3138</span><span id="line-3138">    if (tableState == null) {</span>
+<span class="source-line-no">3139</span><span id="line-3139">      return "TableState in META: No table state in META for table " + table</span>
+<span class="source-line-no">3140</span><span id="line-3140">        + " last state in meta (including deleted is " + findLastTableState(table) + ")";</span>
+<span class="source-line-no">3141</span><span id="line-3141">    } else if (!tableState.inStates(state)) {</span>
+<span class="source-line-no">3142</span><span id="line-3142">      return "TableState in META: Not " + state + " state, but " + tableState;</span>
+<span class="source-line-no">3143</span><span id="line-3143">    } else {</span>
+<span class="source-line-no">3144</span><span id="line-3144">      return "TableState in META: OK";</span>
+<span class="source-line-no">3145</span><span id="line-3145">    }</span>
+<span class="source-line-no">3146</span><span id="line-3146">  }</span>
+<span class="source-line-no">3147</span><span id="line-3147"></span>
+<span class="source-line-no">3148</span><span id="line-3148">  public TableState findLastTableState(final TableName table) throws IOException {</span>
+<span class="source-line-no">3149</span><span id="line-3149">    final AtomicReference&lt;TableState&gt; lastTableState = new AtomicReference&lt;&gt;(null);</span>
+<span class="source-line-no">3150</span><span id="line-3150">    ClientMetaTableAccessor.Visitor visitor = new ClientMetaTableAccessor.Visitor() {</span>
+<span class="source-line-no">3151</span><span id="line-3151">      @Override</span>
+<span class="source-line-no">3152</span><span id="line-3152">      public boolean visit(Result r) throws IOException {</span>
+<span class="source-line-no">3153</span><span id="line-3153">        if (!Arrays.equals(r.getRow(), table.getName())) {</span>
+<span class="source-line-no">3154</span><span id="line-3154">          return false;</span>
+<span class="source-line-no">3155</span><span id="line-3155">        }</span>
+<span class="source-line-no">3156</span><span id="line-3156">        TableState state = CatalogFamilyFormat.getTableState(r);</span>
+<span class="source-line-no">3157</span><span id="line-3157">        if (state != null) {</span>
+<span class="source-line-no">3158</span><span id="line-3158">          lastTableState.set(state);</span>
+<span class="source-line-no">3159</span><span id="line-3159">        }</span>
+<span class="source-line-no">3160</span><span id="line-3160">        return true;</span>
+<span class="source-line-no">3161</span><span id="line-3161">      }</span>
+<span class="source-line-no">3162</span><span id="line-3162">    };</span>
+<span class="source-line-no">3163</span><span id="line-3163">    MetaTableAccessor.scanMeta(getConnection(), null, null, ClientMetaTableAccessor.QueryType.TABLE,</span>
+<span class="source-line-no">3164</span><span id="line-3164">      Integer.MAX_VALUE, visitor);</span>
+<span class="source-line-no">3165</span><span id="line-3165">    return lastTableState.get();</span>
+<span class="source-line-no">3166</span><span id="line-3166">  }</span>
+<span class="source-line-no">3167</span><span id="line-3167"></span>
+<span class="source-line-no">3168</span><span id="line-3168">  /**</span>
+<span class="source-line-no">3169</span><span id="line-3169">   * Waits for a table to be 'enabled'. Enabled means that table is set as 'enabled' and the regions</span>
+<span class="source-line-no">3170</span><span id="line-3170">   * have been all assigned. Will timeout after default period (30 seconds) Tolerates nonexistent</span>
+<span class="source-line-no">3171</span><span id="line-3171">   * table.</span>
+<span class="source-line-no">3172</span><span id="line-3172">   * @param table the table to wait on.</span>
+<span class="source-line-no">3173</span><span id="line-3173">   * @throws InterruptedException if interrupted while waiting</span>
+<span class="source-line-no">3174</span><span id="line-3174">   * @throws IOException          if an IO problem is encountered</span>
+<span class="source-line-no">3175</span><span id="line-3175">   */</span>
+<span class="source-line-no">3176</span><span id="line-3176">  public void waitTableEnabled(TableName table) throws InterruptedException, IOException {</span>
+<span class="source-line-no">3177</span><span id="line-3177">    waitTableEnabled(table, 30000);</span>
+<span class="source-line-no">3178</span><span id="line-3178">  }</span>
+<span class="source-line-no">3179</span><span id="line-3179"></span>
+<span class="source-line-no">3180</span><span id="line-3180">  /**</span>
+<span class="source-line-no">3181</span><span id="line-3181">   * Waits for a table to be 'enabled'. Enabled means that table is set as 'enabled' and the regions</span>
+<span class="source-line-no">3182</span><span id="line-3182">   * have been all assigned.</span>
+<span class="source-line-no">3183</span><span id="line-3183">   * @see #waitTableEnabled(TableName, long)</span>
+<span class="source-line-no">3184</span><span id="line-3184">   * @param table         Table to wait on.</span>
+<span class="source-line-no">3185</span><span id="line-3185">   * @param timeoutMillis Time to wait on it being marked enabled.</span>
+<span class="source-line-no">3186</span><span id="line-3186">   */</span>
+<span class="source-line-no">3187</span><span id="line-3187">  public void waitTableEnabled(byte[] table, long timeoutMillis)</span>
+<span class="source-line-no">3188</span><span id="line-3188">    throws InterruptedException, IOException {</span>
+<span class="source-line-no">3189</span><span id="line-3189">    waitTableEnabled(TableName.valueOf(table), timeoutMillis);</span>
 <span class="source-line-no">3190</span><span id="line-3190">  }</span>
 <span class="source-line-no">3191</span><span id="line-3191"></span>
-<span class="source-line-no">3192</span><span id="line-3192">  public void waitTableDisabled(TableName table, long millisTimeout)</span>
-<span class="source-line-no">3193</span><span id="line-3193">    throws InterruptedException, IOException {</span>
-<span class="source-line-no">3194</span><span id="line-3194">    waitFor(millisTimeout, predicateTableDisabled(table));</span>
-<span class="source-line-no">3195</span><span id="line-3195">  }</span>
-<span class="source-line-no">3196</span><span id="line-3196"></span>
-<span class="source-line-no">3197</span><span id="line-3197">  /**</span>
-<span class="source-line-no">3198</span><span id="line-3198">   * Waits for a table to be 'disabled'. Disabled means that table is set as 'disabled'</span>
-<span class="source-line-no">3199</span><span id="line-3199">   * @param table         Table to wait on.</span>
-<span class="source-line-no">3200</span><span id="line-3200">   * @param timeoutMillis Time to wait on it being marked disabled.</span>
-<span class="source-line-no">3201</span><span id="line-3201">   */</span>
-<span class="source-line-no">3202</span><span id="line-3202">  public void waitTableDisabled(byte[] table, long timeoutMillis)</span>
-<span class="source-line-no">3203</span><span id="line-3203">    throws InterruptedException, IOException {</span>
-<span class="source-line-no">3204</span><span id="line-3204">    waitTableDisabled(TableName.valueOf(table), timeoutMillis);</span>
-<span class="source-line-no">3205</span><span id="line-3205">  }</span>
-<span class="source-line-no">3206</span><span id="line-3206"></span>
-<span class="source-line-no">3207</span><span id="line-3207">  /**</span>
-<span class="source-line-no">3208</span><span id="line-3208">   * Make sure that at least the specified number of region servers are running</span>
-<span class="source-line-no">3209</span><span id="line-3209">   * @param num minimum number of region servers that should be running</span>
-<span class="source-line-no">3210</span><span id="line-3210">   * @return true if we started some servers</span>
-<span class="source-line-no">3211</span><span id="line-3211">   */</span>
-<span class="source-line-no">3212</span><span id="line-3212">  public boolean ensureSomeRegionServersAvailable(final int num) throws IOException {</span>
-<span class="source-line-no">3213</span><span id="line-3213">    boolean startedServer = false;</span>
-<span class="source-line-no">3214</span><span id="line-3214">    MiniHBaseCluster hbaseCluster = getMiniHBaseCluster();</span>
-<span class="source-line-no">3215</span><span id="line-3215">    for (int i = hbaseCluster.getLiveRegionServerThreads().size(); i &lt; num; ++i) {</span>
-<span class="source-line-no">3216</span><span id="line-3216">      LOG.info("Started new server=" + hbaseCluster.startRegionServer());</span>
-<span class="source-line-no">3217</span><span id="line-3217">      startedServer = true;</span>
-<span class="source-line-no">3218</span><span id="line-3218">    }</span>
+<span class="source-line-no">3192</span><span id="line-3192">  public void waitTableEnabled(TableName table, long timeoutMillis) throws IOException {</span>
+<span class="source-line-no">3193</span><span id="line-3193">    waitFor(timeoutMillis, predicateTableEnabled(table));</span>
+<span class="source-line-no">3194</span><span id="line-3194">  }</span>
+<span class="source-line-no">3195</span><span id="line-3195"></span>
+<span class="source-line-no">3196</span><span id="line-3196">  /**</span>
+<span class="source-line-no">3197</span><span id="line-3197">   * Waits for a table to be 'disabled'. Disabled means that table is set as 'disabled' Will timeout</span>
+<span class="source-line-no">3198</span><span id="line-3198">   * after default period (30 seconds)</span>
+<span class="source-line-no">3199</span><span id="line-3199">   * @param table Table to wait on.</span>
+<span class="source-line-no">3200</span><span id="line-3200">   */</span>
+<span class="source-line-no">3201</span><span id="line-3201">  public void waitTableDisabled(byte[] table) throws InterruptedException, IOException {</span>
+<span class="source-line-no">3202</span><span id="line-3202">    waitTableDisabled(table, 30000);</span>
+<span class="source-line-no">3203</span><span id="line-3203">  }</span>
+<span class="source-line-no">3204</span><span id="line-3204"></span>
+<span class="source-line-no">3205</span><span id="line-3205">  public void waitTableDisabled(TableName table, long millisTimeout)</span>
+<span class="source-line-no">3206</span><span id="line-3206">    throws InterruptedException, IOException {</span>
+<span class="source-line-no">3207</span><span id="line-3207">    waitFor(millisTimeout, predicateTableDisabled(table));</span>
+<span class="source-line-no">3208</span><span id="line-3208">  }</span>
+<span class="source-line-no">3209</span><span id="line-3209"></span>
+<span class="source-line-no">3210</span><span id="line-3210">  /**</span>
+<span class="source-line-no">3211</span><span id="line-3211">   * Waits for a table to be 'disabled'. Disabled means that table is set as 'disabled'</span>
+<span class="source-line-no">3212</span><span id="line-3212">   * @param table         Table to wait on.</span>
+<span class="source-line-no">3213</span><span id="line-3213">   * @param timeoutMillis Time to wait on it being marked disabled.</span>
+<span class="source-line-no">3214</span><span id="line-3214">   */</span>
+<span class="source-line-no">3215</span><span id="line-3215">  public void waitTableDisabled(byte[] table, long timeoutMillis)</span>
+<span class="source-line-no">3216</span><span id="line-3216">    throws InterruptedException, IOException {</span>
+<span class="source-line-no">3217</span><span id="line-3217">    waitTableDisabled(TableName.valueOf(table), timeoutMillis);</span>
+<span class="source-line-no">3218</span><span id="line-3218">  }</span>
 <span class="source-line-no">3219</span><span id="line-3219"></span>
-<span class="source-line-no">3220</span><span id="line-3220">    return startedServer;</span>
-<span class="source-line-no">3221</span><span id="line-3221">  }</span>
-<span class="source-line-no">3222</span><span id="line-3222"></span>
-<span class="source-line-no">3223</span><span id="line-3223">  /**</span>
-<span class="source-line-no">3224</span><span id="line-3224">   * Make sure that at least the specified number of region servers are running. We don't count the</span>
-<span class="source-line-no">3225</span><span id="line-3225">   * ones that are currently stopping or are stopped.</span>
-<span class="source-line-no">3226</span><span id="line-3226">   * @param num minimum number of region servers that should be running</span>
-<span class="source-line-no">3227</span><span id="line-3227">   * @return true if we started some servers</span>
-<span class="source-line-no">3228</span><span id="line-3228">   */</span>
-<span class="source-line-no">3229</span><span id="line-3229">  public boolean ensureSomeNonStoppedRegionServersAvailable(final int num) throws IOException {</span>
-<span class="source-line-no">3230</span><span id="line-3230">    boolean startedServer = ensureSomeRegionServersAvailable(num);</span>
-<span class="source-line-no">3231</span><span id="line-3231"></span>
-<span class="source-line-no">3232</span><span id="line-3232">    int nonStoppedServers = 0;</span>
-<span class="source-line-no">3233</span><span id="line-3233">    for (JVMClusterUtil.RegionServerThread rst : getMiniHBaseCluster().getRegionServerThreads()) {</span>
-<span class="source-line-no">3234</span><span id="line-3234"></span>
-<span class="source-line-no">3235</span><span id="line-3235">      HRegionServer hrs = rst.getRegionServer();</span>
-<span class="source-line-no">3236</span><span id="line-3236">      if (hrs.isStopping() || hrs.isStopped()) {</span>
-<span class="source-line-no">3237</span><span id="line-3237">        LOG.info("A region server is stopped or stopping:" + hrs);</span>
-<span class="source-line-no">3238</span><span id="line-3238">      } else {</span>
-<span class="source-line-no">3239</span><span id="line-3239">        nonStoppedServers++;</span>
-<span class="source-line-no">3240</span><span id="line-3240">      }</span>
-<span class="source-line-no">3241</span><span id="line-3241">    }</span>
-<span class="source-line-no">3242</span><span id="line-3242">    for (int i = nonStoppedServers; i &lt; num; ++i) {</span>
-<span class="source-line-no">3243</span><span id="line-3243">      LOG.info("Started new server=" + getMiniHBaseCluster().startRegionServer());</span>
-<span class="source-line-no">3244</span><span id="line-3244">      startedServer = true;</span>
-<span class="source-line-no">3245</span><span id="line-3245">    }</span>
-<span class="source-line-no">3246</span><span id="line-3246">    return startedServer;</span>
-<span class="source-line-no">3247</span><span id="line-3247">  }</span>
-<span class="source-line-no">3248</span><span id="line-3248"></span>
-<span class="source-line-no">3249</span><span id="line-3249">  /**</span>
-<span class="source-line-no">3250</span><span id="line-3250">   * This method clones the passed &lt;code&gt;c&lt;/code&gt; configuration setting a new user into the clone.</span>
-<span class="source-line-no">3251</span><span id="line-3251">   * Use it getting new instances of FileSystem. Only works for DistributedFileSystem w/o Kerberos.</span>
-<span class="source-line-no">3252</span><span id="line-3252">   * @param c                     Initial configuration</span>
-<span class="source-line-no">3253</span><span id="line-3253">   * @param differentiatingSuffix Suffix to differentiate this user from others.</span>
-<span class="source-line-no">3254</span><span id="line-3254">   * @return A new configuration instance with a different user set into it.</span>
-<span class="source-line-no">3255</span><span id="line-3255">   */</span>
-<span class="source-line-no">3256</span><span id="line-3256">  public static User getDifferentUser(final Configuration c, final String differentiatingSuffix)</span>
-<span class="source-line-no">3257</span><span id="line-3257">    throws IOException {</span>
-<span class="source-line-no">3258</span><span id="line-3258">    FileSystem currentfs = FileSystem.get(c);</span>
-<span class="source-line-no">3259</span><span id="line-3259">    if (!(currentfs instanceof DistributedFileSystem) || User.isHBaseSecurityEnabled(c)) {</span>
-<span class="source-line-no">3260</span><span id="line-3260">      return User.getCurrent();</span>
-<span class="source-line-no">3261</span><span id="line-3261">    }</span>
-<span class="source-line-no">3262</span><span id="line-3262">    // Else distributed filesystem. Make a new instance per daemon. Below</span>
-<span class="source-line-no">3263</span><span id="line-3263">    // code is taken from the AppendTestUtil over in hdfs.</span>
-<span class="source-line-no">3264</span><span id="line-3264">    String username = User.getCurrent().getName() + differentiatingSuffix;</span>
-<span class="source-line-no">3265</span><span id="line-3265">    User user = User.createUserForTesting(c, username, new String[] { "supergroup" });</span>
-<span class="source-line-no">3266</span><span id="line-3266">    return user;</span>
-<span class="source-line-no">3267</span><span id="line-3267">  }</span>
-<span class="source-line-no">3268</span><span id="line-3268"></span>
-<span class="source-line-no">3269</span><span id="line-3269">  public static NavigableSet&lt;String&gt; getAllOnlineRegions(MiniHBaseCluster cluster)</span>
+<span class="source-line-no">3220</span><span id="line-3220">  /**</span>
+<span class="source-line-no">3221</span><span id="line-3221">   * Make sure that at least the specified number of region servers are running</span>
+<span class="source-line-no">3222</span><span id="line-3222">   * @param num minimum number of region servers that should be running</span>
+<span class="source-line-no">3223</span><span id="line-3223">   * @return true if we started some servers</span>
+<span class="source-line-no">3224</span><span id="line-3224">   */</span>
+<span class="source-line-no">3225</span><span id="line-3225">  public boolean ensureSomeRegionServersAvailable(final int num) throws IOException {</span>
+<span class="source-line-no">3226</span><span id="line-3226">    boolean startedServer = false;</span>
+<span class="source-line-no">3227</span><span id="line-3227">    MiniHBaseCluster hbaseCluster = getMiniHBaseCluster();</span>
+<span class="source-line-no">3228</span><span id="line-3228">    for (int i = hbaseCluster.getLiveRegionServerThreads().size(); i &lt; num; ++i) {</span>
+<span class="source-line-no">3229</span><span id="line-3229">      LOG.info("Started new server=" + hbaseCluster.startRegionServer());</span>
+<span class="source-line-no">3230</span><span id="line-3230">      startedServer = true;</span>
+<span class="source-line-no">3231</span><span id="line-3231">    }</span>
+<span class="source-line-no">3232</span><span id="line-3232"></span>
+<span class="source-line-no">3233</span><span id="line-3233">    return startedServer;</span>
+<span class="source-line-no">3234</span><span id="line-3234">  }</span>
+<span class="source-line-no">3235</span><span id="line-3235"></span>
+<span class="source-line-no">3236</span><span id="line-3236">  /**</span>
+<span class="source-line-no">3237</span><span id="line-3237">   * Make sure that at least the specified number of region servers are running. We don't count the</span>
+<span class="source-line-no">3238</span><span id="line-3238">   * ones that are currently stopping or are stopped.</span>
+<span class="source-line-no">3239</span><span id="line-3239">   * @param num minimum number of region servers that should be running</span>
+<span class="source-line-no">3240</span><span id="line-3240">   * @return true if we started some servers</span>
+<span class="source-line-no">3241</span><span id="line-3241">   */</span>
+<span class="source-line-no">3242</span><span id="line-3242">  public boolean ensureSomeNonStoppedRegionServersAvailable(final int num) throws IOException {</span>
+<span class="source-line-no">3243</span><span id="line-3243">    boolean startedServer = ensureSomeRegionServersAvailable(num);</span>
+<span class="source-line-no">3244</span><span id="line-3244"></span>
+<span class="source-line-no">3245</span><span id="line-3245">    int nonStoppedServers = 0;</span>
+<span class="source-line-no">3246</span><span id="line-3246">    for (JVMClusterUtil.RegionServerThread rst : getMiniHBaseCluster().getRegionServerThreads()) {</span>
+<span class="source-line-no">3247</span><span id="line-3247"></span>
+<span class="source-line-no">3248</span><span id="line-3248">      HRegionServer hrs = rst.getRegionServer();</span>
+<span class="source-line-no">3249</span><span id="line-3249">      if (hrs.isStopping() || hrs.isStopped()) {</span>
+<span class="source-line-no">3250</span><span id="line-3250">        LOG.info("A region server is stopped or stopping:" + hrs);</span>
+<span class="source-line-no">3251</span><span id="line-3251">      } else {</span>
+<span class="source-line-no">3252</span><span id="line-3252">        nonStoppedServers++;</span>
+<span class="source-line-no">3253</span><span id="line-3253">      }</span>
+<span class="source-line-no">3254</span><span id="line-3254">    }</span>
+<span class="source-line-no">3255</span><span id="line-3255">    for (int i = nonStoppedServers; i &lt; num; ++i) {</span>
+<span class="source-line-no">3256</span><span id="line-3256">      LOG.info("Started new server=" + getMiniHBaseCluster().startRegionServer());</span>
+<span class="source-line-no">3257</span><span id="line-3257">      startedServer = true;</span>
+<span class="source-line-no">3258</span><span id="line-3258">    }</span>
+<span class="source-line-no">3259</span><span id="line-3259">    return startedServer;</span>
+<span class="source-line-no">3260</span><span id="line-3260">  }</span>
+<span class="source-line-no">3261</span><span id="line-3261"></span>
+<span class="source-line-no">3262</span><span id="line-3262">  /**</span>
+<span class="source-line-no">3263</span><span id="line-3263">   * This method clones the passed &lt;code&gt;c&lt;/code&gt; configuration setting a new user into the clone.</span>
+<span class="source-line-no">3264</span><span id="line-3264">   * Use it getting new instances of FileSystem. Only works for DistributedFileSystem w/o Kerberos.</span>
+<span class="source-line-no">3265</span><span id="line-3265">   * @param c                     Initial configuration</span>
+<span class="source-line-no">3266</span><span id="line-3266">   * @param differentiatingSuffix Suffix to differentiate this user from others.</span>
+<span class="source-line-no">3267</span><span id="line-3267">   * @return A new configuration instance with a different user set into it.</span>
+<span class="source-line-no">3268</span><span id="line-3268">   */</span>
+<span class="source-line-no">3269</span><span id="line-3269">  public static User getDifferentUser(final Configuration c, final String differentiatingSuffix)</span>
 <span class="source-line-no">3270</span><span id="line-3270">    throws IOException {</span>
-<span class="source-line-no">3271</span><span id="line-3271">    NavigableSet&lt;String&gt; online = new TreeSet&lt;&gt;();</span>
-<span class="source-line-no">3272</span><span id="line-3272">    for (RegionServerThread rst : cluster.getLiveRegionServerThreads()) {</span>
-<span class="source-line-no">3273</span><span id="line-3273">      try {</span>
-<span class="source-line-no">3274</span><span id="line-3274">        for (RegionInfo region : ProtobufUtil</span>
-<span class="source-line-no">3275</span><span id="line-3275">          .getOnlineRegions(rst.getRegionServer().getRSRpcServices())) {</span>
-<span class="source-line-no">3276</span><span id="line-3276">          online.add(region.getRegionNameAsString());</span>
-<span class="source-line-no">3277</span><span id="line-3277">        }</span>
-<span class="source-line-no">3278</span><span id="line-3278">      } catch (RegionServerStoppedException e) {</span>
-<span class="source-line-no">3279</span><span id="line-3279">        // That's fine.</span>
-<span class="source-line-no">3280</span><span id="line-3280">      }</span>
-<span class="source-line-no">3281</span><span id="line-3281">    }</span>
-<span class="source-line-no">3282</span><span id="line-3282">    return online;</span>
-<span class="source-line-no">3283</span><span id="line-3283">  }</span>
-<span class="source-line-no">3284</span><span id="line-3284"></span>
-<span class="source-line-no">3285</span><span id="line-3285">  /**</span>
-<span class="source-line-no">3286</span><span id="line-3286">   * Set maxRecoveryErrorCount in DFSClient. In 0.20 pre-append its hard-coded to 5 and makes tests</span>
-<span class="source-line-no">3287</span><span id="line-3287">   * linger. Here is the exception you'll see:</span>
-<span class="source-line-no">3288</span><span id="line-3288">   *</span>
-<span class="source-line-no">3289</span><span id="line-3289">   * &lt;pre&gt;</span>
-<span class="source-line-no">3290</span><span id="line-3290">   * 2010-06-15 11:52:28,511 WARN  [DataStreamer for file /hbase/.logs/wal.1276627923013 block</span>
-<span class="source-line-no">3291</span><span id="line-3291">   * blk_928005470262850423_1021] hdfs.DFSClient$DFSOutputStream(2657): Error Recovery for block</span>
-<span class="source-line-no">3292</span><span id="line-3292">   * blk_928005470262850423_1021 failed  because recovery from primary datanode 127.0.0.1:53683</span>
-<span class="source-line-no">3293</span><span id="line-3293">   * failed 4 times.  Pipeline was 127.0.0.1:53687, 127.0.0.1:53683. Will retry...</span>
-<span class="source-line-no">3294</span><span id="line-3294">   * &lt;/pre&gt;</span>
-<span class="source-line-no">3295</span><span id="line-3295">   *</span>
-<span class="source-line-no">3296</span><span id="line-3296">   * @param stream A DFSClient.DFSOutputStream.</span>
-<span class="source-line-no">3297</span><span id="line-3297">   */</span>
-<span class="source-line-no">3298</span><span id="line-3298">  public static void setMaxRecoveryErrorCount(final OutputStream stream, final int max) {</span>
-<span class="source-line-no">3299</span><span id="line-3299">    try {</span>
-<span class="source-line-no">3300</span><span id="line-3300">      Class&lt;?&gt;[] clazzes = DFSClient.class.getDeclaredClasses();</span>
-<span class="source-line-no">3301</span><span id="line-3301">      for (Class&lt;?&gt; clazz : clazzes) {</span>
-<span class="source-line-no">3302</span><span id="line-3302">        String className = clazz.getSimpleName();</span>
-<span class="source-line-no">3303</span><span id="line-3303">        if (className.equals("DFSOutputStream")) {</span>
-<span class="source-line-no">3304</span><span id="line-3304">          if (clazz.isInstance(stream)) {</span>
-<span class="source-line-no">3305</span><span id="line-3305">            Field maxRecoveryErrorCountField =</span>
-<span class="source-line-no">3306</span><span id="line-3306">              stream.getClass().getDeclaredField("maxRecoveryErrorCount");</span>
-<span class="source-line-no">3307</span><span id="line-3307">            maxRecoveryErrorCountField.setAccessible(true);</span>
-<span class="source-line-no">3308</span><span id="line-3308">            maxRecoveryErrorCountField.setInt(stream, max);</span>
-<span class="source-line-no">3309</span><span id="line-3309">            break;</span>
-<span class="source-line-no">3310</span><span id="line-3310">          }</span>
-<span class="source-line-no">3311</span><span id="line-3311">        }</span>
-<span class="source-line-no">3312</span><span id="line-3312">      }</span>
-<span class="source-line-no">3313</span><span id="line-3313">    } catch (Exception e) {</span>
-<span class="source-line-no">3314</span><span id="line-3314">      LOG.info("Could not set max recovery field", e);</span>
-<span class="source-line-no">3315</span><span id="line-3315">    }</span>
-<span class="source-line-no">3316</span><span id="line-3316">  }</span>
-<span class="source-line-no">3317</span><span id="line-3317"></span>
-<span class="source-line-no">3318</span><span id="line-3318">  /**</span>
-<span class="source-line-no">3319</span><span id="line-3319">   * Uses directly the assignment manager to assign the region. and waits until the specified region</span>
-<span class="source-line-no">3320</span><span id="line-3320">   * has completed assignment.</span>
-<span class="source-line-no">3321</span><span id="line-3321">   * @return true if the region is assigned false otherwise.</span>
-<span class="source-line-no">3322</span><span id="line-3322">   */</span>
-<span class="source-line-no">3323</span><span id="line-3323">  public boolean assignRegion(final RegionInfo regionInfo)</span>
-<span class="source-line-no">3324</span><span id="line-3324">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">3325</span><span id="line-3325">    final AssignmentManager am = getHBaseCluster().getMaster().getAssignmentManager();</span>
-<span class="source-line-no">3326</span><span id="line-3326">    am.assign(regionInfo);</span>
-<span class="source-line-no">3327</span><span id="line-3327">    return AssignmentTestingUtil.waitForAssignment(am, regionInfo);</span>
-<span class="source-line-no">3328</span><span id="line-3328">  }</span>
-<span class="source-line-no">3329</span><span id="line-3329"></span>
-<span class="source-line-no">3330</span><span id="line-3330">  /**</span>
-<span class="source-line-no">3331</span><span id="line-3331">   * Move region to destination server and wait till region is completely moved and online</span>
-<span class="source-line-no">3332</span><span id="line-3332">   * @param destRegion region to move</span>
-<span class="source-line-no">3333</span><span id="line-3333">   * @param destServer destination server of the region</span>
-<span class="source-line-no">3334</span><span id="line-3334">   */</span>
-<span class="source-line-no">3335</span><span id="line-3335">  public void moveRegionAndWait(RegionInfo destRegion, ServerName destServer)</span>
-<span class="source-line-no">3336</span><span id="line-3336">    throws InterruptedException, IOException {</span>
-<span class="source-line-no">3337</span><span id="line-3337">    HMaster master = getMiniHBaseCluster().getMaster();</span>
-<span class="source-line-no">3338</span><span id="line-3338">    // TODO: Here we start the move. The move can take a while.</span>
-<span class="source-line-no">3339</span><span id="line-3339">    getAdmin().move(destRegion.getEncodedNameAsBytes(), destServer);</span>
-<span class="source-line-no">3340</span><span id="line-3340">    while (true) {</span>
-<span class="source-line-no">3341</span><span id="line-3341">      ServerName serverName =</span>
-<span class="source-line-no">3342</span><span id="line-3342">        master.getAssignmentManager().getRegionStates().getRegionServerOfRegion(destRegion);</span>
-<span class="source-line-no">3343</span><span id="line-3343">      if (serverName != null &amp;&amp; serverName.equals(destServer)) {</span>
-<span class="source-line-no">3344</span><span id="line-3344">        assertRegionOnServer(destRegion, serverName, 2000);</span>
-<span class="source-line-no">3345</span><span id="line-3345">        break;</span>
-<span class="source-line-no">3346</span><span id="line-3346">      }</span>
-<span class="source-line-no">3347</span><span id="line-3347">      Thread.sleep(10);</span>
-<span class="source-line-no">3348</span><span id="line-3348">    }</span>
-<span class="source-line-no">3349</span><span id="line-3349">  }</span>
-<span class="source-line-no">3350</span><span id="line-3350"></span>
-<span class="source-line-no">3351</span><span id="line-3351">  /**</span>
-<span class="source-line-no">3352</span><span id="line-3352">   * Wait until all regions for a table in hbase:meta have a non-empty info:server, up to a</span>
-<span class="source-line-no">3353</span><span id="line-3353">   * configuable timeout value (default is 60 seconds) This means all regions have been deployed,</span>
-<span class="source-line-no">3354</span><span id="line-3354">   * master has been informed and updated hbase:meta with the regions deployed server.</span>
-<span class="source-line-no">3355</span><span id="line-3355">   * @param tableName the table name</span>
-<span class="source-line-no">3356</span><span id="line-3356">   */</span>
-<span class="source-line-no">3357</span><span id="line-3357">  public void waitUntilAllRegionsAssigned(final TableName tableName) throws IOException {</span>
-<span class="source-line-no">3358</span><span id="line-3358">    waitUntilAllRegionsAssigned(tableName,</span>
-<span class="source-line-no">3359</span><span id="line-3359">      this.conf.getLong("hbase.client.sync.wait.timeout.msec", 60000));</span>
-<span class="source-line-no">3360</span><span id="line-3360">  }</span>
-<span class="source-line-no">3361</span><span id="line-3361"></span>
-<span class="source-line-no">3362</span><span id="line-3362">  /**</span>
-<span class="source-line-no">3363</span><span id="line-3363">   * Waith until all system table's regions get assigned</span>
-<span class="source-line-no">3364</span><span id="line-3364">   */</span>
-<span class="source-line-no">3365</span><span id="line-3365">  public void waitUntilAllSystemRegionsAssigned() throws IOException {</span>
-<span class="source-line-no">3366</span><span id="line-3366">    waitUntilAllRegionsAssigned(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">3367</span><span id="line-3367">  }</span>
-<span class="source-line-no">3368</span><span id="line-3368"></span>
-<span class="source-line-no">3369</span><span id="line-3369">  /**</span>
-<span class="source-line-no">3370</span><span id="line-3370">   * Wait until all regions for a table in hbase:meta have a non-empty info:server, or until</span>
-<span class="source-line-no">3371</span><span id="line-3371">   * timeout. This means all regions have been deployed, master has been informed and updated</span>
-<span class="source-line-no">3372</span><span id="line-3372">   * hbase:meta with the regions deployed server.</span>
-<span class="source-line-no">3373</span><span id="line-3373">   * @param tableName the table name</span>
-<span class="source-line-no">3374</span><span id="line-3374">   * @param timeout   timeout, in milliseconds</span>
-<span class="source-line-no">3375</span><span id="line-3375">   */</span>
-<span class="source-line-no">3376</span><span id="line-3376">  public void waitUntilAllRegionsAssigned(final TableName tableName, final long timeout)</span>
-<span class="source-line-no">3377</span><span id="line-3377">    throws IOException {</span>
-<span class="source-line-no">3378</span><span id="line-3378">    if (!TableName.isMetaTableName(tableName)) {</span>
-<span class="source-line-no">3379</span><span id="line-3379">      try (final Table meta = getConnection().getTable(TableName.META_TABLE_NAME)) {</span>
-<span class="source-line-no">3380</span><span id="line-3380">        LOG.debug("Waiting until all regions of table " + tableName + " get assigned. Timeout = "</span>
-<span class="source-line-no">3381</span><span id="line-3381">          + timeout + "ms");</span>
-<span class="source-line-no">3382</span><span id="line-3382">        waitFor(timeout, 200, true, new ExplainingPredicate&lt;IOException&gt;() {</span>
-<span class="source-line-no">3383</span><span id="line-3383">          @Override</span>
-<span class="source-line-no">3384</span><span id="line-3384">          public String explainFailure() throws IOException {</span>
-<span class="source-line-no">3385</span><span id="line-3385">            return explainTableAvailability(tableName);</span>
-<span class="source-line-no">3386</span><span id="line-3386">          }</span>
-<span class="source-line-no">3387</span><span id="line-3387"></span>
-<span class="source-line-no">3388</span><span id="line-3388">          @Override</span>
-<span class="source-line-no">3389</span><span id="line-3389">          public boolean evaluate() throws IOException {</span>
-<span class="source-line-no">3390</span><span id="line-3390">            Scan scan = new Scan();</span>
-<span class="source-line-no">3391</span><span id="line-3391">            scan.addFamily(HConstants.CATALOG_FAMILY);</span>
-<span class="source-line-no">3392</span><span id="line-3392">            boolean tableFound = false;</span>
-<span class="source-line-no">3393</span><span id="line-3393">            try (ResultScanner s = meta.getScanner(scan)) {</span>
-<span class="source-line-no">3394</span><span id="line-3394">              for (Result r; (r = s.next()) != null;) {</span>
-<span class="source-line-no">3395</span><span id="line-3395">                byte[] b = r.getValue(HConstants.CATALOG_FAMILY, HConstants.REGIONINFO_QUALIFIER);</span>
-<span class="source-line-no">3396</span><span id="line-3396">                RegionInfo info = RegionInfo.parseFromOrNull(b);</span>
-<span class="source-line-no">3397</span><span id="line-3397">                if (info != null &amp;&amp; info.getTable().equals(tableName)) {</span>
-<span class="source-line-no">3398</span><span id="line-3398">                  // Get server hosting this region from catalog family. Return false if no server</span>
-<span class="source-line-no">3399</span><span id="line-3399">                  // hosting this region, or if the server hosting this region was recently killed</span>
-<span class="source-line-no">3400</span><span id="line-3400">                  // (for fault tolerance testing).</span>
-<span class="source-line-no">3401</span><span id="line-3401">                  tableFound = true;</span>
-<span class="source-line-no">3402</span><span id="line-3402">                  byte[] server =</span>
-<span class="source-line-no">3403</span><span id="line-3403">                    r.getValue(HConstants.CATALOG_FAMILY, HConstants.SERVER_QUALIFIER);</span>
-<span class="source-line-no">3404</span><span id="line-3404">                  if (server == null) {</span>
-<span class="source-line-no">3405</span><span id="line-3405">                    return false;</span>
-<span class="source-line-no">3406</span><span id="line-3406">                  } else {</span>
-<span class="source-line-no">3407</span><span id="line-3407">                    byte[] startCode =</span>
-<span class="source-line-no">3408</span><span id="line-3408">                      r.getValue(HConstants.CATALOG_FAMILY, HConstants.STARTCODE_QUALIFIER);</span>
-<span class="source-line-no">3409</span><span id="line-3409">                    ServerName serverName =</span>
-<span class="source-line-no">3410</span><span id="line-3410">                      ServerName.valueOf(Bytes.toString(server).replaceFirst(":", ",") + ","</span>
-<span class="source-line-no">3411</span><span id="line-3411">                        + Bytes.toLong(startCode));</span>
-<span class="source-line-no">3412</span><span id="line-3412">                    if (</span>
-<span class="source-line-no">3413</span><span id="line-3413">                      !getHBaseClusterInterface().isDistributedCluster()</span>
-<span class="source-line-no">3414</span><span id="line-3414">                        &amp;&amp; getHBaseCluster().isKilledRS(serverName)</span>
-<span class="source-line-no">3415</span><span id="line-3415">                    ) {</span>
-<span class="source-line-no">3416</span><span id="line-3416">                      return false;</span>
-<span class="source-line-no">3417</span><span id="line-3417">                    }</span>
-<span class="source-line-no">3418</span><span id="line-3418">                  }</span>
-<span class="source-line-no">3419</span><span id="line-3419">                  if (RegionStateStore.getRegionState(r, info) != RegionState.State.OPEN) {</span>
-<span class="source-line-no">3420</span><span id="line-3420">                    return false;</span>
-<span class="source-line-no">3421</span><span id="line-3421">                  }</span>
-<span class="source-line-no">3422</span><span id="line-3422">                }</span>
-<span class="source-line-no">3423</span><span id="line-3423">              }</span>
-<span class="source-line-no">3424</span><span id="line-3424">            }</span>
-<span class="source-line-no">3425</span><span id="line-3425">            if (!tableFound) {</span>
-<span class="source-line-no">3426</span><span id="line-3426">              LOG.warn(</span>
-<span class="source-line-no">3427</span><span id="line-3427">                "Didn't find the entries for table " + tableName + " in meta, already deleted?");</span>
-<span class="source-line-no">3428</span><span id="line-3428">            }</span>
-<span class="source-line-no">3429</span><span id="line-3429">            return tableFound;</span>
-<span class="source-line-no">3430</span><span id="line-3430">          }</span>
-<span class="source-line-no">3431</span><span id="line-3431">        });</span>
-<span class="source-line-no">3432</span><span id="line-3432">      }</span>
-<span class="source-line-no">3433</span><span id="line-3433">    }</span>
-<span class="source-line-no">3434</span><span id="line-3434">    LOG.info("All regions for table " + tableName + " assigned to meta. Checking AM states.");</span>
-<span class="source-line-no">3435</span><span id="line-3435">    // check from the master state if we are using a mini cluster</span>
-<span class="source-line-no">3436</span><span id="line-3436">    if (!getHBaseClusterInterface().isDistributedCluster()) {</span>
-<span class="source-line-no">3437</span><span id="line-3437">      // So, all regions are in the meta table but make sure master knows of the assignments before</span>
-<span class="source-line-no">3438</span><span id="line-3438">      // returning -- sometimes this can lag.</span>
-<span class="source-line-no">3439</span><span id="line-3439">      HMaster master = getHBaseCluster().getMaster();</span>
-<span class="source-line-no">3440</span><span id="line-3440">      final RegionStates states = master.getAssignmentManager().getRegionStates();</span>
-<span class="source-line-no">3441</span><span id="line-3441">      waitFor(timeout, 200, new ExplainingPredicate&lt;IOException&gt;() {</span>
-<span class="source-line-no">3442</span><span id="line-3442">        @Override</span>
-<span class="source-line-no">3443</span><span id="line-3443">        public String explainFailure() throws IOException {</span>
-<span class="source-line-no">3444</span><span id="line-3444">          return explainTableAvailability(tableName);</span>
-<span class="source-line-no">3445</span><span id="line-3445">        }</span>
-<span class="source-line-no">3446</span><span id="line-3446"></span>
-<span class="source-line-no">3447</span><span id="line-3447">        @Override</span>
-<span class="source-line-no">3448</span><span id="line-3448">        public boolean evaluate() throws IOException {</span>
-<span class="source-line-no">3449</span><span id="line-3449">          List&lt;RegionInfo&gt; hris = states.getRegionsOfTable(tableName);</span>
-<span class="source-line-no">3450</span><span id="line-3450">          return hris != null &amp;&amp; !hris.isEmpty();</span>
-<span class="source-line-no">3451</span><span id="line-3451">        }</span>
-<span class="source-line-no">3452</span><span id="line-3452">      });</span>
-<span class="source-line-no">3453</span><span id="line-3453">    }</span>
-<span class="source-line-no">3454</span><span id="line-3454">    LOG.info("All regions for table " + tableName + " assigned.");</span>
-<span class="source-line-no">3455</span><span id="line-3455">  }</span>
-<span class="source-line-no">3456</span><span id="line-3456"></span>
-<span class="source-line-no">3457</span><span id="line-3457">  /**</span>
-<span class="source-line-no">3458</span><span id="line-3458">   * Do a small get/scan against one store. This is required because store has no actual methods of</span>
-<span class="source-line-no">3459</span><span id="line-3459">   * querying itself, and relies on StoreScanner.</span>
-<span class="source-line-no">3460</span><span id="line-3460">   */</span>
-<span class="source-line-no">3461</span><span id="line-3461">  public static List&lt;Cell&gt; getFromStoreFile(HStore store, Get get) throws IOException {</span>
-<span class="source-line-no">3462</span><span id="line-3462">    Scan scan = new Scan(get);</span>
-<span class="source-line-no">3463</span><span id="line-3463">    InternalScanner scanner = (InternalScanner) store.getScanner(scan,</span>
-<span class="source-line-no">3464</span><span id="line-3464">      scan.getFamilyMap().get(store.getColumnFamilyDescriptor().getName()),</span>
-<span class="source-line-no">3465</span><span id="line-3465">      // originally MultiVersionConcurrencyControl.resetThreadReadPoint() was called to set</span>
-<span class="source-line-no">3466</span><span id="line-3466">      // readpoint 0.</span>
-<span class="source-line-no">3467</span><span id="line-3467">      0);</span>
-<span class="source-line-no">3468</span><span id="line-3468"></span>
-<span class="source-line-no">3469</span><span id="line-3469">    List&lt;Cell&gt; result = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">3470</span><span id="line-3470">    scanner.next(result);</span>
-<span class="source-line-no">3471</span><span id="line-3471">    if (!result.isEmpty()) {</span>
-<span class="source-line-no">3472</span><span id="line-3472">      // verify that we are on the row we want:</span>
-<span class="source-line-no">3473</span><span id="line-3473">      Cell kv = result.get(0);</span>
-<span class="source-line-no">3474</span><span id="line-3474">      if (!CellUtil.matchingRows(kv, get.getRow())) {</span>
-<span class="source-line-no">3475</span><span id="line-3475">        result.clear();</span>
-<span class="source-line-no">3476</span><span id="line-3476">      }</span>
-<span class="source-line-no">3477</span><span id="line-3477">    }</span>
-<span class="source-line-no">3478</span><span id="line-3478">    scanner.close();</span>
-<span class="source-line-no">3479</span><span id="line-3479">    return result;</span>
-<span class="source-line-no">3480</span><span id="line-3480">  }</span>
+<span class="source-line-no">3271</span><span id="line-3271">    FileSystem currentfs = FileSystem.get(c);</span>
+<span class="source-line-no">3272</span><span id="line-3272">    if (!(currentfs instanceof DistributedFileSystem) || User.isHBaseSecurityEnabled(c)) {</span>
+<span class="source-line-no">3273</span><span id="line-3273">      return User.getCurrent();</span>
+<span class="source-line-no">3274</span><span id="line-3274">    }</span>
+<span class="source-line-no">3275</span><span id="line-3275">    // Else distributed filesystem. Make a new instance per daemon. Below</span>
+<span class="source-line-no">3276</span><span id="line-3276">    // code is taken from the AppendTestUtil over in hdfs.</span>
+<span class="source-line-no">3277</span><span id="line-3277">    String username = User.getCurrent().getName() + differentiatingSuffix;</span>
+<span class="source-line-no">3278</span><span id="line-3278">    User user = User.createUserForTesting(c, username, new String[] { "supergroup" });</span>
+<span class="source-line-no">3279</span><span id="line-3279">    return user;</span>
+<span class="source-line-no">3280</span><span id="line-3280">  }</span>
+<span class="source-line-no">3281</span><span id="line-3281"></span>
+<span class="source-line-no">3282</span><span id="line-3282">  public static NavigableSet&lt;String&gt; getAllOnlineRegions(MiniHBaseCluster cluster)</span>
+<span class="source-line-no">3283</span><span id="line-3283">    throws IOException {</span>
+<span class="source-line-no">3284</span><span id="line-3284">    NavigableSet&lt;String&gt; online = new TreeSet&lt;&gt;();</span>
+<span class="source-line-no">3285</span><span id="line-3285">    for (RegionServerThread rst : cluster.getLiveRegionServerThreads()) {</span>
+<span class="source-line-no">3286</span><span id="line-3286">      try {</span>
+<span class="source-line-no">3287</span><span id="line-3287">        for (RegionInfo region : ProtobufUtil</span>
+<span class="source-line-no">3288</span><span id="line-3288">          .getOnlineRegions(rst.getRegionServer().getRSRpcServices())) {</span>
+<span class="source-line-no">3289</span><span id="line-3289">          online.add(region.getRegionNameAsString());</span>
+<span class="source-line-no">3290</span><span id="line-3290">        }</span>
+<span class="source-line-no">3291</span><span id="line-3291">      } catch (RegionServerStoppedException e) {</span>
+<span class="source-line-no">3292</span><span id="line-3292">        // That's fine.</span>
+<span class="source-line-no">3293</span><span id="line-3293">      }</span>
+<span class="source-line-no">3294</span><span id="line-3294">    }</span>
+<span class="source-line-no">3295</span><span id="line-3295">    return online;</span>
+<span class="source-line-no">3296</span><span id="line-3296">  }</span>
+<span class="source-line-no">3297</span><span id="line-3297"></span>
+<span class="source-line-no">3298</span><span id="line-3298">  /**</span>
+<span class="source-line-no">3299</span><span id="line-3299">   * Set maxRecoveryErrorCount in DFSClient. In 0.20 pre-append its hard-coded to 5 and makes tests</span>
+<span class="source-line-no">3300</span><span id="line-3300">   * linger. Here is the exception you'll see:</span>
+<span class="source-line-no">3301</span><span id="line-3301">   *</span>
+<span class="source-line-no">3302</span><span id="line-3302">   * &lt;pre&gt;</span>
+<span class="source-line-no">3303</span><span id="line-3303">   * 2010-06-15 11:52:28,511 WARN  [DataStreamer for file /hbase/.logs/wal.1276627923013 block</span>
+<span class="source-line-no">3304</span><span id="line-3304">   * blk_928005470262850423_1021] hdfs.DFSClient$DFSOutputStream(2657): Error Recovery for block</span>
+<span class="source-line-no">3305</span><span id="line-3305">   * blk_928005470262850423_1021 failed  because recovery from primary datanode 127.0.0.1:53683</span>
+<span class="source-line-no">3306</span><span id="line-3306">   * failed 4 times.  Pipeline was 127.0.0.1:53687, 127.0.0.1:53683. Will retry...</span>
+<span class="source-line-no">3307</span><span id="line-3307">   * &lt;/pre&gt;</span>
+<span class="source-line-no">3308</span><span id="line-3308">   *</span>
+<span class="source-line-no">3309</span><span id="line-3309">   * @param stream A DFSClient.DFSOutputStream.</span>
+<span class="source-line-no">3310</span><span id="line-3310">   */</span>
+<span class="source-line-no">3311</span><span id="line-3311">  public static void setMaxRecoveryErrorCount(final OutputStream stream, final int max) {</span>
+<span class="source-line-no">3312</span><span id="line-3312">    try {</span>
+<span class="source-line-no">3313</span><span id="line-3313">      Class&lt;?&gt;[] clazzes = DFSClient.class.getDeclaredClasses();</span>
+<span class="source-line-no">3314</span><span id="line-3314">      for (Class&lt;?&gt; clazz : clazzes) {</span>
+<span class="source-line-no">3315</span><span id="line-3315">        String className = clazz.getSimpleName();</span>
+<span class="source-line-no">3316</span><span id="line-3316">        if (className.equals("DFSOutputStream")) {</span>
+<span class="source-line-no">3317</span><span id="line-3317">          if (clazz.isInstance(stream)) {</span>
+<span class="source-line-no">3318</span><span id="line-3318">            Field maxRecoveryErrorCountField =</span>
+<span class="source-line-no">3319</span><span id="line-3319">              stream.getClass().getDeclaredField("maxRecoveryErrorCount");</span>
+<span class="source-line-no">3320</span><span id="line-3320">            maxRecoveryErrorCountField.setAccessible(true);</span>
+<span class="source-line-no">3321</span><span id="line-3321">            maxRecoveryErrorCountField.setInt(stream, max);</span>
+<span class="source-line-no">3322</span><span id="line-3322">            break;</span>
+<span class="source-line-no">3323</span><span id="line-3323">          }</span>
+<span class="source-line-no">3324</span><span id="line-3324">        }</span>
+<span class="source-line-no">3325</span><span id="line-3325">      }</span>
+<span class="source-line-no">3326</span><span id="line-3326">    } catch (Exception e) {</span>
+<span class="source-line-no">3327</span><span id="line-3327">      LOG.info("Could not set max recovery field", e);</span>
+<span class="source-line-no">3328</span><span id="line-3328">    }</span>
+<span class="source-line-no">3329</span><span id="line-3329">  }</span>
+<span class="source-line-no">3330</span><span id="line-3330"></span>
+<span class="source-line-no">3331</span><span id="line-3331">  /**</span>
+<span class="source-line-no">3332</span><span id="line-3332">   * Uses directly the assignment manager to assign the region. and waits until the specified region</span>
+<span class="source-line-no">3333</span><span id="line-3333">   * has completed assignment.</span>
+<span class="source-line-no">3334</span><span id="line-3334">   * @return true if the region is assigned false otherwise.</span>
+<span class="source-line-no">3335</span><span id="line-3335">   */</span>
+<span class="source-line-no">3336</span><span id="line-3336">  public boolean assignRegion(final RegionInfo regionInfo)</span>
+<span class="source-line-no">3337</span><span id="line-3337">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">3338</span><span id="line-3338">    final AssignmentManager am = getHBaseCluster().getMaster().getAssignmentManager();</span>
+<span class="source-line-no">3339</span><span id="line-3339">    am.assign(regionInfo);</span>
+<span class="source-line-no">3340</span><span id="line-3340">    return AssignmentTestingUtil.waitForAssignment(am, regionInfo);</span>
+<span class="source-line-no">3341</span><span id="line-3341">  }</span>
+<span class="source-line-no">3342</span><span id="line-3342"></span>
+<span class="source-line-no">3343</span><span id="line-3343">  /**</span>
+<span class="source-line-no">3344</span><span id="line-3344">   * Move region to destination server and wait till region is completely moved and online</span>
+<span class="source-line-no">3345</span><span id="line-3345">   * @param destRegion region to move</span>
+<span class="source-line-no">3346</span><span id="line-3346">   * @param destServer destination server of the region</span>
+<span class="source-line-no">3347</span><span id="line-3347">   */</span>
+<span class="source-line-no">3348</span><span id="line-3348">  public void moveRegionAndWait(RegionInfo destRegion, ServerName destServer)</span>
+<span class="source-line-no">3349</span><span id="line-3349">    throws InterruptedException, IOException {</span>
+<span class="source-line-no">3350</span><span id="line-3350">    HMaster master = getMiniHBaseCluster().getMaster();</span>
+<span class="source-line-no">3351</span><span id="line-3351">    // TODO: Here we start the move. The move can take a while.</span>
+<span class="source-line-no">3352</span><span id="line-3352">    getAdmin().move(destRegion.getEncodedNameAsBytes(), destServer);</span>
+<span class="source-line-no">3353</span><span id="line-3353">    while (true) {</span>
+<span class="source-line-no">3354</span><span id="line-3354">      ServerName serverName =</span>
+<span class="source-line-no">3355</span><span id="line-3355">        master.getAssignmentManager().getRegionStates().getRegionServerOfRegion(destRegion);</span>
+<span class="source-line-no">3356</span><span id="line-3356">      if (serverName != null &amp;&amp; serverName.equals(destServer)) {</span>
+<span class="source-line-no">3357</span><span id="line-3357">        assertRegionOnServer(destRegion, serverName, 2000);</span>
+<span class="source-line-no">3358</span><span id="line-3358">        break;</span>
+<span class="source-line-no">3359</span><span id="line-3359">      }</span>
+<span class="source-line-no">3360</span><span id="line-3360">      Thread.sleep(10);</span>
+<span class="source-line-no">3361</span><span id="line-3361">    }</span>
+<span class="source-line-no">3362</span><span id="line-3362">  }</span>
+<span class="source-line-no">3363</span><span id="line-3363"></span>
+<span class="source-line-no">3364</span><span id="line-3364">  /**</span>
+<span class="source-line-no">3365</span><span id="line-3365">   * Wait until all regions for a table in hbase:meta have a non-empty info:server, up to a</span>
+<span class="source-line-no">3366</span><span id="line-3366">   * configuable timeout value (default is 60 seconds) This means all regions have been deployed,</span>
+<span class="source-line-no">3367</span><span id="line-3367">   * master has been informed and updated hbase:meta with the regions deployed server.</span>
+<span class="source-line-no">3368</span><span id="line-3368">   * @param tableName the table name</span>
+<span class="source-line-no">3369</span><span id="line-3369">   */</span>
+<span class="source-line-no">3370</span><span id="line-3370">  public void waitUntilAllRegionsAssigned(final TableName tableName) throws IOException {</span>
+<span class="source-line-no">3371</span><span id="line-3371">    waitUntilAllRegionsAssigned(tableName,</span>
+<span class="source-line-no">3372</span><span id="line-3372">      this.conf.getLong("hbase.client.sync.wait.timeout.msec", 60000));</span>
+<span class="source-line-no">3373</span><span id="line-3373">  }</span>
+<span class="source-line-no">3374</span><span id="line-3374"></span>
+<span class="source-line-no">3375</span><span id="line-3375">  /**</span>
+<span class="source-line-no">3376</span><span id="line-3376">   * Waith until all system table's regions get assigned</span>
+<span class="source-line-no">3377</span><span id="line-3377">   */</span>
+<span class="source-line-no">3378</span><span id="line-3378">  public void waitUntilAllSystemRegionsAssigned() throws IOException {</span>
+<span class="source-line-no">3379</span><span id="line-3379">    waitUntilAllRegionsAssigned(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">3380</span><span id="line-3380">  }</span>
+<span class="source-line-no">3381</span><span id="line-3381"></span>
+<span class="source-line-no">3382</span><span id="line-3382">  /**</span>
+<span class="source-line-no">3383</span><span id="line-3383">   * Wait until all regions for a table in hbase:meta have a non-empty info:server, or until</span>
+<span class="source-line-no">3384</span><span id="line-3384">   * timeout. This means all regions have been deployed, master has been informed and updated</span>
+<span class="source-line-no">3385</span><span id="line-3385">   * hbase:meta with the regions deployed server.</span>
+<span class="source-line-no">3386</span><span id="line-3386">   * @param tableName the table name</span>
+<span class="source-line-no">3387</span><span id="line-3387">   * @param timeout   timeout, in milliseconds</span>
+<span class="source-line-no">3388</span><span id="line-3388">   */</span>
+<span class="source-line-no">3389</span><span id="line-3389">  public void waitUntilAllRegionsAssigned(final TableName tableName, final long timeout)</span>
+<span class="source-line-no">3390</span><span id="line-3390">    throws IOException {</span>
+<span class="source-line-no">3391</span><span id="line-3391">    if (!TableName.isMetaTableName(tableName)) {</span>
+<span class="source-line-no">3392</span><span id="line-3392">      try (final Table meta = getConnection().getTable(TableName.META_TABLE_NAME)) {</span>
+<span class="source-line-no">3393</span><span id="line-3393">        LOG.debug("Waiting until all regions of table " + tableName + " get assigned. Timeout = "</span>
+<span class="source-line-no">3394</span><span id="line-3394">          + timeout + "ms");</span>
+<span class="source-line-no">3395</span><span id="line-3395">        waitFor(timeout, 200, true, new ExplainingPredicate&lt;IOException&gt;() {</span>
+<span class="source-line-no">3396</span><span id="line-3396">          @Override</span>
+<span class="source-line-no">3397</span><span id="line-3397">          public String explainFailure() throws IOException {</span>
+<span class="source-line-no">3398</span><span id="line-3398">            return explainTableAvailability(tableName);</span>
+<span class="source-line-no">3399</span><span id="line-3399">          }</span>
+<span class="source-line-no">3400</span><span id="line-3400"></span>
+<span class="source-line-no">3401</span><span id="line-3401">          @Override</span>
+<span class="source-line-no">3402</span><span id="line-3402">          public boolean evaluate() throws IOException {</span>
+<span class="source-line-no">3403</span><span id="line-3403">            Scan scan = new Scan();</span>
+<span class="source-line-no">3404</span><span id="line-3404">            scan.addFamily(HConstants.CATALOG_FAMILY);</span>
+<span class="source-line-no">3405</span><span id="line-3405">            boolean tableFound = false;</span>
+<span class="source-line-no">3406</span><span id="line-3406">            try (ResultScanner s = meta.getScanner(scan)) {</span>
+<span class="source-line-no">3407</span><span id="line-3407">              for (Result r; (r = s.next()) != null;) {</span>
+<span class="source-line-no">3408</span><span id="line-3408">                byte[] b = r.getValue(HConstants.CATALOG_FAMILY, HConstants.REGIONINFO_QUALIFIER);</span>
+<span class="source-line-no">3409</span><span id="line-3409">                RegionInfo info = RegionInfo.parseFromOrNull(b);</span>
+<span class="source-line-no">3410</span><span id="line-3410">                if (info != null &amp;&amp; info.getTable().equals(tableName)) {</span>
+<span class="source-line-no">3411</span><span id="line-3411">                  // Get server hosting this region from catalog family. Return false if no server</span>
+<span class="source-line-no">3412</span><span id="line-3412">                  // hosting this region, or if the server hosting this region was recently killed</span>
+<span class="source-line-no">3413</span><span id="line-3413">                  // (for fault tolerance testing).</span>
+<span class="source-line-no">3414</span><span id="line-3414">                  tableFound = true;</span>
+<span class="source-line-no">3415</span><span id="line-3415">                  byte[] server =</span>
+<span class="source-line-no">3416</span><span id="line-3416">                    r.getValue(HConstants.CATALOG_FAMILY, HConstants.SERVER_QUALIFIER);</span>
+<span class="source-line-no">3417</span><span id="line-3417">                  if (server == null) {</span>
+<span class="source-line-no">3418</span><span id="line-3418">                    return false;</span>
+<span class="source-line-no">3419</span><span id="line-3419">                  } else {</span>
+<span class="source-line-no">3420</span><span id="line-3420">                    byte[] startCode =</span>
+<span class="source-line-no">3421</span><span id="line-3421">                      r.getValue(HConstants.CATALOG_FAMILY, HConstants.STARTCODE_QUALIFIER);</span>
+<span class="source-line-no">3422</span><span id="line-3422">                    ServerName serverName =</span>
+<span class="source-line-no">3423</span><span id="line-3423">                      ServerName.valueOf(Bytes.toString(server).replaceFirst(":", ",") + ","</span>
+<span class="source-line-no">3424</span><span id="line-3424">                        + Bytes.toLong(startCode));</span>
+<span class="source-line-no">3425</span><span id="line-3425">                    if (</span>
+<span class="source-line-no">3426</span><span id="line-3426">                      !getHBaseClusterInterface().isDistributedCluster()</span>
+<span class="source-line-no">3427</span><span id="line-3427">                        &amp;&amp; getHBaseCluster().isKilledRS(serverName)</span>
+<span class="source-line-no">3428</span><span id="line-3428">                    ) {</span>
+<span class="source-line-no">3429</span><span id="line-3429">                      return false;</span>
+<span class="source-line-no">3430</span><span id="line-3430">                    }</span>
+<span class="source-line-no">3431</span><span id="line-3431">                  }</span>
+<span class="source-line-no">3432</span><span id="line-3432">                  if (RegionStateStore.getRegionState(r, info) != RegionState.State.OPEN) {</span>
+<span class="source-line-no">3433</span><span id="line-3433">                    return false;</span>
+<span class="source-line-no">3434</span><span id="line-3434">                  }</span>
+<span class="source-line-no">3435</span><span id="line-3435">                }</span>
+<span class="source-line-no">3436</span><span id="line-3436">              }</span>
+<span class="source-line-no">3437</span><span id="line-3437">            }</span>
+<span class="source-line-no">3438</span><span id="line-3438">            if (!tableFound) {</span>
+<span class="source-line-no">3439</span><span id="line-3439">              LOG.warn(</span>
+<span class="source-line-no">3440</span><span id="line-3440">                "Didn't find the entries for table " + tableName + " in meta, already deleted?");</span>
+<span class="source-line-no">3441</span><span id="line-3441">            }</span>
+<span class="source-line-no">3442</span><span id="line-3442">            return tableFound;</span>
+<span class="source-line-no">3443</span><span id="line-3443">          }</span>
+<span class="source-line-no">3444</span><span id="line-3444">        });</span>
+<span class="source-line-no">3445</span><span id="line-3445">      }</span>
+<span class="source-line-no">3446</span><span id="line-3446">    }</span>
+<span class="source-line-no">3447</span><span id="line-3447">    LOG.info("All regions for table " + tableName + " assigned to meta. Checking AM states.");</span>
+<span class="source-line-no">3448</span><span id="line-3448">    // check from the master state if we are using a mini cluster</span>
+<span class="source-line-no">3449</span><span id="line-3449">    if (!getHBaseClusterInterface().isDistributedCluster()) {</span>
+<span class="source-line-no">3450</span><span id="line-3450">      // So, all regions are in the meta table but make sure master knows of the assignments before</span>
+<span class="source-line-no">3451</span><span id="line-3451">      // returning -- sometimes this can lag.</span>
+<span class="source-line-no">3452</span><span id="line-3452">      HMaster master = getHBaseCluster().getMaster();</span>
+<span class="source-line-no">3453</span><span id="line-3453">      final RegionStates states = master.getAssignmentManager().getRegionStates();</span>
+<span class="source-line-no">3454</span><span id="line-3454">      waitFor(timeout, 200, new ExplainingPredicate&lt;IOException&gt;() {</span>
+<span class="source-line-no">3455</span><span id="line-3455">        @Override</span>
+<span class="source-line-no">3456</span><span id="line-3456">        public String explainFailure() throws IOException {</span>
+<span class="source-line-no">3457</span><span id="line-3457">          return explainTableAvailability(tableName);</span>
+<span class="source-line-no">3458</span><span id="line-3458">        }</span>
+<span class="source-line-no">3459</span><span id="line-3459"></span>
+<span class="source-line-no">3460</span><span id="line-3460">        @Override</span>
+<span class="source-line-no">3461</span><span id="line-3461">        public boolean evaluate() throws IOException {</span>
+<span class="source-line-no">3462</span><span id="line-3462">          List&lt;RegionInfo&gt; hris = states.getRegionsOfTable(tableName);</span>
+<span class="source-line-no">3463</span><span id="line-3463">          return hris != null &amp;&amp; !hris.isEmpty();</span>
+<span class="source-line-no">3464</span><span id="line-3464">        }</span>
+<span class="source-line-no">3465</span><span id="line-3465">      });</span>
+<span class="source-line-no">3466</span><span id="line-3466">    }</span>
+<span class="source-line-no">3467</span><span id="line-3467">    LOG.info("All regions for table " + tableName + " assigned.");</span>
+<span class="source-line-no">3468</span><span id="line-3468">  }</span>
+<span class="source-line-no">3469</span><span id="line-3469"></span>
+<span class="source-line-no">3470</span><span id="line-3470">  /**</span>
+<span class="source-line-no">3471</span><span id="line-3471">   * Do a small get/scan against one store. This is required because store has no actual methods of</span>
+<span class="source-line-no">3472</span><span id="line-3472">   * querying itself, and relies on StoreScanner.</span>
+<span class="source-line-no">3473</span><span id="line-3473">   */</span>
+<span class="source-line-no">3474</span><span id="line-3474">  public static List&lt;Cell&gt; getFromStoreFile(HStore store, Get get) throws IOException {</span>
+<span class="source-line-no">3475</span><span id="line-3475">    Scan scan = new Scan(get);</span>
+<span class="source-line-no">3476</span><span id="line-3476">    InternalScanner scanner = (InternalScanner) store.getScanner(scan,</span>
+<span class="source-line-no">3477</span><span id="line-3477">      scan.getFamilyMap().get(store.getColumnFamilyDescriptor().getName()),</span>
+<span class="source-line-no">3478</span><span id="line-3478">      // originally MultiVersionConcurrencyControl.resetThreadReadPoint() was called to set</span>
+<span class="source-line-no">3479</span><span id="line-3479">      // readpoint 0.</span>
+<span class="source-line-no">3480</span><span id="line-3480">      0);</span>
 <span class="source-line-no">3481</span><span id="line-3481"></span>
-<span class="source-line-no">3482</span><span id="line-3482">  /**</span>
-<span class="source-line-no">3483</span><span id="line-3483">   * Create region split keys between startkey and endKey</span>
-<span class="source-line-no">3484</span><span id="line-3484">   * @param numRegions the number of regions to be created. it has to be greater than 3.</span>
-<span class="source-line-no">3485</span><span id="line-3485">   * @return resulting split keys</span>
-<span class="source-line-no">3486</span><span id="line-3486">   */</span>
-<span class="source-line-no">3487</span><span id="line-3487">  public byte[][] getRegionSplitStartKeys(byte[] startKey, byte[] endKey, int numRegions) {</span>
-<span class="source-line-no">3488</span><span id="line-3488">    if (numRegions &lt;= 3) {</span>
-<span class="source-line-no">3489</span><span id="line-3489">      throw new AssertionError();</span>
+<span class="source-line-no">3482</span><span id="line-3482">    List&lt;Cell&gt; result = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">3483</span><span id="line-3483">    scanner.next(result);</span>
+<span class="source-line-no">3484</span><span id="line-3484">    if (!result.isEmpty()) {</span>
+<span class="source-line-no">3485</span><span id="line-3485">      // verify that we are on the row we want:</span>
+<span class="source-line-no">3486</span><span id="line-3486">      Cell kv = result.get(0);</span>
+<span class="source-line-no">3487</span><span id="line-3487">      if (!CellUtil.matchingRows(kv, get.getRow())) {</span>
+<span class="source-line-no">3488</span><span id="line-3488">        result.clear();</span>
+<span class="source-line-no">3489</span><span id="line-3489">      }</span>
 <span class="source-line-no">3490</span><span id="line-3490">    }</span>
-<span class="source-line-no">3491</span><span id="line-3491">    byte[][] tmpSplitKeys = Bytes.split(startKey, endKey, numRegions - 3);</span>
-<span class="source-line-no">3492</span><span id="line-3492">    byte[][] result = new byte[tmpSplitKeys.length + 1][];</span>
-<span class="source-line-no">3493</span><span id="line-3493">    System.arraycopy(tmpSplitKeys, 0, result, 1, tmpSplitKeys.length);</span>
-<span class="source-line-no">3494</span><span id="line-3494">    result[0] = HConstants.EMPTY_BYTE_ARRAY;</span>
-<span class="source-line-no">3495</span><span id="line-3495">    return result;</span>
-<span class="source-line-no">3496</span><span id="line-3496">  }</span>
-<span class="source-line-no">3497</span><span id="line-3497"></span>
-<span class="source-line-no">3498</span><span id="line-3498">  /**</span>
-<span class="source-line-no">3499</span><span id="line-3499">   * Do a small get/scan against one store. This is required because store has no actual methods of</span>
-<span class="source-line-no">3500</span><span id="line-3500">   * querying itself, and relies on StoreScanner.</span>
-<span class="source-line-no">3501</span><span id="line-3501">   */</span>
-<span class="source-line-no">3502</span><span id="line-3502">  public static List&lt;Cell&gt; getFromStoreFile(HStore store, byte[] row, NavigableSet&lt;byte[]&gt; columns)</span>
-<span class="source-line-no">3503</span><span id="line-3503">    throws IOException {</span>
-<span class="source-line-no">3504</span><span id="line-3504">    Get get = new Get(row);</span>
-<span class="source-line-no">3505</span><span id="line-3505">    Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; s = get.getFamilyMap();</span>
-<span class="source-line-no">3506</span><span id="line-3506">    s.put(store.getColumnFamilyDescriptor().getName(), columns);</span>
-<span class="source-line-no">3507</span><span id="line-3507"></span>
-<span class="source-line-no">3508</span><span id="line-3508">    return getFromStoreFile(store, get);</span>
+<span class="source-line-no">3491</span><span id="line-3491">    scanner.close();</span>
+<span class="source-line-no">3492</span><span id="line-3492">    return result;</span>
+<span class="source-line-no">3493</span><span id="line-3493">  }</span>
+<span class="source-line-no">3494</span><span id="line-3494"></span>
+<span class="source-line-no">3495</span><span id="line-3495">  /**</span>
+<span class="source-line-no">3496</span><span id="line-3496">   * Create region split keys between startkey and endKey</span>
+<span class="source-line-no">3497</span><span id="line-3497">   * @param numRegions the number of regions to be created. it has to be greater than 3.</span>
+<span class="source-line-no">3498</span><span id="line-3498">   * @return resulting split keys</span>
+<span class="source-line-no">3499</span><span id="line-3499">   */</span>
+<span class="source-line-no">3500</span><span id="line-3500">  public byte[][] getRegionSplitStartKeys(byte[] startKey, byte[] endKey, int numRegions) {</span>
+<span class="source-line-no">3501</span><span id="line-3501">    if (numRegions &lt;= 3) {</span>
+<span class="source-line-no">3502</span><span id="line-3502">      throw new AssertionError();</span>
+<span class="source-line-no">3503</span><span id="line-3503">    }</span>
+<span class="source-line-no">3504</span><span id="line-3504">    byte[][] tmpSplitKeys = Bytes.split(startKey, endKey, numRegions - 3);</span>
+<span class="source-line-no">3505</span><span id="line-3505">    byte[][] result = new byte[tmpSplitKeys.length + 1][];</span>
+<span class="source-line-no">3506</span><span id="line-3506">    System.arraycopy(tmpSplitKeys, 0, result, 1, tmpSplitKeys.length);</span>
+<span class="source-line-no">3507</span><span id="line-3507">    result[0] = HConstants.EMPTY_BYTE_ARRAY;</span>
+<span class="source-line-no">3508</span><span id="line-3508">    return result;</span>
 <span class="source-line-no">3509</span><span id="line-3509">  }</span>
 <span class="source-line-no">3510</span><span id="line-3510"></span>
-<span class="source-line-no">3511</span><span id="line-3511">  public static void assertKVListsEqual(String additionalMsg, final List&lt;? extends Cell&gt; expected,</span>
-<span class="source-line-no">3512</span><span id="line-3512">    final List&lt;? extends Cell&gt; actual) {</span>
-<span class="source-line-no">3513</span><span id="line-3513">    final int eLen = expected.size();</span>
-<span class="source-line-no">3514</span><span id="line-3514">    final int aLen = actual.size();</span>
-<span class="source-line-no">3515</span><span id="line-3515">    final int minLen = Math.min(eLen, aLen);</span>
-<span class="source-line-no">3516</span><span id="line-3516"></span>
-<span class="source-line-no">3517</span><span id="line-3517">    int i;</span>
-<span class="source-line-no">3518</span><span id="line-3518">    for (i = 0; i &lt; minLen</span>
-<span class="source-line-no">3519</span><span id="line-3519">      &amp;&amp; CellComparator.getInstance().compare(expected.get(i), actual.get(i)) == 0; ++i) {</span>
-<span class="source-line-no">3520</span><span id="line-3520">    }</span>
-<span class="source-line-no">3521</span><span id="line-3521"></span>
-<span class="source-line-no">3522</span><span id="line-3522">    if (additionalMsg == null) {</span>
-<span class="source-line-no">3523</span><span id="line-3523">      additionalMsg = "";</span>
-<span class="source-line-no">3524</span><span id="line-3524">    }</span>
-<span class="source-line-no">3525</span><span id="line-3525">    if (!additionalMsg.isEmpty()) {</span>
-<span class="source-line-no">3526</span><span id="line-3526">      additionalMsg = ". " + additionalMsg;</span>
-<span class="source-line-no">3527</span><span id="line-3527">    }</span>
-<span class="source-line-no">3528</span><span id="line-3528"></span>
-<span class="source-line-no">3529</span><span id="line-3529">    if (eLen != aLen || i != minLen) {</span>
-<span class="source-line-no">3530</span><span id="line-3530">      throw new AssertionError("Expected and actual KV arrays differ at position " + i + ": "</span>
-<span class="source-line-no">3531</span><span id="line-3531">        + safeGetAsStr(expected, i) + " (length " + eLen + ") vs. " + safeGetAsStr(actual, i)</span>
-<span class="source-line-no">3532</span><span id="line-3532">        + " (length " + aLen + ")" + additionalMsg);</span>
+<span class="source-line-no">3511</span><span id="line-3511">  /**</span>
+<span class="source-line-no">3512</span><span id="line-3512">   * Do a small get/scan against one store. This is required because store has no actual methods of</span>
+<span class="source-line-no">3513</span><span id="line-3513">   * querying itself, and relies on StoreScanner.</span>
+<span class="source-line-no">3514</span><span id="line-3514">   */</span>
+<span class="source-line-no">3515</span><span id="line-3515">  public static List&lt;Cell&gt; getFromStoreFile(HStore store, byte[] row, NavigableSet&lt;byte[]&gt; columns)</span>
+<span class="source-line-no">3516</span><span id="line-3516">    throws IOException {</span>
+<span class="source-line-no">3517</span><span id="line-3517">    Get get = new Get(row);</span>
+<span class="source-line-no">3518</span><span id="line-3518">    Map&lt;byte[], NavigableSet&lt;byte[]&gt;&gt; s = get.getFamilyMap();</span>
+<span class="source-line-no">3519</span><span id="line-3519">    s.put(store.getColumnFamilyDescriptor().getName(), columns);</span>
+<span class="source-line-no">3520</span><span id="line-3520"></span>
+<span class="source-line-no">3521</span><span id="line-3521">    return getFromStoreFile(store, get);</span>
+<span class="source-line-no">3522</span><span id="line-3522">  }</span>
+<span class="source-line-no">3523</span><span id="line-3523"></span>
+<span class="source-line-no">3524</span><span id="line-3524">  public static void assertKVListsEqual(String additionalMsg, final List&lt;? extends Cell&gt; expected,</span>
+<span class="source-line-no">3525</span><span id="line-3525">    final List&lt;? extends Cell&gt; actual) {</span>
+<span class="source-line-no">3526</span><span id="line-3526">    final int eLen = expected.size();</span>
+<span class="source-line-no">3527</span><span id="line-3527">    final int aLen = actual.size();</span>
+<span class="source-line-no">3528</span><span id="line-3528">    final int minLen = Math.min(eLen, aLen);</span>
+<span class="source-line-no">3529</span><span id="line-3529"></span>
+<span class="source-line-no">3530</span><span id="line-3530">    int i;</span>
+<span class="source-line-no">3531</span><span id="line-3531">    for (i = 0; i &lt; minLen</span>
+<span class="source-line-no">3532</span><span id="line-3532">      &amp;&amp; CellComparator.getInstance().compare(expected.get(i), actual.get(i)) == 0; ++i) {</span>
 <span class="source-line-no">3533</span><span id="line-3533">    }</span>
-<span class="source-line-no">3534</span><span id="line-3534">  }</span>
-<span class="source-line-no">3535</span><span id="line-3535"></span>
-<span class="source-line-no">3536</span><span id="line-3536">  public static &lt;T&gt; String safeGetAsStr(List&lt;T&gt; lst, int i) {</span>
-<span class="source-line-no">3537</span><span id="line-3537">    if (0 &lt;= i &amp;&amp; i &lt; lst.size()) {</span>
-<span class="source-line-no">3538</span><span id="line-3538">      return lst.get(i).toString();</span>
-<span class="source-line-no">3539</span><span id="line-3539">    } else {</span>
-<span class="source-line-no">3540</span><span id="line-3540">      return "&lt;out_of_range&gt;";</span>
-<span class="source-line-no">3541</span><span id="line-3541">    }</span>
-<span class="source-line-no">3542</span><span id="line-3542">  }</span>
-<span class="source-line-no">3543</span><span id="line-3543"></span>
-<span class="source-line-no">3544</span><span id="line-3544">  public String getRpcConnnectionURI() throws UnknownHostException {</span>
-<span class="source-line-no">3545</span><span id="line-3545">    return "hbase+rpc://" + MasterRegistry.getMasterAddr(conf);</span>
-<span class="source-line-no">3546</span><span id="line-3546">  }</span>
-<span class="source-line-no">3547</span><span id="line-3547"></span>
-<span class="source-line-no">3548</span><span id="line-3548">  public String getZkConnectionURI() {</span>
-<span class="source-line-no">3549</span><span id="line-3549">    return "hbase+zk://" + conf.get(HConstants.ZOOKEEPER_QUORUM) + ":"</span>
-<span class="source-line-no">3550</span><span id="line-3550">      + conf.get(HConstants.ZOOKEEPER_CLIENT_PORT)</span>
-<span class="source-line-no">3551</span><span id="line-3551">      + conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);</span>
-<span class="source-line-no">3552</span><span id="line-3552">  }</span>
-<span class="source-line-no">3553</span><span id="line-3553"></span>
-<span class="source-line-no">3554</span><span id="line-3554">  /**</span>
-<span class="source-line-no">3555</span><span id="line-3555">   * Get the zk based cluster key for this cluster.</span>
-<span class="source-line-no">3556</span><span id="line-3556">   * @deprecated since 2.7.0, will be removed in 4.0.0. Now we use connection uri to specify the</span>
-<span class="source-line-no">3557</span><span id="line-3557">   *             connection info of a cluster. Keep here only for compatibility.</span>
-<span class="source-line-no">3558</span><span id="line-3558">   * @see #getRpcConnnectionURI()</span>
-<span class="source-line-no">3559</span><span id="line-3559">   * @see #getZkConnectionURI()</span>
-<span class="source-line-no">3560</span><span id="line-3560">   */</span>
-<span class="source-line-no">3561</span><span id="line-3561">  @Deprecated</span>
-<span class="source-line-no">3562</span><span id="line-3562">  public String getClusterKey() {</span>
-<span class="source-line-no">3563</span><span id="line-3563">    return conf.get(HConstants.ZOOKEEPER_QUORUM) + ":" + conf.get(HConstants.ZOOKEEPER_CLIENT_PORT)</span>
-<span class="source-line-no">3564</span><span id="line-3564">      + ":"</span>
-<span class="source-line-no">3565</span><span id="line-3565">      + conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);</span>
-<span class="source-line-no">3566</span><span id="line-3566">  }</span>
-<span class="source-line-no">3567</span><span id="line-3567"></span>
-<span class="source-line-no">3568</span><span id="line-3568">  /** Creates a random table with the given parameters */</span>
-<span class="source-line-no">3569</span><span id="line-3569">  public Table createRandomTable(TableName tableName, final Collection&lt;String&gt; families,</span>
-<span class="source-line-no">3570</span><span id="line-3570">    final int maxVersions, final int numColsPerRow, final int numFlushes, final int numRegions,</span>
-<span class="source-line-no">3571</span><span id="line-3571">    final int numRowsPerFlush) throws IOException, InterruptedException {</span>
-<span class="source-line-no">3572</span><span id="line-3572"></span>
-<span class="source-line-no">3573</span><span id="line-3573">    LOG.info("\n\nCreating random table " + tableName + " with " + numRegions + " regions, "</span>
-<span class="source-line-no">3574</span><span id="line-3574">      + numFlushes + " storefiles per region, " + numRowsPerFlush + " rows per flush, maxVersions="</span>
-<span class="source-line-no">3575</span><span id="line-3575">      + maxVersions + "\n");</span>
-<span class="source-line-no">3576</span><span id="line-3576"></span>
-<span class="source-line-no">3577</span><span id="line-3577">    final int numCF = families.size();</span>
-<span class="source-line-no">3578</span><span id="line-3578">    final byte[][] cfBytes = new byte[numCF][];</span>
-<span class="source-line-no">3579</span><span id="line-3579">    {</span>
-<span class="source-line-no">3580</span><span id="line-3580">      int cfIndex = 0;</span>
-<span class="source-line-no">3581</span><span id="line-3581">      for (String cf : families) {</span>
-<span class="source-line-no">3582</span><span id="line-3582">        cfBytes[cfIndex++] = Bytes.toBytes(cf);</span>
-<span class="source-line-no">3583</span><span id="line-3583">      }</span>
-<span class="source-line-no">3584</span><span id="line-3584">    }</span>
+<span class="source-line-no">3534</span><span id="line-3534"></span>
+<span class="source-line-no">3535</span><span id="line-3535">    if (additionalMsg == null) {</span>
+<span class="source-line-no">3536</span><span id="line-3536">      additionalMsg = "";</span>
+<span class="source-line-no">3537</span><span id="line-3537">    }</span>
+<span class="source-line-no">3538</span><span id="line-3538">    if (!additionalMsg.isEmpty()) {</span>
+<span class="source-line-no">3539</span><span id="line-3539">      additionalMsg = ". " + additionalMsg;</span>
+<span class="source-line-no">3540</span><span id="line-3540">    }</span>
+<span class="source-line-no">3541</span><span id="line-3541"></span>
+<span class="source-line-no">3542</span><span id="line-3542">    if (eLen != aLen || i != minLen) {</span>
+<span class="source-line-no">3543</span><span id="line-3543">      throw new AssertionError("Expected and actual KV arrays differ at position " + i + ": "</span>
+<span class="source-line-no">3544</span><span id="line-3544">        + safeGetAsStr(expected, i) + " (length " + eLen + ") vs. " + safeGetAsStr(actual, i)</span>
+<span class="source-line-no">3545</span><span id="line-3545">        + " (length " + aLen + ")" + additionalMsg);</span>
+<span class="source-line-no">3546</span><span id="line-3546">    }</span>
+<span class="source-line-no">3547</span><span id="line-3547">  }</span>
+<span class="source-line-no">3548</span><span id="line-3548"></span>
+<span class="source-line-no">3549</span><span id="line-3549">  public static &lt;T&gt; String safeGetAsStr(List&lt;T&gt; lst, int i) {</span>
+<span class="source-line-no">3550</span><span id="line-3550">    if (0 &lt;= i &amp;&amp; i &lt; lst.size()) {</span>
+<span class="source-line-no">3551</span><span id="line-3551">      return lst.get(i).toString();</span>
+<span class="source-line-no">3552</span><span id="line-3552">    } else {</span>
+<span class="source-line-no">3553</span><span id="line-3553">      return "&lt;out_of_range&gt;";</span>
+<span class="source-line-no">3554</span><span id="line-3554">    }</span>
+<span class="source-line-no">3555</span><span id="line-3555">  }</span>
+<span class="source-line-no">3556</span><span id="line-3556"></span>
+<span class="source-line-no">3557</span><span id="line-3557">  public String getRpcConnnectionURI() throws UnknownHostException {</span>
+<span class="source-line-no">3558</span><span id="line-3558">    return "hbase+rpc://" + MasterRegistry.getMasterAddr(conf);</span>
+<span class="source-line-no">3559</span><span id="line-3559">  }</span>
+<span class="source-line-no">3560</span><span id="line-3560"></span>
+<span class="source-line-no">3561</span><span id="line-3561">  public String getZkConnectionURI() {</span>
+<span class="source-line-no">3562</span><span id="line-3562">    return "hbase+zk://" + conf.get(HConstants.ZOOKEEPER_QUORUM) + ":"</span>
+<span class="source-line-no">3563</span><span id="line-3563">      + conf.get(HConstants.ZOOKEEPER_CLIENT_PORT)</span>
+<span class="source-line-no">3564</span><span id="line-3564">      + conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);</span>
+<span class="source-line-no">3565</span><span id="line-3565">  }</span>
+<span class="source-line-no">3566</span><span id="line-3566"></span>
+<span class="source-line-no">3567</span><span id="line-3567">  /**</span>
+<span class="source-line-no">3568</span><span id="line-3568">   * Get the zk based cluster key for this cluster.</span>
+<span class="source-line-no">3569</span><span id="line-3569">   * @deprecated since 2.7.0, will be removed in 4.0.0. Now we use connection uri to specify the</span>
+<span class="source-line-no">3570</span><span id="line-3570">   *             connection info of a cluster. Keep here only for compatibility.</span>
+<span class="source-line-no">3571</span><span id="line-3571">   * @see #getRpcConnnectionURI()</span>
+<span class="source-line-no">3572</span><span id="line-3572">   * @see #getZkConnectionURI()</span>
+<span class="source-line-no">3573</span><span id="line-3573">   */</span>
+<span class="source-line-no">3574</span><span id="line-3574">  @Deprecated</span>
+<span class="source-line-no">3575</span><span id="line-3575">  public String getClusterKey() {</span>
+<span class="source-line-no">3576</span><span id="line-3576">    return conf.get(HConstants.ZOOKEEPER_QUORUM) + ":" + conf.get(HConstants.ZOOKEEPER_CLIENT_PORT)</span>
+<span class="source-line-no">3577</span><span id="line-3577">      + ":"</span>
+<span class="source-line-no">3578</span><span id="line-3578">      + conf.get(HConstants.ZOOKEEPER_ZNODE_PARENT, HConstants.DEFAULT_ZOOKEEPER_ZNODE_PARENT);</span>
+<span class="source-line-no">3579</span><span id="line-3579">  }</span>
+<span class="source-line-no">3580</span><span id="line-3580"></span>
+<span class="source-line-no">3581</span><span id="line-3581">  /** Creates a random table with the given parameters */</span>
+<span class="source-line-no">3582</span><span id="line-3582">  public Table createRandomTable(TableName tableName, final Collection&lt;String&gt; families,</span>
+<span class="source-line-no">3583</span><span id="line-3583">    final int maxVersions, final int numColsPerRow, final int numFlushes, final int numRegions,</span>
+<span class="source-line-no">3584</span><span id="line-3584">    final int numRowsPerFlush) throws IOException, InterruptedException {</span>
 <span class="source-line-no">3585</span><span id="line-3585"></span>
-<span class="source-line-no">3586</span><span id="line-3586">    final int actualStartKey = 0;</span>
-<span class="source-line-no">3587</span><span id="line-3587">    final int actualEndKey = Integer.MAX_VALUE;</span>
-<span class="source-line-no">3588</span><span id="line-3588">    final int keysPerRegion = (actualEndKey - actualStartKey) / numRegions;</span>
-<span class="source-line-no">3589</span><span id="line-3589">    final int splitStartKey = actualStartKey + keysPerRegion;</span>
-<span class="source-line-no">3590</span><span id="line-3590">    final int splitEndKey = actualEndKey - keysPerRegion;</span>
-<span class="source-line-no">3591</span><span id="line-3591">    final String keyFormat = "%08x";</span>
-<span class="source-line-no">3592</span><span id="line-3592">    final Table table = createTable(tableName, cfBytes, maxVersions,</span>
-<span class="source-line-no">3593</span><span id="line-3593">      Bytes.toBytes(String.format(keyFormat, splitStartKey)),</span>
-<span class="source-line-no">3594</span><span id="line-3594">      Bytes.toBytes(String.format(keyFormat, splitEndKey)), numRegions);</span>
-<span class="source-line-no">3595</span><span id="line-3595"></span>
-<span class="source-line-no">3596</span><span id="line-3596">    if (hbaseCluster != null) {</span>
-<span class="source-line-no">3597</span><span id="line-3597">      getMiniHBaseCluster().flushcache(TableName.META_TABLE_NAME);</span>
-<span class="source-line-no">3598</span><span id="line-3598">    }</span>
-<span class="source-line-no">3599</span><span id="line-3599"></span>
-<span class="source-line-no">3600</span><span id="line-3600">    BufferedMutator mutator = getConnection().getBufferedMutator(tableName);</span>
-<span class="source-line-no">3601</span><span id="line-3601"></span>
-<span class="source-line-no">3602</span><span id="line-3602">    final Random rand = ThreadLocalRandom.current();</span>
-<span class="source-line-no">3603</span><span id="line-3603">    for (int iFlush = 0; iFlush &lt; numFlushes; ++iFlush) {</span>
-<span class="source-line-no">3604</span><span id="line-3604">      for (int iRow = 0; iRow &lt; numRowsPerFlush; ++iRow) {</span>
-<span class="source-line-no">3605</span><span id="line-3605">        final byte[] row = Bytes.toBytes(</span>
-<span class="source-line-no">3606</span><span id="line-3606">          String.format(keyFormat, actualStartKey + rand.nextInt(actualEndKey - actualStartKey)));</span>
-<span class="source-line-no">3607</span><span id="line-3607"></span>
-<span class="source-line-no">3608</span><span id="line-3608">        Put put = new Put(row);</span>
-<span class="source-line-no">3609</span><span id="line-3609">        Delete del = new Delete(row);</span>
-<span class="source-line-no">3610</span><span id="line-3610">        for (int iCol = 0; iCol &lt; numColsPerRow; ++iCol) {</span>
-<span class="source-line-no">3611</span><span id="line-3611">          final byte[] cf = cfBytes[rand.nextInt(numCF)];</span>
-<span class="source-line-no">3612</span><span id="line-3612">          final long ts = rand.nextInt();</span>
-<span class="source-line-no">3613</span><span id="line-3613">          final byte[] qual = Bytes.toBytes("col" + iCol);</span>
-<span class="source-line-no">3614</span><span id="line-3614">          if (rand.nextBoolean()) {</span>
-<span class="source-line-no">3615</span><span id="line-3615">            final byte[] value =</span>
-<span class="source-line-no">3616</span><span id="line-3616">              Bytes.toBytes("value_for_row_" + iRow + "_cf_" + Bytes.toStringBinary(cf) + "_col_"</span>
-<span class="source-line-no">3617</span><span id="line-3617">                + iCol + "_ts_" + ts + "_random_" + rand.nextLong());</span>
-<span class="source-line-no">3618</span><span id="line-3618">            put.addColumn(cf, qual, ts, value);</span>
-<span class="source-line-no">3619</span><span id="line-3619">          } else if (rand.nextDouble() &lt; 0.8) {</span>
-<span class="source-line-no">3620</span><span id="line-3620">            del.addColumn(cf, qual, ts);</span>
-<span class="source-line-no">3621</span><span id="line-3621">          } else {</span>
-<span class="source-line-no">3622</span><span id="line-3622">            del.addColumns(cf, qual, ts);</span>
-<span class="source-line-no">3623</span><span id="line-3623">          }</span>
-<span class="source-line-no">3624</span><span id="line-3624">        }</span>
-<span class="source-line-no">3625</span><span id="line-3625"></span>
-<span class="source-line-no">3626</span><span id="line-3626">        if (!put.isEmpty()) {</span>
-<span class="source-line-no">3627</span><span id="line-3627">          mutator.mutate(put);</span>
-<span class="source-line-no">3628</span><span id="line-3628">        }</span>
-<span class="source-line-no">3629</span><span id="line-3629"></span>
-<span class="source-line-no">3630</span><span id="line-3630">        if (!del.isEmpty()) {</span>
-<span class="source-line-no">3631</span><span id="line-3631">          mutator.mutate(del);</span>
-<span class="source-line-no">3632</span><span id="line-3632">        }</span>
-<span class="source-line-no">3633</span><span id="line-3633">      }</span>
-<span class="source-line-no">3634</span><span id="line-3634">      LOG.info("Initiating flush #" + iFlush + " for table " + tableName);</span>
-<span class="source-line-no">3635</span><span id="line-3635">      mutator.flush();</span>
-<span class="source-line-no">3636</span><span id="line-3636">      if (hbaseCluster != null) {</span>
-<span class="source-line-no">3637</span><span id="line-3637">        getMiniHBaseCluster().flushcache(table.getName());</span>
-<span class="source-line-no">3638</span><span id="line-3638">      }</span>
-<span class="source-line-no">3639</span><span id="line-3639">    }</span>
-<span class="source-line-no">3640</span><span id="line-3640">    mutator.close();</span>
-<span class="source-line-no">3641</span><span id="line-3641"></span>
-<span class="source-line-no">3642</span><span id="line-3642">    return table;</span>
-<span class="source-line-no">3643</span><span id="line-3643">  }</span>
-<span class="source-line-no">3644</span><span id="line-3644"></span>
-<span class="source-line-no">3645</span><span id="line-3645">  public static int randomFreePort() {</span>
-<span class="source-line-no">3646</span><span id="line-3646">    return HBaseCommonTestingUtility.randomFreePort();</span>
-<span class="source-line-no">3647</span><span id="line-3647">  }</span>
-<span class="source-line-no">3648</span><span id="line-3648"></span>
-<span class="source-line-no">3649</span><span id="line-3649">  public static String randomMultiCastAddress() {</span>
-<span class="source-line-no">3650</span><span id="line-3650">    return "226.1.1." + ThreadLocalRandom.current().nextInt(254);</span>
-<span class="source-line-no">3651</span><span id="line-3651">  }</span>
-<span class="source-line-no">3652</span><span id="line-3652"></span>
-<span class="source-line-no">3653</span><span id="line-3653">  public static void waitForHostPort(String host, int port) throws IOException {</span>
-<span class="source-line-no">3654</span><span id="line-3654">    final int maxTimeMs = 10000;</span>
-<span class="source-line-no">3655</span><span id="line-3655">    final int maxNumAttempts = maxTimeMs / HConstants.SOCKET_RETRY_WAIT_MS;</span>
-<span class="source-line-no">3656</span><span id="line-3656">    IOException savedException = null;</span>
-<span class="source-line-no">3657</span><span id="line-3657">    LOG.info("Waiting for server at " + host + ":" + port);</span>
-<span class="source-line-no">3658</span><span id="line-3658">    for (int attempt = 0; attempt &lt; maxNumAttempts; ++attempt) {</span>
-<span class="source-line-no">3659</span><span id="line-3659">      try {</span>
-<span class="source-line-no">3660</span><span id="line-3660">        Socket sock = new Socket(InetAddress.getByName(host), port);</span>
-<span class="source-line-no">3661</span><span id="line-3661">        sock.close();</span>
-<span class="source-line-no">3662</span><span id="line-3662">        savedException = null;</span>
-<span class="source-line-no">3663</span><span id="line-3663">        LOG.info("Server at " + host + ":" + port + " is available");</span>
-<span class="source-line-no">3664</span><span id="line-3664">        break;</span>
-<span class="source-line-no">3665</span><span id="line-3665">      } catch (UnknownHostException e) {</span>
-<span class="source-line-no">3666</span><span id="line-3666">        throw new IOException("Failed to look up " + host, e);</span>
-<span class="source-line-no">3667</span><span id="line-3667">      } catch (IOException e) {</span>
-<span class="source-line-no">3668</span><span id="line-3668">        savedException = e;</span>
-<span class="source-line-no">3669</span><span id="line-3669">      }</span>
-<span class="source-line-no">3670</span><span id="line-3670">      Threads.sleepWithoutInterrupt(HConstants.SOCKET_RETRY_WAIT_MS);</span>
-<span class="source-line-no">3671</span><span id="line-3671">    }</span>
-<span class="source-line-no">3672</span><span id="line-3672"></span>
-<span class="source-line-no">3673</span><span id="line-3673">    if (savedException != null) {</span>
-<span class="source-line-no">3674</span><span id="line-3674">      throw savedException;</span>
-<span class="source-line-no">3675</span><span id="line-3675">    }</span>
-<span class="source-line-no">3676</span><span id="line-3676">  }</span>
-<span class="source-line-no">3677</span><span id="line-3677"></span>
-<span class="source-line-no">3678</span><span id="line-3678">  /**</span>
-<span class="source-line-no">3679</span><span id="line-3679">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3680</span><span id="line-3680">   * continues.</span>
-<span class="source-line-no">3681</span><span id="line-3681">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3682</span><span id="line-3682">   */</span>
-<span class="source-line-no">3683</span><span id="line-3683">  public static int createPreSplitLoadTestTable(Configuration conf, TableName tableName,</span>
-<span class="source-line-no">3684</span><span id="line-3684">    byte[] columnFamily, Algorithm compression, DataBlockEncoding dataBlockEncoding)</span>
-<span class="source-line-no">3685</span><span id="line-3685">    throws IOException {</span>
-<span class="source-line-no">3686</span><span id="line-3686">    return createPreSplitLoadTestTable(conf, tableName, columnFamily, compression,</span>
-<span class="source-line-no">3687</span><span id="line-3687">      dataBlockEncoding, DEFAULT_REGIONS_PER_SERVER, 1, Durability.USE_DEFAULT);</span>
-<span class="source-line-no">3688</span><span id="line-3688">  }</span>
-<span class="source-line-no">3689</span><span id="line-3689"></span>
-<span class="source-line-no">3690</span><span id="line-3690">  /**</span>
-<span class="source-line-no">3691</span><span id="line-3691">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3692</span><span id="line-3692">   * continues.</span>
-<span class="source-line-no">3693</span><span id="line-3693">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3694</span><span id="line-3694">   */</span>
-<span class="source-line-no">3695</span><span id="line-3695">  public static int createPreSplitLoadTestTable(Configuration conf, TableName tableName,</span>
-<span class="source-line-no">3696</span><span id="line-3696">    byte[] columnFamily, Algorithm compression, DataBlockEncoding dataBlockEncoding,</span>
-<span class="source-line-no">3697</span><span id="line-3697">    int numRegionsPerServer, int regionReplication, Durability durability) throws IOException {</span>
-<span class="source-line-no">3698</span><span id="line-3698">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">3699</span><span id="line-3699">    builder.setDurability(durability);</span>
-<span class="source-line-no">3700</span><span id="line-3700">    builder.setRegionReplication(regionReplication);</span>
-<span class="source-line-no">3701</span><span id="line-3701">    ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">3702</span><span id="line-3702">      ColumnFamilyDescriptorBuilder.newBuilder(columnFamily);</span>
-<span class="source-line-no">3703</span><span id="line-3703">    cfBuilder.setDataBlockEncoding(dataBlockEncoding);</span>
-<span class="source-line-no">3704</span><span id="line-3704">    cfBuilder.setCompressionType(compression);</span>
-<span class="source-line-no">3705</span><span id="line-3705">    return createPreSplitLoadTestTable(conf, builder.build(), cfBuilder.build(),</span>
-<span class="source-line-no">3706</span><span id="line-3706">      numRegionsPerServer);</span>
-<span class="source-line-no">3707</span><span id="line-3707">  }</span>
-<span class="source-line-no">3708</span><span id="line-3708"></span>
-<span class="source-line-no">3709</span><span id="line-3709">  /**</span>
-<span class="source-line-no">3710</span><span id="line-3710">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3711</span><span id="line-3711">   * continues.</span>
-<span class="source-line-no">3712</span><span id="line-3712">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3713</span><span id="line-3713">   */</span>
-<span class="source-line-no">3714</span><span id="line-3714">  public static int createPreSplitLoadTestTable(Configuration conf, TableName tableName,</span>
-<span class="source-line-no">3715</span><span id="line-3715">    byte[][] columnFamilies, Algorithm compression, DataBlockEncoding dataBlockEncoding,</span>
-<span class="source-line-no">3716</span><span id="line-3716">    int numRegionsPerServer, int regionReplication, Durability durability) throws IOException {</span>
-<span class="source-line-no">3717</span><span id="line-3717">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
-<span class="source-line-no">3718</span><span id="line-3718">    builder.setDurability(durability);</span>
-<span class="source-line-no">3719</span><span id="line-3719">    builder.setRegionReplication(regionReplication);</span>
-<span class="source-line-no">3720</span><span id="line-3720">    ColumnFamilyDescriptor[] hcds = new ColumnFamilyDescriptor[columnFamilies.length];</span>
-<span class="source-line-no">3721</span><span id="line-3721">    for (int i = 0; i &lt; columnFamilies.length; i++) {</span>
-<span class="source-line-no">3722</span><span id="line-3722">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">3723</span><span id="line-3723">        ColumnFamilyDescriptorBuilder.newBuilder(columnFamilies[i]);</span>
-<span class="source-line-no">3724</span><span id="line-3724">      cfBuilder.setDataBlockEncoding(dataBlockEncoding);</span>
-<span class="source-line-no">3725</span><span id="line-3725">      cfBuilder.setCompressionType(compression);</span>
-<span class="source-line-no">3726</span><span id="line-3726">      hcds[i] = cfBuilder.build();</span>
-<span class="source-line-no">3727</span><span id="line-3727">    }</span>
-<span class="source-line-no">3728</span><span id="line-3728">    return createPreSplitLoadTestTable(conf, builder.build(), hcds, numRegionsPerServer);</span>
-<span class="source-line-no">3729</span><span id="line-3729">  }</span>
-<span class="source-line-no">3730</span><span id="line-3730"></span>
-<span class="source-line-no">3731</span><span id="line-3731">  /**</span>
-<span class="source-line-no">3732</span><span id="line-3732">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3733</span><span id="line-3733">   * continues.</span>
-<span class="source-line-no">3734</span><span id="line-3734">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3735</span><span id="line-3735">   */</span>
-<span class="source-line-no">3736</span><span id="line-3736">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor desc,</span>
-<span class="source-line-no">3737</span><span id="line-3737">    ColumnFamilyDescriptor hcd) throws IOException {</span>
-<span class="source-line-no">3738</span><span id="line-3738">    return createPreSplitLoadTestTable(conf, desc, hcd, DEFAULT_REGIONS_PER_SERVER);</span>
-<span class="source-line-no">3739</span><span id="line-3739">  }</span>
-<span class="source-line-no">3740</span><span id="line-3740"></span>
-<span class="source-line-no">3741</span><span id="line-3741">  /**</span>
-<span class="source-line-no">3742</span><span id="line-3742">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3743</span><span id="line-3743">   * continues.</span>
-<span class="source-line-no">3744</span><span id="line-3744">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3745</span><span id="line-3745">   */</span>
-<span class="source-line-no">3746</span><span id="line-3746">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor desc,</span>
-<span class="source-line-no">3747</span><span id="line-3747">    ColumnFamilyDescriptor hcd, int numRegionsPerServer) throws IOException {</span>
-<span class="source-line-no">3748</span><span id="line-3748">    return createPreSplitLoadTestTable(conf, desc, new ColumnFamilyDescriptor[] { hcd },</span>
-<span class="source-line-no">3749</span><span id="line-3749">      numRegionsPerServer);</span>
-<span class="source-line-no">3750</span><span id="line-3750">  }</span>
-<span class="source-line-no">3751</span><span id="line-3751"></span>
-<span class="source-line-no">3752</span><span id="line-3752">  /**</span>
-<span class="source-line-no">3753</span><span id="line-3753">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3754</span><span id="line-3754">   * continues.</span>
-<span class="source-line-no">3755</span><span id="line-3755">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3756</span><span id="line-3756">   */</span>
-<span class="source-line-no">3757</span><span id="line-3757">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor desc,</span>
-<span class="source-line-no">3758</span><span id="line-3758">    ColumnFamilyDescriptor[] hcds, int numRegionsPerServer) throws IOException {</span>
-<span class="source-line-no">3759</span><span id="line-3759">    return createPreSplitLoadTestTable(conf, desc, hcds, new RegionSplitter.HexStringSplit(),</span>
-<span class="source-line-no">3760</span><span id="line-3760">      numRegionsPerServer);</span>
-<span class="source-line-no">3761</span><span id="line-3761">  }</span>
-<span class="source-line-no">3762</span><span id="line-3762"></span>
-<span class="source-line-no">3763</span><span id="line-3763">  /**</span>
-<span class="source-line-no">3764</span><span id="line-3764">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
-<span class="source-line-no">3765</span><span id="line-3765">   * continues.</span>
-<span class="source-line-no">3766</span><span id="line-3766">   * @return the number of regions the table was split into</span>
-<span class="source-line-no">3767</span><span id="line-3767">   */</span>
-<span class="source-line-no">3768</span><span id="line-3768">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor td,</span>
-<span class="source-line-no">3769</span><span id="line-3769">    ColumnFamilyDescriptor[] cds, SplitAlgorithm splitter, int numRegionsPerServer)</span>
-<span class="source-line-no">3770</span><span id="line-3770">    throws IOException {</span>
-<span class="source-line-no">3771</span><span id="line-3771">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(td);</span>
-<span class="source-line-no">3772</span><span id="line-3772">    for (ColumnFamilyDescriptor cd : cds) {</span>
-<span class="source-line-no">3773</span><span id="line-3773">      if (!td.hasColumnFamily(cd.getName())) {</span>
-<span class="source-line-no">3774</span><span id="line-3774">        builder.setColumnFamily(cd);</span>
-<span class="source-line-no">3775</span><span id="line-3775">      }</span>
-<span class="source-line-no">3776</span><span id="line-3776">    }</span>
-<span class="source-line-no">3777</span><span id="line-3777">    td = builder.build();</span>
-<span class="source-line-no">3778</span><span id="line-3778">    int totalNumberOfRegions = 0;</span>
-<span class="source-line-no">3779</span><span id="line-3779">    Connection unmanagedConnection = ConnectionFactory.createConnection(conf);</span>
-<span class="source-line-no">3780</span><span id="line-3780">    Admin admin = unmanagedConnection.getAdmin();</span>
-<span class="source-line-no">3781</span><span id="line-3781"></span>
-<span class="source-line-no">3782</span><span id="line-3782">    try {</span>
-<span class="source-line-no">3783</span><span id="line-3783">      // create a table a pre-splits regions.</span>
-<span class="source-line-no">3784</span><span id="line-3784">      // The number of splits is set as:</span>
-<span class="source-line-no">3785</span><span id="line-3785">      // region servers * regions per region server).</span>
-<span class="source-line-no">3786</span><span id="line-3786">      int numberOfServers = admin.getRegionServers().size();</span>
-<span class="source-line-no">3787</span><span id="line-3787">      if (numberOfServers == 0) {</span>
-<span class="source-line-no">3788</span><span id="line-3788">        throw new IllegalStateException("No live regionservers");</span>
-<span class="source-line-no">3789</span><span id="line-3789">      }</span>
-<span class="source-line-no">3790</span><span id="line-3790"></span>
-<span class="source-line-no">3791</span><span id="line-3791">      totalNumberOfRegions = numberOfServers * numRegionsPerServer;</span>
-<span class="source-line-no">3792</span><span id="line-3792">      LOG.info("Number of live regionservers: " + numberOfServers + ", "</span>
-<span class="source-line-no">3793</span><span id="line-3793">        + "pre-splitting table into " + totalNumberOfRegions + " regions " + "(regions per server: "</span>
-<span class="source-line-no">3794</span><span id="line-3794">        + numRegionsPerServer + ")");</span>
-<span class="source-line-no">3795</span><span id="line-3795"></span>
-<span class="source-line-no">3796</span><span id="line-3796">      byte[][] splits = splitter.split(totalNumberOfRegions);</span>
-<span class="source-line-no">3797</span><span id="line-3797"></span>
-<span class="source-line-no">3798</span><span id="line-3798">      admin.createTable(td, splits);</span>
-<span class="source-line-no">3799</span><span id="line-3799">    } catch (MasterNotRunningException e) {</span>
-<span class="source-line-no">3800</span><span id="line-3800">      LOG.error("Master not running", e);</span>
-<span class="source-line-no">3801</span><span id="line-3801">      throw new IOException(e);</span>
-<span class="source-line-no">3802</span><span id="line-3802">    } catch (TableExistsException e) {</span>
-<span class="source-line-no">3803</span><span id="line-3803">      LOG.warn("Table " + td.getTableName() + " already exists, continuing");</span>
-<span class="source-line-no">3804</span><span id="line-3804">    } finally {</span>
-<span class="source-line-no">3805</span><span id="line-3805">      admin.close();</span>
-<span class="source-line-no">3806</span><span id="line-3806">      unmanagedConnection.close();</span>
-<span class="source-line-no">3807</span><span id="line-3807">    }</span>
-<span class="source-line-no">3808</span><span id="line-3808">    return totalNumberOfRegions;</span>
-<span class="source-line-no">3809</span><span id="line-3809">  }</span>
+<span class="source-line-no">3586</span><span id="line-3586">    LOG.info("\n\nCreating random table " + tableName + " with " + numRegions + " regions, "</span>
+<span class="source-line-no">3587</span><span id="line-3587">      + numFlushes + " storefiles per region, " + numRowsPerFlush + " rows per flush, maxVersions="</span>
+<span class="source-line-no">3588</span><span id="line-3588">      + maxVersions + "\n");</span>
+<span class="source-line-no">3589</span><span id="line-3589"></span>
+<span class="source-line-no">3590</span><span id="line-3590">    final int numCF = families.size();</span>
+<span class="source-line-no">3591</span><span id="line-3591">    final byte[][] cfBytes = new byte[numCF][];</span>
+<span class="source-line-no">3592</span><span id="line-3592">    {</span>
+<span class="source-line-no">3593</span><span id="line-3593">      int cfIndex = 0;</span>
+<span class="source-line-no">3594</span><span id="line-3594">      for (String cf : families) {</span>
+<span class="source-line-no">3595</span><span id="line-3595">        cfBytes[cfIndex++] = Bytes.toBytes(cf);</span>
+<span class="source-line-no">3596</span><span id="line-3596">      }</span>
+<span class="source-line-no">3597</span><span id="line-3597">    }</span>
+<span class="source-line-no">3598</span><span id="line-3598"></span>
+<span class="source-line-no">3599</span><span id="line-3599">    final int actualStartKey = 0;</span>
+<span class="source-line-no">3600</span><span id="line-3600">    final int actualEndKey = Integer.MAX_VALUE;</span>
+<span class="source-line-no">3601</span><span id="line-3601">    final int keysPerRegion = (actualEndKey - actualStartKey) / numRegions;</span>
+<span class="source-line-no">3602</span><span id="line-3602">    final int splitStartKey = actualStartKey + keysPerRegion;</span>
+<span class="source-line-no">3603</span><span id="line-3603">    final int splitEndKey = actualEndKey - keysPerRegion;</span>
+<span class="source-line-no">3604</span><span id="line-3604">    final String keyFormat = "%08x";</span>
+<span class="source-line-no">3605</span><span id="line-3605">    final Table table = createTable(tableName, cfBytes, maxVersions,</span>
+<span class="source-line-no">3606</span><span id="line-3606">      Bytes.toBytes(String.format(keyFormat, splitStartKey)),</span>
+<span class="source-line-no">3607</span><span id="line-3607">      Bytes.toBytes(String.format(keyFormat, splitEndKey)), numRegions);</span>
+<span class="source-line-no">3608</span><span id="line-3608"></span>
+<span class="source-line-no">3609</span><span id="line-3609">    if (hbaseCluster != null) {</span>
+<span class="source-line-no">3610</span><span id="line-3610">      getMiniHBaseCluster().flushcache(TableName.META_TABLE_NAME);</span>
+<span class="source-line-no">3611</span><span id="line-3611">    }</span>
+<span class="source-line-no">3612</span><span id="line-3612"></span>
+<span class="source-line-no">3613</span><span id="line-3613">    BufferedMutator mutator = getConnection().getBufferedMutator(tableName);</span>
+<span class="source-line-no">3614</span><span id="line-3614"></span>
+<span class="source-line-no">3615</span><span id="line-3615">    final Random rand = ThreadLocalRandom.current();</span>
+<span class="source-line-no">3616</span><span id="line-3616">    for (int iFlush = 0; iFlush &lt; numFlushes; ++iFlush) {</span>
+<span class="source-line-no">3617</span><span id="line-3617">      for (int iRow = 0; iRow &lt; numRowsPerFlush; ++iRow) {</span>
+<span class="source-line-no">3618</span><span id="line-3618">        final byte[] row = Bytes.toBytes(</span>
+<span class="source-line-no">3619</span><span id="line-3619">          String.format(keyFormat, actualStartKey + rand.nextInt(actualEndKey - actualStartKey)));</span>
+<span class="source-line-no">3620</span><span id="line-3620"></span>
+<span class="source-line-no">3621</span><span id="line-3621">        Put put = new Put(row);</span>
+<span class="source-line-no">3622</span><span id="line-3622">        Delete del = new Delete(row);</span>
+<span class="source-line-no">3623</span><span id="line-3623">        for (int iCol = 0; iCol &lt; numColsPerRow; ++iCol) {</span>
+<span class="source-line-no">3624</span><span id="line-3624">          final byte[] cf = cfBytes[rand.nextInt(numCF)];</span>
+<span class="source-line-no">3625</span><span id="line-3625">          final long ts = rand.nextInt();</span>
+<span class="source-line-no">3626</span><span id="line-3626">          final byte[] qual = Bytes.toBytes("col" + iCol);</span>
+<span class="source-line-no">3627</span><span id="line-3627">          if (rand.nextBoolean()) {</span>
+<span class="source-line-no">3628</span><span id="line-3628">            final byte[] value =</span>
+<span class="source-line-no">3629</span><span id="line-3629">              Bytes.toBytes("value_for_row_" + iRow + "_cf_" + Bytes.toStringBinary(cf) + "_col_"</span>
+<span class="source-line-no">3630</span><span id="line-3630">                + iCol + "_ts_" + ts + "_random_" + rand.nextLong());</span>
+<span class="source-line-no">3631</span><span id="line-3631">            put.addColumn(cf, qual, ts, value);</span>
+<span class="source-line-no">3632</span><span id="line-3632">          } else if (rand.nextDouble() &lt; 0.8) {</span>
+<span class="source-line-no">3633</span><span id="line-3633">            del.addColumn(cf, qual, ts);</span>
+<span class="source-line-no">3634</span><span id="line-3634">          } else {</span>
+<span class="source-line-no">3635</span><span id="line-3635">            del.addColumns(cf, qual, ts);</span>
+<span class="source-line-no">3636</span><span id="line-3636">          }</span>
+<span class="source-line-no">3637</span><span id="line-3637">        }</span>
+<span class="source-line-no">3638</span><span id="line-3638"></span>
+<span class="source-line-no">3639</span><span id="line-3639">        if (!put.isEmpty()) {</span>
+<span class="source-line-no">3640</span><span id="line-3640">          mutator.mutate(put);</span>
+<span class="source-line-no">3641</span><span id="line-3641">        }</span>
+<span class="source-line-no">3642</span><span id="line-3642"></span>
+<span class="source-line-no">3643</span><span id="line-3643">        if (!del.isEmpty()) {</span>
+<span class="source-line-no">3644</span><span id="line-3644">          mutator.mutate(del);</span>
+<span class="source-line-no">3645</span><span id="line-3645">        }</span>
+<span class="source-line-no">3646</span><span id="line-3646">      }</span>
+<span class="source-line-no">3647</span><span id="line-3647">      LOG.info("Initiating flush #" + iFlush + " for table " + tableName);</span>
+<span class="source-line-no">3648</span><span id="line-3648">      mutator.flush();</span>
+<span class="source-line-no">3649</span><span id="line-3649">      if (hbaseCluster != null) {</span>
+<span class="source-line-no">3650</span><span id="line-3650">        getMiniHBaseCluster().flushcache(table.getName());</span>
+<span class="source-line-no">3651</span><span id="line-3651">      }</span>
+<span class="source-line-no">3652</span><span id="line-3652">    }</span>
+<span class="source-line-no">3653</span><span id="line-3653">    mutator.close();</span>
+<span class="source-line-no">3654</span><span id="line-3654"></span>
+<span class="source-line-no">3655</span><span id="line-3655">    return table;</span>
+<span class="source-line-no">3656</span><span id="line-3656">  }</span>
+<span class="source-line-no">3657</span><span id="line-3657"></span>
+<span class="source-line-no">3658</span><span id="line-3658">  public static int randomFreePort() {</span>
+<span class="source-line-no">3659</span><span id="line-3659">    return HBaseCommonTestingUtility.randomFreePort();</span>
+<span class="source-line-no">3660</span><span id="line-3660">  }</span>
+<span class="source-line-no">3661</span><span id="line-3661"></span>
+<span class="source-line-no">3662</span><span id="line-3662">  public static String randomMultiCastAddress() {</span>
+<span class="source-line-no">3663</span><span id="line-3663">    return "226.1.1." + ThreadLocalRandom.current().nextInt(254);</span>
+<span class="source-line-no">3664</span><span id="line-3664">  }</span>
+<span class="source-line-no">3665</span><span id="line-3665"></span>
+<span class="source-line-no">3666</span><span id="line-3666">  public static void waitForHostPort(String host, int port) throws IOException {</span>
+<span class="source-line-no">3667</span><span id="line-3667">    final int maxTimeMs = 10000;</span>
+<span class="source-line-no">3668</span><span id="line-3668">    final int maxNumAttempts = maxTimeMs / HConstants.SOCKET_RETRY_WAIT_MS;</span>
+<span class="source-line-no">3669</span><span id="line-3669">    IOException savedException = null;</span>
+<span class="source-line-no">3670</span><span id="line-3670">    LOG.info("Waiting for server at " + host + ":" + port);</span>
+<span class="source-line-no">3671</span><span id="line-3671">    for (int attempt = 0; attempt &lt; maxNumAttempts; ++attempt) {</span>
+<span class="source-line-no">3672</span><span id="line-3672">      try {</span>
+<span class="source-line-no">3673</span><span id="line-3673">        Socket sock = new Socket(InetAddress.getByName(host), port);</span>
+<span class="source-line-no">3674</span><span id="line-3674">        sock.close();</span>
+<span class="source-line-no">3675</span><span id="line-3675">        savedException = null;</span>
+<span class="source-line-no">3676</span><span id="line-3676">        LOG.info("Server at " + host + ":" + port + " is available");</span>
+<span class="source-line-no">3677</span><span id="line-3677">        break;</span>
+<span class="source-line-no">3678</span><span id="line-3678">      } catch (UnknownHostException e) {</span>
+<span class="source-line-no">3679</span><span id="line-3679">        throw new IOException("Failed to look up " + host, e);</span>
+<span class="source-line-no">3680</span><span id="line-3680">      } catch (IOException e) {</span>
+<span class="source-line-no">3681</span><span id="line-3681">        savedException = e;</span>
+<span class="source-line-no">3682</span><span id="line-3682">      }</span>
+<span class="source-line-no">3683</span><span id="line-3683">      Threads.sleepWithoutInterrupt(HConstants.SOCKET_RETRY_WAIT_MS);</span>
+<span class="source-line-no">3684</span><span id="line-3684">    }</span>
+<span class="source-line-no">3685</span><span id="line-3685"></span>
+<span class="source-line-no">3686</span><span id="line-3686">    if (savedException != null) {</span>
+<span class="source-line-no">3687</span><span id="line-3687">      throw savedException;</span>
+<span class="source-line-no">3688</span><span id="line-3688">    }</span>
+<span class="source-line-no">3689</span><span id="line-3689">  }</span>
+<span class="source-line-no">3690</span><span id="line-3690"></span>
+<span class="source-line-no">3691</span><span id="line-3691">  /**</span>
+<span class="source-line-no">3692</span><span id="line-3692">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3693</span><span id="line-3693">   * continues.</span>
+<span class="source-line-no">3694</span><span id="line-3694">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3695</span><span id="line-3695">   */</span>
+<span class="source-line-no">3696</span><span id="line-3696">  public static int createPreSplitLoadTestTable(Configuration conf, TableName tableName,</span>
+<span class="source-line-no">3697</span><span id="line-3697">    byte[] columnFamily, Algorithm compression, DataBlockEncoding dataBlockEncoding)</span>
+<span class="source-line-no">3698</span><span id="line-3698">    throws IOException {</span>
+<span class="source-line-no">3699</span><span id="line-3699">    return createPreSplitLoadTestTable(conf, tableName, columnFamily, compression,</span>
+<span class="source-line-no">3700</span><span id="line-3700">      dataBlockEncoding, DEFAULT_REGIONS_PER_SERVER, 1, Durability.USE_DEFAULT);</span>
+<span class="source-line-no">3701</span><span id="line-3701">  }</span>
+<span class="source-line-no">3702</span><span id="line-3702"></span>
+<span class="source-line-no">3703</span><span id="line-3703">  /**</span>
+<span class="source-line-no">3704</span><span id="line-3704">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3705</span><span id="line-3705">   * continues.</span>
+<span class="source-line-no">3706</span><span id="line-3706">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3707</span><span id="line-3707">   */</span>
+<span class="source-line-no">3708</span><span id="line-3708">  public static int createPreSplitLoadTestTable(Configuration conf, TableName tableName,</span>
+<span class="source-line-no">3709</span><span id="line-3709">    byte[] columnFamily, Algorithm compression, DataBlockEncoding dataBlockEncoding,</span>
+<span class="source-line-no">3710</span><span id="line-3710">    int numRegionsPerServer, int regionReplication, Durability durability) throws IOException {</span>
+<span class="source-line-no">3711</span><span id="line-3711">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">3712</span><span id="line-3712">    builder.setDurability(durability);</span>
+<span class="source-line-no">3713</span><span id="line-3713">    builder.setRegionReplication(regionReplication);</span>
+<span class="source-line-no">3714</span><span id="line-3714">    ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">3715</span><span id="line-3715">      ColumnFamilyDescriptorBuilder.newBuilder(columnFamily);</span>
+<span class="source-line-no">3716</span><span id="line-3716">    cfBuilder.setDataBlockEncoding(dataBlockEncoding);</span>
+<span class="source-line-no">3717</span><span id="line-3717">    cfBuilder.setCompressionType(compression);</span>
+<span class="source-line-no">3718</span><span id="line-3718">    return createPreSplitLoadTestTable(conf, builder.build(), cfBuilder.build(),</span>
+<span class="source-line-no">3719</span><span id="line-3719">      numRegionsPerServer);</span>
+<span class="source-line-no">3720</span><span id="line-3720">  }</span>
+<span class="source-line-no">3721</span><span id="line-3721"></span>
+<span class="source-line-no">3722</span><span id="line-3722">  /**</span>
+<span class="source-line-no">3723</span><span id="line-3723">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3724</span><span id="line-3724">   * continues.</span>
+<span class="source-line-no">3725</span><span id="line-3725">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3726</span><span id="line-3726">   */</span>
+<span class="source-line-no">3727</span><span id="line-3727">  public static int createPreSplitLoadTestTable(Configuration conf, TableName tableName,</span>
+<span class="source-line-no">3728</span><span id="line-3728">    byte[][] columnFamilies, Algorithm compression, DataBlockEncoding dataBlockEncoding,</span>
+<span class="source-line-no">3729</span><span id="line-3729">    int numRegionsPerServer, int regionReplication, Durability durability) throws IOException {</span>
+<span class="source-line-no">3730</span><span id="line-3730">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);</span>
+<span class="source-line-no">3731</span><span id="line-3731">    builder.setDurability(durability);</span>
+<span class="source-line-no">3732</span><span id="line-3732">    builder.setRegionReplication(regionReplication);</span>
+<span class="source-line-no">3733</span><span id="line-3733">    ColumnFamilyDescriptor[] hcds = new ColumnFamilyDescriptor[columnFamilies.length];</span>
+<span class="source-line-no">3734</span><span id="line-3734">    for (int i = 0; i &lt; columnFamilies.length; i++) {</span>
+<span class="source-line-no">3735</span><span id="line-3735">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">3736</span><span id="line-3736">        ColumnFamilyDescriptorBuilder.newBuilder(columnFamilies[i]);</span>
+<span class="source-line-no">3737</span><span id="line-3737">      cfBuilder.setDataBlockEncoding(dataBlockEncoding);</span>
+<span class="source-line-no">3738</span><span id="line-3738">      cfBuilder.setCompressionType(compression);</span>
+<span class="source-line-no">3739</span><span id="line-3739">      hcds[i] = cfBuilder.build();</span>
+<span class="source-line-no">3740</span><span id="line-3740">    }</span>
+<span class="source-line-no">3741</span><span id="line-3741">    return createPreSplitLoadTestTable(conf, builder.build(), hcds, numRegionsPerServer);</span>
+<span class="source-line-no">3742</span><span id="line-3742">  }</span>
+<span class="source-line-no">3743</span><span id="line-3743"></span>
+<span class="source-line-no">3744</span><span id="line-3744">  /**</span>
+<span class="source-line-no">3745</span><span id="line-3745">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3746</span><span id="line-3746">   * continues.</span>
+<span class="source-line-no">3747</span><span id="line-3747">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3748</span><span id="line-3748">   */</span>
+<span class="source-line-no">3749</span><span id="line-3749">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor desc,</span>
+<span class="source-line-no">3750</span><span id="line-3750">    ColumnFamilyDescriptor hcd) throws IOException {</span>
+<span class="source-line-no">3751</span><span id="line-3751">    return createPreSplitLoadTestTable(conf, desc, hcd, DEFAULT_REGIONS_PER_SERVER);</span>
+<span class="source-line-no">3752</span><span id="line-3752">  }</span>
+<span class="source-line-no">3753</span><span id="line-3753"></span>
+<span class="source-line-no">3754</span><span id="line-3754">  /**</span>
+<span class="source-line-no">3755</span><span id="line-3755">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3756</span><span id="line-3756">   * continues.</span>
+<span class="source-line-no">3757</span><span id="line-3757">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3758</span><span id="line-3758">   */</span>
+<span class="source-line-no">3759</span><span id="line-3759">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor desc,</span>
+<span class="source-line-no">3760</span><span id="line-3760">    ColumnFamilyDescriptor hcd, int numRegionsPerServer) throws IOException {</span>
+<span class="source-line-no">3761</span><span id="line-3761">    return createPreSplitLoadTestTable(conf, desc, new ColumnFamilyDescriptor[] { hcd },</span>
+<span class="source-line-no">3762</span><span id="line-3762">      numRegionsPerServer);</span>
+<span class="source-line-no">3763</span><span id="line-3763">  }</span>
+<span class="source-line-no">3764</span><span id="line-3764"></span>
+<span class="source-line-no">3765</span><span id="line-3765">  /**</span>
+<span class="source-line-no">3766</span><span id="line-3766">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3767</span><span id="line-3767">   * continues.</span>
+<span class="source-line-no">3768</span><span id="line-3768">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3769</span><span id="line-3769">   */</span>
+<span class="source-line-no">3770</span><span id="line-3770">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor desc,</span>
+<span class="source-line-no">3771</span><span id="line-3771">    ColumnFamilyDescriptor[] hcds, int numRegionsPerServer) throws IOException {</span>
+<span class="source-line-no">3772</span><span id="line-3772">    return createPreSplitLoadTestTable(conf, desc, hcds, new RegionSplitter.HexStringSplit(),</span>
+<span class="source-line-no">3773</span><span id="line-3773">      numRegionsPerServer);</span>
+<span class="source-line-no">3774</span><span id="line-3774">  }</span>
+<span class="source-line-no">3775</span><span id="line-3775"></span>
+<span class="source-line-no">3776</span><span id="line-3776">  /**</span>
+<span class="source-line-no">3777</span><span id="line-3777">   * Creates a pre-split table for load testing. If the table already exists, logs a warning and</span>
+<span class="source-line-no">3778</span><span id="line-3778">   * continues.</span>
+<span class="source-line-no">3779</span><span id="line-3779">   * @return the number of regions the table was split into</span>
+<span class="source-line-no">3780</span><span id="line-3780">   */</span>
+<span class="source-line-no">3781</span><span id="line-3781">  public static int createPreSplitLoadTestTable(Configuration conf, TableDescriptor td,</span>
+<span class="source-line-no">3782</span><span id="line-3782">    ColumnFamilyDescriptor[] cds, SplitAlgorithm splitter, int numRegionsPerServer)</span>
+<span class="source-line-no">3783</span><span id="line-3783">    throws IOException {</span>
+<span class="source-line-no">3784</span><span id="line-3784">    TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(td);</span>
+<span class="source-line-no">3785</span><span id="line-3785">    for (ColumnFamilyDescriptor cd : cds) {</span>
+<span class="source-line-no">3786</span><span id="line-3786">      if (!td.hasColumnFamily(cd.getName())) {</span>
+<span class="source-line-no">3787</span><span id="line-3787">        builder.setColumnFamily(cd);</span>
+<span class="source-line-no">3788</span><span id="line-3788">      }</span>
+<span class="source-line-no">3789</span><span id="line-3789">    }</span>
+<span class="source-line-no">3790</span><span id="line-3790">    td = builder.build();</span>
+<span class="source-line-no">3791</span><span id="line-3791">    int totalNumberOfRegions = 0;</span>
+<span class="source-line-no">3792</span><span id="line-3792">    Connection unmanagedConnection = ConnectionFactory.createConnection(conf);</span>
+<span class="source-line-no">3793</span><span id="line-3793">    Admin admin = unmanagedConnection.getAdmin();</span>
+<span class="source-line-no">3794</span><span id="line-3794"></span>
+<span class="source-line-no">3795</span><span id="line-3795">    try {</span>
+<span class="source-line-no">3796</span><span id="line-3796">      // create a table a pre-splits regions.</span>
+<span class="source-line-no">3797</span><span id="line-3797">      // The number of splits is set as:</span>
+<span class="source-line-no">3798</span><span id="line-3798">      // region servers * regions per region server).</span>
+<span class="source-line-no">3799</span><span id="line-3799">      int numberOfServers = admin.getRegionServers().size();</span>
+<span class="source-line-no">3800</span><span id="line-3800">      if (numberOfServers == 0) {</span>
+<span class="source-line-no">3801</span><span id="line-3801">        throw new IllegalStateException("No live regionservers");</span>
+<span class="source-line-no">3802</span><span id="line-3802">      }</span>
+<span class="source-line-no">3803</span><span id="line-3803"></span>
+<span class="source-line-no">3804</span><span id="line-3804">      totalNumberOfRegions = numberOfServers * numRegionsPerServer;</span>
+<span class="source-line-no">3805</span><span id="line-3805">      LOG.info("Number of live regionservers: " + numberOfServers + ", "</span>
+<span class="source-line-no">3806</span><span id="line-3806">        + "pre-splitting table into " + totalNumberOfRegions + " regions " + "(regions per server: "</span>
+<span class="source-line-no">3807</span><span id="line-3807">        + numRegionsPerServer + ")");</span>
+<span class="source-line-no">3808</span><span id="line-3808"></span>
+<span class="source-line-no">3809</span><span id="line-3809">      byte[][] splits = splitter.split(totalNumberOfRegions);</span>
 <span class="source-line-no">3810</span><span id="line-3810"></span>
-<span class="source-line-no">3811</span><span id="line-3811">  public static int getMetaRSPort(Connection connection) throws IOException {</span>
-<span class="source-line-no">3812</span><span id="line-3812">    try (RegionLocator locator = connection.getRegionLocator(TableName.META_TABLE_NAME)) {</span>
-<span class="source-line-no">3813</span><span id="line-3813">      return locator.getRegionLocation(Bytes.toBytes("")).getPort();</span>
-<span class="source-line-no">3814</span><span id="line-3814">    }</span>
-<span class="source-line-no">3815</span><span id="line-3815">  }</span>
-<span class="source-line-no">3816</span><span id="line-3816"></span>
-<span class="source-line-no">3817</span><span id="line-3817">  /**</span>
-<span class="source-line-no">3818</span><span id="line-3818">   * Due to async racing issue, a region may not be in the online region list of a region server</span>
-<span class="source-line-no">3819</span><span id="line-3819">   * yet, after the assignment znode is deleted and the new assignment is recorded in master.</span>
-<span class="source-line-no">3820</span><span id="line-3820">   */</span>
-<span class="source-line-no">3821</span><span id="line-3821">  public void assertRegionOnServer(final RegionInfo hri, final ServerName server,</span>
-<span class="source-line-no">3822</span><span id="line-3822">    final long timeout) throws IOException, InterruptedException {</span>
-<span class="source-line-no">3823</span><span id="line-3823">    long timeoutTime = EnvironmentEdgeManager.currentTime() + timeout;</span>
-<span class="source-line-no">3824</span><span id="line-3824">    while (true) {</span>
-<span class="source-line-no">3825</span><span id="line-3825">      List&lt;RegionInfo&gt; regions = getAdmin().getRegions(server);</span>
-<span class="source-line-no">3826</span><span id="line-3826">      if (regions.stream().anyMatch(r -&gt; RegionInfo.COMPARATOR.compare(r, hri) == 0)) return;</span>
-<span class="source-line-no">3827</span><span id="line-3827">      long now = EnvironmentEdgeManager.currentTime();</span>
-<span class="source-line-no">3828</span><span id="line-3828">      if (now &gt; timeoutTime) break;</span>
-<span class="source-line-no">3829</span><span id="line-3829">      Thread.sleep(10);</span>
-<span class="source-line-no">3830</span><span id="line-3830">    }</span>
-<span class="source-line-no">3831</span><span id="line-3831">    throw new AssertionError(</span>
-<span class="source-line-no">3832</span><span id="line-3832">      "Could not find region " + hri.getRegionNameAsString() + " on server " + server);</span>
-<span class="source-line-no">3833</span><span id="line-3833">  }</span>
-<span class="source-line-no">3834</span><span id="line-3834"></span>
-<span class="source-line-no">3835</span><span id="line-3835">  /**</span>
-<span class="source-line-no">3836</span><span id="line-3836">   * Check to make sure the region is open on the specified region server, but not on any other one.</span>
-<span class="source-line-no">3837</span><span id="line-3837">   */</span>
-<span class="source-line-no">3838</span><span id="line-3838">  public void assertRegionOnlyOnServer(final RegionInfo hri, final ServerName server,</span>
-<span class="source-line-no">3839</span><span id="line-3839">    final long timeout) throws IOException, InterruptedException {</span>
-<span class="source-line-no">3840</span><span id="line-3840">    long timeoutTime = EnvironmentEdgeManager.currentTime() + timeout;</span>
-<span class="source-line-no">3841</span><span id="line-3841">    while (true) {</span>
-<span class="source-line-no">3842</span><span id="line-3842">      List&lt;RegionInfo&gt; regions = getAdmin().getRegions(server);</span>
-<span class="source-line-no">3843</span><span id="line-3843">      if (regions.stream().anyMatch(r -&gt; RegionInfo.COMPARATOR.compare(r, hri) == 0)) {</span>
-<span class="source-line-no">3844</span><span id="line-3844">        List&lt;JVMClusterUtil.RegionServerThread&gt; rsThreads =</span>
-<span class="source-line-no">3845</span><span id="line-3845">          getHBaseCluster().getLiveRegionServerThreads();</span>
-<span class="source-line-no">3846</span><span id="line-3846">        for (JVMClusterUtil.RegionServerThread rsThread : rsThreads) {</span>
-<span class="source-line-no">3847</span><span id="line-3847">          HRegionServer rs = rsThread.getRegionServer();</span>
-<span class="source-line-no">3848</span><span id="line-3848">          if (server.equals(rs.getServerName())) {</span>
-<span class="source-line-no">3849</span><span id="line-3849">            continue;</span>
-<span class="source-line-no">3850</span><span id="line-3850">          }</span>
-<span class="source-line-no">3851</span><span id="line-3851">          Collection&lt;HRegion&gt; hrs = rs.getOnlineRegionsLocalContext();</span>
-<span class="source-line-no">3852</span><span id="line-3852">          for (HRegion r : hrs) {</span>
-<span class="source-line-no">3853</span><span id="line-3853">            if (r.getRegionInfo().getRegionId() == hri.getRegionId()) {</span>
-<span class="source-line-no">3854</span><span id="line-3854">              throw new AssertionError("Region should not be double assigned");</span>
-<span class="source-line-no">3855</span><span id="line-3855">            }</span>
-<span class="source-line-no">3856</span><span id="line-3856">          }</span>
-<span class="source-line-no">3857</span><span id="line-3857">        }</span>
-<span class="source-line-no">3858</span><span id="line-3858">        return; // good, we are happy</span>
-<span class="source-line-no">3859</span><span id="line-3859">      }</span>
-<span class="source-line-no">3860</span><span id="line-3860">      long now = EnvironmentEdgeManager.currentTime();</span>
-<span class="source-line-no">3861</span><span id="line-3861">      if (now &gt; timeoutTime) break;</span>
-<span class="source-line-no">3862</span><span id="line-3862">      Thread.sleep(10);</span>
-<span class="source-line-no">3863</span><span id="line-3863">    }</span>
-<span class="source-line-no">3864</span><span id="line-3864">    throw new AssertionError(</span>
-<span class="source-line-no">3865</span><span id="line-3865">      "Could not find region " + hri.getRegionNameAsString() + " on server " + server);</span>
-<span class="source-line-no">3866</span><span id="line-3866">  }</span>
-<span class="source-line-no">3867</span><span id="line-3867"></span>
-<span class="source-line-no">3868</span><span id="line-3868">  public HRegion createTestRegion(String tableName, ColumnFamilyDescriptor cd) throws IOException {</span>
-<span class="source-line-no">3869</span><span id="line-3869">    TableDescriptor td =</span>
-<span class="source-line-no">3870</span><span id="line-3870">      TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName)).setColumnFamily(cd).build();</span>
-<span class="source-line-no">3871</span><span id="line-3871">    RegionInfo info = RegionInfoBuilder.newBuilder(TableName.valueOf(tableName)).build();</span>
-<span class="source-line-no">3872</span><span id="line-3872">    return createRegionAndWAL(info, getDataTestDir(), getConfiguration(), td);</span>
-<span class="source-line-no">3873</span><span id="line-3873">  }</span>
-<span class="source-line-no">3874</span><span id="line-3874"></span>
-<span class="source-line-no">3875</span><span id="line-3875">  public HRegion createTestRegion(String tableName, ColumnFamilyDescriptor cd,</span>
-<span class="source-line-no">3876</span><span id="line-3876">    BlockCache blockCache) throws IOException {</span>
-<span class="source-line-no">3877</span><span id="line-3877">    TableDescriptor td =</span>
-<span class="source-line-no">3878</span><span id="line-3878">      TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName)).setColumnFamily(cd).build();</span>
-<span class="source-line-no">3879</span><span id="line-3879">    RegionInfo info = RegionInfoBuilder.newBuilder(TableName.valueOf(tableName)).build();</span>
-<span class="source-line-no">3880</span><span id="line-3880">    return createRegionAndWAL(info, getDataTestDir(), getConfiguration(), td, blockCache);</span>
-<span class="source-line-no">3881</span><span id="line-3881">  }</span>
-<span class="source-line-no">3882</span><span id="line-3882"></span>
-<span class="source-line-no">3883</span><span id="line-3883">  public static void setFileSystemURI(String fsURI) {</span>
-<span class="source-line-no">3884</span><span id="line-3884">    FS_URI = fsURI;</span>
-<span class="source-line-no">3885</span><span id="line-3885">  }</span>
-<span class="source-line-no">3886</span><span id="line-3886"></span>
-<span class="source-line-no">3887</span><span id="line-3887">  /**</span>
-<span class="source-line-no">3888</span><span id="line-3888">   * Returns a {@link Predicate} for checking that there are no regions in transition in master</span>
-<span class="source-line-no">3889</span><span id="line-3889">   */</span>
-<span class="source-line-no">3890</span><span id="line-3890">  public ExplainingPredicate&lt;IOException&gt; predicateNoRegionsInTransition() {</span>
-<span class="source-line-no">3891</span><span id="line-3891">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
-<span class="source-line-no">3892</span><span id="line-3892">      @Override</span>
-<span class="source-line-no">3893</span><span id="line-3893">      public String explainFailure() throws IOException {</span>
-<span class="source-line-no">3894</span><span id="line-3894">        final AssignmentManager am = getMiniHBaseCluster().getMaster().getAssignmentManager();</span>
-<span class="source-line-no">3895</span><span id="line-3895">        return "found in transition: " + am.getRegionsInTransition().toString();</span>
-<span class="source-line-no">3896</span><span id="line-3896">      }</span>
-<span class="source-line-no">3897</span><span id="line-3897"></span>
-<span class="source-line-no">3898</span><span id="line-3898">      @Override</span>
-<span class="source-line-no">3899</span><span id="line-3899">      public boolean evaluate() throws IOException {</span>
-<span class="source-line-no">3900</span><span id="line-3900">        HMaster master = getMiniHBaseCluster().getMaster();</span>
-<span class="source-line-no">3901</span><span id="line-3901">        if (master == null) return false;</span>
-<span class="source-line-no">3902</span><span id="line-3902">        AssignmentManager am = master.getAssignmentManager();</span>
-<span class="source-line-no">3903</span><span id="line-3903">        if (am == null) return false;</span>
-<span class="source-line-no">3904</span><span id="line-3904">        return !am.hasRegionsInTransition();</span>
-<span class="source-line-no">3905</span><span id="line-3905">      }</span>
-<span class="source-line-no">3906</span><span id="line-3906">    };</span>
-<span class="source-line-no">3907</span><span id="line-3907">  }</span>
-<span class="source-line-no">3908</span><span id="line-3908"></span>
-<span class="source-line-no">3909</span><span id="line-3909">  /**</span>
-<span class="source-line-no">3910</span><span id="line-3910">   * Returns a {@link Predicate} for checking that table is enabled</span>
-<span class="source-line-no">3911</span><span id="line-3911">   */</span>
-<span class="source-line-no">3912</span><span id="line-3912">  public Waiter.Predicate&lt;IOException&gt; predicateTableEnabled(final TableName tableName) {</span>
-<span class="source-line-no">3913</span><span id="line-3913">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
-<span class="source-line-no">3914</span><span id="line-3914">      @Override</span>
-<span class="source-line-no">3915</span><span id="line-3915">      public String explainFailure() throws IOException {</span>
-<span class="source-line-no">3916</span><span id="line-3916">        return explainTableState(tableName, TableState.State.ENABLED);</span>
-<span class="source-line-no">3917</span><span id="line-3917">      }</span>
-<span class="source-line-no">3918</span><span id="line-3918"></span>
-<span class="source-line-no">3919</span><span id="line-3919">      @Override</span>
-<span class="source-line-no">3920</span><span id="line-3920">      public boolean evaluate() throws IOException {</span>
-<span class="source-line-no">3921</span><span id="line-3921">        return getAdmin().tableExists(tableName) &amp;&amp; getAdmin().isTableEnabled(tableName);</span>
-<span class="source-line-no">3922</span><span id="line-3922">      }</span>
-<span class="source-line-no">3923</span><span id="line-3923">    };</span>
-<span class="source-line-no">3924</span><span id="line-3924">  }</span>
-<span class="source-line-no">3925</span><span id="line-3925"></span>
-<span class="source-line-no">3926</span><span id="line-3926">  /**</span>
-<span class="source-line-no">3927</span><span id="line-3927">   * Returns a {@link Predicate} for checking that table is enabled</span>
-<span class="source-line-no">3928</span><span id="line-3928">   */</span>
-<span class="source-line-no">3929</span><span id="line-3929">  public Waiter.Predicate&lt;IOException&gt; predicateTableDisabled(final TableName tableName) {</span>
-<span class="source-line-no">3930</span><span id="line-3930">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
-<span class="source-line-no">3931</span><span id="line-3931">      @Override</span>
-<span class="source-line-no">3932</span><span id="line-3932">      public String explainFailure() throws IOException {</span>
-<span class="source-line-no">3933</span><span id="line-3933">        return explainTableState(tableName, TableState.State.DISABLED);</span>
-<span class="source-line-no">3934</span><span id="line-3934">      }</span>
-<span class="source-line-no">3935</span><span id="line-3935"></span>
-<span class="source-line-no">3936</span><span id="line-3936">      @Override</span>
-<span class="source-line-no">3937</span><span id="line-3937">      public boolean evaluate() throws IOException {</span>
-<span class="source-line-no">3938</span><span id="line-3938">        return getAdmin().isTableDisabled(tableName);</span>
-<span class="source-line-no">3939</span><span id="line-3939">      }</span>
-<span class="source-line-no">3940</span><span id="line-3940">    };</span>
-<span class="source-line-no">3941</span><span id="line-3941">  }</span>
-<span class="source-line-no">3942</span><span id="line-3942"></span>
-<span class="source-line-no">3943</span><span id="line-3943">  /**</span>
-<span class="source-line-no">3944</span><span id="line-3944">   * Returns a {@link Predicate} for checking that table is enabled</span>
-<span class="source-line-no">3945</span><span id="line-3945">   */</span>
-<span class="source-line-no">3946</span><span id="line-3946">  public Waiter.Predicate&lt;IOException&gt; predicateTableAvailable(final TableName tableName) {</span>
-<span class="source-line-no">3947</span><span id="line-3947">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
-<span class="source-line-no">3948</span><span id="line-3948">      @Override</span>
-<span class="source-line-no">3949</span><span id="line-3949">      public String explainFailure() throws IOException {</span>
-<span class="source-line-no">3950</span><span id="line-3950">        return explainTableAvailability(tableName);</span>
-<span class="source-line-no">3951</span><span id="line-3951">      }</span>
-<span class="source-line-no">3952</span><span id="line-3952"></span>
-<span class="source-line-no">3953</span><span id="line-3953">      @Override</span>
-<span class="source-line-no">3954</span><span id="line-3954">      public boolean evaluate() throws IOException {</span>
-<span class="source-line-no">3955</span><span id="line-3955">        boolean tableAvailable = getAdmin().isTableAvailable(tableName);</span>
-<span class="source-line-no">3956</span><span id="line-3956">        if (tableAvailable) {</span>
-<span class="source-line-no">3957</span><span id="line-3957">          try (Table table = getConnection().getTable(tableName)) {</span>
-<span class="source-line-no">3958</span><span id="line-3958">            TableDescriptor htd = table.getDescriptor();</span>
-<span class="source-line-no">3959</span><span id="line-3959">            for (HRegionLocation loc : getConnection().getRegionLocator(tableName)</span>
-<span class="source-line-no">3960</span><span id="line-3960">              .getAllRegionLocations()) {</span>
-<span class="source-line-no">3961</span><span id="line-3961">              Scan scan = new Scan().withStartRow(loc.getRegion().getStartKey())</span>
-<span class="source-line-no">3962</span><span id="line-3962">                .withStopRow(loc.getRegion().getEndKey()).setOneRowLimit()</span>
-<span class="source-line-no">3963</span><span id="line-3963">                .setMaxResultsPerColumnFamily(1).setCacheBlocks(false);</span>
-<span class="source-line-no">3964</span><span id="line-3964">              for (byte[] family : htd.getColumnFamilyNames()) {</span>
-<span class="source-line-no">3965</span><span id="line-3965">                scan.addFamily(family);</span>
-<span class="source-line-no">3966</span><span id="line-3966">              }</span>
-<span class="source-line-no">3967</span><span id="line-3967">              try (ResultScanner scanner = table.getScanner(scan)) {</span>
-<span class="source-line-no">3968</span><span id="line-3968">                scanner.next();</span>
-<span class="source-line-no">3969</span><span id="line-3969">              }</span>
-<span class="source-line-no">3970</span><span id="line-3970">            }</span>
-<span class="source-line-no">3971</span><span id="line-3971">          }</span>
-<span class="source-line-no">3972</span><span id="line-3972">        }</span>
-<span class="source-line-no">3973</span><span id="line-3973">        return tableAvailable;</span>
-<span class="source-line-no">3974</span><span id="line-3974">      }</span>
-<span class="source-line-no">3975</span><span id="line-3975">    };</span>
-<span class="source-line-no">3976</span><span id="line-3976">  }</span>
-<span class="source-line-no">3977</span><span id="line-3977"></span>
-<span class="source-line-no">3978</span><span id="line-3978">  /**</span>
-<span class="source-line-no">3979</span><span id="line-3979">   * Wait until no regions in transition.</span>
-<span class="source-line-no">3980</span><span id="line-3980">   * @param timeout How long to wait.</span>
-<span class="source-line-no">3981</span><span id="line-3981">   */</span>
-<span class="source-line-no">3982</span><span id="line-3982">  public void waitUntilNoRegionsInTransition(final long timeout) throws IOException {</span>
-<span class="source-line-no">3983</span><span id="line-3983">    waitFor(timeout, predicateNoRegionsInTransition());</span>
-<span class="source-line-no">3984</span><span id="line-3984">  }</span>
-<span class="source-line-no">3985</span><span id="line-3985"></span>
-<span class="source-line-no">3986</span><span id="line-3986">  /**</span>
-<span class="source-line-no">3987</span><span id="line-3987">   * Wait until no regions in transition. (time limit 15min)</span>
-<span class="source-line-no">3988</span><span id="line-3988">   */</span>
-<span class="source-line-no">3989</span><span id="line-3989">  public void waitUntilNoRegionsInTransition() throws IOException {</span>
-<span class="source-line-no">3990</span><span id="line-3990">    waitUntilNoRegionsInTransition(15 * 60000);</span>
-<span class="source-line-no">3991</span><span id="line-3991">  }</span>
-<span class="source-line-no">3992</span><span id="line-3992"></span>
-<span class="source-line-no">3993</span><span id="line-3993">  /**</span>
-<span class="source-line-no">3994</span><span id="line-3994">   * Wait until labels is ready in VisibilityLabelsCache.</span>
-<span class="source-line-no">3995</span><span id="line-3995">   */</span>
-<span class="source-line-no">3996</span><span id="line-3996">  public void waitLabelAvailable(long timeoutMillis, final String... labels) {</span>
-<span class="source-line-no">3997</span><span id="line-3997">    final VisibilityLabelsCache labelsCache = VisibilityLabelsCache.get();</span>
-<span class="source-line-no">3998</span><span id="line-3998">    waitFor(timeoutMillis, new Waiter.ExplainingPredicate&lt;RuntimeException&gt;() {</span>
-<span class="source-line-no">3999</span><span id="line-3999"></span>
-<span class="source-line-no">4000</span><span id="line-4000">      @Override</span>
-<span class="source-line-no">4001</span><span id="line-4001">      public boolean evaluate() {</span>
-<span class="source-line-no">4002</span><span id="line-4002">        for (String label : labels) {</span>
-<span class="source-line-no">4003</span><span id="line-4003">          if (labelsCache.getLabelOrdinal(label) == 0) {</span>
-<span class="source-line-no">4004</span><span id="line-4004">            return false;</span>
-<span class="source-line-no">4005</span><span id="line-4005">          }</span>
-<span class="source-line-no">4006</span><span id="line-4006">        }</span>
-<span class="source-line-no">4007</span><span id="line-4007">        return true;</span>
-<span class="source-line-no">4008</span><span id="line-4008">      }</span>
-<span class="source-line-no">4009</span><span id="line-4009"></span>
-<span class="source-line-no">4010</span><span id="line-4010">      @Override</span>
-<span class="source-line-no">4011</span><span id="line-4011">      public String explainFailure() {</span>
-<span class="source-line-no">4012</span><span id="line-4012">        for (String label : labels) {</span>
-<span class="source-line-no">4013</span><span id="line-4013">          if (labelsCache.getLabelOrdinal(label) == 0) {</span>
-<span class="source-line-no">4014</span><span id="line-4014">            return label + " is not available yet";</span>
-<span class="source-line-no">4015</span><span id="line-4015">          }</span>
-<span class="source-line-no">4016</span><span id="line-4016">        }</span>
-<span class="source-line-no">4017</span><span id="line-4017">        return "";</span>
-<span class="source-line-no">4018</span><span id="line-4018">      }</span>
-<span class="source-line-no">4019</span><span id="line-4019">    });</span>
-<span class="source-line-no">4020</span><span id="line-4020">  }</span>
-<span class="source-line-no">4021</span><span id="line-4021"></span>
-<span class="source-line-no">4022</span><span id="line-4022">  /**</span>
-<span class="source-line-no">4023</span><span id="line-4023">   * Create a set of column descriptors with the combination of compression, encoding, bloom codecs</span>
-<span class="source-line-no">4024</span><span id="line-4024">   * available.</span>
-<span class="source-line-no">4025</span><span id="line-4025">   * @return the list of column descriptors</span>
-<span class="source-line-no">4026</span><span id="line-4026">   */</span>
-<span class="source-line-no">4027</span><span id="line-4027">  public static List&lt;ColumnFamilyDescriptor&gt; generateColumnDescriptors() {</span>
-<span class="source-line-no">4028</span><span id="line-4028">    return generateColumnDescriptors("");</span>
-<span class="source-line-no">4029</span><span id="line-4029">  }</span>
-<span class="source-line-no">4030</span><span id="line-4030"></span>
-<span class="source-line-no">4031</span><span id="line-4031">  /**</span>
-<span class="source-line-no">4032</span><span id="line-4032">   * Create a set of column descriptors with the combination of compression, encoding, bloom codecs</span>
-<span class="source-line-no">4033</span><span id="line-4033">   * available.</span>
-<span class="source-line-no">4034</span><span id="line-4034">   * @param prefix family names prefix</span>
-<span class="source-line-no">4035</span><span id="line-4035">   * @return the list of column descriptors</span>
-<span class="source-line-no">4036</span><span id="line-4036">   */</span>
-<span class="source-line-no">4037</span><span id="line-4037">  public static List&lt;ColumnFamilyDescriptor&gt; generateColumnDescriptors(final String prefix) {</span>
-<span class="source-line-no">4038</span><span id="line-4038">    List&lt;ColumnFamilyDescriptor&gt; columnFamilyDescriptors = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">4039</span><span id="line-4039">    long familyId = 0;</span>
-<span class="source-line-no">4040</span><span id="line-4040">    for (Compression.Algorithm compressionType : getSupportedCompressionAlgorithms()) {</span>
-<span class="source-line-no">4041</span><span id="line-4041">      for (DataBlockEncoding encodingType : DataBlockEncoding.values()) {</span>
-<span class="source-line-no">4042</span><span id="line-4042">        for (BloomType bloomType : BloomType.values()) {</span>
-<span class="source-line-no">4043</span><span id="line-4043">          String name = String.format("%s-cf-!@#&amp;-%d!@#", prefix, familyId);</span>
-<span class="source-line-no">4044</span><span id="line-4044">          ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder =</span>
-<span class="source-line-no">4045</span><span id="line-4045">            ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(name));</span>
-<span class="source-line-no">4046</span><span id="line-4046">          columnFamilyDescriptorBuilder.setCompressionType(compressionType);</span>
-<span class="source-line-no">4047</span><span id="line-4047">          columnFamilyDescriptorBuilder.setDataBlockEncoding(encodingType);</span>
-<span class="source-line-no">4048</span><span id="line-4048">          columnFamilyDescriptorBuilder.setBloomFilterType(bloomType);</span>
-<span class="source-line-no">4049</span><span id="line-4049">          columnFamilyDescriptors.add(columnFamilyDescriptorBuilder.build());</span>
-<span class="source-line-no">4050</span><span id="line-4050">          familyId++;</span>
-<span class="source-line-no">4051</span><span id="line-4051">        }</span>
-<span class="source-line-no">4052</span><span id="line-4052">      }</span>
-<span class="source-line-no">4053</span><span id="line-4053">    }</span>
-<span class="source-line-no">4054</span><span id="line-4054">    return columnFamilyDescriptors;</span>
-<span class="source-line-no">4055</span><span id="line-4055">  }</span>
-<span class="source-line-no">4056</span><span id="line-4056"></span>
-<span class="source-line-no">4057</span><span id="line-4057">  /**</span>
-<span class="source-line-no">4058</span><span id="line-4058">   * Get supported compression algorithms.</span>
-<span class="source-line-no">4059</span><span id="line-4059">   * @return supported compression algorithms.</span>
-<span class="source-line-no">4060</span><span id="line-4060">   */</span>
-<span class="source-line-no">4061</span><span id="line-4061">  public static Compression.Algorithm[] getSupportedCompressionAlgorithms() {</span>
-<span class="source-line-no">4062</span><span id="line-4062">    String[] allAlgos = HFile.getSupportedCompressionAlgorithms();</span>
-<span class="source-line-no">4063</span><span id="line-4063">    List&lt;Compression.Algorithm&gt; supportedAlgos = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">4064</span><span id="line-4064">    for (String algoName : allAlgos) {</span>
-<span class="source-line-no">4065</span><span id="line-4065">      try {</span>
-<span class="source-line-no">4066</span><span id="line-4066">        Compression.Algorithm algo = Compression.getCompressionAlgorithmByName(algoName);</span>
-<span class="source-line-no">4067</span><span id="line-4067">        algo.getCompressor();</span>
-<span class="source-line-no">4068</span><span id="line-4068">        supportedAlgos.add(algo);</span>
-<span class="source-line-no">4069</span><span id="line-4069">      } catch (Throwable t) {</span>
-<span class="source-line-no">4070</span><span id="line-4070">        // this algo is not available</span>
-<span class="source-line-no">4071</span><span id="line-4071">      }</span>
-<span class="source-line-no">4072</span><span id="line-4072">    }</span>
-<span class="source-line-no">4073</span><span id="line-4073">    return supportedAlgos.toArray(new Algorithm[supportedAlgos.size()]);</span>
-<span class="source-line-no">4074</span><span id="line-4074">  }</span>
-<span class="source-line-no">4075</span><span id="line-4075"></span>
-<span class="source-line-no">4076</span><span id="line-4076">  public Result getClosestRowBefore(Region r, byte[] row, byte[] family) throws IOException {</span>
-<span class="source-line-no">4077</span><span id="line-4077">    Scan scan = new Scan().withStartRow(row);</span>
-<span class="source-line-no">4078</span><span id="line-4078">    scan.setReadType(ReadType.PREAD);</span>
-<span class="source-line-no">4079</span><span id="line-4079">    scan.setCaching(1);</span>
-<span class="source-line-no">4080</span><span id="line-4080">    scan.setReversed(true);</span>
-<span class="source-line-no">4081</span><span id="line-4081">    scan.addFamily(family);</span>
-<span class="source-line-no">4082</span><span id="line-4082">    try (RegionScanner scanner = r.getScanner(scan)) {</span>
-<span class="source-line-no">4083</span><span id="line-4083">      List&lt;Cell&gt; cells = new ArrayList&lt;&gt;(1);</span>
-<span class="source-line-no">4084</span><span id="line-4084">      scanner.next(cells);</span>
-<span class="source-line-no">4085</span><span id="line-4085">      if (r.getRegionInfo().isMetaRegion() &amp;&amp; !isTargetTable(row, cells.get(0))) {</span>
-<span class="source-line-no">4086</span><span id="line-4086">        return null;</span>
-<span class="source-line-no">4087</span><span id="line-4087">      }</span>
-<span class="source-line-no">4088</span><span id="line-4088">      return Result.create(cells);</span>
-<span class="source-line-no">4089</span><span id="line-4089">    }</span>
-<span class="source-line-no">4090</span><span id="line-4090">  }</span>
-<span class="source-line-no">4091</span><span id="line-4091"></span>
-<span class="source-line-no">4092</span><span id="line-4092">  private boolean isTargetTable(final byte[] inRow, Cell c) {</span>
-<span class="source-line-no">4093</span><span id="line-4093">    String inputRowString = Bytes.toString(inRow);</span>
-<span class="source-line-no">4094</span><span id="line-4094">    int i = inputRowString.indexOf(HConstants.DELIMITER);</span>
-<span class="source-line-no">4095</span><span id="line-4095">    String outputRowString = Bytes.toString(c.getRowArray(), c.getRowOffset(), c.getRowLength());</span>
-<span class="source-line-no">4096</span><span id="line-4096">    int o = outputRowString.indexOf(HConstants.DELIMITER);</span>
-<span class="source-line-no">4097</span><span id="line-4097">    return inputRowString.substring(0, i).equals(outputRowString.substring(0, o));</span>
-<span class="source-line-no">4098</span><span id="line-4098">  }</span>
-<span class="source-line-no">4099</span><span id="line-4099"></span>
-<span class="source-line-no">4100</span><span id="line-4100">  /**</span>
-<span class="source-line-no">4101</span><span id="line-4101">   * Sets up {@link MiniKdc} for testing security. Uses {@link HBaseKerberosUtils} to set the given</span>
-<span class="source-line-no">4102</span><span id="line-4102">   * keytab file as {@link HBaseKerberosUtils#KRB_KEYTAB_FILE}. FYI, there is also the easier-to-use</span>
-<span class="source-line-no">4103</span><span id="line-4103">   * kerby KDC server and utility for using it,</span>
-<span class="source-line-no">4104</span><span id="line-4104">   * {@link org.apache.hadoop.hbase.util.SimpleKdcServerUtil}. The kerby KDC server is preferred;</span>
-<span class="source-line-no">4105</span><span id="line-4105">   * less baggage. It came in in HBASE-5291.</span>
-<span class="source-line-no">4106</span><span id="line-4106">   */</span>
-<span class="source-line-no">4107</span><span id="line-4107">  public MiniKdc setupMiniKdc(File keytabFile) throws Exception {</span>
-<span class="source-line-no">4108</span><span id="line-4108">    Properties conf = MiniKdc.createConf();</span>
-<span class="source-line-no">4109</span><span id="line-4109">    conf.put(MiniKdc.DEBUG, true);</span>
-<span class="source-line-no">4110</span><span id="line-4110">    MiniKdc kdc = null;</span>
-<span class="source-line-no">4111</span><span id="line-4111">    File dir = null;</span>
-<span class="source-line-no">4112</span><span id="line-4112">    // There is time lag between selecting a port and trying to bind with it. It's possible that</span>
-<span class="source-line-no">4113</span><span id="line-4113">    // another service captures the port in between which'll result in BindException.</span>
-<span class="source-line-no">4114</span><span id="line-4114">    boolean bindException;</span>
-<span class="source-line-no">4115</span><span id="line-4115">    int numTries = 0;</span>
-<span class="source-line-no">4116</span><span id="line-4116">    do {</span>
-<span class="source-line-no">4117</span><span id="line-4117">      try {</span>
-<span class="source-line-no">4118</span><span id="line-4118">        bindException = false;</span>
-<span class="source-line-no">4119</span><span id="line-4119">        dir = new File(getDataTestDir("kdc").toUri().getPath());</span>
-<span class="source-line-no">4120</span><span id="line-4120">        kdc = new MiniKdc(conf, dir);</span>
-<span class="source-line-no">4121</span><span id="line-4121">        kdc.start();</span>
-<span class="source-line-no">4122</span><span id="line-4122">      } catch (BindException e) {</span>
-<span class="source-line-no">4123</span><span id="line-4123">        FileUtils.deleteDirectory(dir); // clean directory</span>
-<span class="source-line-no">4124</span><span id="line-4124">        numTries++;</span>
-<span class="source-line-no">4125</span><span id="line-4125">        if (numTries == 3) {</span>
-<span class="source-line-no">4126</span><span id="line-4126">          LOG.error("Failed setting up MiniKDC. Tried " + numTries + " times.");</span>
-<span class="source-line-no">4127</span><span id="line-4127">          throw e;</span>
-<span class="source-line-no">4128</span><span id="line-4128">        }</span>
-<span class="source-line-no">4129</span><span id="line-4129">        LOG.error("BindException encountered when setting up MiniKdc. Trying again.");</span>
-<span class="source-line-no">4130</span><span id="line-4130">        bindException = true;</span>
-<span class="source-line-no">4131</span><span id="line-4131">      }</span>
-<span class="source-line-no">4132</span><span id="line-4132">    } while (bindException);</span>
-<span class="source-line-no">4133</span><span id="line-4133">    HBaseKerberosUtils.setKeytabFileForTesting(keytabFile.getAbsolutePath());</span>
-<span class="source-line-no">4134</span><span id="line-4134">    return kdc;</span>
-<span class="source-line-no">4135</span><span id="line-4135">  }</span>
-<span class="source-line-no">4136</span><span id="line-4136"></span>
-<span class="source-line-no">4137</span><span id="line-4137">  public int getNumHFiles(final TableName tableName, final byte[] family) {</span>
-<span class="source-line-no">4138</span><span id="line-4138">    int numHFiles = 0;</span>
-<span class="source-line-no">4139</span><span id="line-4139">    for (RegionServerThread regionServerThread : getMiniHBaseCluster().getRegionServerThreads()) {</span>
-<span class="source-line-no">4140</span><span id="line-4140">      numHFiles += getNumHFilesForRS(regionServerThread.getRegionServer(), tableName, family);</span>
-<span class="source-line-no">4141</span><span id="line-4141">    }</span>
-<span class="source-line-no">4142</span><span id="line-4142">    return numHFiles;</span>
-<span class="source-line-no">4143</span><span id="line-4143">  }</span>
-<span class="source-line-no">4144</span><span id="line-4144"></span>
-<span class="source-line-no">4145</span><span id="line-4145">  public int getNumHFilesForRS(final HRegionServer rs, final TableName tableName,</span>
-<span class="source-line-no">4146</span><span id="line-4146">    final byte[] family) {</span>
-<span class="source-line-no">4147</span><span id="line-4147">    int numHFiles = 0;</span>
-<span class="source-line-no">4148</span><span id="line-4148">    for (Region region : rs.getRegions(tableName)) {</span>
-<span class="source-line-no">4149</span><span id="line-4149">      numHFiles += region.getStore(family).getStorefilesCount();</span>
-<span class="source-line-no">4150</span><span id="line-4150">    }</span>
-<span class="source-line-no">4151</span><span id="line-4151">    return numHFiles;</span>
-<span class="source-line-no">4152</span><span id="line-4152">  }</span>
-<span class="source-line-no">4153</span><span id="line-4153"></span>
-<span class="source-line-no">4154</span><span id="line-4154">  private void assertEquals(String message, int expected, int actual) {</span>
-<span class="source-line-no">4155</span><span id="line-4155">    if (expected == actual) {</span>
-<span class="source-line-no">4156</span><span id="line-4156">      return;</span>
-<span class="source-line-no">4157</span><span id="line-4157">    }</span>
-<span class="source-line-no">4158</span><span id="line-4158">    String formatted = "";</span>
-<span class="source-line-no">4159</span><span id="line-4159">    if (message != null &amp;&amp; !"".equals(message)) {</span>
-<span class="source-line-no">4160</span><span id="line-4160">      formatted = message + " ";</span>
-<span class="source-line-no">4161</span><span id="line-4161">    }</span>
-<span class="source-line-no">4162</span><span id="line-4162">    throw new AssertionError(formatted + "expected:&lt;" + expected + "&gt; but was:&lt;" + actual + "&gt;");</span>
-<span class="source-line-no">4163</span><span id="line-4163">  }</span>
-<span class="source-line-no">4164</span><span id="line-4164"></span>
-<span class="source-line-no">4165</span><span id="line-4165">  public void verifyTableDescriptorIgnoreTableName(TableDescriptor ltd, TableDescriptor rtd) {</span>
-<span class="source-line-no">4166</span><span id="line-4166">    if (ltd.getValues().hashCode() != rtd.getValues().hashCode()) {</span>
-<span class="source-line-no">4167</span><span id="line-4167">      throw new AssertionError();</span>
-<span class="source-line-no">4168</span><span id="line-4168">    }</span>
-<span class="source-line-no">4169</span><span id="line-4169">    assertEquals("", ltd.getValues().hashCode(), rtd.getValues().hashCode());</span>
-<span class="source-line-no">4170</span><span id="line-4170">    Collection&lt;ColumnFamilyDescriptor&gt; ltdFamilies = Arrays.asList(ltd.getColumnFamilies());</span>
-<span class="source-line-no">4171</span><span id="line-4171">    Collection&lt;ColumnFamilyDescriptor&gt; rtdFamilies = Arrays.asList(rtd.getColumnFamilies());</span>
-<span class="source-line-no">4172</span><span id="line-4172">    assertEquals("", ltdFamilies.size(), rtdFamilies.size());</span>
-<span class="source-line-no">4173</span><span id="line-4173">    for (Iterator&lt;ColumnFamilyDescriptor&gt; it = ltdFamilies.iterator(),</span>
-<span class="source-line-no">4174</span><span id="line-4174">        it2 = rtdFamilies.iterator(); it.hasNext();) {</span>
-<span class="source-line-no">4175</span><span id="line-4175">      assertEquals("", 0, ColumnFamilyDescriptor.COMPARATOR.compare(it.next(), it2.next()));</span>
-<span class="source-line-no">4176</span><span id="line-4176">    }</span>
-<span class="source-line-no">4177</span><span id="line-4177">  }</span>
-<span class="source-line-no">4178</span><span id="line-4178"></span>
-<span class="source-line-no">4179</span><span id="line-4179">  /**</span>
-<span class="source-line-no">4180</span><span id="line-4180">   * Await the successful return of {@code condition}, sleeping {@code sleepMillis} between</span>
-<span class="source-line-no">4181</span><span id="line-4181">   * invocations.</span>
-<span class="source-line-no">4182</span><span id="line-4182">   */</span>
-<span class="source-line-no">4183</span><span id="line-4183">  public static void await(final long sleepMillis, final BooleanSupplier condition)</span>
-<span class="source-line-no">4184</span><span id="line-4184">    throws InterruptedException {</span>
-<span class="source-line-no">4185</span><span id="line-4185">    try {</span>
-<span class="source-line-no">4186</span><span id="line-4186">      while (!condition.getAsBoolean()) {</span>
-<span class="source-line-no">4187</span><span id="line-4187">        Thread.sleep(sleepMillis);</span>
-<span class="source-line-no">4188</span><span id="line-4188">      }</span>
-<span class="source-line-no">4189</span><span id="line-4189">    } catch (RuntimeException e) {</span>
-<span class="source-line-no">4190</span><span id="line-4190">      if (e.getCause() instanceof AssertionError) {</span>
-<span class="source-line-no">4191</span><span id="line-4191">        throw (AssertionError) e.getCause();</span>
-<span class="source-line-no">4192</span><span id="line-4192">      }</span>
-<span class="source-line-no">4193</span><span id="line-4193">      throw e;</span>
-<span class="source-line-no">4194</span><span id="line-4194">    }</span>
-<span class="source-line-no">4195</span><span id="line-4195">  }</span>
-<span class="source-line-no">4196</span><span id="line-4196">}</span>
+<span class="source-line-no">3811</span><span id="line-3811">      admin.createTable(td, splits);</span>
+<span class="source-line-no">3812</span><span id="line-3812">    } catch (MasterNotRunningException e) {</span>
+<span class="source-line-no">3813</span><span id="line-3813">      LOG.error("Master not running", e);</span>
+<span class="source-line-no">3814</span><span id="line-3814">      throw new IOException(e);</span>
+<span class="source-line-no">3815</span><span id="line-3815">    } catch (TableExistsException e) {</span>
+<span class="source-line-no">3816</span><span id="line-3816">      LOG.warn("Table " + td.getTableName() + " already exists, continuing");</span>
+<span class="source-line-no">3817</span><span id="line-3817">    } finally {</span>
+<span class="source-line-no">3818</span><span id="line-3818">      admin.close();</span>
+<span class="source-line-no">3819</span><span id="line-3819">      unmanagedConnection.close();</span>
+<span class="source-line-no">3820</span><span id="line-3820">    }</span>
+<span class="source-line-no">3821</span><span id="line-3821">    return totalNumberOfRegions;</span>
+<span class="source-line-no">3822</span><span id="line-3822">  }</span>
+<span class="source-line-no">3823</span><span id="line-3823"></span>
+<span class="source-line-no">3824</span><span id="line-3824">  public static int getMetaRSPort(Connection connection) throws IOException {</span>
+<span class="source-line-no">3825</span><span id="line-3825">    try (RegionLocator locator = connection.getRegionLocator(TableName.META_TABLE_NAME)) {</span>
+<span class="source-line-no">3826</span><span id="line-3826">      return locator.getRegionLocation(Bytes.toBytes("")).getPort();</span>
+<span class="source-line-no">3827</span><span id="line-3827">    }</span>
+<span class="source-line-no">3828</span><span id="line-3828">  }</span>
+<span class="source-line-no">3829</span><span id="line-3829"></span>
+<span class="source-line-no">3830</span><span id="line-3830">  /**</span>
+<span class="source-line-no">3831</span><span id="line-3831">   * Due to async racing issue, a region may not be in the online region list of a region server</span>
+<span class="source-line-no">3832</span><span id="line-3832">   * yet, after the assignment znode is deleted and the new assignment is recorded in master.</span>
+<span class="source-line-no">3833</span><span id="line-3833">   */</span>
+<span class="source-line-no">3834</span><span id="line-3834">  public void assertRegionOnServer(final RegionInfo hri, final ServerName server,</span>
+<span class="source-line-no">3835</span><span id="line-3835">    final long timeout) throws IOException, InterruptedException {</span>
+<span class="source-line-no">3836</span><span id="line-3836">    long timeoutTime = EnvironmentEdgeManager.currentTime() + timeout;</span>
+<span class="source-line-no">3837</span><span id="line-3837">    while (true) {</span>
+<span class="source-line-no">3838</span><span id="line-3838">      List&lt;RegionInfo&gt; regions = getAdmin().getRegions(server);</span>
+<span class="source-line-no">3839</span><span id="line-3839">      if (regions.stream().anyMatch(r -&gt; RegionInfo.COMPARATOR.compare(r, hri) == 0)) return;</span>
+<span class="source-line-no">3840</span><span id="line-3840">      long now = EnvironmentEdgeManager.currentTime();</span>
+<span class="source-line-no">3841</span><span id="line-3841">      if (now &gt; timeoutTime) break;</span>
+<span class="source-line-no">3842</span><span id="line-3842">      Thread.sleep(10);</span>
+<span class="source-line-no">3843</span><span id="line-3843">    }</span>
+<span class="source-line-no">3844</span><span id="line-3844">    throw new AssertionError(</span>
+<span class="source-line-no">3845</span><span id="line-3845">      "Could not find region " + hri.getRegionNameAsString() + " on server " + server);</span>
+<span class="source-line-no">3846</span><span id="line-3846">  }</span>
+<span class="source-line-no">3847</span><span id="line-3847"></span>
+<span class="source-line-no">3848</span><span id="line-3848">  /**</span>
+<span class="source-line-no">3849</span><span id="line-3849">   * Check to make sure the region is open on the specified region server, but not on any other one.</span>
+<span class="source-line-no">3850</span><span id="line-3850">   */</span>
+<span class="source-line-no">3851</span><span id="line-3851">  public void assertRegionOnlyOnServer(final RegionInfo hri, final ServerName server,</span>
+<span class="source-line-no">3852</span><span id="line-3852">    final long timeout) throws IOException, InterruptedException {</span>
+<span class="source-line-no">3853</span><span id="line-3853">    long timeoutTime = EnvironmentEdgeManager.currentTime() + timeout;</span>
+<span class="source-line-no">3854</span><span id="line-3854">    while (true) {</span>
+<span class="source-line-no">3855</span><span id="line-3855">      List&lt;RegionInfo&gt; regions = getAdmin().getRegions(server);</span>
+<span class="source-line-no">3856</span><span id="line-3856">      if (regions.stream().anyMatch(r -&gt; RegionInfo.COMPARATOR.compare(r, hri) == 0)) {</span>
+<span class="source-line-no">3857</span><span id="line-3857">        List&lt;JVMClusterUtil.RegionServerThread&gt; rsThreads =</span>
+<span class="source-line-no">3858</span><span id="line-3858">          getHBaseCluster().getLiveRegionServerThreads();</span>
+<span class="source-line-no">3859</span><span id="line-3859">        for (JVMClusterUtil.RegionServerThread rsThread : rsThreads) {</span>
+<span class="source-line-no">3860</span><span id="line-3860">          HRegionServer rs = rsThread.getRegionServer();</span>
+<span class="source-line-no">3861</span><span id="line-3861">          if (server.equals(rs.getServerName())) {</span>
+<span class="source-line-no">3862</span><span id="line-3862">            continue;</span>
+<span class="source-line-no">3863</span><span id="line-3863">          }</span>
+<span class="source-line-no">3864</span><span id="line-3864">          Collection&lt;HRegion&gt; hrs = rs.getOnlineRegionsLocalContext();</span>
+<span class="source-line-no">3865</span><span id="line-3865">          for (HRegion r : hrs) {</span>
+<span class="source-line-no">3866</span><span id="line-3866">            if (r.getRegionInfo().getRegionId() == hri.getRegionId()) {</span>
+<span class="source-line-no">3867</span><span id="line-3867">              throw new AssertionError("Region should not be double assigned");</span>
+<span class="source-line-no">3868</span><span id="line-3868">            }</span>
+<span class="source-line-no">3869</span><span id="line-3869">          }</span>
+<span class="source-line-no">3870</span><span id="line-3870">        }</span>
+<span class="source-line-no">3871</span><span id="line-3871">        return; // good, we are happy</span>
+<span class="source-line-no">3872</span><span id="line-3872">      }</span>
+<span class="source-line-no">3873</span><span id="line-3873">      long now = EnvironmentEdgeManager.currentTime();</span>
+<span class="source-line-no">3874</span><span id="line-3874">      if (now &gt; timeoutTime) break;</span>
+<span class="source-line-no">3875</span><span id="line-3875">      Thread.sleep(10);</span>
+<span class="source-line-no">3876</span><span id="line-3876">    }</span>
+<span class="source-line-no">3877</span><span id="line-3877">    throw new AssertionError(</span>
+<span class="source-line-no">3878</span><span id="line-3878">      "Could not find region " + hri.getRegionNameAsString() + " on server " + server);</span>
+<span class="source-line-no">3879</span><span id="line-3879">  }</span>
+<span class="source-line-no">3880</span><span id="line-3880"></span>
+<span class="source-line-no">3881</span><span id="line-3881">  public HRegion createTestRegion(String tableName, ColumnFamilyDescriptor cd) throws IOException {</span>
+<span class="source-line-no">3882</span><span id="line-3882">    TableDescriptor td =</span>
+<span class="source-line-no">3883</span><span id="line-3883">      TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName)).setColumnFamily(cd).build();</span>
+<span class="source-line-no">3884</span><span id="line-3884">    RegionInfo info = RegionInfoBuilder.newBuilder(TableName.valueOf(tableName)).build();</span>
+<span class="source-line-no">3885</span><span id="line-3885">    return createRegionAndWAL(info, getDataTestDir(), getConfiguration(), td);</span>
+<span class="source-line-no">3886</span><span id="line-3886">  }</span>
+<span class="source-line-no">3887</span><span id="line-3887"></span>
+<span class="source-line-no">3888</span><span id="line-3888">  public HRegion createTestRegion(String tableName, ColumnFamilyDescriptor cd,</span>
+<span class="source-line-no">3889</span><span id="line-3889">    BlockCache blockCache) throws IOException {</span>
+<span class="source-line-no">3890</span><span id="line-3890">    TableDescriptor td =</span>
+<span class="source-line-no">3891</span><span id="line-3891">      TableDescriptorBuilder.newBuilder(TableName.valueOf(tableName)).setColumnFamily(cd).build();</span>
+<span class="source-line-no">3892</span><span id="line-3892">    RegionInfo info = RegionInfoBuilder.newBuilder(TableName.valueOf(tableName)).build();</span>
+<span class="source-line-no">3893</span><span id="line-3893">    return createRegionAndWAL(info, getDataTestDir(), getConfiguration(), td, blockCache);</span>
+<span class="source-line-no">3894</span><span id="line-3894">  }</span>
+<span class="source-line-no">3895</span><span id="line-3895"></span>
+<span class="source-line-no">3896</span><span id="line-3896">  public static void setFileSystemURI(String fsURI) {</span>
+<span class="source-line-no">3897</span><span id="line-3897">    FS_URI = fsURI;</span>
+<span class="source-line-no">3898</span><span id="line-3898">  }</span>
+<span class="source-line-no">3899</span><span id="line-3899"></span>
+<span class="source-line-no">3900</span><span id="line-3900">  /**</span>
+<span class="source-line-no">3901</span><span id="line-3901">   * Returns a {@link Predicate} for checking that there are no regions in transition in master</span>
+<span class="source-line-no">3902</span><span id="line-3902">   */</span>
+<span class="source-line-no">3903</span><span id="line-3903">  public ExplainingPredicate&lt;IOException&gt; predicateNoRegionsInTransition() {</span>
+<span class="source-line-no">3904</span><span id="line-3904">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
+<span class="source-line-no">3905</span><span id="line-3905">      @Override</span>
+<span class="source-line-no">3906</span><span id="line-3906">      public String explainFailure() throws IOException {</span>
+<span class="source-line-no">3907</span><span id="line-3907">        final AssignmentManager am = getMiniHBaseCluster().getMaster().getAssignmentManager();</span>
+<span class="source-line-no">3908</span><span id="line-3908">        return "found in transition: " + am.getRegionsInTransition().toString();</span>
+<span class="source-line-no">3909</span><span id="line-3909">      }</span>
+<span class="source-line-no">3910</span><span id="line-3910"></span>
+<span class="source-line-no">3911</span><span id="line-3911">      @Override</span>
+<span class="source-line-no">3912</span><span id="line-3912">      public boolean evaluate() throws IOException {</span>
+<span class="source-line-no">3913</span><span id="line-3913">        HMaster master = getMiniHBaseCluster().getMaster();</span>
+<span class="source-line-no">3914</span><span id="line-3914">        if (master == null) return false;</span>
+<span class="source-line-no">3915</span><span id="line-3915">        AssignmentManager am = master.getAssignmentManager();</span>
+<span class="source-line-no">3916</span><span id="line-3916">        if (am == null) return false;</span>
+<span class="source-line-no">3917</span><span id="line-3917">        return !am.hasRegionsInTransition();</span>
+<span class="source-line-no">3918</span><span id="line-3918">      }</span>
+<span class="source-line-no">3919</span><span id="line-3919">    };</span>
+<span class="source-line-no">3920</span><span id="line-3920">  }</span>
+<span class="source-line-no">3921</span><span id="line-3921"></span>
+<span class="source-line-no">3922</span><span id="line-3922">  /**</span>
+<span class="source-line-no">3923</span><span id="line-3923">   * Returns a {@link Predicate} for checking that table is enabled</span>
+<span class="source-line-no">3924</span><span id="line-3924">   */</span>
+<span class="source-line-no">3925</span><span id="line-3925">  public Waiter.Predicate&lt;IOException&gt; predicateTableEnabled(final TableName tableName) {</span>
+<span class="source-line-no">3926</span><span id="line-3926">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
+<span class="source-line-no">3927</span><span id="line-3927">      @Override</span>
+<span class="source-line-no">3928</span><span id="line-3928">      public String explainFailure() throws IOException {</span>
+<span class="source-line-no">3929</span><span id="line-3929">        return explainTableState(tableName, TableState.State.ENABLED);</span>
+<span class="source-line-no">3930</span><span id="line-3930">      }</span>
+<span class="source-line-no">3931</span><span id="line-3931"></span>
+<span class="source-line-no">3932</span><span id="line-3932">      @Override</span>
+<span class="source-line-no">3933</span><span id="line-3933">      public boolean evaluate() throws IOException {</span>
+<span class="source-line-no">3934</span><span id="line-3934">        return getAdmin().tableExists(tableName) &amp;&amp; getAdmin().isTableEnabled(tableName);</span>
+<span class="source-line-no">3935</span><span id="line-3935">      }</span>
+<span class="source-line-no">3936</span><span id="line-3936">    };</span>
+<span class="source-line-no">3937</span><span id="line-3937">  }</span>
+<span class="source-line-no">3938</span><span id="line-3938"></span>
+<span class="source-line-no">3939</span><span id="line-3939">  /**</span>
+<span class="source-line-no">3940</span><span id="line-3940">   * Returns a {@link Predicate} for checking that table is enabled</span>
+<span class="source-line-no">3941</span><span id="line-3941">   */</span>
+<span class="source-line-no">3942</span><span id="line-3942">  public Waiter.Predicate&lt;IOException&gt; predicateTableDisabled(final TableName tableName) {</span>
+<span class="source-line-no">3943</span><span id="line-3943">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
+<span class="source-line-no">3944</span><span id="line-3944">      @Override</span>
+<span class="source-line-no">3945</span><span id="line-3945">      public String explainFailure() throws IOException {</span>
+<span class="source-line-no">3946</span><span id="line-3946">        return explainTableState(tableName, TableState.State.DISABLED);</span>
+<span class="source-line-no">3947</span><span id="line-3947">      }</span>
+<span class="source-line-no">3948</span><span id="line-3948"></span>
+<span class="source-line-no">3949</span><span id="line-3949">      @Override</span>
+<span class="source-line-no">3950</span><span id="line-3950">      public boolean evaluate() throws IOException {</span>
+<span class="source-line-no">3951</span><span id="line-3951">        return getAdmin().isTableDisabled(tableName);</span>
+<span class="source-line-no">3952</span><span id="line-3952">      }</span>
+<span class="source-line-no">3953</span><span id="line-3953">    };</span>
+<span class="source-line-no">3954</span><span id="line-3954">  }</span>
+<span class="source-line-no">3955</span><span id="line-3955"></span>
+<span class="source-line-no">3956</span><span id="line-3956">  /**</span>
+<span class="source-line-no">3957</span><span id="line-3957">   * Returns a {@link Predicate} for checking that table is enabled</span>
+<span class="source-line-no">3958</span><span id="line-3958">   */</span>
+<span class="source-line-no">3959</span><span id="line-3959">  public Waiter.Predicate&lt;IOException&gt; predicateTableAvailable(final TableName tableName) {</span>
+<span class="source-line-no">3960</span><span id="line-3960">    return new ExplainingPredicate&lt;IOException&gt;() {</span>
+<span class="source-line-no">3961</span><span id="line-3961">      @Override</span>
+<span class="source-line-no">3962</span><span id="line-3962">      public String explainFailure() throws IOException {</span>
+<span class="source-line-no">3963</span><span id="line-3963">        return explainTableAvailability(tableName);</span>
+<span class="source-line-no">3964</span><span id="line-3964">      }</span>
+<span class="source-line-no">3965</span><span id="line-3965"></span>
+<span class="source-line-no">3966</span><span id="line-3966">      @Override</span>
+<span class="source-line-no">3967</span><span id="line-3967">      public boolean evaluate() throws IOException {</span>
+<span class="source-line-no">3968</span><span id="line-3968">        boolean tableAvailable = getAdmin().isTableAvailable(tableName);</span>
+<span class="source-line-no">3969</span><span id="line-3969">        if (tableAvailable) {</span>
+<span class="source-line-no">3970</span><span id="line-3970">          try (Table table = getConnection().getTable(tableName)) {</span>
+<span class="source-line-no">3971</span><span id="line-3971">            TableDescriptor htd = table.getDescriptor();</span>
+<span class="source-line-no">3972</span><span id="line-3972">            for (HRegionLocation loc : getConnection().getRegionLocator(tableName)</span>
+<span class="source-line-no">3973</span><span id="line-3973">              .getAllRegionLocations()) {</span>
+<span class="source-line-no">3974</span><span id="line-3974">              Scan scan = new Scan().withStartRow(loc.getRegion().getStartKey())</span>
+<span class="source-line-no">3975</span><span id="line-3975">                .withStopRow(loc.getRegion().getEndKey()).setOneRowLimit()</span>
+<span class="source-line-no">3976</span><span id="line-3976">                .setMaxResultsPerColumnFamily(1).setCacheBlocks(false);</span>
+<span class="source-line-no">3977</span><span id="line-3977">              for (byte[] family : htd.getColumnFamilyNames()) {</span>
+<span class="source-line-no">3978</span><span id="line-3978">                scan.addFamily(family);</span>
+<span class="source-line-no">3979</span><span id="line-3979">              }</span>
+<span class="source-line-no">3980</span><span id="line-3980">              try (ResultScanner scanner = table.getScanner(scan)) {</span>
+<span class="source-line-no">3981</span><span id="line-3981">                scanner.next();</span>
+<span class="source-line-no">3982</span><span id="line-3982">              }</span>
+<span class="source-line-no">3983</span><span id="line-3983">            }</span>
+<span class="source-line-no">3984</span><span id="line-3984">          }</span>
+<span class="source-line-no">3985</span><span id="line-3985">        }</span>
+<span class="source-line-no">3986</span><span id="line-3986">        return tableAvailable;</span>
+<span class="source-line-no">3987</span><span id="line-3987">      }</span>
+<span class="source-line-no">3988</span><span id="line-3988">    };</span>
+<span class="source-line-no">3989</span><span id="line-3989">  }</span>
+<span class="source-line-no">3990</span><span id="line-3990"></span>
+<span class="source-line-no">3991</span><span id="line-3991">  /**</span>
+<span class="source-line-no">3992</span><span id="line-3992">   * Wait until no regions in transition.</span>
+<span class="source-line-no">3993</span><span id="line-3993">   * @param timeout How long to wait.</span>
+<span class="source-line-no">3994</span><span id="line-3994">   */</span>
+<span class="source-line-no">3995</span><span id="line-3995">  public void waitUntilNoRegionsInTransition(final long timeout) throws IOException {</span>
+<span class="source-line-no">3996</span><span id="line-3996">    waitFor(timeout, predicateNoRegionsInTransition());</span>
+<span class="source-line-no">3997</span><span id="line-3997">  }</span>
+<span class="source-line-no">3998</span><span id="line-3998"></span>
+<span class="source-line-no">3999</span><span id="line-3999">  /**</span>
+<span class="source-line-no">4000</span><span id="line-4000">   * Wait until no regions in transition. (time limit 15min)</span>
+<span class="source-line-no">4001</span><span id="line-4001">   */</span>
+<span class="source-line-no">4002</span><span id="line-4002">  public void waitUntilNoRegionsInTransition() throws IOException {</span>
+<span class="source-line-no">4003</span><span id="line-4003">    waitUntilNoRegionsInTransition(15 * 60000);</span>
+<span class="source-line-no">4004</span><span id="line-4004">  }</span>
+<span class="source-line-no">4005</span><span id="line-4005"></span>
+<span class="source-line-no">4006</span><span id="line-4006">  /**</span>
+<span class="source-line-no">4007</span><span id="line-4007">   * Wait until labels is ready in VisibilityLabelsCache.</span>
+<span class="source-line-no">4008</span><span id="line-4008">   */</span>
+<span class="source-line-no">4009</span><span id="line-4009">  public void waitLabelAvailable(long timeoutMillis, final String... labels) {</span>
+<span class="source-line-no">4010</span><span id="line-4010">    final VisibilityLabelsCache labelsCache = VisibilityLabelsCache.get();</span>
+<span class="source-line-no">4011</span><span id="line-4011">    waitFor(timeoutMillis, new Waiter.ExplainingPredicate&lt;RuntimeException&gt;() {</span>
+<span class="source-line-no">4012</span><span id="line-4012"></span>
+<span class="source-line-no">4013</span><span id="line-4013">      @Override</span>
+<span class="source-line-no">4014</span><span id="line-4014">      public boolean evaluate() {</span>
+<span class="source-line-no">4015</span><span id="line-4015">        for (String label : labels) {</span>
+<span class="source-line-no">4016</span><span id="line-4016">          if (labelsCache.getLabelOrdinal(label) == 0) {</span>
+<span class="source-line-no">4017</span><span id="line-4017">            return false;</span>
+<span class="source-line-no">4018</span><span id="line-4018">          }</span>
+<span class="source-line-no">4019</span><span id="line-4019">        }</span>
+<span class="source-line-no">4020</span><span id="line-4020">        return true;</span>
+<span class="source-line-no">4021</span><span id="line-4021">      }</span>
+<span class="source-line-no">4022</span><span id="line-4022"></span>
+<span class="source-line-no">4023</span><span id="line-4023">      @Override</span>
+<span class="source-line-no">4024</span><span id="line-4024">      public String explainFailure() {</span>
+<span class="source-line-no">4025</span><span id="line-4025">        for (String label : labels) {</span>
+<span class="source-line-no">4026</span><span id="line-4026">          if (labelsCache.getLabelOrdinal(label) == 0) {</span>
+<span class="source-line-no">4027</span><span id="line-4027">            return label + " is not available yet";</span>
+<span class="source-line-no">4028</span><span id="line-4028">          }</span>
+<span class="source-line-no">4029</span><span id="line-4029">        }</span>
+<span class="source-line-no">4030</span><span id="line-4030">        return "";</span>
+<span class="source-line-no">4031</span><span id="line-4031">      }</span>
+<span class="source-line-no">4032</span><span id="line-4032">    });</span>
+<span class="source-line-no">4033</span><span id="line-4033">  }</span>
+<span class="source-line-no">4034</span><span id="line-4034"></span>
+<span class="source-line-no">4035</span><span id="line-4035">  /**</span>
+<span class="source-line-no">4036</span><span id="line-4036">   * Create a set of column descriptors with the combination of compression, encoding, bloom codecs</span>
+<span class="source-line-no">4037</span><span id="line-4037">   * available.</span>
+<span class="source-line-no">4038</span><span id="line-4038">   * @return the list of column descriptors</span>
+<span class="source-line-no">4039</span><span id="line-4039">   */</span>
+<span class="source-line-no">4040</span><span id="line-4040">  public static List&lt;ColumnFamilyDescriptor&gt; generateColumnDescriptors() {</span>
+<span class="source-line-no">4041</span><span id="line-4041">    return generateColumnDescriptors("");</span>
+<span class="source-line-no">4042</span><span id="line-4042">  }</span>
+<span class="source-line-no">4043</span><span id="line-4043"></span>
+<span class="source-line-no">4044</span><span id="line-4044">  /**</span>
+<span class="source-line-no">4045</span><span id="line-4045">   * Create a set of column descriptors with the combination of compression, encoding, bloom codecs</span>
+<span class="source-line-no">4046</span><span id="line-4046">   * available.</span>
+<span class="source-line-no">4047</span><span id="line-4047">   * @param prefix family names prefix</span>
+<span class="source-line-no">4048</span><span id="line-4048">   * @return the list of column descriptors</span>
+<span class="source-line-no">4049</span><span id="line-4049">   */</span>
+<span class="source-line-no">4050</span><span id="line-4050">  public static List&lt;ColumnFamilyDescriptor&gt; generateColumnDescriptors(final String prefix) {</span>
+<span class="source-line-no">4051</span><span id="line-4051">    List&lt;ColumnFamilyDescriptor&gt; columnFamilyDescriptors = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">4052</span><span id="line-4052">    long familyId = 0;</span>
+<span class="source-line-no">4053</span><span id="line-4053">    for (Compression.Algorithm compressionType : getSupportedCompressionAlgorithms()) {</span>
+<span class="source-line-no">4054</span><span id="line-4054">      for (DataBlockEncoding encodingType : DataBlockEncoding.values()) {</span>
+<span class="source-line-no">4055</span><span id="line-4055">        for (BloomType bloomType : BloomType.values()) {</span>
+<span class="source-line-no">4056</span><span id="line-4056">          String name = String.format("%s-cf-!@#&amp;-%d!@#", prefix, familyId);</span>
+<span class="source-line-no">4057</span><span id="line-4057">          ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder =</span>
+<span class="source-line-no">4058</span><span id="line-4058">            ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(name));</span>
+<span class="source-line-no">4059</span><span id="line-4059">          columnFamilyDescriptorBuilder.setCompressionType(compressionType);</span>
+<span class="source-line-no">4060</span><span id="line-4060">          columnFamilyDescriptorBuilder.setDataBlockEncoding(encodingType);</span>
+<span class="source-line-no">4061</span><span id="line-4061">          columnFamilyDescriptorBuilder.setBloomFilterType(bloomType);</span>
+<span class="source-line-no">4062</span><span id="line-4062">          columnFamilyDescriptors.add(columnFamilyDescriptorBuilder.build());</span>
+<span class="source-line-no">4063</span><span id="line-4063">          familyId++;</span>
+<span class="source-line-no">4064</span><span id="line-4064">        }</span>
+<span class="source-line-no">4065</span><span id="line-4065">      }</span>
+<span class="source-line-no">4066</span><span id="line-4066">    }</span>
+<span class="source-line-no">4067</span><span id="line-4067">    return columnFamilyDescriptors;</span>
+<span class="source-line-no">4068</span><span id="line-4068">  }</span>
+<span class="source-line-no">4069</span><span id="line-4069"></span>
+<span class="source-line-no">4070</span><span id="line-4070">  /**</span>
+<span class="source-line-no">4071</span><span id="line-4071">   * Get supported compression algorithms.</span>
+<span class="source-line-no">4072</span><span id="line-4072">   * @return supported compression algorithms.</span>
+<span class="source-line-no">4073</span><span id="line-4073">   */</span>
+<span class="source-line-no">4074</span><span id="line-4074">  public static Compression.Algorithm[] getSupportedCompressionAlgorithms() {</span>
+<span class="source-line-no">4075</span><span id="line-4075">    String[] allAlgos = HFile.getSupportedCompressionAlgorithms();</span>
+<span class="source-line-no">4076</span><span id="line-4076">    List&lt;Compression.Algorithm&gt; supportedAlgos = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">4077</span><span id="line-4077">    for (String algoName : allAlgos) {</span>
+<span class="source-line-no">4078</span><span id="line-4078">      try {</span>
+<span class="source-line-no">4079</span><span id="line-4079">        Compression.Algorithm algo = Compression.getCompressionAlgorithmByName(algoName);</span>
+<span class="source-line-no">4080</span><span id="line-4080">        algo.getCompressor();</span>
+<span class="source-line-no">4081</span><span id="line-4081">        supportedAlgos.add(algo);</span>
+<span class="source-line-no">4082</span><span id="line-4082">      } catch (Throwable t) {</span>
+<span class="source-line-no">4083</span><span id="line-4083">        // this algo is not available</span>
+<span class="source-line-no">4084</span><span id="line-4084">      }</span>
+<span class="source-line-no">4085</span><span id="line-4085">    }</span>
+<span class="source-line-no">4086</span><span id="line-4086">    return supportedAlgos.toArray(new Algorithm[supportedAlgos.size()]);</span>
+<span class="source-line-no">4087</span><span id="line-4087">  }</span>
+<span class="source-line-no">4088</span><span id="line-4088"></span>
+<span class="source-line-no">4089</span><span id="line-4089">  public Result getClosestRowBefore(Region r, byte[] row, byte[] family) throws IOException {</span>
+<span class="source-line-no">4090</span><span id="line-4090">    Scan scan = new Scan().withStartRow(row);</span>
+<span class="source-line-no">4091</span><span id="line-4091">    scan.setReadType(ReadType.PREAD);</span>
+<span class="source-line-no">4092</span><span id="line-4092">    scan.setCaching(1);</span>
+<span class="source-line-no">4093</span><span id="line-4093">    scan.setReversed(true);</span>
+<span class="source-line-no">4094</span><span id="line-4094">    scan.addFamily(family);</span>
+<span class="source-line-no">4095</span><span id="line-4095">    try (RegionScanner scanner = r.getScanner(scan)) {</span>
+<span class="source-line-no">4096</span><span id="line-4096">      List&lt;Cell&gt; cells = new ArrayList&lt;&gt;(1);</span>
+<span class="source-line-no">4097</span><span id="line-4097">      scanner.next(cells);</span>
+<span class="source-line-no">4098</span><span id="line-4098">      if (r.getRegionInfo().isMetaRegion() &amp;&amp; !isTargetTable(row, cells.get(0))) {</span>
+<span class="source-line-no">4099</span><span id="line-4099">        return null;</span>
+<span class="source-line-no">4100</span><span id="line-4100">      }</span>
+<span class="source-line-no">4101</span><span id="line-4101">      return Result.create(cells);</span>
+<span class="source-line-no">4102</span><span id="line-4102">    }</span>
+<span class="source-line-no">4103</span><span id="line-4103">  }</span>
+<span class="source-line-no">4104</span><span id="line-4104"></span>
+<span class="source-line-no">4105</span><span id="line-4105">  private boolean isTargetTable(final byte[] inRow, Cell c) {</span>
+<span class="source-line-no">4106</span><span id="line-4106">    String inputRowString = Bytes.toString(inRow);</span>
+<span class="source-line-no">4107</span><span id="line-4107">    int i = inputRowString.indexOf(HConstants.DELIMITER);</span>
+<span class="source-line-no">4108</span><span id="line-4108">    String outputRowString = Bytes.toString(c.getRowArray(), c.getRowOffset(), c.getRowLength());</span>
+<span class="source-line-no">4109</span><span id="line-4109">    int o = outputRowString.indexOf(HConstants.DELIMITER);</span>
+<span class="source-line-no">4110</span><span id="line-4110">    return inputRowString.substring(0, i).equals(outputRowString.substring(0, o));</span>
+<span class="source-line-no">4111</span><span id="line-4111">  }</span>
+<span class="source-line-no">4112</span><span id="line-4112"></span>
+<span class="source-line-no">4113</span><span id="line-4113">  /**</span>
+<span class="source-line-no">4114</span><span id="line-4114">   * Sets up {@link MiniKdc} for testing security. Uses {@link HBaseKerberosUtils} to set the given</span>
+<span class="source-line-no">4115</span><span id="line-4115">   * keytab file as {@link HBaseKerberosUtils#KRB_KEYTAB_FILE}. FYI, there is also the easier-to-use</span>
+<span class="source-line-no">4116</span><span id="line-4116">   * kerby KDC server and utility for using it,</span>
+<span class="source-line-no">4117</span><span id="line-4117">   * {@link org.apache.hadoop.hbase.util.SimpleKdcServerUtil}. The kerby KDC server is preferred;</span>
+<span class="source-line-no">4118</span><span id="line-4118">   * less baggage. It came in in HBASE-5291.</span>
+<span class="source-line-no">4119</span><span id="line-4119">   */</span>
+<span class="source-line-no">4120</span><span id="line-4120">  public MiniKdc setupMiniKdc(File keytabFile) throws Exception {</span>
+<span class="source-line-no">4121</span><span id="line-4121">    Properties conf = MiniKdc.createConf();</span>
+<span class="source-line-no">4122</span><span id="line-4122">    conf.put(MiniKdc.DEBUG, true);</span>
+<span class="source-line-no">4123</span><span id="line-4123">    MiniKdc kdc = null;</span>
+<span class="source-line-no">4124</span><span id="line-4124">    File dir = null;</span>
+<span class="source-line-no">4125</span><span id="line-4125">    // There is time lag between selecting a port and trying to bind with it. It's possible that</span>
+<span class="source-line-no">4126</span><span id="line-4126">    // another service captures the port in between which'll result in BindException.</span>
+<span class="source-line-no">4127</span><span id="line-4127">    boolean bindException;</span>
+<span class="source-line-no">4128</span><span id="line-4128">    int numTries = 0;</span>
+<span class="source-line-no">4129</span><span id="line-4129">    do {</span>
+<span class="source-line-no">4130</span><span id="line-4130">      try {</span>
+<span class="source-line-no">4131</span><span id="line-4131">        bindException = false;</span>
+<span class="source-line-no">4132</span><span id="line-4132">        dir = new File(getDataTestDir("kdc").toUri().getPath());</span>
+<span class="source-line-no">4133</span><span id="line-4133">        kdc = new MiniKdc(conf, dir);</span>
+<span class="source-line-no">4134</span><span id="line-4134">        kdc.start();</span>
+<span class="source-line-no">4135</span><span id="line-4135">      } catch (BindException e) {</span>
+<span class="source-line-no">4136</span><span id="line-4136">        FileUtils.deleteDirectory(dir); // clean directory</span>
+<span class="source-line-no">4137</span><span id="line-4137">        numTries++;</span>
+<span class="source-line-no">4138</span><span id="line-4138">        if (numTries == 3) {</span>
+<span class="source-line-no">4139</span><span id="line-4139">          LOG.error("Failed setting up MiniKDC. Tried " + numTries + " times.");</span>
+<span class="source-line-no">4140</span><span id="line-4140">          throw e;</span>
+<span class="source-line-no">4141</span><span id="line-4141">        }</span>
+<span class="source-line-no">4142</span><span id="line-4142">        LOG.error("BindException encountered when setting up MiniKdc. Trying again.");</span>
+<span class="source-line-no">4143</span><span id="line-4143">        bindException = true;</span>
+<span class="source-line-no">4144</span><span id="line-4144">      }</span>
+<span class="source-line-no">4145</span><span id="line-4145">    } while (bindException);</span>
+<span class="source-line-no">4146</span><span id="line-4146">    HBaseKerberosUtils.setKeytabFileForTesting(keytabFile.getAbsolutePath());</span>
+<span class="source-line-no">4147</span><span id="line-4147">    return kdc;</span>
+<span class="source-line-no">4148</span><span id="line-4148">  }</span>
+<span class="source-line-no">4149</span><span id="line-4149"></span>
+<span class="source-line-no">4150</span><span id="line-4150">  public int getNumHFiles(final TableName tableName, final byte[] family) {</span>
+<span class="source-line-no">4151</span><span id="line-4151">    int numHFiles = 0;</span>
+<span class="source-line-no">4152</span><span id="line-4152">    for (RegionServerThread regionServerThread : getMiniHBaseCluster().getRegionServerThreads()) {</span>
+<span class="source-line-no">4153</span><span id="line-4153">      numHFiles += getNumHFilesForRS(regionServerThread.getRegionServer(), tableName, family);</span>
+<span class="source-line-no">4154</span><span id="line-4154">    }</span>
+<span class="source-line-no">4155</span><span id="line-4155">    return numHFiles;</span>
+<span class="source-line-no">4156</span><span id="line-4156">  }</span>
+<span class="source-line-no">4157</span><span id="line-4157"></span>
+<span class="source-line-no">4158</span><span id="line-4158">  public int getNumHFilesForRS(final HRegionServer rs, final TableName tableName,</span>
+<span class="source-line-no">4159</span><span id="line-4159">    final byte[] family) {</span>
+<span class="source-line-no">4160</span><span id="line-4160">    int numHFiles = 0;</span>
+<span class="source-line-no">4161</span><span id="line-4161">    for (Region region : rs.getRegions(tableName)) {</span>
+<span class="source-line-no">4162</span><span id="line-4162">      numHFiles += region.getStore(family).getStorefilesCount();</span>
+<span class="source-line-no">4163</span><span id="line-4163">    }</span>
+<span class="source-line-no">4164</span><span id="line-4164">    return numHFiles;</span>
+<span class="source-line-no">4165</span><span id="line-4165">  }</span>
+<span class="source-line-no">4166</span><span id="line-4166"></span>
+<span class="source-line-no">4167</span><span id="line-4167">  private void assertEquals(String message, int expected, int actual) {</span>
+<span class="source-line-no">4168</span><span id="line-4168">    if (expected == actual) {</span>
+<span class="source-line-no">4169</span><span id="line-4169">      return;</span>
+<span class="source-line-no">4170</span><span id="line-4170">    }</span>
+<span class="source-line-no">4171</span><span id="line-4171">    String formatted = "";</span>
+<span class="source-line-no">4172</span><span id="line-4172">    if (message != null &amp;&amp; !"".equals(message)) {</span>
+<span class="source-line-no">4173</span><span id="line-4173">      formatted = message + " ";</span>
+<span class="source-line-no">4174</span><span id="line-4174">    }</span>
+<span class="source-line-no">4175</span><span id="line-4175">    throw new AssertionError(formatted + "expected:&lt;" + expected + "&gt; but was:&lt;" + actual + "&gt;");</span>
+<span class="source-line-no">4176</span><span id="line-4176">  }</span>
+<span class="source-line-no">4177</span><span id="line-4177"></span>
+<span class="source-line-no">4178</span><span id="line-4178">  public void verifyTableDescriptorIgnoreTableName(TableDescriptor ltd, TableDescriptor rtd) {</span>
+<span class="source-line-no">4179</span><span id="line-4179">    if (ltd.getValues().hashCode() != rtd.getValues().hashCode()) {</span>
+<span class="source-line-no">4180</span><span id="line-4180">      throw new AssertionError();</span>
+<span class="source-line-no">4181</span><span id="line-4181">    }</span>
+<span class="source-line-no">4182</span><span id="line-4182">    assertEquals("", ltd.getValues().hashCode(), rtd.getValues().hashCode());</span>
+<span class="source-line-no">4183</span><span id="line-4183">    Collection&lt;ColumnFamilyDescriptor&gt; ltdFamilies = Arrays.asList(ltd.getColumnFamilies());</span>
+<span class="source-line-no">4184</span><span id="line-4184">    Collection&lt;ColumnFamilyDescriptor&gt; rtdFamilies = Arrays.asList(rtd.getColumnFamilies());</span>
+<span class="source-line-no">4185</span><span id="line-4185">    assertEquals("", ltdFamilies.size(), rtdFamilies.size());</span>
+<span class="source-line-no">4186</span><span id="line-4186">    for (Iterator&lt;ColumnFamilyDescriptor&gt; it = ltdFamilies.iterator(),</span>
+<span class="source-line-no">4187</span><span id="line-4187">        it2 = rtdFamilies.iterator(); it.hasNext();) {</span>
+<span class="source-line-no">4188</span><span id="line-4188">      assertEquals("", 0, ColumnFamilyDescriptor.COMPARATOR.compare(it.next(), it2.next()));</span>
+<span class="source-line-no">4189</span><span id="line-4189">    }</span>
+<span class="source-line-no">4190</span><span id="line-4190">  }</span>
+<span class="source-line-no">4191</span><span id="line-4191"></span>
+<span class="source-line-no">4192</span><span id="line-4192">  /**</span>
+<span class="source-line-no">4193</span><span id="line-4193">   * Await the successful return of {@code condition}, sleeping {@code sleepMillis} between</span>
+<span class="source-line-no">4194</span><span id="line-4194">   * invocations.</span>
+<span class="source-line-no">4195</span><span id="line-4195">   */</span>
+<span class="source-line-no">4196</span><span id="line-4196">  public static void await(final long sleepMillis, final BooleanSupplier condition)</span>
+<span class="source-line-no">4197</span><span id="line-4197">    throws InterruptedException {</span>
+<span class="source-line-no">4198</span><span id="line-4198">    try {</span>
+<span class="source-line-no">4199</span><span id="line-4199">      while (!condition.getAsBoolean()) {</span>
+<span class="source-line-no">4200</span><span id="line-4200">        Thread.sleep(sleepMillis);</span>
+<span class="source-line-no">4201</span><span id="line-4201">      }</span>
+<span class="source-line-no">4202</span><span id="line-4202">    } catch (RuntimeException e) {</span>
+<span class="source-line-no">4203</span><span id="line-4203">      if (e.getCause() instanceof AssertionError) {</span>
+<span class="source-line-no">4204</span><span id="line-4204">        throw (AssertionError) e.getCause();</span>
+<span class="source-line-no">4205</span><span id="line-4205">      }</span>
+<span class="source-line-no">4206</span><span id="line-4206">      throw e;</span>
+<span class="source-line-no">4207</span><span id="line-4207">    }</span>
+<span class="source-line-no">4208</span><span id="line-4208">  }</span>
+<span class="source-line-no">4209</span><span id="line-4209">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html b/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
index 339c24e37b9..e2f6f1c1f15 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/HBaseTestingUtility.html
@@ -156,2326 +156,2326 @@
 <span class="source-line-no">143</span><span id="line-143">import org.apache.hadoop.mapred.JobConf;</span>
 <span class="source-line-no">144</span><span id="line-144">import org.apache.hadoop.mapred.MiniMRCluster;</span>
 <span class="source-line-no">145</span><span id="line-145">import org.apache.hadoop.mapred.TaskLog;</span>
-<span class="source-line-no">146</span><span id="line-146">import org.apache.hadoop.minikdc.MiniKdc;</span>
-<span class="source-line-no">147</span><span id="line-147">import org.apache.yetus.audience.InterfaceAudience;</span>
-<span class="source-line-no">148</span><span id="line-148">import org.apache.zookeeper.WatchedEvent;</span>
-<span class="source-line-no">149</span><span id="line-149">import org.apache.zookeeper.ZooKeeper;</span>
-<span class="source-line-no">150</span><span id="line-150">import org.apache.zookeeper.ZooKeeper.States;</span>
-<span class="source-line-no">151</span><span id="line-151"></span>
-<span class="source-line-no">152</span><span id="line-152">import org.apache.hbase.thirdparty.com.google.common.io.Closeables;</span>
-<span class="source-line-no">153</span><span id="line-153"></span>
-<span class="source-line-no">154</span><span id="line-154">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
-<span class="source-line-no">155</span><span id="line-155"></span>
-<span class="source-line-no">156</span><span id="line-156">/**</span>
-<span class="source-line-no">157</span><span id="line-157"> * Facility for testing HBase. Replacement for old HBaseTestCase and HBaseClusterTestCase</span>
-<span class="source-line-no">158</span><span id="line-158"> * functionality. Create an instance and keep it around testing HBase. This class is meant to be</span>
-<span class="source-line-no">159</span><span id="line-159"> * your one-stop shop for anything you might need testing. Manages one cluster at a time only.</span>
-<span class="source-line-no">160</span><span id="line-160"> * Managed cluster can be an in-process {@link MiniHBaseCluster}, or a deployed cluster of type</span>
-<span class="source-line-no">161</span><span id="line-161"> * {@code DistributedHBaseCluster}. Not all methods work with the real cluster. Depends on log4j</span>
-<span class="source-line-no">162</span><span id="line-162"> * being on classpath and hbase-site.xml for logging and test-run configuration. It does not set</span>
-<span class="source-line-no">163</span><span id="line-163"> * logging levels. In the configuration properties, default values for master-info-port and</span>
-<span class="source-line-no">164</span><span id="line-164"> * region-server-port are overridden such that a random port will be assigned (thus avoiding port</span>
-<span class="source-line-no">165</span><span id="line-165"> * contention if another local HBase instance is already running).</span>
-<span class="source-line-no">166</span><span id="line-166"> * &lt;p&gt;</span>
-<span class="source-line-no">167</span><span id="line-167"> * To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"</span>
-<span class="source-line-no">168</span><span id="line-168"> * setting it to true.</span>
-<span class="source-line-no">169</span><span id="line-169"> * @deprecated since 3.0.0, will be removed in 4.0.0. Use</span>
-<span class="source-line-no">170</span><span id="line-170"> *             {@link org.apache.hadoop.hbase.testing.TestingHBaseCluster} instead.</span>
-<span class="source-line-no">171</span><span id="line-171"> */</span>
-<span class="source-line-no">172</span><span id="line-172">@InterfaceAudience.Public</span>
-<span class="source-line-no">173</span><span id="line-173">@Deprecated</span>
-<span class="source-line-no">174</span><span id="line-174">public class HBaseTestingUtility extends HBaseZKTestingUtility {</span>
-<span class="source-line-no">175</span><span id="line-175"></span>
-<span class="source-line-no">176</span><span id="line-176">  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";</span>
-<span class="source-line-no">177</span><span id="line-177">  /**</span>
-<span class="source-line-no">178</span><span id="line-178">   * The default number of regions per regionserver when creating a pre-split table.</span>
-<span class="source-line-no">179</span><span id="line-179">   */</span>
-<span class="source-line-no">180</span><span id="line-180">  public static final int DEFAULT_REGIONS_PER_SERVER = 3;</span>
-<span class="source-line-no">181</span><span id="line-181"></span>
-<span class="source-line-no">182</span><span id="line-182">  private MiniDFSCluster dfsCluster = null;</span>
-<span class="source-line-no">183</span><span id="line-183">  private FsDatasetAsyncDiskServiceFixer dfsClusterFixer = null;</span>
-<span class="source-line-no">184</span><span id="line-184"></span>
-<span class="source-line-no">185</span><span id="line-185">  private volatile HBaseCluster hbaseCluster = null;</span>
-<span class="source-line-no">186</span><span id="line-186">  private MiniMRCluster mrCluster = null;</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">  /** If there is a mini cluster running for this testing utility instance. */</span>
-<span class="source-line-no">189</span><span id="line-189">  private volatile boolean miniClusterRunning;</span>
-<span class="source-line-no">190</span><span id="line-190"></span>
-<span class="source-line-no">191</span><span id="line-191">  private String hadoopLogDir;</span>
-<span class="source-line-no">192</span><span id="line-192"></span>
-<span class="source-line-no">193</span><span id="line-193">  /**</span>
-<span class="source-line-no">194</span><span id="line-194">   * Directory on test filesystem where we put the data for this instance of HBaseTestingUtility</span>
-<span class="source-line-no">195</span><span id="line-195">   */</span>
-<span class="source-line-no">196</span><span id="line-196">  private Path dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">197</span><span id="line-197"></span>
-<span class="source-line-no">198</span><span id="line-198">  private final AtomicReference&lt;AsyncClusterConnection&gt; asyncConnection = new AtomicReference&lt;&gt;();</span>
-<span class="source-line-no">199</span><span id="line-199"></span>
-<span class="source-line-no">200</span><span id="line-200">  /** Filesystem URI used for map-reduce mini-cluster setup */</span>
-<span class="source-line-no">201</span><span id="line-201">  private static String FS_URI;</span>
-<span class="source-line-no">202</span><span id="line-202"></span>
-<span class="source-line-no">203</span><span id="line-203">  /** This is for unit tests parameterized with a single boolean. */</span>
-<span class="source-line-no">204</span><span id="line-204">  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();</span>
-<span class="source-line-no">205</span><span id="line-205"></span>
-<span class="source-line-no">206</span><span id="line-206">  private Admin hbaseAdmin = null;</span>
-<span class="source-line-no">207</span><span id="line-207"></span>
-<span class="source-line-no">208</span><span id="line-208">  /**</span>
-<span class="source-line-no">209</span><span id="line-209">   * Checks to see if a specific port is available.</span>
-<span class="source-line-no">210</span><span id="line-210">   * @param port the port number to check for availability</span>
-<span class="source-line-no">211</span><span id="line-211">   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not</span>
-<span class="source-line-no">212</span><span id="line-212">   */</span>
-<span class="source-line-no">213</span><span id="line-213">  public static boolean available(int port) {</span>
-<span class="source-line-no">214</span><span id="line-214">    ServerSocket ss = null;</span>
-<span class="source-line-no">215</span><span id="line-215">    DatagramSocket ds = null;</span>
-<span class="source-line-no">216</span><span id="line-216">    try {</span>
-<span class="source-line-no">217</span><span id="line-217">      ss = new ServerSocket(port);</span>
-<span class="source-line-no">218</span><span id="line-218">      ss.setReuseAddress(true);</span>
-<span class="source-line-no">219</span><span id="line-219">      ds = new DatagramSocket(port);</span>
-<span class="source-line-no">220</span><span id="line-220">      ds.setReuseAddress(true);</span>
-<span class="source-line-no">221</span><span id="line-221">      return true;</span>
-<span class="source-line-no">222</span><span id="line-222">    } catch (IOException e) {</span>
-<span class="source-line-no">223</span><span id="line-223">      // Do nothing</span>
-<span class="source-line-no">224</span><span id="line-224">    } finally {</span>
-<span class="source-line-no">225</span><span id="line-225">      if (ds != null) {</span>
-<span class="source-line-no">226</span><span id="line-226">        ds.close();</span>
-<span class="source-line-no">227</span><span id="line-227">      }</span>
-<span class="source-line-no">228</span><span id="line-228"></span>
-<span class="source-line-no">229</span><span id="line-229">      if (ss != null) {</span>
-<span class="source-line-no">230</span><span id="line-230">        try {</span>
-<span class="source-line-no">231</span><span id="line-231">          ss.close();</span>
-<span class="source-line-no">232</span><span id="line-232">        } catch (IOException e) {</span>
-<span class="source-line-no">233</span><span id="line-233">          /* should not be thrown */</span>
-<span class="source-line-no">234</span><span id="line-234">        }</span>
-<span class="source-line-no">235</span><span id="line-235">      }</span>
-<span class="source-line-no">236</span><span id="line-236">    }</span>
-<span class="source-line-no">237</span><span id="line-237"></span>
-<span class="source-line-no">238</span><span id="line-238">    return false;</span>
-<span class="source-line-no">239</span><span id="line-239">  }</span>
-<span class="source-line-no">240</span><span id="line-240"></span>
-<span class="source-line-no">241</span><span id="line-241">  /**</span>
-<span class="source-line-no">242</span><span id="line-242">   * Create all combinations of Bloom filters and compression algorithms for testing.</span>
-<span class="source-line-no">243</span><span id="line-243">   */</span>
-<span class="source-line-no">244</span><span id="line-244">  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {</span>
-<span class="source-line-no">245</span><span id="line-245">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">246</span><span id="line-246">    for (Compression.Algorithm comprAlgo : HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {</span>
-<span class="source-line-no">247</span><span id="line-247">      for (BloomType bloomType : BloomType.values()) {</span>
-<span class="source-line-no">248</span><span id="line-248">        configurations.add(new Object[] { comprAlgo, bloomType });</span>
-<span class="source-line-no">249</span><span id="line-249">      }</span>
-<span class="source-line-no">250</span><span id="line-250">    }</span>
-<span class="source-line-no">251</span><span id="line-251">    return Collections.unmodifiableList(configurations);</span>
+<span class="source-line-no">146</span><span id="line-146">import org.apache.hadoop.metrics2.impl.JmxCacheBuster;</span>
+<span class="source-line-no">147</span><span id="line-147">import org.apache.hadoop.minikdc.MiniKdc;</span>
+<span class="source-line-no">148</span><span id="line-148">import org.apache.yetus.audience.InterfaceAudience;</span>
+<span class="source-line-no">149</span><span id="line-149">import org.apache.zookeeper.WatchedEvent;</span>
+<span class="source-line-no">150</span><span id="line-150">import org.apache.zookeeper.ZooKeeper;</span>
+<span class="source-line-no">151</span><span id="line-151">import org.apache.zookeeper.ZooKeeper.States;</span>
+<span class="source-line-no">152</span><span id="line-152"></span>
+<span class="source-line-no">153</span><span id="line-153">import org.apache.hbase.thirdparty.com.google.common.io.Closeables;</span>
+<span class="source-line-no">154</span><span id="line-154"></span>
+<span class="source-line-no">155</span><span id="line-155">import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;</span>
+<span class="source-line-no">156</span><span id="line-156"></span>
+<span class="source-line-no">157</span><span id="line-157">/**</span>
+<span class="source-line-no">158</span><span id="line-158"> * Facility for testing HBase. Replacement for old HBaseTestCase and HBaseClusterTestCase</span>
+<span class="source-line-no">159</span><span id="line-159"> * functionality. Create an instance and keep it around testing HBase. This class is meant to be</span>
+<span class="source-line-no">160</span><span id="line-160"> * your one-stop shop for anything you might need testing. Manages one cluster at a time only.</span>
+<span class="source-line-no">161</span><span id="line-161"> * Managed cluster can be an in-process {@link MiniHBaseCluster}, or a deployed cluster of type</span>
+<span class="source-line-no">162</span><span id="line-162"> * {@code DistributedHBaseCluster}. Not all methods work with the real cluster. Depends on log4j</span>
+<span class="source-line-no">163</span><span id="line-163"> * being on classpath and hbase-site.xml for logging and test-run configuration. It does not set</span>
+<span class="source-line-no">164</span><span id="line-164"> * logging levels. In the configuration properties, default values for master-info-port and</span>
+<span class="source-line-no">165</span><span id="line-165"> * region-server-port are overridden such that a random port will be assigned (thus avoiding port</span>
+<span class="source-line-no">166</span><span id="line-166"> * contention if another local HBase instance is already running).</span>
+<span class="source-line-no">167</span><span id="line-167"> * &lt;p&gt;</span>
+<span class="source-line-no">168</span><span id="line-168"> * To preserve test data directories, pass the system property "hbase.testing.preserve.testdir"</span>
+<span class="source-line-no">169</span><span id="line-169"> * setting it to true.</span>
+<span class="source-line-no">170</span><span id="line-170"> * @deprecated since 3.0.0, will be removed in 4.0.0. Use</span>
+<span class="source-line-no">171</span><span id="line-171"> *             {@link org.apache.hadoop.hbase.testing.TestingHBaseCluster} instead.</span>
+<span class="source-line-no">172</span><span id="line-172"> */</span>
+<span class="source-line-no">173</span><span id="line-173">@InterfaceAudience.Public</span>
+<span class="source-line-no">174</span><span id="line-174">@Deprecated</span>
+<span class="source-line-no">175</span><span id="line-175">public class HBaseTestingUtility extends HBaseZKTestingUtility {</span>
+<span class="source-line-no">176</span><span id="line-176"></span>
+<span class="source-line-no">177</span><span id="line-177">  public static final String REGIONS_PER_SERVER_KEY = "hbase.test.regions-per-server";</span>
+<span class="source-line-no">178</span><span id="line-178">  /**</span>
+<span class="source-line-no">179</span><span id="line-179">   * The default number of regions per regionserver when creating a pre-split table.</span>
+<span class="source-line-no">180</span><span id="line-180">   */</span>
+<span class="source-line-no">181</span><span id="line-181">  public static final int DEFAULT_REGIONS_PER_SERVER = 3;</span>
+<span class="source-line-no">182</span><span id="line-182"></span>
+<span class="source-line-no">183</span><span id="line-183">  private MiniDFSCluster dfsCluster = null;</span>
+<span class="source-line-no">184</span><span id="line-184">  private FsDatasetAsyncDiskServiceFixer dfsClusterFixer = null;</span>
+<span class="source-line-no">185</span><span id="line-185"></span>
+<span class="source-line-no">186</span><span id="line-186">  private volatile HBaseCluster hbaseCluster = null;</span>
+<span class="source-line-no">187</span><span id="line-187">  private MiniMRCluster mrCluster = null;</span>
+<span class="source-line-no">188</span><span id="line-188"></span>
+<span class="source-line-no">189</span><span id="line-189">  /** If there is a mini cluster running for this testing utility instance. */</span>
+<span class="source-line-no">190</span><span id="line-190">  private volatile boolean miniClusterRunning;</span>
+<span class="source-line-no">191</span><span id="line-191"></span>
+<span class="source-line-no">192</span><span id="line-192">  private String hadoopLogDir;</span>
+<span class="source-line-no">193</span><span id="line-193"></span>
+<span class="source-line-no">194</span><span id="line-194">  /**</span>
+<span class="source-line-no">195</span><span id="line-195">   * Directory on test filesystem where we put the data for this instance of HBaseTestingUtility</span>
+<span class="source-line-no">196</span><span id="line-196">   */</span>
+<span class="source-line-no">197</span><span id="line-197">  private Path dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">198</span><span id="line-198"></span>
+<span class="source-line-no">199</span><span id="line-199">  private final AtomicReference&lt;AsyncClusterConnection&gt; asyncConnection = new AtomicReference&lt;&gt;();</span>
+<span class="source-line-no">200</span><span id="line-200"></span>
+<span class="source-line-no">201</span><span id="line-201">  /** Filesystem URI used for map-reduce mini-cluster setup */</span>
+<span class="source-line-no">202</span><span id="line-202">  private static String FS_URI;</span>
+<span class="source-line-no">203</span><span id="line-203"></span>
+<span class="source-line-no">204</span><span id="line-204">  /** This is for unit tests parameterized with a single boolean. */</span>
+<span class="source-line-no">205</span><span id="line-205">  public static final List&lt;Object[]&gt; MEMSTORETS_TAGS_PARAMETRIZED = memStoreTSAndTagsCombination();</span>
+<span class="source-line-no">206</span><span id="line-206"></span>
+<span class="source-line-no">207</span><span id="line-207">  private Admin hbaseAdmin = null;</span>
+<span class="source-line-no">208</span><span id="line-208"></span>
+<span class="source-line-no">209</span><span id="line-209">  static {</span>
+<span class="source-line-no">210</span><span id="line-210">    // JmxCacheBuster may cause dead lock in test environment. As on master side, the table/region</span>
+<span class="source-line-no">211</span><span id="line-211">    // related metrics updating will finally lead to a meta access, so if meta is not online yet, we</span>
+<span class="source-line-no">212</span><span id="line-212">    // will block when updating while holding the metrics lock. But when we assign meta, there are</span>
+<span class="source-line-no">213</span><span id="line-213">    // bunch of places where we need to register a new metrics thus need to get the metrics lock,</span>
+<span class="source-line-no">214</span><span id="line-214">    // and then lead to a dead lock and cause the test to hang forever.</span>
+<span class="source-line-no">215</span><span id="line-215">    // The code is in hadoop so there is no easy way for us to fix, so here we just stop</span>
+<span class="source-line-no">216</span><span id="line-216">    // JmxCacheBuster to stabilize our tests first. See HBASE-30118 for more details and future</span>
+<span class="source-line-no">217</span><span id="line-217">    // plans.</span>
+<span class="source-line-no">218</span><span id="line-218">    JmxCacheBuster.stop();</span>
+<span class="source-line-no">219</span><span id="line-219">  }</span>
+<span class="source-line-no">220</span><span id="line-220"></span>
+<span class="source-line-no">221</span><span id="line-221">  /**</span>
+<span class="source-line-no">222</span><span id="line-222">   * Checks to see if a specific port is available.</span>
+<span class="source-line-no">223</span><span id="line-223">   * @param port the port number to check for availability</span>
+<span class="source-line-no">224</span><span id="line-224">   * @return &lt;tt&gt;true&lt;/tt&gt; if the port is available, or &lt;tt&gt;false&lt;/tt&gt; if not</span>
+<span class="source-line-no">225</span><span id="line-225">   */</span>
+<span class="source-line-no">226</span><span id="line-226">  public static boolean available(int port) {</span>
+<span class="source-line-no">227</span><span id="line-227">    ServerSocket ss = null;</span>
+<span class="source-line-no">228</span><span id="line-228">    DatagramSocket ds = null;</span>
+<span class="source-line-no">229</span><span id="line-229">    try {</span>
+<span class="source-line-no">230</span><span id="line-230">      ss = new ServerSocket(port);</span>
+<span class="source-line-no">231</span><span id="line-231">      ss.setReuseAddress(true);</span>
+<span class="source-line-no">232</span><span id="line-232">      ds = new DatagramSocket(port);</span>
+<span class="source-line-no">233</span><span id="line-233">      ds.setReuseAddress(true);</span>
+<span class="source-line-no">234</span><span id="line-234">      return true;</span>
+<span class="source-line-no">235</span><span id="line-235">    } catch (IOException e) {</span>
+<span class="source-line-no">236</span><span id="line-236">      // Do nothing</span>
+<span class="source-line-no">237</span><span id="line-237">    } finally {</span>
+<span class="source-line-no">238</span><span id="line-238">      if (ds != null) {</span>
+<span class="source-line-no">239</span><span id="line-239">        ds.close();</span>
+<span class="source-line-no">240</span><span id="line-240">      }</span>
+<span class="source-line-no">241</span><span id="line-241"></span>
+<span class="source-line-no">242</span><span id="line-242">      if (ss != null) {</span>
+<span class="source-line-no">243</span><span id="line-243">        try {</span>
+<span class="source-line-no">244</span><span id="line-244">          ss.close();</span>
+<span class="source-line-no">245</span><span id="line-245">        } catch (IOException e) {</span>
+<span class="source-line-no">246</span><span id="line-246">          /* should not be thrown */</span>
+<span class="source-line-no">247</span><span id="line-247">        }</span>
+<span class="source-line-no">248</span><span id="line-248">      }</span>
+<span class="source-line-no">249</span><span id="line-249">    }</span>
+<span class="source-line-no">250</span><span id="line-250"></span>
+<span class="source-line-no">251</span><span id="line-251">    return false;</span>
 <span class="source-line-no">252</span><span id="line-252">  }</span>
 <span class="source-line-no">253</span><span id="line-253"></span>
 <span class="source-line-no">254</span><span id="line-254">  /**</span>
-<span class="source-line-no">255</span><span id="line-255">   * Create combination of memstoreTS and tags</span>
+<span class="source-line-no">255</span><span id="line-255">   * Create all combinations of Bloom filters and compression algorithms for testing.</span>
 <span class="source-line-no">256</span><span id="line-256">   */</span>
-<span class="source-line-no">257</span><span id="line-257">  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {</span>
+<span class="source-line-no">257</span><span id="line-257">  private static List&lt;Object[]&gt; bloomAndCompressionCombinations() {</span>
 <span class="source-line-no">258</span><span id="line-258">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">259</span><span id="line-259">    configurations.add(new Object[] { false, false });</span>
-<span class="source-line-no">260</span><span id="line-260">    configurations.add(new Object[] { false, true });</span>
-<span class="source-line-no">261</span><span id="line-261">    configurations.add(new Object[] { true, false });</span>
-<span class="source-line-no">262</span><span id="line-262">    configurations.add(new Object[] { true, true });</span>
-<span class="source-line-no">263</span><span id="line-263">    return Collections.unmodifiableList(configurations);</span>
-<span class="source-line-no">264</span><span id="line-264">  }</span>
-<span class="source-line-no">265</span><span id="line-265"></span>
-<span class="source-line-no">266</span><span id="line-266">  public static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {</span>
-<span class="source-line-no">267</span><span id="line-267">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
-<span class="source-line-no">268</span><span id="line-268">    configurations.add(new Object[] { false, false, true });</span>
-<span class="source-line-no">269</span><span id="line-269">    configurations.add(new Object[] { false, false, false });</span>
-<span class="source-line-no">270</span><span id="line-270">    configurations.add(new Object[] { false, true, true });</span>
-<span class="source-line-no">271</span><span id="line-271">    configurations.add(new Object[] { false, true, false });</span>
-<span class="source-line-no">272</span><span id="line-272">    configurations.add(new Object[] { true, false, true });</span>
-<span class="source-line-no">273</span><span id="line-273">    configurations.add(new Object[] { true, false, false });</span>
-<span class="source-line-no">274</span><span id="line-274">    configurations.add(new Object[] { true, true, true });</span>
-<span class="source-line-no">275</span><span id="line-275">    configurations.add(new Object[] { true, true, false });</span>
+<span class="source-line-no">259</span><span id="line-259">    for (Compression.Algorithm comprAlgo : HBaseCommonTestingUtility.COMPRESSION_ALGORITHMS) {</span>
+<span class="source-line-no">260</span><span id="line-260">      for (BloomType bloomType : BloomType.values()) {</span>
+<span class="source-line-no">261</span><span id="line-261">        configurations.add(new Object[] { comprAlgo, bloomType });</span>
+<span class="source-line-no">262</span><span id="line-262">      }</span>
+<span class="source-line-no">263</span><span id="line-263">    }</span>
+<span class="source-line-no">264</span><span id="line-264">    return Collections.unmodifiableList(configurations);</span>
+<span class="source-line-no">265</span><span id="line-265">  }</span>
+<span class="source-line-no">266</span><span id="line-266"></span>
+<span class="source-line-no">267</span><span id="line-267">  /**</span>
+<span class="source-line-no">268</span><span id="line-268">   * Create combination of memstoreTS and tags</span>
+<span class="source-line-no">269</span><span id="line-269">   */</span>
+<span class="source-line-no">270</span><span id="line-270">  private static List&lt;Object[]&gt; memStoreTSAndTagsCombination() {</span>
+<span class="source-line-no">271</span><span id="line-271">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">272</span><span id="line-272">    configurations.add(new Object[] { false, false });</span>
+<span class="source-line-no">273</span><span id="line-273">    configurations.add(new Object[] { false, true });</span>
+<span class="source-line-no">274</span><span id="line-274">    configurations.add(new Object[] { true, false });</span>
+<span class="source-line-no">275</span><span id="line-275">    configurations.add(new Object[] { true, true });</span>
 <span class="source-line-no">276</span><span id="line-276">    return Collections.unmodifiableList(configurations);</span>
 <span class="source-line-no">277</span><span id="line-277">  }</span>
 <span class="source-line-no">278</span><span id="line-278"></span>
-<span class="source-line-no">279</span><span id="line-279">  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =</span>
-<span class="source-line-no">280</span><span id="line-280">    bloomAndCompressionCombinations();</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">  /**</span>
-<span class="source-line-no">283</span><span id="line-283">   * &lt;p&gt;</span>
-<span class="source-line-no">284</span><span id="line-284">   * Create an HBaseTestingUtility using a default configuration.</span>
-<span class="source-line-no">285</span><span id="line-285">   * &lt;p&gt;</span>
-<span class="source-line-no">286</span><span id="line-286">   * Initially, all tmp files are written to a local test data directory. Once</span>
-<span class="source-line-no">287</span><span id="line-287">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
-<span class="source-line-no">288</span><span id="line-288">   * data will be written to the DFS directory instead.</span>
-<span class="source-line-no">289</span><span id="line-289">   */</span>
-<span class="source-line-no">290</span><span id="line-290">  public HBaseTestingUtility() {</span>
-<span class="source-line-no">291</span><span id="line-291">    this(HBaseConfiguration.create());</span>
-<span class="source-line-no">292</span><span id="line-292">  }</span>
-<span class="source-line-no">293</span><span id="line-293"></span>
-<span class="source-line-no">294</span><span id="line-294">  /**</span>
-<span class="source-line-no">295</span><span id="line-295">   * &lt;p&gt;</span>
-<span class="source-line-no">296</span><span id="line-296">   * Create an HBaseTestingUtility using a given configuration.</span>
-<span class="source-line-no">297</span><span id="line-297">   * &lt;p&gt;</span>
-<span class="source-line-no">298</span><span id="line-298">   * Initially, all tmp files are written to a local test data directory. Once</span>
-<span class="source-line-no">299</span><span id="line-299">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
-<span class="source-line-no">300</span><span id="line-300">   * data will be written to the DFS directory instead.</span>
-<span class="source-line-no">301</span><span id="line-301">   * @param conf The configuration to use for further operations</span>
+<span class="source-line-no">279</span><span id="line-279">  public static List&lt;Object[]&gt; memStoreTSTagsAndOffheapCombination() {</span>
+<span class="source-line-no">280</span><span id="line-280">    List&lt;Object[]&gt; configurations = new ArrayList&lt;&gt;();</span>
+<span class="source-line-no">281</span><span id="line-281">    configurations.add(new Object[] { false, false, true });</span>
+<span class="source-line-no">282</span><span id="line-282">    configurations.add(new Object[] { false, false, false });</span>
+<span class="source-line-no">283</span><span id="line-283">    configurations.add(new Object[] { false, true, true });</span>
+<span class="source-line-no">284</span><span id="line-284">    configurations.add(new Object[] { false, true, false });</span>
+<span class="source-line-no">285</span><span id="line-285">    configurations.add(new Object[] { true, false, true });</span>
+<span class="source-line-no">286</span><span id="line-286">    configurations.add(new Object[] { true, false, false });</span>
+<span class="source-line-no">287</span><span id="line-287">    configurations.add(new Object[] { true, true, true });</span>
+<span class="source-line-no">288</span><span id="line-288">    configurations.add(new Object[] { true, true, false });</span>
+<span class="source-line-no">289</span><span id="line-289">    return Collections.unmodifiableList(configurations);</span>
+<span class="source-line-no">290</span><span id="line-290">  }</span>
+<span class="source-line-no">291</span><span id="line-291"></span>
+<span class="source-line-no">292</span><span id="line-292">  public static final Collection&lt;Object[]&gt; BLOOM_AND_COMPRESSION_COMBINATIONS =</span>
+<span class="source-line-no">293</span><span id="line-293">    bloomAndCompressionCombinations();</span>
+<span class="source-line-no">294</span><span id="line-294"></span>
+<span class="source-line-no">295</span><span id="line-295">  /**</span>
+<span class="source-line-no">296</span><span id="line-296">   * &lt;p&gt;</span>
+<span class="source-line-no">297</span><span id="line-297">   * Create an HBaseTestingUtility using a default configuration.</span>
+<span class="source-line-no">298</span><span id="line-298">   * &lt;p&gt;</span>
+<span class="source-line-no">299</span><span id="line-299">   * Initially, all tmp files are written to a local test data directory. Once</span>
+<span class="source-line-no">300</span><span id="line-300">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
+<span class="source-line-no">301</span><span id="line-301">   * data will be written to the DFS directory instead.</span>
 <span class="source-line-no">302</span><span id="line-302">   */</span>
-<span class="source-line-no">303</span><span id="line-303">  public HBaseTestingUtility(Configuration conf) {</span>
-<span class="source-line-no">304</span><span id="line-304">    super(conf);</span>
-<span class="source-line-no">305</span><span id="line-305"></span>
-<span class="source-line-no">306</span><span id="line-306">    // a hbase checksum verification failure will cause unit tests to fail</span>
-<span class="source-line-no">307</span><span id="line-307">    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);</span>
-<span class="source-line-no">308</span><span id="line-308"></span>
-<span class="source-line-no">309</span><span id="line-309">    // Save this for when setting default file:// breaks things</span>
-<span class="source-line-no">310</span><span id="line-310">    if (this.conf.get("fs.defaultFS") != null) {</span>
-<span class="source-line-no">311</span><span id="line-311">      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));</span>
-<span class="source-line-no">312</span><span id="line-312">    }</span>
-<span class="source-line-no">313</span><span id="line-313">    if (this.conf.get(HConstants.HBASE_DIR) != null) {</span>
-<span class="source-line-no">314</span><span id="line-314">      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));</span>
-<span class="source-line-no">315</span><span id="line-315">    }</span>
-<span class="source-line-no">316</span><span id="line-316">    // Every cluster is a local cluster until we start DFS</span>
-<span class="source-line-no">317</span><span id="line-317">    // Note that conf could be null, but this.conf will not be</span>
-<span class="source-line-no">318</span><span id="line-318">    String dataTestDir = getDataTestDir().toString();</span>
-<span class="source-line-no">319</span><span id="line-319">    this.conf.set("fs.defaultFS", "file:///");</span>
-<span class="source-line-no">320</span><span id="line-320">    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);</span>
-<span class="source-line-no">321</span><span id="line-321">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
-<span class="source-line-no">322</span><span id="line-322">    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, false);</span>
-<span class="source-line-no">323</span><span id="line-323">    // If the value for random ports isn't set set it to true, thus making</span>
-<span class="source-line-no">324</span><span id="line-324">    // tests opt-out for random port assignment</span>
-<span class="source-line-no">325</span><span id="line-325">    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,</span>
-<span class="source-line-no">326</span><span id="line-326">      this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));</span>
-<span class="source-line-no">327</span><span id="line-327">  }</span>
-<span class="source-line-no">328</span><span id="line-328"></span>
-<span class="source-line-no">329</span><span id="line-329">  /**</span>
-<span class="source-line-no">330</span><span id="line-330">   * Close both the region {@code r} and it's underlying WAL. For use in tests.</span>
-<span class="source-line-no">331</span><span id="line-331">   */</span>
-<span class="source-line-no">332</span><span id="line-332">  public static void closeRegionAndWAL(final Region r) throws IOException {</span>
-<span class="source-line-no">333</span><span id="line-333">    closeRegionAndWAL((HRegion) r);</span>
-<span class="source-line-no">334</span><span id="line-334">  }</span>
-<span class="source-line-no">335</span><span id="line-335"></span>
-<span class="source-line-no">336</span><span id="line-336">  /**</span>
-<span class="source-line-no">337</span><span id="line-337">   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.</span>
-<span class="source-line-no">338</span><span id="line-338">   */</span>
-<span class="source-line-no">339</span><span id="line-339">  public static void closeRegionAndWAL(final HRegion r) throws IOException {</span>
-<span class="source-line-no">340</span><span id="line-340">    if (r == null) return;</span>
-<span class="source-line-no">341</span><span id="line-341">    r.close();</span>
-<span class="source-line-no">342</span><span id="line-342">    if (r.getWAL() == null) return;</span>
-<span class="source-line-no">343</span><span id="line-343">    r.getWAL().close();</span>
-<span class="source-line-no">344</span><span id="line-344">  }</span>
-<span class="source-line-no">345</span><span id="line-345"></span>
-<span class="source-line-no">346</span><span id="line-346">  /**</span>
-<span class="source-line-no">347</span><span id="line-347">   * Returns this classes's instance of {@link Configuration}. Be careful how you use the returned</span>
-<span class="source-line-no">348</span><span id="line-348">   * Configuration since {@link Connection} instances can be shared. The Map of Connections is keyed</span>
-<span class="source-line-no">349</span><span id="line-349">   * by the Configuration. If say, a Connection was being used against a cluster that had been</span>
-<span class="source-line-no">350</span><span id="line-350">   * shutdown, see {@link #shutdownMiniCluster()}, then the Connection will no longer be wholesome.</span>
-<span class="source-line-no">351</span><span id="line-351">   * Rather than use the return direct, its usually best to make a copy and use that. Do</span>
-<span class="source-line-no">352</span><span id="line-352">   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;</span>
-<span class="source-line-no">353</span><span id="line-353">   * @return Instance of Configuration.</span>
-<span class="source-line-no">354</span><span id="line-354">   */</span>
-<span class="source-line-no">355</span><span id="line-355">  @Override</span>
-<span class="source-line-no">356</span><span id="line-356">  public Configuration getConfiguration() {</span>
-<span class="source-line-no">357</span><span id="line-357">    return super.getConfiguration();</span>
-<span class="source-line-no">358</span><span id="line-358">  }</span>
-<span class="source-line-no">359</span><span id="line-359"></span>
-<span class="source-line-no">360</span><span id="line-360">  public void setHBaseCluster(HBaseCluster hbaseCluster) {</span>
-<span class="source-line-no">361</span><span id="line-361">    this.hbaseCluster = hbaseCluster;</span>
-<span class="source-line-no">362</span><span id="line-362">  }</span>
-<span class="source-line-no">363</span><span id="line-363"></span>
-<span class="source-line-no">364</span><span id="line-364">  /**</span>
-<span class="source-line-no">365</span><span id="line-365">   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}. Give it a random name so can</span>
-<span class="source-line-no">366</span><span id="line-366">   * have many concurrent tests running if we need to. Moding a System property is not the way to do</span>
-<span class="source-line-no">367</span><span id="line-367">   * concurrent instances -- another instance could grab the temporary value unintentionally -- but</span>
-<span class="source-line-no">368</span><span id="line-368">   * not anything can do about it at moment; single instance only is how the minidfscluster works.</span>
-<span class="source-line-no">369</span><span id="line-369">   * We also create the underlying directory names for hadoop.log.dir, mapreduce.cluster.local.dir</span>
-<span class="source-line-no">370</span><span id="line-370">   * and hadoop.tmp.dir, and set the values in the conf, and as a system property for hadoop.tmp.dir</span>
-<span class="source-line-no">371</span><span id="line-371">   * (We do not create them!).</span>
-<span class="source-line-no">372</span><span id="line-372">   * @return The calculated data test build directory, if newly-created.</span>
-<span class="source-line-no">373</span><span id="line-373">   */</span>
-<span class="source-line-no">374</span><span id="line-374">  @Override</span>
-<span class="source-line-no">375</span><span id="line-375">  protected Path setupDataTestDir() {</span>
-<span class="source-line-no">376</span><span id="line-376">    Path testPath = super.setupDataTestDir();</span>
-<span class="source-line-no">377</span><span id="line-377">    if (null == testPath) {</span>
-<span class="source-line-no">378</span><span id="line-378">      return null;</span>
-<span class="source-line-no">379</span><span id="line-379">    }</span>
-<span class="source-line-no">380</span><span id="line-380"></span>
-<span class="source-line-no">381</span><span id="line-381">    createSubDirAndSystemProperty("hadoop.log.dir", testPath, "hadoop-log-dir");</span>
-<span class="source-line-no">382</span><span id="line-382"></span>
-<span class="source-line-no">383</span><span id="line-383">    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but</span>
-<span class="source-line-no">384</span><span id="line-384">    // we want our own value to ensure uniqueness on the same machine</span>
-<span class="source-line-no">385</span><span id="line-385">    createSubDirAndSystemProperty("hadoop.tmp.dir", testPath, "hadoop-tmp-dir");</span>
-<span class="source-line-no">386</span><span id="line-386"></span>
-<span class="source-line-no">387</span><span id="line-387">    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster</span>
-<span class="source-line-no">388</span><span id="line-388">    createSubDir("mapreduce.cluster.local.dir", testPath, "mapred-local-dir");</span>
-<span class="source-line-no">389</span><span id="line-389">    return testPath;</span>
-<span class="source-line-no">390</span><span id="line-390">  }</span>
-<span class="source-line-no">391</span><span id="line-391"></span>
-<span class="source-line-no">392</span><span id="line-392">  private void createSubDirAndSystemProperty(String propertyName, Path parent, String subDirName) {</span>
+<span class="source-line-no">303</span><span id="line-303">  public HBaseTestingUtility() {</span>
+<span class="source-line-no">304</span><span id="line-304">    this(HBaseConfiguration.create());</span>
+<span class="source-line-no">305</span><span id="line-305">  }</span>
+<span class="source-line-no">306</span><span id="line-306"></span>
+<span class="source-line-no">307</span><span id="line-307">  /**</span>
+<span class="source-line-no">308</span><span id="line-308">   * &lt;p&gt;</span>
+<span class="source-line-no">309</span><span id="line-309">   * Create an HBaseTestingUtility using a given configuration.</span>
+<span class="source-line-no">310</span><span id="line-310">   * &lt;p&gt;</span>
+<span class="source-line-no">311</span><span id="line-311">   * Initially, all tmp files are written to a local test data directory. Once</span>
+<span class="source-line-no">312</span><span id="line-312">   * {@link #startMiniDFSCluster} is called, either directly or via {@link #startMiniCluster()}, tmp</span>
+<span class="source-line-no">313</span><span id="line-313">   * data will be written to the DFS directory instead.</span>
+<span class="source-line-no">314</span><span id="line-314">   * @param conf The configuration to use for further operations</span>
+<span class="source-line-no">315</span><span id="line-315">   */</span>
+<span class="source-line-no">316</span><span id="line-316">  public HBaseTestingUtility(Configuration conf) {</span>
+<span class="source-line-no">317</span><span id="line-317">    super(conf);</span>
+<span class="source-line-no">318</span><span id="line-318"></span>
+<span class="source-line-no">319</span><span id="line-319">    // a hbase checksum verification failure will cause unit tests to fail</span>
+<span class="source-line-no">320</span><span id="line-320">    ChecksumUtil.generateExceptionForChecksumFailureForTest(true);</span>
+<span class="source-line-no">321</span><span id="line-321"></span>
+<span class="source-line-no">322</span><span id="line-322">    // Save this for when setting default file:// breaks things</span>
+<span class="source-line-no">323</span><span id="line-323">    if (this.conf.get("fs.defaultFS") != null) {</span>
+<span class="source-line-no">324</span><span id="line-324">      this.conf.set("original.defaultFS", this.conf.get("fs.defaultFS"));</span>
+<span class="source-line-no">325</span><span id="line-325">    }</span>
+<span class="source-line-no">326</span><span id="line-326">    if (this.conf.get(HConstants.HBASE_DIR) != null) {</span>
+<span class="source-line-no">327</span><span id="line-327">      this.conf.set("original.hbase.dir", this.conf.get(HConstants.HBASE_DIR));</span>
+<span class="source-line-no">328</span><span id="line-328">    }</span>
+<span class="source-line-no">329</span><span id="line-329">    // Every cluster is a local cluster until we start DFS</span>
+<span class="source-line-no">330</span><span id="line-330">    // Note that conf could be null, but this.conf will not be</span>
+<span class="source-line-no">331</span><span id="line-331">    String dataTestDir = getDataTestDir().toString();</span>
+<span class="source-line-no">332</span><span id="line-332">    this.conf.set("fs.defaultFS", "file:///");</span>
+<span class="source-line-no">333</span><span id="line-333">    this.conf.set(HConstants.HBASE_DIR, "file://" + dataTestDir);</span>
+<span class="source-line-no">334</span><span id="line-334">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
+<span class="source-line-no">335</span><span id="line-335">    this.conf.setBoolean(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE, false);</span>
+<span class="source-line-no">336</span><span id="line-336">    // If the value for random ports isn't set set it to true, thus making</span>
+<span class="source-line-no">337</span><span id="line-337">    // tests opt-out for random port assignment</span>
+<span class="source-line-no">338</span><span id="line-338">    this.conf.setBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS,</span>
+<span class="source-line-no">339</span><span id="line-339">      this.conf.getBoolean(LocalHBaseCluster.ASSIGN_RANDOM_PORTS, true));</span>
+<span class="source-line-no">340</span><span id="line-340">  }</span>
+<span class="source-line-no">341</span><span id="line-341"></span>
+<span class="source-line-no">342</span><span id="line-342">  /**</span>
+<span class="source-line-no">343</span><span id="line-343">   * Close both the region {@code r} and it's underlying WAL. For use in tests.</span>
+<span class="source-line-no">344</span><span id="line-344">   */</span>
+<span class="source-line-no">345</span><span id="line-345">  public static void closeRegionAndWAL(final Region r) throws IOException {</span>
+<span class="source-line-no">346</span><span id="line-346">    closeRegionAndWAL((HRegion) r);</span>
+<span class="source-line-no">347</span><span id="line-347">  }</span>
+<span class="source-line-no">348</span><span id="line-348"></span>
+<span class="source-line-no">349</span><span id="line-349">  /**</span>
+<span class="source-line-no">350</span><span id="line-350">   * Close both the HRegion {@code r} and it's underlying WAL. For use in tests.</span>
+<span class="source-line-no">351</span><span id="line-351">   */</span>
+<span class="source-line-no">352</span><span id="line-352">  public static void closeRegionAndWAL(final HRegion r) throws IOException {</span>
+<span class="source-line-no">353</span><span id="line-353">    if (r == null) return;</span>
+<span class="source-line-no">354</span><span id="line-354">    r.close();</span>
+<span class="source-line-no">355</span><span id="line-355">    if (r.getWAL() == null) return;</span>
+<span class="source-line-no">356</span><span id="line-356">    r.getWAL().close();</span>
+<span class="source-line-no">357</span><span id="line-357">  }</span>
+<span class="source-line-no">358</span><span id="line-358"></span>
+<span class="source-line-no">359</span><span id="line-359">  /**</span>
+<span class="source-line-no">360</span><span id="line-360">   * Returns this classes's instance of {@link Configuration}. Be careful how you use the returned</span>
+<span class="source-line-no">361</span><span id="line-361">   * Configuration since {@link Connection} instances can be shared. The Map of Connections is keyed</span>
+<span class="source-line-no">362</span><span id="line-362">   * by the Configuration. If say, a Connection was being used against a cluster that had been</span>
+<span class="source-line-no">363</span><span id="line-363">   * shutdown, see {@link #shutdownMiniCluster()}, then the Connection will no longer be wholesome.</span>
+<span class="source-line-no">364</span><span id="line-364">   * Rather than use the return direct, its usually best to make a copy and use that. Do</span>
+<span class="source-line-no">365</span><span id="line-365">   * &lt;code&gt;Configuration c = new Configuration(INSTANCE.getConfiguration());&lt;/code&gt;</span>
+<span class="source-line-no">366</span><span id="line-366">   * @return Instance of Configuration.</span>
+<span class="source-line-no">367</span><span id="line-367">   */</span>
+<span class="source-line-no">368</span><span id="line-368">  @Override</span>
+<span class="source-line-no">369</span><span id="line-369">  public Configuration getConfiguration() {</span>
+<span class="source-line-no">370</span><span id="line-370">    return super.getConfiguration();</span>
+<span class="source-line-no">371</span><span id="line-371">  }</span>
+<span class="source-line-no">372</span><span id="line-372"></span>
+<span class="source-line-no">373</span><span id="line-373">  public void setHBaseCluster(HBaseCluster hbaseCluster) {</span>
+<span class="source-line-no">374</span><span id="line-374">    this.hbaseCluster = hbaseCluster;</span>
+<span class="source-line-no">375</span><span id="line-375">  }</span>
+<span class="source-line-no">376</span><span id="line-376"></span>
+<span class="source-line-no">377</span><span id="line-377">  /**</span>
+<span class="source-line-no">378</span><span id="line-378">   * Home our data in a dir under {@link #DEFAULT_BASE_TEST_DIRECTORY}. Give it a random name so can</span>
+<span class="source-line-no">379</span><span id="line-379">   * have many concurrent tests running if we need to. Moding a System property is not the way to do</span>
+<span class="source-line-no">380</span><span id="line-380">   * concurrent instances -- another instance could grab the temporary value unintentionally -- but</span>
+<span class="source-line-no">381</span><span id="line-381">   * not anything can do about it at moment; single instance only is how the minidfscluster works.</span>
+<span class="source-line-no">382</span><span id="line-382">   * We also create the underlying directory names for hadoop.log.dir, mapreduce.cluster.local.dir</span>
+<span class="source-line-no">383</span><span id="line-383">   * and hadoop.tmp.dir, and set the values in the conf, and as a system property for hadoop.tmp.dir</span>
+<span class="source-line-no">384</span><span id="line-384">   * (We do not create them!).</span>
+<span class="source-line-no">385</span><span id="line-385">   * @return The calculated data test build directory, if newly-created.</span>
+<span class="source-line-no">386</span><span id="line-386">   */</span>
+<span class="source-line-no">387</span><span id="line-387">  @Override</span>
+<span class="source-line-no">388</span><span id="line-388">  protected Path setupDataTestDir() {</span>
+<span class="source-line-no">389</span><span id="line-389">    Path testPath = super.setupDataTestDir();</span>
+<span class="source-line-no">390</span><span id="line-390">    if (null == testPath) {</span>
+<span class="source-line-no">391</span><span id="line-391">      return null;</span>
+<span class="source-line-no">392</span><span id="line-392">    }</span>
 <span class="source-line-no">393</span><span id="line-393"></span>
-<span class="source-line-no">394</span><span id="line-394">    String sysValue = System.getProperty(propertyName);</span>
+<span class="source-line-no">394</span><span id="line-394">    createSubDirAndSystemProperty("hadoop.log.dir", testPath, "hadoop-log-dir");</span>
 <span class="source-line-no">395</span><span id="line-395"></span>
-<span class="source-line-no">396</span><span id="line-396">    if (sysValue != null) {</span>
-<span class="source-line-no">397</span><span id="line-397">      // There is already a value set. So we do nothing but hope</span>
-<span class="source-line-no">398</span><span id="line-398">      // that there will be no conflicts</span>
-<span class="source-line-no">399</span><span id="line-399">      LOG.info("System.getProperty(\"" + propertyName + "\") already set to: " + sysValue</span>
-<span class="source-line-no">400</span><span id="line-400">        + " so I do NOT create it in " + parent);</span>
-<span class="source-line-no">401</span><span id="line-401">      String confValue = conf.get(propertyName);</span>
-<span class="source-line-no">402</span><span id="line-402">      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)) {</span>
-<span class="source-line-no">403</span><span id="line-403">        LOG.warn(propertyName + " property value differs in configuration and system: "</span>
-<span class="source-line-no">404</span><span id="line-404">          + "Configuration=" + confValue + " while System=" + sysValue</span>
-<span class="source-line-no">405</span><span id="line-405">          + " Erasing configuration value by system value.");</span>
-<span class="source-line-no">406</span><span id="line-406">      }</span>
-<span class="source-line-no">407</span><span id="line-407">      conf.set(propertyName, sysValue);</span>
-<span class="source-line-no">408</span><span id="line-408">    } else {</span>
-<span class="source-line-no">409</span><span id="line-409">      // Ok, it's not set, so we create it as a subdirectory</span>
-<span class="source-line-no">410</span><span id="line-410">      createSubDir(propertyName, parent, subDirName);</span>
-<span class="source-line-no">411</span><span id="line-411">      System.setProperty(propertyName, conf.get(propertyName));</span>
-<span class="source-line-no">412</span><span id="line-412">    }</span>
-<span class="source-line-no">413</span><span id="line-413">  }</span>
-<span class="source-line-no">414</span><span id="line-414"></span>
-<span class="source-line-no">415</span><span id="line-415">  /**</span>
-<span class="source-line-no">416</span><span id="line-416">   * @return Where to write test data on the test filesystem; Returns working directory for the test</span>
-<span class="source-line-no">417</span><span id="line-417">   *         filesystem by default</span>
-<span class="source-line-no">418</span><span id="line-418">   * @see #setupDataTestDirOnTestFS()</span>
-<span class="source-line-no">419</span><span id="line-419">   * @see #getTestFileSystem()</span>
-<span class="source-line-no">420</span><span id="line-420">   */</span>
-<span class="source-line-no">421</span><span id="line-421">  private Path getBaseTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">422</span><span id="line-422">    FileSystem fs = getTestFileSystem();</span>
-<span class="source-line-no">423</span><span id="line-423">    return new Path(fs.getWorkingDirectory(), "test-data");</span>
-<span class="source-line-no">424</span><span id="line-424">  }</span>
-<span class="source-line-no">425</span><span id="line-425"></span>
-<span class="source-line-no">426</span><span id="line-426">  /**</span>
-<span class="source-line-no">427</span><span id="line-427">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
-<span class="source-line-no">428</span><span id="line-428">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
-<span class="source-line-no">429</span><span id="line-429">   * on it.</span>
-<span class="source-line-no">430</span><span id="line-430">   * @return a unique path in the test filesystem</span>
-<span class="source-line-no">431</span><span id="line-431">   */</span>
-<span class="source-line-no">432</span><span id="line-432">  public Path getDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">433</span><span id="line-433">    if (dataTestDirOnTestFS == null) {</span>
-<span class="source-line-no">434</span><span id="line-434">      setupDataTestDirOnTestFS();</span>
-<span class="source-line-no">435</span><span id="line-435">    }</span>
-<span class="source-line-no">436</span><span id="line-436"></span>
-<span class="source-line-no">437</span><span id="line-437">    return dataTestDirOnTestFS;</span>
-<span class="source-line-no">438</span><span id="line-438">  }</span>
-<span class="source-line-no">439</span><span id="line-439"></span>
-<span class="source-line-no">440</span><span id="line-440">  /**</span>
-<span class="source-line-no">441</span><span id="line-441">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
-<span class="source-line-no">442</span><span id="line-442">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
-<span class="source-line-no">443</span><span id="line-443">   * on it.</span>
-<span class="source-line-no">444</span><span id="line-444">   * @return a unique path in the test filesystem</span>
-<span class="source-line-no">445</span><span id="line-445">   * @param subdirName name of the subdir to create under the base test dir</span>
-<span class="source-line-no">446</span><span id="line-446">   */</span>
-<span class="source-line-no">447</span><span id="line-447">  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {</span>
-<span class="source-line-no">448</span><span id="line-448">    return new Path(getDataTestDirOnTestFS(), subdirName);</span>
-<span class="source-line-no">449</span><span id="line-449">  }</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">  /**</span>
-<span class="source-line-no">452</span><span id="line-452">   * Sets up a path in test filesystem to be used by tests. Creates a new directory if not already</span>
-<span class="source-line-no">453</span><span id="line-453">   * setup.</span>
-<span class="source-line-no">454</span><span id="line-454">   */</span>
-<span class="source-line-no">455</span><span id="line-455">  private void setupDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">456</span><span id="line-456">    if (dataTestDirOnTestFS != null) {</span>
-<span class="source-line-no">457</span><span id="line-457">      LOG.warn("Data test on test fs dir already setup in " + dataTestDirOnTestFS.toString());</span>
-<span class="source-line-no">458</span><span id="line-458">      return;</span>
-<span class="source-line-no">459</span><span id="line-459">    }</span>
-<span class="source-line-no">460</span><span id="line-460">    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();</span>
-<span class="source-line-no">461</span><span id="line-461">  }</span>
-<span class="source-line-no">462</span><span id="line-462"></span>
-<span class="source-line-no">463</span><span id="line-463">  /**</span>
-<span class="source-line-no">464</span><span id="line-464">   * Sets up a new path in test filesystem to be used by tests.</span>
-<span class="source-line-no">465</span><span id="line-465">   */</span>
-<span class="source-line-no">466</span><span id="line-466">  private Path getNewDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">467</span><span id="line-467">    // The file system can be either local, mini dfs, or if the configuration</span>
-<span class="source-line-no">468</span><span id="line-468">    // is supplied externally, it can be an external cluster FS. If it is a local</span>
-<span class="source-line-no">469</span><span id="line-469">    // file system, the tests should use getBaseTestDir, otherwise, we can use</span>
-<span class="source-line-no">470</span><span id="line-470">    // the working directory, and create a unique sub dir there</span>
-<span class="source-line-no">471</span><span id="line-471">    FileSystem fs = getTestFileSystem();</span>
-<span class="source-line-no">472</span><span id="line-472">    Path newDataTestDir;</span>
-<span class="source-line-no">473</span><span id="line-473">    String randomStr = getRandomUUID().toString();</span>
-<span class="source-line-no">474</span><span id="line-474">    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {</span>
-<span class="source-line-no">475</span><span id="line-475">      newDataTestDir = new Path(getDataTestDir(), randomStr);</span>
-<span class="source-line-no">476</span><span id="line-476">      File dataTestDir = new File(newDataTestDir.toString());</span>
-<span class="source-line-no">477</span><span id="line-477">      if (deleteOnExit()) dataTestDir.deleteOnExit();</span>
-<span class="source-line-no">478</span><span id="line-478">    } else {</span>
-<span class="source-line-no">479</span><span id="line-479">      Path base = getBaseTestDirOnTestFS();</span>
-<span class="source-line-no">480</span><span id="line-480">      newDataTestDir = new Path(base, randomStr);</span>
-<span class="source-line-no">481</span><span id="line-481">      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);</span>
-<span class="source-line-no">482</span><span id="line-482">    }</span>
-<span class="source-line-no">483</span><span id="line-483">    return newDataTestDir;</span>
-<span class="source-line-no">484</span><span id="line-484">  }</span>
-<span class="source-line-no">485</span><span id="line-485"></span>
-<span class="source-line-no">486</span><span id="line-486">  /**</span>
-<span class="source-line-no">487</span><span id="line-487">   * Cleans the test data directory on the test filesystem.</span>
-<span class="source-line-no">488</span><span id="line-488">   * @return True if we removed the test dirs</span>
-<span class="source-line-no">489</span><span id="line-489">   */</span>
-<span class="source-line-no">490</span><span id="line-490">  public boolean cleanupDataTestDirOnTestFS() throws IOException {</span>
-<span class="source-line-no">491</span><span id="line-491">    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);</span>
-<span class="source-line-no">492</span><span id="line-492">    if (ret) dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">493</span><span id="line-493">    return ret;</span>
-<span class="source-line-no">494</span><span id="line-494">  }</span>
-<span class="source-line-no">495</span><span id="line-495"></span>
-<span class="source-line-no">496</span><span id="line-496">  /**</span>
-<span class="source-line-no">497</span><span id="line-497">   * Cleans a subdirectory under the test data directory on the test filesystem.</span>
-<span class="source-line-no">498</span><span id="line-498">   * @return True if we removed child</span>
-<span class="source-line-no">499</span><span id="line-499">   */</span>
-<span class="source-line-no">500</span><span id="line-500">  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {</span>
-<span class="source-line-no">501</span><span id="line-501">    Path cpath = getDataTestDirOnTestFS(subdirName);</span>
-<span class="source-line-no">502</span><span id="line-502">    return getTestFileSystem().delete(cpath, true);</span>
-<span class="source-line-no">503</span><span id="line-503">  }</span>
-<span class="source-line-no">504</span><span id="line-504"></span>
-<span class="source-line-no">505</span><span id="line-505">  // Workaround to avoid IllegalThreadStateException</span>
-<span class="source-line-no">506</span><span id="line-506">  // See HBASE-27148 for more details</span>
-<span class="source-line-no">507</span><span id="line-507">  private static final class FsDatasetAsyncDiskServiceFixer extends Thread {</span>
+<span class="source-line-no">396</span><span id="line-396">    // This is defaulted in core-default.xml to /tmp/hadoop-${user.name}, but</span>
+<span class="source-line-no">397</span><span id="line-397">    // we want our own value to ensure uniqueness on the same machine</span>
+<span class="source-line-no">398</span><span id="line-398">    createSubDirAndSystemProperty("hadoop.tmp.dir", testPath, "hadoop-tmp-dir");</span>
+<span class="source-line-no">399</span><span id="line-399"></span>
+<span class="source-line-no">400</span><span id="line-400">    // Read and modified in org.apache.hadoop.mapred.MiniMRCluster</span>
+<span class="source-line-no">401</span><span id="line-401">    createSubDir("mapreduce.cluster.local.dir", testPath, "mapred-local-dir");</span>
+<span class="source-line-no">402</span><span id="line-402">    return testPath;</span>
+<span class="source-line-no">403</span><span id="line-403">  }</span>
+<span class="source-line-no">404</span><span id="line-404"></span>
+<span class="source-line-no">405</span><span id="line-405">  private void createSubDirAndSystemProperty(String propertyName, Path parent, String subDirName) {</span>
+<span class="source-line-no">406</span><span id="line-406"></span>
+<span class="source-line-no">407</span><span id="line-407">    String sysValue = System.getProperty(propertyName);</span>
+<span class="source-line-no">408</span><span id="line-408"></span>
+<span class="source-line-no">409</span><span id="line-409">    if (sysValue != null) {</span>
+<span class="source-line-no">410</span><span id="line-410">      // There is already a value set. So we do nothing but hope</span>
+<span class="source-line-no">411</span><span id="line-411">      // that there will be no conflicts</span>
+<span class="source-line-no">412</span><span id="line-412">      LOG.info("System.getProperty(\"" + propertyName + "\") already set to: " + sysValue</span>
+<span class="source-line-no">413</span><span id="line-413">        + " so I do NOT create it in " + parent);</span>
+<span class="source-line-no">414</span><span id="line-414">      String confValue = conf.get(propertyName);</span>
+<span class="source-line-no">415</span><span id="line-415">      if (confValue != null &amp;&amp; !confValue.endsWith(sysValue)) {</span>
+<span class="source-line-no">416</span><span id="line-416">        LOG.warn(propertyName + " property value differs in configuration and system: "</span>
+<span class="source-line-no">417</span><span id="line-417">          + "Configuration=" + confValue + " while System=" + sysValue</span>
+<span class="source-line-no">418</span><span id="line-418">          + " Erasing configuration value by system value.");</span>
+<span class="source-line-no">419</span><span id="line-419">      }</span>
+<span class="source-line-no">420</span><span id="line-420">      conf.set(propertyName, sysValue);</span>
+<span class="source-line-no">421</span><span id="line-421">    } else {</span>
+<span class="source-line-no">422</span><span id="line-422">      // Ok, it's not set, so we create it as a subdirectory</span>
+<span class="source-line-no">423</span><span id="line-423">      createSubDir(propertyName, parent, subDirName);</span>
+<span class="source-line-no">424</span><span id="line-424">      System.setProperty(propertyName, conf.get(propertyName));</span>
+<span class="source-line-no">425</span><span id="line-425">    }</span>
+<span class="source-line-no">426</span><span id="line-426">  }</span>
+<span class="source-line-no">427</span><span id="line-427"></span>
+<span class="source-line-no">428</span><span id="line-428">  /**</span>
+<span class="source-line-no">429</span><span id="line-429">   * @return Where to write test data on the test filesystem; Returns working directory for the test</span>
+<span class="source-line-no">430</span><span id="line-430">   *         filesystem by default</span>
+<span class="source-line-no">431</span><span id="line-431">   * @see #setupDataTestDirOnTestFS()</span>
+<span class="source-line-no">432</span><span id="line-432">   * @see #getTestFileSystem()</span>
+<span class="source-line-no">433</span><span id="line-433">   */</span>
+<span class="source-line-no">434</span><span id="line-434">  private Path getBaseTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">435</span><span id="line-435">    FileSystem fs = getTestFileSystem();</span>
+<span class="source-line-no">436</span><span id="line-436">    return new Path(fs.getWorkingDirectory(), "test-data");</span>
+<span class="source-line-no">437</span><span id="line-437">  }</span>
+<span class="source-line-no">438</span><span id="line-438"></span>
+<span class="source-line-no">439</span><span id="line-439">  /**</span>
+<span class="source-line-no">440</span><span id="line-440">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
+<span class="source-line-no">441</span><span id="line-441">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
+<span class="source-line-no">442</span><span id="line-442">   * on it.</span>
+<span class="source-line-no">443</span><span id="line-443">   * @return a unique path in the test filesystem</span>
+<span class="source-line-no">444</span><span id="line-444">   */</span>
+<span class="source-line-no">445</span><span id="line-445">  public Path getDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">446</span><span id="line-446">    if (dataTestDirOnTestFS == null) {</span>
+<span class="source-line-no">447</span><span id="line-447">      setupDataTestDirOnTestFS();</span>
+<span class="source-line-no">448</span><span id="line-448">    }</span>
+<span class="source-line-no">449</span><span id="line-449"></span>
+<span class="source-line-no">450</span><span id="line-450">    return dataTestDirOnTestFS;</span>
+<span class="source-line-no">451</span><span id="line-451">  }</span>
+<span class="source-line-no">452</span><span id="line-452"></span>
+<span class="source-line-no">453</span><span id="line-453">  /**</span>
+<span class="source-line-no">454</span><span id="line-454">   * Returns a Path in the test filesystem, obtained from {@link #getTestFileSystem()} to write</span>
+<span class="source-line-no">455</span><span id="line-455">   * temporary test data. Call this method after setting up the mini dfs cluster if the test relies</span>
+<span class="source-line-no">456</span><span id="line-456">   * on it.</span>
+<span class="source-line-no">457</span><span id="line-457">   * @return a unique path in the test filesystem</span>
+<span class="source-line-no">458</span><span id="line-458">   * @param subdirName name of the subdir to create under the base test dir</span>
+<span class="source-line-no">459</span><span id="line-459">   */</span>
+<span class="source-line-no">460</span><span id="line-460">  public Path getDataTestDirOnTestFS(final String subdirName) throws IOException {</span>
+<span class="source-line-no">461</span><span id="line-461">    return new Path(getDataTestDirOnTestFS(), subdirName);</span>
+<span class="source-line-no">462</span><span id="line-462">  }</span>
+<span class="source-line-no">463</span><span id="line-463"></span>
+<span class="source-line-no">464</span><span id="line-464">  /**</span>
+<span class="source-line-no">465</span><span id="line-465">   * Sets up a path in test filesystem to be used by tests. Creates a new directory if not already</span>
+<span class="source-line-no">466</span><span id="line-466">   * setup.</span>
+<span class="source-line-no">467</span><span id="line-467">   */</span>
+<span class="source-line-no">468</span><span id="line-468">  private void setupDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">469</span><span id="line-469">    if (dataTestDirOnTestFS != null) {</span>
+<span class="source-line-no">470</span><span id="line-470">      LOG.warn("Data test on test fs dir already setup in " + dataTestDirOnTestFS.toString());</span>
+<span class="source-line-no">471</span><span id="line-471">      return;</span>
+<span class="source-line-no">472</span><span id="line-472">    }</span>
+<span class="source-line-no">473</span><span id="line-473">    dataTestDirOnTestFS = getNewDataTestDirOnTestFS();</span>
+<span class="source-line-no">474</span><span id="line-474">  }</span>
+<span class="source-line-no">475</span><span id="line-475"></span>
+<span class="source-line-no">476</span><span id="line-476">  /**</span>
+<span class="source-line-no">477</span><span id="line-477">   * Sets up a new path in test filesystem to be used by tests.</span>
+<span class="source-line-no">478</span><span id="line-478">   */</span>
+<span class="source-line-no">479</span><span id="line-479">  private Path getNewDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">480</span><span id="line-480">    // The file system can be either local, mini dfs, or if the configuration</span>
+<span class="source-line-no">481</span><span id="line-481">    // is supplied externally, it can be an external cluster FS. If it is a local</span>
+<span class="source-line-no">482</span><span id="line-482">    // file system, the tests should use getBaseTestDir, otherwise, we can use</span>
+<span class="source-line-no">483</span><span id="line-483">    // the working directory, and create a unique sub dir there</span>
+<span class="source-line-no">484</span><span id="line-484">    FileSystem fs = getTestFileSystem();</span>
+<span class="source-line-no">485</span><span id="line-485">    Path newDataTestDir;</span>
+<span class="source-line-no">486</span><span id="line-486">    String randomStr = getRandomUUID().toString();</span>
+<span class="source-line-no">487</span><span id="line-487">    if (fs.getUri().getScheme().equals(FileSystem.getLocal(conf).getUri().getScheme())) {</span>
+<span class="source-line-no">488</span><span id="line-488">      newDataTestDir = new Path(getDataTestDir(), randomStr);</span>
+<span class="source-line-no">489</span><span id="line-489">      File dataTestDir = new File(newDataTestDir.toString());</span>
+<span class="source-line-no">490</span><span id="line-490">      if (deleteOnExit()) dataTestDir.deleteOnExit();</span>
+<span class="source-line-no">491</span><span id="line-491">    } else {</span>
+<span class="source-line-no">492</span><span id="line-492">      Path base = getBaseTestDirOnTestFS();</span>
+<span class="source-line-no">493</span><span id="line-493">      newDataTestDir = new Path(base, randomStr);</span>
+<span class="source-line-no">494</span><span id="line-494">      if (deleteOnExit()) fs.deleteOnExit(newDataTestDir);</span>
+<span class="source-line-no">495</span><span id="line-495">    }</span>
+<span class="source-line-no">496</span><span id="line-496">    return newDataTestDir;</span>
+<span class="source-line-no">497</span><span id="line-497">  }</span>
+<span class="source-line-no">498</span><span id="line-498"></span>
+<span class="source-line-no">499</span><span id="line-499">  /**</span>
+<span class="source-line-no">500</span><span id="line-500">   * Cleans the test data directory on the test filesystem.</span>
+<span class="source-line-no">501</span><span id="line-501">   * @return True if we removed the test dirs</span>
+<span class="source-line-no">502</span><span id="line-502">   */</span>
+<span class="source-line-no">503</span><span id="line-503">  public boolean cleanupDataTestDirOnTestFS() throws IOException {</span>
+<span class="source-line-no">504</span><span id="line-504">    boolean ret = getTestFileSystem().delete(dataTestDirOnTestFS, true);</span>
+<span class="source-line-no">505</span><span id="line-505">    if (ret) dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">506</span><span id="line-506">    return ret;</span>
+<span class="source-line-no">507</span><span id="line-507">  }</span>
 <span class="source-line-no">508</span><span id="line-508"></span>
-<span class="source-line-no">509</span><span id="line-509">    private volatile boolean stopped = false;</span>
-<span class="source-line-no">510</span><span id="line-510"></span>
-<span class="source-line-no">511</span><span id="line-511">    private final MiniDFSCluster cluster;</span>
-<span class="source-line-no">512</span><span id="line-512"></span>
-<span class="source-line-no">513</span><span id="line-513">    FsDatasetAsyncDiskServiceFixer(MiniDFSCluster cluster) {</span>
-<span class="source-line-no">514</span><span id="line-514">      super("FsDatasetAsyncDiskServiceFixer");</span>
-<span class="source-line-no">515</span><span id="line-515">      setDaemon(true);</span>
-<span class="source-line-no">516</span><span id="line-516">      this.cluster = cluster;</span>
-<span class="source-line-no">517</span><span id="line-517">    }</span>
-<span class="source-line-no">518</span><span id="line-518"></span>
-<span class="source-line-no">519</span><span id="line-519">    @Override</span>
-<span class="source-line-no">520</span><span id="line-520">    public void run() {</span>
-<span class="source-line-no">521</span><span id="line-521">      while (!stopped) {</span>
-<span class="source-line-no">522</span><span id="line-522">        try {</span>
-<span class="source-line-no">523</span><span id="line-523">          Thread.sleep(30000);</span>
-<span class="source-line-no">524</span><span id="line-524">        } catch (InterruptedException e) {</span>
-<span class="source-line-no">525</span><span id="line-525">          Thread.currentThread().interrupt();</span>
-<span class="source-line-no">526</span><span id="line-526">          continue;</span>
-<span class="source-line-no">527</span><span id="line-527">        }</span>
-<span class="source-line-no">528</span><span id="line-528">        // we could add new datanodes during tests, so here we will check every 30 seconds, as the</span>
-<span class="source-line-no">529</span><span id="line-529">        // timeout of the thread pool executor is 60 seconds by default.</span>
-<span class="source-line-no">530</span><span id="line-530">        try {</span>
-<span class="source-line-no">531</span><span id="line-531">          for (DataNode dn : cluster.getDataNodes()) {</span>
-<span class="source-line-no">532</span><span id="line-532">            FsDatasetSpi&lt;?&gt; dataset = dn.getFSDataset();</span>
-<span class="source-line-no">533</span><span id="line-533">            Field service = dataset.getClass().getDeclaredField("asyncDiskService");</span>
-<span class="source-line-no">534</span><span id="line-534">            service.setAccessible(true);</span>
-<span class="source-line-no">535</span><span id="line-535">            Object asyncDiskService = service.get(dataset);</span>
-<span class="source-line-no">536</span><span id="line-536">            Field group = asyncDiskService.getClass().getDeclaredField("threadGroup");</span>
-<span class="source-line-no">537</span><span id="line-537">            group.setAccessible(true);</span>
-<span class="source-line-no">538</span><span id="line-538">            ThreadGroup threadGroup = (ThreadGroup) group.get(asyncDiskService);</span>
-<span class="source-line-no">539</span><span id="line-539">            if (threadGroup.isDaemon()) {</span>
-<span class="source-line-no">540</span><span id="line-540">              threadGroup.setDaemon(false);</span>
-<span class="source-line-no">541</span><span id="line-541">            }</span>
-<span class="source-line-no">542</span><span id="line-542">          }</span>
-<span class="source-line-no">543</span><span id="line-543">        } catch (NoSuchFieldException e) {</span>
-<span class="source-line-no">544</span><span id="line-544">          LOG.debug("NoSuchFieldException: " + e.getMessage()</span>
-<span class="source-line-no">545</span><span id="line-545">            + "; It might because your Hadoop version &gt; 3.2.3 or 3.3.4, "</span>
-<span class="source-line-no">546</span><span id="line-546">            + "See HBASE-27595 for details.");</span>
-<span class="source-line-no">547</span><span id="line-547">        } catch (Exception e) {</span>
-<span class="source-line-no">548</span><span id="line-548">          LOG.warn("failed to reset thread pool timeout for FsDatasetAsyncDiskService", e);</span>
-<span class="source-line-no">549</span><span id="line-549">        }</span>
-<span class="source-line-no">550</span><span id="line-550">      }</span>
-<span class="source-line-no">551</span><span id="line-551">    }</span>
-<span class="source-line-no">552</span><span id="line-552"></span>
-<span class="source-line-no">553</span><span id="line-553">    void shutdown() {</span>
-<span class="source-line-no">554</span><span id="line-554">      stopped = true;</span>
-<span class="source-line-no">555</span><span id="line-555">      interrupt();</span>
-<span class="source-line-no">556</span><span id="line-556">    }</span>
-<span class="source-line-no">557</span><span id="line-557">  }</span>
-<span class="source-line-no">558</span><span id="line-558"></span>
-<span class="source-line-no">559</span><span id="line-559">  /**</span>
-<span class="source-line-no">560</span><span id="line-560">   * Start a minidfscluster.</span>
-<span class="source-line-no">561</span><span id="line-561">   * @param servers How many DNs to start.</span>
-<span class="source-line-no">562</span><span id="line-562">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">563</span><span id="line-563">   * @return The mini dfs cluster created.</span>
-<span class="source-line-no">564</span><span id="line-564">   */</span>
-<span class="source-line-no">565</span><span id="line-565">  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {</span>
-<span class="source-line-no">566</span><span id="line-566">    return startMiniDFSCluster(servers, null);</span>
-<span class="source-line-no">567</span><span id="line-567">  }</span>
-<span class="source-line-no">568</span><span id="line-568"></span>
-<span class="source-line-no">569</span><span id="line-569">  /**</span>
-<span class="source-line-no">570</span><span id="line-570">   * Start a minidfscluster. This is useful if you want to run datanode on distinct hosts for things</span>
-<span class="source-line-no">571</span><span id="line-571">   * like HDFS block location verification. If you start MiniDFSCluster without host names, all</span>
-<span class="source-line-no">572</span><span id="line-572">   * instances of the datanodes will have the same host name.</span>
-<span class="source-line-no">573</span><span id="line-573">   * @param hosts hostnames DNs to run on.</span>
-<span class="source-line-no">574</span><span id="line-574">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">575</span><span id="line-575">   * @return The mini dfs cluster created.</span>
-<span class="source-line-no">576</span><span id="line-576">   */</span>
-<span class="source-line-no">577</span><span id="line-577">  public MiniDFSCluster startMiniDFSCluster(final String hosts[]) throws Exception {</span>
-<span class="source-line-no">578</span><span id="line-578">    if (hosts != null &amp;&amp; hosts.length != 0) {</span>
-<span class="source-line-no">579</span><span id="line-579">      return startMiniDFSCluster(hosts.length, hosts);</span>
-<span class="source-line-no">580</span><span id="line-580">    } else {</span>
-<span class="source-line-no">581</span><span id="line-581">      return startMiniDFSCluster(1, null);</span>
-<span class="source-line-no">582</span><span id="line-582">    }</span>
-<span class="source-line-no">583</span><span id="line-583">  }</span>
-<span class="source-line-no">584</span><span id="line-584"></span>
-<span class="source-line-no">585</span><span id="line-585">  /**</span>
-<span class="source-line-no">586</span><span id="line-586">   * Start a minidfscluster. Can only create one.</span>
-<span class="source-line-no">587</span><span id="line-587">   * @param servers How many DNs to start.</span>
-<span class="source-line-no">588</span><span id="line-588">   * @param hosts   hostnames DNs to run on.</span>
-<span class="source-line-no">589</span><span id="line-589">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">590</span><span id="line-590">   * @return The mini dfs cluster created.</span>
-<span class="source-line-no">591</span><span id="line-591">   */</span>
-<span class="source-line-no">592</span><span id="line-592">  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[]) throws Exception {</span>
-<span class="source-line-no">593</span><span id="line-593">    return startMiniDFSCluster(servers, null, hosts);</span>
-<span class="source-line-no">594</span><span id="line-594">  }</span>
-<span class="source-line-no">595</span><span id="line-595"></span>
-<span class="source-line-no">596</span><span id="line-596">  private void setFs() throws IOException {</span>
-<span class="source-line-no">597</span><span id="line-597">    if (this.dfsCluster == null) {</span>
-<span class="source-line-no">598</span><span id="line-598">      LOG.info("Skipping setting fs because dfsCluster is null");</span>
-<span class="source-line-no">599</span><span id="line-599">      return;</span>
-<span class="source-line-no">600</span><span id="line-600">    }</span>
-<span class="source-line-no">601</span><span id="line-601">    FileSystem fs = this.dfsCluster.getFileSystem();</span>
-<span class="source-line-no">602</span><span id="line-602">    CommonFSUtils.setFsDefault(this.conf, new Path(fs.getUri()));</span>
-<span class="source-line-no">603</span><span id="line-603"></span>
-<span class="source-line-no">604</span><span id="line-604">    // re-enable this check with dfs</span>
-<span class="source-line-no">605</span><span id="line-605">    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);</span>
-<span class="source-line-no">606</span><span id="line-606">  }</span>
-<span class="source-line-no">607</span><span id="line-607"></span>
-<span class="source-line-no">608</span><span id="line-608">  public MiniDFSCluster startMiniDFSCluster(int servers, final String racks[], String hosts[])</span>
-<span class="source-line-no">609</span><span id="line-609">    throws Exception {</span>
-<span class="source-line-no">610</span><span id="line-610">    createDirsAndSetProperties();</span>
-<span class="source-line-no">611</span><span id="line-611">    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);</span>
-<span class="source-line-no">612</span><span id="line-612"></span>
-<span class="source-line-no">613</span><span id="line-613">    this.dfsCluster =</span>
-<span class="source-line-no">614</span><span id="line-614">      new MiniDFSCluster(0, this.conf, servers, true, true, true, null, racks, hosts, null);</span>
-<span class="source-line-no">615</span><span id="line-615">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
-<span class="source-line-no">616</span><span id="line-616">    this.dfsClusterFixer.start();</span>
-<span class="source-line-no">617</span><span id="line-617">    // Set this just-started cluster as our filesystem.</span>
-<span class="source-line-no">618</span><span id="line-618">    setFs();</span>
-<span class="source-line-no">619</span><span id="line-619"></span>
-<span class="source-line-no">620</span><span id="line-620">    // Wait for the cluster to be totally up</span>
-<span class="source-line-no">621</span><span id="line-621">    this.dfsCluster.waitClusterUp();</span>
-<span class="source-line-no">622</span><span id="line-622"></span>
-<span class="source-line-no">623</span><span id="line-623">    // reset the test directory for test file system</span>
-<span class="source-line-no">624</span><span id="line-624">    dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">625</span><span id="line-625">    String dataTestDir = getDataTestDir().toString();</span>
-<span class="source-line-no">626</span><span id="line-626">    conf.set(HConstants.HBASE_DIR, dataTestDir);</span>
-<span class="source-line-no">627</span><span id="line-627">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
-<span class="source-line-no">628</span><span id="line-628"></span>
-<span class="source-line-no">629</span><span id="line-629">    return this.dfsCluster;</span>
-<span class="source-line-no">630</span><span id="line-630">  }</span>
-<span class="source-line-no">631</span><span id="line-631"></span>
-<span class="source-line-no">632</span><span id="line-632">  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {</span>
-<span class="source-line-no">633</span><span id="line-633">    createDirsAndSetProperties();</span>
-<span class="source-line-no">634</span><span id="line-634">    dfsCluster =</span>
-<span class="source-line-no">635</span><span id="line-635">      new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null, null, null, null);</span>
-<span class="source-line-no">636</span><span id="line-636">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
-<span class="source-line-no">637</span><span id="line-637">    this.dfsClusterFixer.start();</span>
-<span class="source-line-no">638</span><span id="line-638">    return dfsCluster;</span>
-<span class="source-line-no">639</span><span id="line-639">  }</span>
-<span class="source-line-no">640</span><span id="line-640"></span>
-<span class="source-line-no">641</span><span id="line-641">  /**</span>
-<span class="source-line-no">642</span><span id="line-642">   * This is used before starting HDFS and map-reduce mini-clusters Run something like the below to</span>
-<span class="source-line-no">643</span><span id="line-643">   * check for the likes of '/tmp' references -- i.e. references outside of the test data dir -- in</span>
-<span class="source-line-no">644</span><span id="line-644">   * the conf.</span>
-<span class="source-line-no">645</span><span id="line-645">   *</span>
-<span class="source-line-no">646</span><span id="line-646">   * &lt;pre&gt;</span>
-<span class="source-line-no">647</span><span id="line-647">   * Configuration conf = TEST_UTIL.getConfiguration();</span>
-<span class="source-line-no">648</span><span id="line-648">   * for (Iterator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt; i = conf.iterator(); i.hasNext();) {</span>
-<span class="source-line-no">649</span><span id="line-649">   *   Map.Entry&amp;lt;String, String&amp;gt; e = i.next();</span>
-<span class="source-line-no">650</span><span id="line-650">   *   assertFalse(e.getKey() + " " + e.getValue(), e.getValue().contains("/tmp"));</span>
-<span class="source-line-no">651</span><span id="line-651">   * }</span>
-<span class="source-line-no">652</span><span id="line-652">   * &lt;/pre&gt;</span>
-<span class="source-line-no">653</span><span id="line-653">   */</span>
-<span class="source-line-no">654</span><span id="line-654">  private void createDirsAndSetProperties() throws IOException {</span>
-<span class="source-line-no">655</span><span id="line-655">    setupClusterTestDir();</span>
-<span class="source-line-no">656</span><span id="line-656">    conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, clusterTestDir.getCanonicalPath());</span>
-<span class="source-line-no">657</span><span id="line-657">    createDirAndSetProperty("test.cache.data");</span>
-<span class="source-line-no">658</span><span id="line-658">    createDirAndSetProperty("hadoop.tmp.dir");</span>
-<span class="source-line-no">659</span><span id="line-659">    hadoopLogDir = createDirAndSetProperty("hadoop.log.dir");</span>
-<span class="source-line-no">660</span><span id="line-660">    createDirAndSetProperty("mapreduce.cluster.local.dir");</span>
-<span class="source-line-no">661</span><span id="line-661">    createDirAndSetProperty("mapreduce.cluster.temp.dir");</span>
-<span class="source-line-no">662</span><span id="line-662">    enableShortCircuit();</span>
-<span class="source-line-no">663</span><span id="line-663"></span>
-<span class="source-line-no">664</span><span id="line-664">    Path root = getDataTestDirOnTestFS("hadoop");</span>
-<span class="source-line-no">665</span><span id="line-665">    conf.set(MapreduceTestingShim.getMROutputDirProp(),</span>
-<span class="source-line-no">666</span><span id="line-666">      new Path(root, "mapred-output-dir").toString());</span>
-<span class="source-line-no">667</span><span id="line-667">    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());</span>
-<span class="source-line-no">668</span><span id="line-668">    conf.set("mapreduce.jobtracker.staging.root.dir",</span>
-<span class="source-line-no">669</span><span id="line-669">      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());</span>
-<span class="source-line-no">670</span><span id="line-670">    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());</span>
-<span class="source-line-no">671</span><span id="line-671">    conf.set("yarn.app.mapreduce.am.staging-dir",</span>
-<span class="source-line-no">672</span><span id="line-672">      new Path(root, "mapreduce-am-staging-root-dir").toString());</span>
-<span class="source-line-no">673</span><span id="line-673"></span>
-<span class="source-line-no">674</span><span id="line-674">    // Frustrate yarn's and hdfs's attempts at writing /tmp.</span>
-<span class="source-line-no">675</span><span id="line-675">    // Below is fragile. Make it so we just interpolate any 'tmp' reference.</span>
-<span class="source-line-no">676</span><span id="line-676">    createDirAndSetProperty("yarn.node-labels.fs-store.root-dir");</span>
-<span class="source-line-no">677</span><span id="line-677">    createDirAndSetProperty("yarn.node-attribute.fs-store.root-dir");</span>
-<span class="source-line-no">678</span><span id="line-678">    createDirAndSetProperty("yarn.nodemanager.log-dirs");</span>
-<span class="source-line-no">679</span><span id="line-679">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
-<span class="source-line-no">680</span><span id="line-680">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.active-dir");</span>
-<span class="source-line-no">681</span><span id="line-681">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.done-dir");</span>
-<span class="source-line-no">682</span><span id="line-682">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
-<span class="source-line-no">683</span><span id="line-683">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
-<span class="source-line-no">684</span><span id="line-684">    createDirAndSetProperty("dfs.datanode.shared.file.descriptor.paths");</span>
-<span class="source-line-no">685</span><span id="line-685">    createDirAndSetProperty("nfs.dump.dir");</span>
-<span class="source-line-no">686</span><span id="line-686">    createDirAndSetProperty("java.io.tmpdir");</span>
-<span class="source-line-no">687</span><span id="line-687">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
-<span class="source-line-no">688</span><span id="line-688">    createDirAndSetProperty("dfs.provided.aliasmap.inmemory.leveldb.dir");</span>
-<span class="source-line-no">689</span><span id="line-689">    createDirAndSetProperty("fs.s3a.committer.staging.tmp.path");</span>
-<span class="source-line-no">690</span><span id="line-690"></span>
-<span class="source-line-no">691</span><span id="line-691">    // disable metrics logger since it depend on commons-logging internal classes and we do not want</span>
-<span class="source-line-no">692</span><span id="line-692">    // commons-logging on our classpath</span>
-<span class="source-line-no">693</span><span id="line-693">    conf.setInt(DFSConfigKeys.DFS_NAMENODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
-<span class="source-line-no">694</span><span id="line-694">    conf.setInt(DFSConfigKeys.DFS_DATANODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
-<span class="source-line-no">695</span><span id="line-695">  }</span>
-<span class="source-line-no">696</span><span id="line-696"></span>
-<span class="source-line-no">697</span><span id="line-697">  /**</span>
-<span class="source-line-no">698</span><span id="line-698">   * Check whether the tests should assume NEW_VERSION_BEHAVIOR when creating new column families.</span>
-<span class="source-line-no">699</span><span id="line-699">   * Default to false.</span>
-<span class="source-line-no">700</span><span id="line-700">   */</span>
-<span class="source-line-no">701</span><span id="line-701">  public boolean isNewVersionBehaviorEnabled() {</span>
-<span class="source-line-no">702</span><span id="line-702">    final String propName = "hbase.tests.new.version.behavior";</span>
-<span class="source-line-no">703</span><span id="line-703">    String v = System.getProperty(propName);</span>
-<span class="source-line-no">704</span><span id="line-704">    if (v != null) {</span>
-<span class="source-line-no">705</span><span id="line-705">      return Boolean.parseBoolean(v);</span>
-<span class="source-line-no">706</span><span id="line-706">    }</span>
-<span class="source-line-no">707</span><span id="line-707">    return false;</span>
+<span class="source-line-no">509</span><span id="line-509">  /**</span>
+<span class="source-line-no">510</span><span id="line-510">   * Cleans a subdirectory under the test data directory on the test filesystem.</span>
+<span class="source-line-no">511</span><span id="line-511">   * @return True if we removed child</span>
+<span class="source-line-no">512</span><span id="line-512">   */</span>
+<span class="source-line-no">513</span><span id="line-513">  public boolean cleanupDataTestDirOnTestFS(String subdirName) throws IOException {</span>
+<span class="source-line-no">514</span><span id="line-514">    Path cpath = getDataTestDirOnTestFS(subdirName);</span>
+<span class="source-line-no">515</span><span id="line-515">    return getTestFileSystem().delete(cpath, true);</span>
+<span class="source-line-no">516</span><span id="line-516">  }</span>
+<span class="source-line-no">517</span><span id="line-517"></span>
+<span class="source-line-no">518</span><span id="line-518">  // Workaround to avoid IllegalThreadStateException</span>
+<span class="source-line-no">519</span><span id="line-519">  // See HBASE-27148 for more details</span>
+<span class="source-line-no">520</span><span id="line-520">  private static final class FsDatasetAsyncDiskServiceFixer extends Thread {</span>
+<span class="source-line-no">521</span><span id="line-521"></span>
+<span class="source-line-no">522</span><span id="line-522">    private volatile boolean stopped = false;</span>
+<span class="source-line-no">523</span><span id="line-523"></span>
+<span class="source-line-no">524</span><span id="line-524">    private final MiniDFSCluster cluster;</span>
+<span class="source-line-no">525</span><span id="line-525"></span>
+<span class="source-line-no">526</span><span id="line-526">    FsDatasetAsyncDiskServiceFixer(MiniDFSCluster cluster) {</span>
+<span class="source-line-no">527</span><span id="line-527">      super("FsDatasetAsyncDiskServiceFixer");</span>
+<span class="source-line-no">528</span><span id="line-528">      setDaemon(true);</span>
+<span class="source-line-no">529</span><span id="line-529">      this.cluster = cluster;</span>
+<span class="source-line-no">530</span><span id="line-530">    }</span>
+<span class="source-line-no">531</span><span id="line-531"></span>
+<span class="source-line-no">532</span><span id="line-532">    @Override</span>
+<span class="source-line-no">533</span><span id="line-533">    public void run() {</span>
+<span class="source-line-no">534</span><span id="line-534">      while (!stopped) {</span>
+<span class="source-line-no">535</span><span id="line-535">        try {</span>
+<span class="source-line-no">536</span><span id="line-536">          Thread.sleep(30000);</span>
+<span class="source-line-no">537</span><span id="line-537">        } catch (InterruptedException e) {</span>
+<span class="source-line-no">538</span><span id="line-538">          Thread.currentThread().interrupt();</span>
+<span class="source-line-no">539</span><span id="line-539">          continue;</span>
+<span class="source-line-no">540</span><span id="line-540">        }</span>
+<span class="source-line-no">541</span><span id="line-541">        // we could add new datanodes during tests, so here we will check every 30 seconds, as the</span>
+<span class="source-line-no">542</span><span id="line-542">        // timeout of the thread pool executor is 60 seconds by default.</span>
+<span class="source-line-no">543</span><span id="line-543">        try {</span>
+<span class="source-line-no">544</span><span id="line-544">          for (DataNode dn : cluster.getDataNodes()) {</span>
+<span class="source-line-no">545</span><span id="line-545">            FsDatasetSpi&lt;?&gt; dataset = dn.getFSDataset();</span>
+<span class="source-line-no">546</span><span id="line-546">            Field service = dataset.getClass().getDeclaredField("asyncDiskService");</span>
+<span class="source-line-no">547</span><span id="line-547">            service.setAccessible(true);</span>
+<span class="source-line-no">548</span><span id="line-548">            Object asyncDiskService = service.get(dataset);</span>
+<span class="source-line-no">549</span><span id="line-549">            Field group = asyncDiskService.getClass().getDeclaredField("threadGroup");</span>
+<span class="source-line-no">550</span><span id="line-550">            group.setAccessible(true);</span>
+<span class="source-line-no">551</span><span id="line-551">            ThreadGroup threadGroup = (ThreadGroup) group.get(asyncDiskService);</span>
+<span class="source-line-no">552</span><span id="line-552">            if (threadGroup.isDaemon()) {</span>
+<span class="source-line-no">553</span><span id="line-553">              threadGroup.setDaemon(false);</span>
+<span class="source-line-no">554</span><span id="line-554">            }</span>
+<span class="source-line-no">555</span><span id="line-555">          }</span>
+<span class="source-line-no">556</span><span id="line-556">        } catch (NoSuchFieldException e) {</span>
+<span class="source-line-no">557</span><span id="line-557">          LOG.debug("NoSuchFieldException: " + e.getMessage()</span>
+<span class="source-line-no">558</span><span id="line-558">            + "; It might because your Hadoop version &gt; 3.2.3 or 3.3.4, "</span>
+<span class="source-line-no">559</span><span id="line-559">            + "See HBASE-27595 for details.");</span>
+<span class="source-line-no">560</span><span id="line-560">        } catch (Exception e) {</span>
+<span class="source-line-no">561</span><span id="line-561">          LOG.warn("failed to reset thread pool timeout for FsDatasetAsyncDiskService", e);</span>
+<span class="source-line-no">562</span><span id="line-562">        }</span>
+<span class="source-line-no">563</span><span id="line-563">      }</span>
+<span class="source-line-no">564</span><span id="line-564">    }</span>
+<span class="source-line-no">565</span><span id="line-565"></span>
+<span class="source-line-no">566</span><span id="line-566">    void shutdown() {</span>
+<span class="source-line-no">567</span><span id="line-567">      stopped = true;</span>
+<span class="source-line-no">568</span><span id="line-568">      interrupt();</span>
+<span class="source-line-no">569</span><span id="line-569">    }</span>
+<span class="source-line-no">570</span><span id="line-570">  }</span>
+<span class="source-line-no">571</span><span id="line-571"></span>
+<span class="source-line-no">572</span><span id="line-572">  /**</span>
+<span class="source-line-no">573</span><span id="line-573">   * Start a minidfscluster.</span>
+<span class="source-line-no">574</span><span id="line-574">   * @param servers How many DNs to start.</span>
+<span class="source-line-no">575</span><span id="line-575">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">576</span><span id="line-576">   * @return The mini dfs cluster created.</span>
+<span class="source-line-no">577</span><span id="line-577">   */</span>
+<span class="source-line-no">578</span><span id="line-578">  public MiniDFSCluster startMiniDFSCluster(int servers) throws Exception {</span>
+<span class="source-line-no">579</span><span id="line-579">    return startMiniDFSCluster(servers, null);</span>
+<span class="source-line-no">580</span><span id="line-580">  }</span>
+<span class="source-line-no">581</span><span id="line-581"></span>
+<span class="source-line-no">582</span><span id="line-582">  /**</span>
+<span class="source-line-no">583</span><span id="line-583">   * Start a minidfscluster. This is useful if you want to run datanode on distinct hosts for things</span>
+<span class="source-line-no">584</span><span id="line-584">   * like HDFS block location verification. If you start MiniDFSCluster without host names, all</span>
+<span class="source-line-no">585</span><span id="line-585">   * instances of the datanodes will have the same host name.</span>
+<span class="source-line-no">586</span><span id="line-586">   * @param hosts hostnames DNs to run on.</span>
+<span class="source-line-no">587</span><span id="line-587">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">588</span><span id="line-588">   * @return The mini dfs cluster created.</span>
+<span class="source-line-no">589</span><span id="line-589">   */</span>
+<span class="source-line-no">590</span><span id="line-590">  public MiniDFSCluster startMiniDFSCluster(final String hosts[]) throws Exception {</span>
+<span class="source-line-no">591</span><span id="line-591">    if (hosts != null &amp;&amp; hosts.length != 0) {</span>
+<span class="source-line-no">592</span><span id="line-592">      return startMiniDFSCluster(hosts.length, hosts);</span>
+<span class="source-line-no">593</span><span id="line-593">    } else {</span>
+<span class="source-line-no">594</span><span id="line-594">      return startMiniDFSCluster(1, null);</span>
+<span class="source-line-no">595</span><span id="line-595">    }</span>
+<span class="source-line-no">596</span><span id="line-596">  }</span>
+<span class="source-line-no">597</span><span id="line-597"></span>
+<span class="source-line-no">598</span><span id="line-598">  /**</span>
+<span class="source-line-no">599</span><span id="line-599">   * Start a minidfscluster. Can only create one.</span>
+<span class="source-line-no">600</span><span id="line-600">   * @param servers How many DNs to start.</span>
+<span class="source-line-no">601</span><span id="line-601">   * @param hosts   hostnames DNs to run on.</span>
+<span class="source-line-no">602</span><span id="line-602">   * @see #shutdownMiniDFSCluster()</span>
+<span class="source-line-no">603</span><span id="line-603">   * @return The mini dfs cluster created.</span>
+<span class="source-line-no">604</span><span id="line-604">   */</span>
+<span class="source-line-no">605</span><span id="line-605">  public MiniDFSCluster startMiniDFSCluster(int servers, final String hosts[]) throws Exception {</span>
+<span class="source-line-no">606</span><span id="line-606">    return startMiniDFSCluster(servers, null, hosts);</span>
+<span class="source-line-no">607</span><span id="line-607">  }</span>
+<span class="source-line-no">608</span><span id="line-608"></span>
+<span class="source-line-no">609</span><span id="line-609">  private void setFs() throws IOException {</span>
+<span class="source-line-no">610</span><span id="line-610">    if (this.dfsCluster == null) {</span>
+<span class="source-line-no">611</span><span id="line-611">      LOG.info("Skipping setting fs because dfsCluster is null");</span>
+<span class="source-line-no">612</span><span id="line-612">      return;</span>
+<span class="source-line-no">613</span><span id="line-613">    }</span>
+<span class="source-line-no">614</span><span id="line-614">    FileSystem fs = this.dfsCluster.getFileSystem();</span>
+<span class="source-line-no">615</span><span id="line-615">    CommonFSUtils.setFsDefault(this.conf, new Path(fs.getUri()));</span>
+<span class="source-line-no">616</span><span id="line-616"></span>
+<span class="source-line-no">617</span><span id="line-617">    // re-enable this check with dfs</span>
+<span class="source-line-no">618</span><span id="line-618">    conf.unset(CommonFSUtils.UNSAFE_STREAM_CAPABILITY_ENFORCE);</span>
+<span class="source-line-no">619</span><span id="line-619">  }</span>
+<span class="source-line-no">620</span><span id="line-620"></span>
+<span class="source-line-no">621</span><span id="line-621">  public MiniDFSCluster startMiniDFSCluster(int servers, final String racks[], String hosts[])</span>
+<span class="source-line-no">622</span><span id="line-622">    throws Exception {</span>
+<span class="source-line-no">623</span><span id="line-623">    createDirsAndSetProperties();</span>
+<span class="source-line-no">624</span><span id="line-624">    EditLogFileOutputStream.setShouldSkipFsyncForTesting(true);</span>
+<span class="source-line-no">625</span><span id="line-625"></span>
+<span class="source-line-no">626</span><span id="line-626">    this.dfsCluster =</span>
+<span class="source-line-no">627</span><span id="line-627">      new MiniDFSCluster(0, this.conf, servers, true, true, true, null, racks, hosts, null);</span>
+<span class="source-line-no">628</span><span id="line-628">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
+<span class="source-line-no">629</span><span id="line-629">    this.dfsClusterFixer.start();</span>
+<span class="source-line-no">630</span><span id="line-630">    // Set this just-started cluster as our filesystem.</span>
+<span class="source-line-no">631</span><span id="line-631">    setFs();</span>
+<span class="source-line-no">632</span><span id="line-632"></span>
+<span class="source-line-no">633</span><span id="line-633">    // Wait for the cluster to be totally up</span>
+<span class="source-line-no">634</span><span id="line-634">    this.dfsCluster.waitClusterUp();</span>
+<span class="source-line-no">635</span><span id="line-635"></span>
+<span class="source-line-no">636</span><span id="line-636">    // reset the test directory for test file system</span>
+<span class="source-line-no">637</span><span id="line-637">    dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">638</span><span id="line-638">    String dataTestDir = getDataTestDir().toString();</span>
+<span class="source-line-no">639</span><span id="line-639">    conf.set(HConstants.HBASE_DIR, dataTestDir);</span>
+<span class="source-line-no">640</span><span id="line-640">    LOG.debug("Setting {} to {}", HConstants.HBASE_DIR, dataTestDir);</span>
+<span class="source-line-no">641</span><span id="line-641"></span>
+<span class="source-line-no">642</span><span id="line-642">    return this.dfsCluster;</span>
+<span class="source-line-no">643</span><span id="line-643">  }</span>
+<span class="source-line-no">644</span><span id="line-644"></span>
+<span class="source-line-no">645</span><span id="line-645">  public MiniDFSCluster startMiniDFSClusterForTestWAL(int namenodePort) throws IOException {</span>
+<span class="source-line-no">646</span><span id="line-646">    createDirsAndSetProperties();</span>
+<span class="source-line-no">647</span><span id="line-647">    dfsCluster =</span>
+<span class="source-line-no">648</span><span id="line-648">      new MiniDFSCluster(namenodePort, conf, 5, false, true, true, null, null, null, null);</span>
+<span class="source-line-no">649</span><span id="line-649">    this.dfsClusterFixer = new FsDatasetAsyncDiskServiceFixer(dfsCluster);</span>
+<span class="source-line-no">650</span><span id="line-650">    this.dfsClusterFixer.start();</span>
+<span class="source-line-no">651</span><span id="line-651">    return dfsCluster;</span>
+<span class="source-line-no">652</span><span id="line-652">  }</span>
+<span class="source-line-no">653</span><span id="line-653"></span>
+<span class="source-line-no">654</span><span id="line-654">  /**</span>
+<span class="source-line-no">655</span><span id="line-655">   * This is used before starting HDFS and map-reduce mini-clusters Run something like the below to</span>
+<span class="source-line-no">656</span><span id="line-656">   * check for the likes of '/tmp' references -- i.e. references outside of the test data dir -- in</span>
+<span class="source-line-no">657</span><span id="line-657">   * the conf.</span>
+<span class="source-line-no">658</span><span id="line-658">   *</span>
+<span class="source-line-no">659</span><span id="line-659">   * &lt;pre&gt;</span>
+<span class="source-line-no">660</span><span id="line-660">   * Configuration conf = TEST_UTIL.getConfiguration();</span>
+<span class="source-line-no">661</span><span id="line-661">   * for (Iterator&amp;lt;Map.Entry&amp;lt;String, String&amp;gt;&amp;gt; i = conf.iterator(); i.hasNext();) {</span>
+<span class="source-line-no">662</span><span id="line-662">   *   Map.Entry&amp;lt;String, String&amp;gt; e = i.next();</span>
+<span class="source-line-no">663</span><span id="line-663">   *   assertFalse(e.getKey() + " " + e.getValue(), e.getValue().contains("/tmp"));</span>
+<span class="source-line-no">664</span><span id="line-664">   * }</span>
+<span class="source-line-no">665</span><span id="line-665">   * &lt;/pre&gt;</span>
+<span class="source-line-no">666</span><span id="line-666">   */</span>
+<span class="source-line-no">667</span><span id="line-667">  private void createDirsAndSetProperties() throws IOException {</span>
+<span class="source-line-no">668</span><span id="line-668">    setupClusterTestDir();</span>
+<span class="source-line-no">669</span><span id="line-669">    conf.set(MiniDFSCluster.HDFS_MINIDFS_BASEDIR, clusterTestDir.getCanonicalPath());</span>
+<span class="source-line-no">670</span><span id="line-670">    createDirAndSetProperty("test.cache.data");</span>
+<span class="source-line-no">671</span><span id="line-671">    createDirAndSetProperty("hadoop.tmp.dir");</span>
+<span class="source-line-no">672</span><span id="line-672">    hadoopLogDir = createDirAndSetProperty("hadoop.log.dir");</span>
+<span class="source-line-no">673</span><span id="line-673">    createDirAndSetProperty("mapreduce.cluster.local.dir");</span>
+<span class="source-line-no">674</span><span id="line-674">    createDirAndSetProperty("mapreduce.cluster.temp.dir");</span>
+<span class="source-line-no">675</span><span id="line-675">    enableShortCircuit();</span>
+<span class="source-line-no">676</span><span id="line-676"></span>
+<span class="source-line-no">677</span><span id="line-677">    Path root = getDataTestDirOnTestFS("hadoop");</span>
+<span class="source-line-no">678</span><span id="line-678">    conf.set(MapreduceTestingShim.getMROutputDirProp(),</span>
+<span class="source-line-no">679</span><span id="line-679">      new Path(root, "mapred-output-dir").toString());</span>
+<span class="source-line-no">680</span><span id="line-680">    conf.set("mapreduce.jobtracker.system.dir", new Path(root, "mapred-system-dir").toString());</span>
+<span class="source-line-no">681</span><span id="line-681">    conf.set("mapreduce.jobtracker.staging.root.dir",</span>
+<span class="source-line-no">682</span><span id="line-682">      new Path(root, "mapreduce-jobtracker-staging-root-dir").toString());</span>
+<span class="source-line-no">683</span><span id="line-683">    conf.set("mapreduce.job.working.dir", new Path(root, "mapred-working-dir").toString());</span>
+<span class="source-line-no">684</span><span id="line-684">    conf.set("yarn.app.mapreduce.am.staging-dir",</span>
+<span class="source-line-no">685</span><span id="line-685">      new Path(root, "mapreduce-am-staging-root-dir").toString());</span>
+<span class="source-line-no">686</span><span id="line-686"></span>
+<span class="source-line-no">687</span><span id="line-687">    // Frustrate yarn's and hdfs's attempts at writing /tmp.</span>
+<span class="source-line-no">688</span><span id="line-688">    // Below is fragile. Make it so we just interpolate any 'tmp' reference.</span>
+<span class="source-line-no">689</span><span id="line-689">    createDirAndSetProperty("yarn.node-labels.fs-store.root-dir");</span>
+<span class="source-line-no">690</span><span id="line-690">    createDirAndSetProperty("yarn.node-attribute.fs-store.root-dir");</span>
+<span class="source-line-no">691</span><span id="line-691">    createDirAndSetProperty("yarn.nodemanager.log-dirs");</span>
+<span class="source-line-no">692</span><span id="line-692">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
+<span class="source-line-no">693</span><span id="line-693">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.active-dir");</span>
+<span class="source-line-no">694</span><span id="line-694">    createDirAndSetProperty("yarn.timeline-service.entity-group-fs-store.done-dir");</span>
+<span class="source-line-no">695</span><span id="line-695">    createDirAndSetProperty("yarn.nodemanager.remote-app-log-dir");</span>
+<span class="source-line-no">696</span><span id="line-696">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
+<span class="source-line-no">697</span><span id="line-697">    createDirAndSetProperty("dfs.datanode.shared.file.descriptor.paths");</span>
+<span class="source-line-no">698</span><span id="line-698">    createDirAndSetProperty("nfs.dump.dir");</span>
+<span class="source-line-no">699</span><span id="line-699">    createDirAndSetProperty("java.io.tmpdir");</span>
+<span class="source-line-no">700</span><span id="line-700">    createDirAndSetProperty("dfs.journalnode.edits.dir");</span>
+<span class="source-line-no">701</span><span id="line-701">    createDirAndSetProperty("dfs.provided.aliasmap.inmemory.leveldb.dir");</span>
+<span class="source-line-no">702</span><span id="line-702">    createDirAndSetProperty("fs.s3a.committer.staging.tmp.path");</span>
+<span class="source-line-no">703</span><span id="line-703"></span>
+<span class="source-line-no">704</span><span id="line-704">    // disable metrics logger since it depend on commons-logging internal classes and we do not want</span>
+<span class="source-line-no">705</span><span id="line-705">    // commons-logging on our classpath</span>
+<span class="source-line-no">706</span><span id="line-706">    conf.setInt(DFSConfigKeys.DFS_NAMENODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
+<span class="source-line-no">707</span><span id="line-707">    conf.setInt(DFSConfigKeys.DFS_DATANODE_METRICS_LOGGER_PERIOD_SECONDS_KEY, 0);</span>
 <span class="source-line-no">708</span><span id="line-708">  }</span>
 <span class="source-line-no">709</span><span id="line-709"></span>
 <span class="source-line-no">710</span><span id="line-710">  /**</span>
-<span class="source-line-no">711</span><span id="line-711">   * Get the HBase setting for dfs.client.read.shortcircuit from the conf or a system property. This</span>
-<span class="source-line-no">712</span><span id="line-712">   * allows to specify this parameter on the command line. If not set, default is true.</span>
+<span class="source-line-no">711</span><span id="line-711">   * Check whether the tests should assume NEW_VERSION_BEHAVIOR when creating new column families.</span>
+<span class="source-line-no">712</span><span id="line-712">   * Default to false.</span>
 <span class="source-line-no">713</span><span id="line-713">   */</span>
-<span class="source-line-no">714</span><span id="line-714">  public boolean isReadShortCircuitOn() {</span>
-<span class="source-line-no">715</span><span id="line-715">    final String propName = "hbase.tests.use.shortcircuit.reads";</span>
-<span class="source-line-no">716</span><span id="line-716">    String readOnProp = System.getProperty(propName);</span>
-<span class="source-line-no">717</span><span id="line-717">    if (readOnProp != null) {</span>
-<span class="source-line-no">718</span><span id="line-718">      return Boolean.parseBoolean(readOnProp);</span>
-<span class="source-line-no">719</span><span id="line-719">    } else {</span>
-<span class="source-line-no">720</span><span id="line-720">      return conf.getBoolean(propName, false);</span>
-<span class="source-line-no">721</span><span id="line-721">    }</span>
-<span class="source-line-no">722</span><span id="line-722">  }</span>
-<span class="source-line-no">723</span><span id="line-723"></span>
-<span class="source-line-no">724</span><span id="line-724">  /**</span>
-<span class="source-line-no">725</span><span id="line-725">   * Enable the short circuit read, unless configured differently. Set both HBase and HDFS settings,</span>
-<span class="source-line-no">726</span><span id="line-726">   * including skipping the hdfs checksum checks.</span>
-<span class="source-line-no">727</span><span id="line-727">   */</span>
-<span class="source-line-no">728</span><span id="line-728">  private void enableShortCircuit() {</span>
-<span class="source-line-no">729</span><span id="line-729">    if (isReadShortCircuitOn()) {</span>
-<span class="source-line-no">730</span><span id="line-730">      String curUser = System.getProperty("user.name");</span>
-<span class="source-line-no">731</span><span id="line-731">      LOG.info("read short circuit is ON for user " + curUser);</span>
-<span class="source-line-no">732</span><span id="line-732">      // read short circuit, for hdfs</span>
-<span class="source-line-no">733</span><span id="line-733">      conf.set("dfs.block.local-path-access.user", curUser);</span>
-<span class="source-line-no">734</span><span id="line-734">      // read short circuit, for hbase</span>
-<span class="source-line-no">735</span><span id="line-735">      conf.setBoolean("dfs.client.read.shortcircuit", true);</span>
-<span class="source-line-no">736</span><span id="line-736">      // Skip checking checksum, for the hdfs client and the datanode</span>
-<span class="source-line-no">737</span><span id="line-737">      conf.setBoolean("dfs.client.read.shortcircuit.skip.checksum", true);</span>
-<span class="source-line-no">738</span><span id="line-738">    } else {</span>
-<span class="source-line-no">739</span><span id="line-739">      LOG.info("read short circuit is OFF");</span>
-<span class="source-line-no">740</span><span id="line-740">    }</span>
-<span class="source-line-no">741</span><span id="line-741">  }</span>
-<span class="source-line-no">742</span><span id="line-742"></span>
-<span class="source-line-no">743</span><span id="line-743">  private String createDirAndSetProperty(final String property) {</span>
-<span class="source-line-no">744</span><span id="line-744">    return createDirAndSetProperty(property, property);</span>
-<span class="source-line-no">745</span><span id="line-745">  }</span>
-<span class="source-line-no">746</span><span id="line-746"></span>
-<span class="source-line-no">747</span><span id="line-747">  private String createDirAndSetProperty(final String relPath, String property) {</span>
-<span class="source-line-no">748</span><span id="line-748">    String path = getDataTestDir(relPath).toString();</span>
-<span class="source-line-no">749</span><span id="line-749">    System.setProperty(property, path);</span>
-<span class="source-line-no">750</span><span id="line-750">    conf.set(property, path);</span>
-<span class="source-line-no">751</span><span id="line-751">    new File(path).mkdirs();</span>
-<span class="source-line-no">752</span><span id="line-752">    LOG.info("Setting " + property + " to " + path + " in system properties and HBase conf");</span>
-<span class="source-line-no">753</span><span id="line-753">    return path;</span>
+<span class="source-line-no">714</span><span id="line-714">  public boolean isNewVersionBehaviorEnabled() {</span>
+<span class="source-line-no">715</span><span id="line-715">    final String propName = "hbase.tests.new.version.behavior";</span>
+<span class="source-line-no">716</span><span id="line-716">    String v = System.getProperty(propName);</span>
+<span class="source-line-no">717</span><span id="line-717">    if (v != null) {</span>
+<span class="source-line-no">718</span><span id="line-718">      return Boolean.parseBoolean(v);</span>
+<span class="source-line-no">719</span><span id="line-719">    }</span>
+<span class="source-line-no">720</span><span id="line-720">    return false;</span>
+<span class="source-line-no">721</span><span id="line-721">  }</span>
+<span class="source-line-no">722</span><span id="line-722"></span>
+<span class="source-line-no">723</span><span id="line-723">  /**</span>
+<span class="source-line-no">724</span><span id="line-724">   * Get the HBase setting for dfs.client.read.shortcircuit from the conf or a system property. This</span>
+<span class="source-line-no">725</span><span id="line-725">   * allows to specify this parameter on the command line. If not set, default is true.</span>
+<span class="source-line-no">726</span><span id="line-726">   */</span>
+<span class="source-line-no">727</span><span id="line-727">  public boolean isReadShortCircuitOn() {</span>
+<span class="source-line-no">728</span><span id="line-728">    final String propName = "hbase.tests.use.shortcircuit.reads";</span>
+<span class="source-line-no">729</span><span id="line-729">    String readOnProp = System.getProperty(propName);</span>
+<span class="source-line-no">730</span><span id="line-730">    if (readOnProp != null) {</span>
+<span class="source-line-no">731</span><span id="line-731">      return Boolean.parseBoolean(readOnProp);</span>
+<span class="source-line-no">732</span><span id="line-732">    } else {</span>
+<span class="source-line-no">733</span><span id="line-733">      return conf.getBoolean(propName, false);</span>
+<span class="source-line-no">734</span><span id="line-734">    }</span>
+<span class="source-line-no">735</span><span id="line-735">  }</span>
+<span class="source-line-no">736</span><span id="line-736"></span>
+<span class="source-line-no">737</span><span id="line-737">  /**</span>
+<span class="source-line-no">738</span><span id="line-738">   * Enable the short circuit read, unless configured differently. Set both HBase and HDFS settings,</span>
+<span class="source-line-no">739</span><span id="line-739">   * including skipping the hdfs checksum checks.</span>
+<span class="source-line-no">740</span><span id="line-740">   */</span>
+<span class="source-line-no">741</span><span id="line-741">  private void enableShortCircuit() {</span>
+<span class="source-line-no">742</span><span id="line-742">    if (isReadShortCircuitOn()) {</span>
+<span class="source-line-no">743</span><span id="line-743">      String curUser = System.getProperty("user.name");</span>
+<span class="source-line-no">744</span><span id="line-744">      LOG.info("read short circuit is ON for user " + curUser);</span>
+<span class="source-line-no">745</span><span id="line-745">      // read short circuit, for hdfs</span>
+<span class="source-line-no">746</span><span id="line-746">      conf.set("dfs.block.local-path-access.user", curUser);</span>
+<span class="source-line-no">747</span><span id="line-747">      // read short circuit, for hbase</span>
+<span class="source-line-no">748</span><span id="line-748">      conf.setBoolean("dfs.client.read.shortcircuit", true);</span>
+<span class="source-line-no">749</span><span id="line-749">      // Skip checking checksum, for the hdfs client and the datanode</span>
+<span class="source-line-no">750</span><span id="line-750">      conf.setBoolean("dfs.client.read.shortcircuit.skip.checksum", true);</span>
+<span class="source-line-no">751</span><span id="line-751">    } else {</span>
+<span class="source-line-no">752</span><span id="line-752">      LOG.info("read short circuit is OFF");</span>
+<span class="source-line-no">753</span><span id="line-753">    }</span>
 <span class="source-line-no">754</span><span id="line-754">  }</span>
 <span class="source-line-no">755</span><span id="line-755"></span>
-<span class="source-line-no">756</span><span id="line-756">  /**</span>
-<span class="source-line-no">757</span><span id="line-757">   * Shuts down instance created by call to {@link #startMiniDFSCluster(int)} or does nothing.</span>
-<span class="source-line-no">758</span><span id="line-758">   */</span>
-<span class="source-line-no">759</span><span id="line-759">  public void shutdownMiniDFSCluster() throws IOException {</span>
-<span class="source-line-no">760</span><span id="line-760">    if (this.dfsCluster != null) {</span>
-<span class="source-line-no">761</span><span id="line-761">      // The below throws an exception per dn, AsynchronousCloseException.</span>
-<span class="source-line-no">762</span><span id="line-762">      this.dfsCluster.shutdown();</span>
-<span class="source-line-no">763</span><span id="line-763">      dfsCluster = null;</span>
-<span class="source-line-no">764</span><span id="line-764">      // It is possible that the dfs cluster is set through setDFSCluster method, where we will not</span>
-<span class="source-line-no">765</span><span id="line-765">      // have a fixer</span>
-<span class="source-line-no">766</span><span id="line-766">      if (dfsClusterFixer != null) {</span>
-<span class="source-line-no">767</span><span id="line-767">        this.dfsClusterFixer.shutdown();</span>
-<span class="source-line-no">768</span><span id="line-768">        dfsClusterFixer = null;</span>
-<span class="source-line-no">769</span><span id="line-769">      }</span>
-<span class="source-line-no">770</span><span id="line-770">      dataTestDirOnTestFS = null;</span>
-<span class="source-line-no">771</span><span id="line-771">      CommonFSUtils.setFsDefault(this.conf, new Path("file:///"));</span>
-<span class="source-line-no">772</span><span id="line-772">    }</span>
-<span class="source-line-no">773</span><span id="line-773">  }</span>
-<span class="source-line-no">774</span><span id="line-774"></span>
-<span class="source-line-no">775</span><span id="line-775">  /**</span>
-<span class="source-line-no">776</span><span id="line-776">   * Start up a minicluster of hbase, dfs, and zookeeper where WAL's walDir is created separately.</span>
-<span class="source-line-no">777</span><span id="line-777">   * All other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">778</span><span id="line-778">   * @param createWALDir Whether to create a new WAL directory.</span>
-<span class="source-line-no">779</span><span id="line-779">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">780</span><span id="line-780">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">781</span><span id="line-781">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">782</span><span id="line-782">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">783</span><span id="line-783">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">784</span><span id="line-784">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">785</span><span id="line-785">   */</span>
-<span class="source-line-no">786</span><span id="line-786">  @Deprecated</span>
-<span class="source-line-no">787</span><span id="line-787">  public MiniHBaseCluster startMiniCluster(boolean createWALDir) throws Exception {</span>
-<span class="source-line-no">788</span><span id="line-788">    StartMiniClusterOption option =</span>
-<span class="source-line-no">789</span><span id="line-789">      StartMiniClusterOption.builder().createWALDir(createWALDir).build();</span>
-<span class="source-line-no">790</span><span id="line-790">    return startMiniCluster(option);</span>
-<span class="source-line-no">791</span><span id="line-791">  }</span>
-<span class="source-line-no">792</span><span id="line-792"></span>
-<span class="source-line-no">793</span><span id="line-793">  /**</span>
-<span class="source-line-no">794</span><span id="line-794">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">795</span><span id="line-795">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">796</span><span id="line-796">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">797</span><span id="line-797">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">798</span><span id="line-798">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">799</span><span id="line-799">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">800</span><span id="line-800">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">801</span><span id="line-801">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">802</span><span id="line-802">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">803</span><span id="line-803">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">804</span><span id="line-804">   */</span>
-<span class="source-line-no">805</span><span id="line-805">  @Deprecated</span>
-<span class="source-line-no">806</span><span id="line-806">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir) throws Exception {</span>
-<span class="source-line-no">807</span><span id="line-807">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
-<span class="source-line-no">808</span><span id="line-808">      .numDataNodes(numSlaves).createRootDir(createRootDir).build();</span>
-<span class="source-line-no">809</span><span id="line-809">    return startMiniCluster(option);</span>
-<span class="source-line-no">810</span><span id="line-810">  }</span>
-<span class="source-line-no">811</span><span id="line-811"></span>
-<span class="source-line-no">812</span><span id="line-812">  /**</span>
-<span class="source-line-no">813</span><span id="line-813">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">814</span><span id="line-814">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">815</span><span id="line-815">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">816</span><span id="line-816">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">817</span><span id="line-817">   * @param createWALDir  Whether to create a new WAL directory.</span>
-<span class="source-line-no">818</span><span id="line-818">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">819</span><span id="line-819">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">820</span><span id="line-820">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">821</span><span id="line-821">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">822</span><span id="line-822">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">823</span><span id="line-823">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">824</span><span id="line-824">   */</span>
-<span class="source-line-no">825</span><span id="line-825">  @Deprecated</span>
-<span class="source-line-no">826</span><span id="line-826">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir,</span>
-<span class="source-line-no">827</span><span id="line-827">    boolean createWALDir) throws Exception {</span>
-<span class="source-line-no">828</span><span id="line-828">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
-<span class="source-line-no">829</span><span id="line-829">      .numDataNodes(numSlaves).createRootDir(createRootDir).createWALDir(createWALDir).build();</span>
-<span class="source-line-no">830</span><span id="line-830">    return startMiniCluster(option);</span>
-<span class="source-line-no">831</span><span id="line-831">  }</span>
-<span class="source-line-no">832</span><span id="line-832"></span>
-<span class="source-line-no">833</span><span id="line-833">  /**</span>
-<span class="source-line-no">834</span><span id="line-834">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">835</span><span id="line-835">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">836</span><span id="line-836">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">837</span><span id="line-837">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">838</span><span id="line-838">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">839</span><span id="line-839">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">840</span><span id="line-840">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">841</span><span id="line-841">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">842</span><span id="line-842">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">843</span><span id="line-843">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">844</span><span id="line-844">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">845</span><span id="line-845">   */</span>
-<span class="source-line-no">846</span><span id="line-846">  @Deprecated</span>
-<span class="source-line-no">847</span><span id="line-847">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, boolean createRootDir)</span>
-<span class="source-line-no">848</span><span id="line-848">    throws Exception {</span>
-<span class="source-line-no">849</span><span id="line-849">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">850</span><span id="line-850">      .numRegionServers(numSlaves).createRootDir(createRootDir).numDataNodes(numSlaves).build();</span>
-<span class="source-line-no">851</span><span id="line-851">    return startMiniCluster(option);</span>
-<span class="source-line-no">852</span><span id="line-852">  }</span>
-<span class="source-line-no">853</span><span id="line-853"></span>
-<span class="source-line-no">854</span><span id="line-854">  /**</span>
-<span class="source-line-no">855</span><span id="line-855">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">856</span><span id="line-856">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">857</span><span id="line-857">   * @param numMasters Master node number.</span>
-<span class="source-line-no">858</span><span id="line-858">   * @param numSlaves  Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">859</span><span id="line-859">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">860</span><span id="line-860">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">861</span><span id="line-861">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">862</span><span id="line-862">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">863</span><span id="line-863">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">864</span><span id="line-864">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">865</span><span id="line-865">   */</span>
-<span class="source-line-no">866</span><span id="line-866">  @Deprecated</span>
-<span class="source-line-no">867</span><span id="line-867">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves) throws Exception {</span>
-<span class="source-line-no">868</span><span id="line-868">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">869</span><span id="line-869">      .numRegionServers(numSlaves).numDataNodes(numSlaves).build();</span>
-<span class="source-line-no">870</span><span id="line-870">    return startMiniCluster(option);</span>
-<span class="source-line-no">871</span><span id="line-871">  }</span>
-<span class="source-line-no">872</span><span id="line-872"></span>
-<span class="source-line-no">873</span><span id="line-873">  /**</span>
-<span class="source-line-no">874</span><span id="line-874">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">875</span><span id="line-875">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">876</span><span id="line-876">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">877</span><span id="line-877">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">878</span><span id="line-878">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
-<span class="source-line-no">879</span><span id="line-879">   *                      HDFS data node number.</span>
-<span class="source-line-no">880</span><span id="line-880">   * @param createRootDir Whether to create a new root or data directory path.</span>
-<span class="source-line-no">881</span><span id="line-881">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">882</span><span id="line-882">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">883</span><span id="line-883">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">884</span><span id="line-884">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">885</span><span id="line-885">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">886</span><span id="line-886">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">887</span><span id="line-887">   */</span>
-<span class="source-line-no">888</span><span id="line-888">  @Deprecated</span>
-<span class="source-line-no">889</span><span id="line-889">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts,</span>
-<span class="source-line-no">890</span><span id="line-890">    boolean createRootDir) throws Exception {</span>
-<span class="source-line-no">891</span><span id="line-891">    StartMiniClusterOption option =</span>
-<span class="source-line-no">892</span><span id="line-892">      StartMiniClusterOption.builder().numMasters(numMasters).numRegionServers(numSlaves)</span>
-<span class="source-line-no">893</span><span id="line-893">        .createRootDir(createRootDir).numDataNodes(numSlaves).dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">894</span><span id="line-894">    return startMiniCluster(option);</span>
-<span class="source-line-no">895</span><span id="line-895">  }</span>
-<span class="source-line-no">896</span><span id="line-896"></span>
-<span class="source-line-no">897</span><span id="line-897">  /**</span>
-<span class="source-line-no">898</span><span id="line-898">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">899</span><span id="line-899">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">900</span><span id="line-900">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">901</span><span id="line-901">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">902</span><span id="line-902">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
-<span class="source-line-no">903</span><span id="line-903">   *                      HDFS data node number.</span>
-<span class="source-line-no">904</span><span id="line-904">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">905</span><span id="line-905">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">906</span><span id="line-906">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">907</span><span id="line-907">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">908</span><span id="line-908">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">909</span><span id="line-909">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">910</span><span id="line-910">   */</span>
-<span class="source-line-no">911</span><span id="line-911">  @Deprecated</span>
-<span class="source-line-no">912</span><span id="line-912">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts)</span>
-<span class="source-line-no">913</span><span id="line-913">    throws Exception {</span>
-<span class="source-line-no">914</span><span id="line-914">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">915</span><span id="line-915">      .numRegionServers(numSlaves).numDataNodes(numSlaves).dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">916</span><span id="line-916">    return startMiniCluster(option);</span>
-<span class="source-line-no">917</span><span id="line-917">  }</span>
-<span class="source-line-no">918</span><span id="line-918"></span>
-<span class="source-line-no">919</span><span id="line-919">  /**</span>
-<span class="source-line-no">920</span><span id="line-920">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">921</span><span id="line-921">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">922</span><span id="line-922">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">923</span><span id="line-923">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">924</span><span id="line-924">   * @param numDataNodes     Number of datanodes.</span>
-<span class="source-line-no">925</span><span id="line-925">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">926</span><span id="line-926">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">927</span><span id="line-927">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">928</span><span id="line-928">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">929</span><span id="line-929">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">930</span><span id="line-930">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">931</span><span id="line-931">   */</span>
-<span class="source-line-no">932</span><span id="line-932">  @Deprecated</span>
-<span class="source-line-no">933</span><span id="line-933">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes)</span>
-<span class="source-line-no">934</span><span id="line-934">    throws Exception {</span>
-<span class="source-line-no">935</span><span id="line-935">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">936</span><span id="line-936">      .numRegionServers(numRegionServers).numDataNodes(numDataNodes).build();</span>
-<span class="source-line-no">937</span><span id="line-937">    return startMiniCluster(option);</span>
-<span class="source-line-no">938</span><span id="line-938">  }</span>
-<span class="source-line-no">939</span><span id="line-939"></span>
-<span class="source-line-no">940</span><span id="line-940">  /**</span>
-<span class="source-line-no">941</span><span id="line-941">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">942</span><span id="line-942">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">943</span><span id="line-943">   * @param numMasters    Master node number.</span>
-<span class="source-line-no">944</span><span id="line-944">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">945</span><span id="line-945">   * @param dataNodeHosts The hostnames of DataNodes to run on. If not null, its size will overwrite</span>
-<span class="source-line-no">946</span><span id="line-946">   *                      HDFS data node number.</span>
-<span class="source-line-no">947</span><span id="line-947">   * @param masterClass   The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">948</span><span id="line-948">   * @param rsClass       The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">949</span><span id="line-949">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">950</span><span id="line-950">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">951</span><span id="line-951">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">952</span><span id="line-952">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">953</span><span id="line-953">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">954</span><span id="line-954">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">955</span><span id="line-955">   */</span>
-<span class="source-line-no">956</span><span id="line-956">  @Deprecated</span>
-<span class="source-line-no">957</span><span id="line-957">  public MiniHBaseCluster startMiniCluster(int numMasters, int numSlaves, String[] dataNodeHosts,</span>
-<span class="source-line-no">958</span><span id="line-958">    Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">959</span><span id="line-959">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass) throws Exception {</span>
-<span class="source-line-no">960</span><span id="line-960">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">961</span><span id="line-961">      .masterClass(masterClass).numRegionServers(numSlaves).rsClass(rsClass).numDataNodes(numSlaves)</span>
-<span class="source-line-no">962</span><span id="line-962">      .dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">963</span><span id="line-963">    return startMiniCluster(option);</span>
-<span class="source-line-no">964</span><span id="line-964">  }</span>
-<span class="source-line-no">965</span><span id="line-965"></span>
-<span class="source-line-no">966</span><span id="line-966">  /**</span>
-<span class="source-line-no">967</span><span id="line-967">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">968</span><span id="line-968">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">969</span><span id="line-969">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">970</span><span id="line-970">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">971</span><span id="line-971">   * @param numDataNodes     Number of datanodes.</span>
-<span class="source-line-no">972</span><span id="line-972">   * @param dataNodeHosts    The hostnames of DataNodes to run on. If not null, its size will</span>
-<span class="source-line-no">973</span><span id="line-973">   *                         overwrite HDFS data node number.</span>
-<span class="source-line-no">974</span><span id="line-974">   * @param masterClass      The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">975</span><span id="line-975">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">976</span><span id="line-976">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">977</span><span id="line-977">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">978</span><span id="line-978">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">979</span><span id="line-979">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">980</span><span id="line-980">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">981</span><span id="line-981">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">982</span><span id="line-982">   */</span>
-<span class="source-line-no">983</span><span id="line-983">  @Deprecated</span>
-<span class="source-line-no">984</span><span id="line-984">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes,</span>
-<span class="source-line-no">985</span><span id="line-985">    String[] dataNodeHosts, Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">986</span><span id="line-986">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass) throws Exception {</span>
-<span class="source-line-no">987</span><span id="line-987">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">988</span><span id="line-988">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass)</span>
-<span class="source-line-no">989</span><span id="line-989">      .numDataNodes(numDataNodes).dataNodeHosts(dataNodeHosts).build();</span>
-<span class="source-line-no">990</span><span id="line-990">    return startMiniCluster(option);</span>
-<span class="source-line-no">991</span><span id="line-991">  }</span>
-<span class="source-line-no">992</span><span id="line-992"></span>
-<span class="source-line-no">993</span><span id="line-993">  /**</span>
-<span class="source-line-no">994</span><span id="line-994">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
-<span class="source-line-no">995</span><span id="line-995">   * defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">996</span><span id="line-996">   * @param numMasters       Master node number.</span>
-<span class="source-line-no">997</span><span id="line-997">   * @param numRegionServers Number of region servers.</span>
-<span class="source-line-no">998</span><span id="line-998">   * @param numDataNodes     Number of datanodes.</span>
-<span class="source-line-no">999</span><span id="line-999">   * @param dataNodeHosts    The hostnames of DataNodes to run on. If not null, its size will</span>
-<span class="source-line-no">1000</span><span id="line-1000">   *                         overwrite HDFS data node number.</span>
-<span class="source-line-no">1001</span><span id="line-1001">   * @param masterClass      The class to use as HMaster, or null for default.</span>
-<span class="source-line-no">1002</span><span id="line-1002">   * @param rsClass          The class to use as HRegionServer, or null for default.</span>
-<span class="source-line-no">1003</span><span id="line-1003">   * @param createRootDir    Whether to create a new root or data directory path.</span>
-<span class="source-line-no">1004</span><span id="line-1004">   * @param createWALDir     Whether to create a new WAL directory.</span>
-<span class="source-line-no">1005</span><span id="line-1005">   * @return The mini HBase cluster created.</span>
-<span class="source-line-no">1006</span><span id="line-1006">   * @see #shutdownMiniCluster()</span>
-<span class="source-line-no">1007</span><span id="line-1007">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
-<span class="source-line-no">1008</span><span id="line-1008">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
-<span class="source-line-no">1009</span><span id="line-1009">   * @see #startMiniCluster(StartMiniClusterOption)</span>
-<span class="source-line-no">1010</span><span id="line-1010">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
-<span class="source-line-no">1011</span><span id="line-1011">   */</span>
-<span class="source-line-no">1012</span><span id="line-1012">  @Deprecated</span>
-<span class="source-line-no">1013</span><span id="line-1013">  public MiniHBaseCluster startMiniCluster(int numMasters, int numRegionServers, int numDataNodes,</span>
-<span class="source-line-no">1014</span><span id="line-1014">    String[] dataNodeHosts, Class&lt;? extends HMaster&gt; masterClass,</span>
-<span class="source-line-no">1015</span><span id="line-1015">    Class&lt;? extends MiniHBaseCluster.MiniHBaseClusterRegionServer&gt; rsClass, boolean createRootDir,</span>
-<span class="source-line-no">1016</span><span id="line-1016">    boolean createWALDir) throws Exception {</span>
-<span class="source-line-no">1017</span><span id="line-1017">    StartMiniClusterOption option = StartMiniClusterOption.builder().numMasters(numMasters)</span>
-<span class="source-line-no">1018</span><span id="line-1018">      .masterClass(masterClass).numRegionServers(numRegionServers).rsClass(rsClass)</span>
-<span class="source-line-no">1019</span><span id="line-1019">      .numDataNodes(numDataNodes).dataNodeHosts(dataNodeHosts).createRootDir(createRootDir)</span>
-<span class="source-line-no">1020</span><span id="line-1020">      .createWALDir(createWALDir).build();</span>
-<span class="source-line-no">1021</span><span id="line-1021">    return startMiniCluster(option);</span>
-<span class="source-line-no">1022</span><span id="line-1022">  }</span>
-<span class="source-line-no">1023</span><span id="line-1023"></span>
-<span class="source-line-no">1024</span><span id="line-1024">  /**</span>
-<span class="source-line-no">1025</span><span id="line-1025">   * Start up a minicluster of hbase, dfs and zookeeper clusters with given slave node number. All</span>
-<span class="source-line-no">1026</span><span id="line-1026">   * other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
-<span class="source-line-no">1027</span><span id="line-1027">   * @param numSlaves slave node number, for both HBase region server and HDFS data node.</span>
-<span class="source-line-no">1028</span><span id="line-1028">   * @see #startMiniCluster(StartMiniClusterOption option)</span>
-<span class="source-line-no">1029</span><span id="line-1029">   * @see #shutdownMiniDFSCluster()</span>
-<span class="source-line-no">1030</span><span id="line-1030">   */</span>
-<span class="source-line-no">1031</span><span id="line-1031">  public MiniHBaseCluster startMiniCluster(int numSlaves) throws Exception {</span>
-<span class="source-line-no">1032</span><span id="line-1032">    StartMiniClusterOption option =</span>
-<span class="source-line-no">1033</span><span id="line-1033">      StartMiniClusterOption.builder().numRegionServers(numSlaves).numDataNodes(numSlaves).build();</span>
+<span class="source-line-no">756</span><span id="line-756">  private String createDirAndSetProperty(final String property) {</span>
+<span class="source-line-no">757</span><span id="line-757">    return createDirAndSetProperty(property, property);</span>
+<span class="source-line-no">758</span><span id="line-758">  }</span>
+<span class="source-line-no">759</span><span id="line-759"></span>
+<span class="source-line-no">760</span><span id="line-760">  private String createDirAndSetProperty(final String relPath, String property) {</span>
+<span class="source-line-no">761</span><span id="line-761">    String path = getDataTestDir(relPath).toString();</span>
+<span class="source-line-no">762</span><span id="line-762">    System.setProperty(property, path);</span>
+<span class="source-line-no">763</span><span id="line-763">    conf.set(property, path);</span>
+<span class="source-line-no">764</span><span id="line-764">    new File(path).mkdirs();</span>
+<span class="source-line-no">765</span><span id="line-765">    LOG.info("Setting " + property + " to " + path + " in system properties and HBase conf");</span>
+<span class="source-line-no">766</span><span id="line-766">    return path;</span>
+<span class="source-line-no">767</span><span id="line-767">  }</span>
+<span class="source-line-no">768</span><span id="line-768"></span>
+<span class="source-line-no">769</span><span id="line-769">  /**</span>
+<span class="source-line-no">770</span><span id="line-770">   * Shuts down instance created by call to {@link #startMiniDFSCluster(int)} or does nothing.</span>
+<span class="source-line-no">771</span><span id="line-771">   */</span>
+<span class="source-line-no">772</span><span id="line-772">  public void shutdownMiniDFSCluster() throws IOException {</span>
+<span class="source-line-no">773</span><span id="line-773">    if (this.dfsCluster != null) {</span>
+<span class="source-line-no">774</span><span id="line-774">      // The below throws an exception per dn, AsynchronousCloseException.</span>
+<span class="source-line-no">775</span><span id="line-775">      this.dfsCluster.shutdown();</span>
+<span class="source-line-no">776</span><span id="line-776">      dfsCluster = null;</span>
+<span class="source-line-no">777</span><span id="line-777">      // It is possible that the dfs cluster is set through setDFSCluster method, where we will not</span>
+<span class="source-line-no">778</span><span id="line-778">      // have a fixer</span>
+<span class="source-line-no">779</span><span id="line-779">      if (dfsClusterFixer != null) {</span>
+<span class="source-line-no">780</span><span id="line-780">        this.dfsClusterFixer.shutdown();</span>
+<span class="source-line-no">781</span><span id="line-781">        dfsClusterFixer = null;</span>
+<span class="source-line-no">782</span><span id="line-782">      }</span>
+<span class="source-line-no">783</span><span id="line-783">      dataTestDirOnTestFS = null;</span>
+<span class="source-line-no">784</span><span id="line-784">      CommonFSUtils.setFsDefault(this.conf, new Path("file:///"));</span>
+<span class="source-line-no">785</span><span id="line-785">    }</span>
+<span class="source-line-no">786</span><span id="line-786">  }</span>
+<span class="source-line-no">787</span><span id="line-787"></span>
+<span class="source-line-no">788</span><span id="line-788">  /**</span>
+<span class="source-line-no">789</span><span id="line-789">   * Start up a minicluster of hbase, dfs, and zookeeper where WAL's walDir is created separately.</span>
+<span class="source-line-no">790</span><span id="line-790">   * All other options will use default values, defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">791</span><span id="line-791">   * @param createWALDir Whether to create a new WAL directory.</span>
+<span class="source-line-no">792</span><span id="line-792">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">793</span><span id="line-793">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">794</span><span id="line-794">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">795</span><span id="line-795">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">796</span><span id="line-796">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">797</span><span id="line-797">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">798</span><span id="line-798">   */</span>
+<span class="source-line-no">799</span><span id="line-799">  @Deprecated</span>
+<span class="source-line-no">800</span><span id="line-800">  public MiniHBaseCluster startMiniCluster(boolean createWALDir) throws Exception {</span>
+<span class="source-line-no">801</span><span id="line-801">    StartMiniClusterOption option =</span>
+<span class="source-line-no">802</span><span id="line-802">      StartMiniClusterOption.builder().createWALDir(createWALDir).build();</span>
+<span class="source-line-no">803</span><span id="line-803">    return startMiniCluster(option);</span>
+<span class="source-line-no">804</span><span id="line-804">  }</span>
+<span class="source-line-no">805</span><span id="line-805"></span>
+<span class="source-line-no">806</span><span id="line-806">  /**</span>
+<span class="source-line-no">807</span><span id="line-807">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">808</span><span id="line-808">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">809</span><span id="line-809">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">810</span><span id="line-810">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">811</span><span id="line-811">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">812</span><span id="line-812">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">813</span><span id="line-813">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">814</span><span id="line-814">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">815</span><span id="line-815">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">816</span><span id="line-816">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">817</span><span id="line-817">   */</span>
+<span class="source-line-no">818</span><span id="line-818">  @Deprecated</span>
+<span class="source-line-no">819</span><span id="line-819">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir) throws Exception {</span>
+<span class="source-line-no">820</span><span id="line-820">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
+<span class="source-line-no">821</span><span id="line-821">      .numDataNodes(numSlaves).createRootDir(createRootDir).build();</span>
+<span class="source-line-no">822</span><span id="line-822">    return startMiniCluster(option);</span>
+<span class="source-line-no">823</span><span id="line-823">  }</span>
+<span class="source-line-no">824</span><span id="line-824"></span>
+<span class="source-line-no">825</span><span id="line-825">  /**</span>
+<span class="source-line-no">826</span><span id="line-826">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">827</span><span id="line-827">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">828</span><span id="line-828">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">829</span><span id="line-829">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">830</span><span id="line-830">   * @param createWALDir  Whether to create a new WAL directory.</span>
+<span class="source-line-no">831</span><span id="line-831">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">832</span><span id="line-832">   * @see #shutdownMiniCluster()</span>
+<span class="source-line-no">833</span><span id="line-833">   * @deprecated since 2.2.0 and will be removed in 4.0.0. Use</span>
+<span class="source-line-no">834</span><span id="line-834">   *             {@link #startMiniCluster(StartMiniClusterOption)} instead.</span>
+<span class="source-line-no">835</span><span id="line-835">   * @see #startMiniCluster(StartMiniClusterOption)</span>
+<span class="source-line-no">836</span><span id="line-836">   * @see &lt;a href="https://issues.apache.org/jira/browse/HBASE-21071"&gt;HBASE-21071&lt;/a&gt;</span>
+<span class="source-line-no">837</span><span id="line-837">   */</span>
+<span class="source-line-no">838</span><span id="line-838">  @Deprecated</span>
+<span class="source-line-no">839</span><span id="line-839">  public MiniHBaseCluster startMiniCluster(int numSlaves, boolean createRootDir,</span>
+<span class="source-line-no">840</span><span id="line-840">    boolean createWALDir) throws Exception {</span>
+<span class="source-line-no">841</span><span id="line-841">    StartMiniClusterOption option = StartMiniClusterOption.builder().numRegionServers(numSlaves)</span>
+<span class="source-line-no">842</span><span id="line-842">      .numDataNodes(numSlaves).createRootDir(createRootDir).createWALDir(createWALDir).build();</span>
+<span class="source-line-no">843</span><span id="line-843">    return startMiniCluster(option);</span>
+<span class="source-line-no">844</span><span id="line-844">  }</span>
+<span class="source-line-no">845</span><span id="line-845"></span>
+<span class="source-line-no">846</span><span id="line-846">  /**</span>
+<span class="source-line-no">847</span><span id="line-847">   * Start up a minicluster of hbase, dfs, and zookeeper. All other options will use default values,</span>
+<span class="source-line-no">848</span><span id="line-848">   * defined in {@link StartMiniClusterOption.Builder}.</span>
+<span class="source-line-no">849</span><span id="line-849">   * @param numMasters    Master node number.</span>
+<span class="source-line-no">850</span><span id="line-850">   * @param numSlaves     Slave node number, for both HBase region server and HDFS data node.</span>
+<span class="source-line-no">851</span><span id="line-851">   * @param createRootDir Whether to create a new root or data directory path.</span>
+<span class="source-line-no">852</span><span id="line-852">   * @return The mini HBase cluster created.</span>
+<span class="source-line-no">853</span><span id="line-853">   * @see #shutdownMiniCluster()</span>
... 112311 lines suppressed ...