Revert "HBASE-26490 Add builder for class ReplicationLoadSink (#3883)"
[hbase.git] / RELEASENOTES.md
blobc1b26b2e9f1e91230ba25c3f8d4589b194b4a7ca
1 # RELEASENOTES
3 <!---
4 # Licensed to the Apache Software Foundation (ASF) under one
5 # or more contributor license agreements.  See the NOTICE file
6 # distributed with this work for additional information
7 # regarding copyright ownership.  The ASF licenses this file
8 # to you under the Apache License, Version 2.0 (the
9 # "License"); you may not use this file except in compliance
10 # with the License.  You may obtain a copy of the License at
12 #     http://www.apache.org/licenses/LICENSE-2.0
14 # Unless required by applicable law or agreed to in writing, software
15 # distributed under the License is distributed on an "AS IS" BASIS,
16 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 # See the License for the specific language governing permissions and
18 # limitations under the License.
20 # Be careful doing manual edits in this file. Do not change format
21 # of release header or remove the below marker. This file is generated.
22 # DO NOT REMOVE THIS MARKER; FOR INTERPOLATING CHANGES!-->
23 # hbase 2.4.9 Release Notes
24 No changes
26 # HBASE  2.4.8 Release Notes
28 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
31 ---
33 * [HBASE-26362](https://issues.apache.org/jira/browse/HBASE-26362) | *Major* | **Upload mvn site artifacts for nightly build to nightlies**
35 Now we will upload the site artifacts to nightlies for nightly build as well as pre commit build.
38 ---
40 * [HBASE-26329](https://issues.apache.org/jira/browse/HBASE-26329) | *Major* | **Upgrade commons-io to 2.11.0**
42 Upgraded commons-io to 2.11.0.
45 ---
47 * [HBASE-26186](https://issues.apache.org/jira/browse/HBASE-26186) | *Major* | **jenkins script for caching artifacts should verify cached file before relying on it**
49 Add a '--verify-tar-gz' option to cache-apache-project-artifact.sh for verifying whether the cached file can be parsed as a gzipped tarball.
50 Use this option in our nightly job to avoid failures on broken cached hadoop tarballs.
53 ---
55 * [HBASE-26339](https://issues.apache.org/jira/browse/HBASE-26339) | *Major* | **SshPublisher will skip uploading artifacts if the build is failure**
57 Now we will mark build as unstable instead of failure when the yetus script returns error. This is used to solve the problem that the SshPublisher jenkins plugin will skip uploading artifacts if the build is marked as failure. In fact, the test output will be more important when there are UT failures.
61 # HBASE  2.4.7 Release Notes
63 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
66 ---
68 * [HBASE-26274](https://issues.apache.org/jira/browse/HBASE-26274) | *Major* | **Create an option to reintroduce BlockCache to mapreduce job**
70 Introduce \`hfile.onheap.block.cache.fixed.size\` and default to disable. When using ClientSideRegionScanner, it will be enabled with a fixed size for caching INDEX/LEAF\_INDEX block when a client, e.g. snapshot scanner, scans the entire HFile and does not need to seek/reseek to index block multiple times.
73 ---
75 * [HBASE-26270](https://issues.apache.org/jira/browse/HBASE-26270) | *Minor* | **Provide getConfiguration method for Region and Store interface**
77 Provide 'getReadOnlyConfiguration' method for Store and Region interface
80 ---
82 * [HBASE-26273](https://issues.apache.org/jira/browse/HBASE-26273) | *Major* | **TableSnapshotInputFormat/TableSnapshotInputFormatImpl should use ReadType.STREAM for scanning HFiles**
84 HBase's MapReduce API which can operate over HBase snapshots will now default to using ReadType.STREAM instead of ReadType.DEFAULT (which is PREAD) as a result of this change. HBase developers expect that STREAM will perform significantly better for average Snapshot-based batch jobs. Users can restore the previous functionality (using PREAD) by updating their code to explicitly set a value of \`ReadType.PREAD\` on the \`Scan\` object they provide to TableSnapshotInputFormat, or by setting the configuration property "hbase.TableSnapshotInputFormat.scanner.readtype" to "PREAD" in hbase-site.xml.
87 ---
89 * [HBASE-26276](https://issues.apache.org/jira/browse/HBASE-26276) | *Major* | **Allow HashTable/SyncTable to perform rawScan when comparing cells**
91 Added --rawScan option to HashTable job, which allows HashTable/SyncTable to perform raw scans. If this property is omitted, it defaults to false. When used together with --versions set to a high value, SyncTable will fabricate delete markers to all old versions still hanging (not cleaned yet by major compaction), avoiding the inconsistencies reported in HBASE-21596.
95 # HBASE  2.4.6 Release Notes
97 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
102 * [HBASE-26204](https://issues.apache.org/jira/browse/HBASE-26204) | *Major* | **VerifyReplication should obtain token for peerQuorumAddress too**
104 VerifyReplication obtains tokens even if the peer quorum parameter is used. VerifyReplication with peer quorum can be used for secure clusters also.
109 * [HBASE-24652](https://issues.apache.org/jira/browse/HBASE-24652) | *Minor* | **master-status UI make date type fields sortable**
111 Makes RegionServer 'Start time' sortable in the Master UI
116 * [HBASE-26200](https://issues.apache.org/jira/browse/HBASE-26200) | *Major* | **Undo 'HBASE-25165 Change 'State time' in UI so sorts (#2508)' in favor of HBASE-24652**
118 Undid showing RegionServer 'Start time' in ISO-8601 format. Revert.
123 * [HBASE-6908](https://issues.apache.org/jira/browse/HBASE-6908) | *Major* | **Pluggable Call BlockingQueue for HBaseServer**
125 Can pass in a FQCN to load as the call queue implementation.
127 Standardized arguments to the constructor are the max queue length, the PriorityFunction, and the Configuration.
129 PluggableBlockingQueue abstract class provided to help guide the correct constructor signature.
131 Hard fails with PluggableRpcQueueNotFound if the class fails to load as a BlockingQueue\<CallRunner\>
133 Upstreaming on behalf of Hubspot, we are interested in defining our own custom RPC queue and don't want to get involved in necessarily upstreaming internal requirements/iterations.
138 * [HBASE-26196](https://issues.apache.org/jira/browse/HBASE-26196) | *Major* | **Support configuration override for remote cluster of HFileOutputFormat locality sensitive**
140 Allow any configuration for the remote cluster in HFileOutputFormat2 that could be useful the different configuration from the job's configuration is necessary to connect the remote cluster, for instance, non-secure vs secure.
145 * [HBASE-26160](https://issues.apache.org/jira/browse/HBASE-26160) | *Minor* | **Configurable disallowlist for live editing of loglevels**
147 Adds a new hbase.ui.logLevels.readonly.loggers config which takes a comma-separated list of logger names. Similar to log4j configurations, the logger names can be prefixes or a full logger name. The log level of read only loggers cannot be changed via the logLevel UI or setlevel CLI. This is useful for securing sensitive loggers, such as the SecurityLogger used for audit logs.
152 * [HBASE-26154](https://issues.apache.org/jira/browse/HBASE-26154) | *Minor* | **Provide exception metric for quota exceeded and throttling**
154 Adds "exceptions.quotaExceeded" and "exceptions.rpcThrottling" to HBase server and Thrift server metrics.
159 * [HBASE-26146](https://issues.apache.org/jira/browse/HBASE-26146) | *Minor* | **Allow custom opts for hbck in hbase bin**
161 Adds HBASE\_HBCK\_OPTS environment variable to bin/hbase for passing extra options to hbck/hbck2. Defaults to HBASE\_SERVER\_JAAS\_OPTS if specified, or HBASE\_REGIONSERVER\_OPTS.
165 # HBASE  2.4.5 Release Notes
167 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
172 * [HBASE-26088](https://issues.apache.org/jira/browse/HBASE-26088) | *Critical* | **conn.getBufferedMutator(tableName) leaks thread executors and other problems**
174 The API doc for Connection#getBufferedMutator(TableName) and Connection#getBufferedMutator(BufferedMutatorParams) mentioned that when user dont pass a ThreadPool to be used, we use the ThreadPool in the Connection.  But in reality, we were creating new ThreadPool in such cases.
176 We are keeping the behaviour of code as is but corrected the Javadoc and also a bug of not closing this new pool while Closing the BufferedMutator.
181 * [HBASE-25986](https://issues.apache.org/jira/browse/HBASE-25986) | *Minor* | **Expose the NORMALIZARION\_ENABLED table descriptor through a property in hbase-site**
183 New config: hbase.table.normalization.enabled
185 Default value: false
187 Description: This config is used to set default behaviour of normalizer at table level. To override this at table level one can set NORMALIZATION\_ENABLED at table descriptor level and that property will be honored. Of course, this property at table level can only work if normalizer is enabled at cluster level using "normalizer\_switch true" command.
192 * [HBASE-22923](https://issues.apache.org/jira/browse/HBASE-22923) | *Major* | **hbase:meta is assigned to localhost when we downgrade the hbase version**
194 Introduced new config: hbase.min.version.move.system.tables
196 When the operator uses this configuration option, any version between
197 the current cluster version and the value of "hbase.min.version.move.system.tables"
198 does not trigger any auto-region movement. Auto-region movement here
199 refers to auto-migration of system table regions to newer server versions.
200 It is assumed that the configured range of versions does not require special
201 handling of moving system table regions to higher versioned RegionServer.
202 This auto-migration is done by AssignmentManager#checkIfShouldMoveSystemRegionAsync().
203 Example: Let's assume the cluster is on version 1.4.0 and we have
204 set "hbase.min.version.move.system.tables" as "2.0.0". Now if we upgrade
205 one RegionServer on 1.4.0 cluster to 1.6.0 (\< 2.0.0), then AssignmentManager will
206 not move hbase:meta, hbase:namespace and other system table regions
207 to newly brought up RegionServer 1.6.0 as part of auto-migration.
208 However, if we upgrade one RegionServer on 1.4.0 cluster to 2.2.0 (\> 2.0.0),
209 then AssignmentManager will move all system table regions to newly brought
210 up RegionServer 2.2.0 as part of auto-migration done by
211 AssignmentManager#checkIfShouldMoveSystemRegionAsync().
213 Overall, assuming we have system RSGroup where we keep HBase system tables, if we use
214 config "hbase.min.version.move.system.tables" with value x.y.z then while upgrading cluster to
215 version greater than or equal to x.y.z, the first RegionServer that we upgrade must
216 belong to system RSGroup only.
221 * [HBASE-25902](https://issues.apache.org/jira/browse/HBASE-25902) | *Critical* | **Add missing CFs in meta during HBase 1 to 2.3+ Upgrade**
223 While upgrading cluster from 1.x to 2.3+ versions, after the active master is done setting it's status as 'Initialized', it attempts to add 'table' and 'repl\_barrier' CFs in meta. Once CFs are added successfully, master is aborted with PleaseRestartMasterException because master has missed certain initialization events (e.g ClusterSchemaService is not initialized and tableStateManager fails to migrate table states from ZK to meta due to missing CFs). Subsequent active master initialization is expected to be smooth. 
224 In the presence of multi masters, when one of them becomes active for the first time after upgrading to HBase 2.3+, it is aborted after fixing CFs in meta and one of the other backup masters will take over and become active soon. Hence, overall this is expected to be smooth upgrade if we have backup masters configured. If not, operator is expected to restart same master again manually.
229 * [HBASE-25877](https://issues.apache.org/jira/browse/HBASE-25877) | *Major* | **Add access  check for compactionSwitch**
231 Now calling RSRpcService.compactionSwitch, i.e, Admin.compactionSwitch at client side, requires ADMIN permission.
232 This is an incompatible change but it is also a bug, as we should not allow any users to disable compaction on a regionserver, so we apply this to all active branches.
237 * [HBASE-25984](https://issues.apache.org/jira/browse/HBASE-25984) | *Critical* | **FSHLog WAL lockup with sync future reuse [RS deadlock]**
239 Fixes a WAL lockup issue due to premature reuse of the sync futures by the WAL consumers. The lockup causes the WAL system to hang resulting in blocked appends and syncs thus holding up the RPC handlers from progressing. Only workaround without this fix is to force abort the region server.
244 * [HBASE-25993](https://issues.apache.org/jira/browse/HBASE-25993) | *Major* | **Make excluded SSL cipher suites configurable for all Web UIs**
246 Add "ssl.server.exclude.cipher.list" configuration to excluded cipher suites for the http server started by the InfoServer.
251 * [HBASE-25969](https://issues.apache.org/jira/browse/HBASE-25969) | *Major* | **Cleanup netty-all transitive includes**
253 We have an (old) netty-all in our produced artifacts. It is transitively included from hadoop. It is needed by MiniMRCluster referenced from a few MR tests in hbase. This commit adds netty-all excludes everywhere else but where tests will fail unless the transitive is allowed through. TODO: move MR and/or MR tests out of hbase core.
257 # HBASE  2.4.4 Release Notes
259 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
264 * [HBASE-25963](https://issues.apache.org/jira/browse/HBASE-25963) | *Major* | **HBaseCluster should be marked as IA.Public**
266 Change HBaseCluster to IA.Public as its sub class MiniHBaseCluster is IA.Public.
270 # HBASE  2.4.3 Release Notes
272 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
277 * [HBASE-25766](https://issues.apache.org/jira/browse/HBASE-25766) | *Major* | **Introduce RegionSplitRestriction that restricts the pattern of the split point**
279 After HBASE-25766, we can specify a split restriction, "KeyPrefix" or "DelimitedKeyPrefix", to a table with the "hbase.regionserver.region.split\_restriction.type" property. The "KeyPrefix" split restriction groups rows by a prefix of the row-key. And the "DelimitedKeyPrefix" split restriction groups rows by a prefix of the row-key with a delimiter.
281 For example:
282 \`\`\`
283 # Create a table with a "KeyPrefix" split restriction, where the prefix length is 2 bytes
284 hbase\> create 'tbl1', 'fam', {CONFIGURATION =\> {'hbase.regionserver.region.split\_restriction.type' =\> 'KeyPrefix', 'hbase.regionserver.region.split\_restriction.prefix\_length' =\> '2'}}
286 # Create a table with a "DelimitedKeyPrefix" split restriction, where the delimiter is a comma (,)
287 hbase\> create 'tbl2', 'fam', {CONFIGURATION =\> {'hbase.regionserver.region.split\_restriction.type' =\> 'DelimitedKeyPrefix', 'hbase.regionserver.region.split\_restriction.delimiter' =\> ','}}
288 \`\`\`
290 Instead of specifying a split restriction to a table directly, we can also set the properties in hbase-site.xml. In this case, the specified split restriction is applied for all the tables.
292 Note that the split restriction is also applied to a user-specified split point so that we don't allow users to break the restriction, which is different behavior from the existing KeyPrefixRegionSplitPolicy and DelimitedKeyPrefixRegionSplitPolicy.
297 * [HBASE-25775](https://issues.apache.org/jira/browse/HBASE-25775) | *Major* | **Use a special balancer to deal with maintenance mode**
299 Introduced a MaintenanceLoadBalancer to be used only under maintenance mode. Typically you should not use it as your balancer implementation.
304 * [HBASE-25767](https://issues.apache.org/jira/browse/HBASE-25767) | *Major* | **CandidateGenerator.getRandomIterationOrder is too slow on large cluster**
306 In the actual implementation classes of CandidateGenerator, now we just random select a start point and then iterate sequentially, instead of using the old way, where we will create a big array to hold all the integers in [0, num\_regions\_in\_cluster), shuffle the array, and then iterate on the array.
307 The new implementation is 'random' enough as every time we just select one candidate. The problem for the old implementation is that, it will create an array every time when we want to get a candidate, if we have tens of thousands regions, we will create an array with tens of thousands length everytime, which causes big GC pressure and slow down the balancer execution.
312 * [HBASE-25734](https://issues.apache.org/jira/browse/HBASE-25734) | *Minor* | **Backport HBASE-24305 to branch-2.4**
314 The following method was added to ServerName
316 - #valueOf(Address, long)
321 * [HBASE-25199](https://issues.apache.org/jira/browse/HBASE-25199) | *Minor* | **Remove HStore#getStoreHomedir**
323 Moved the following methods from HStore to HRegionFileSystem
325 - #getStoreHomedir(Path, RegionInfo, byte[])
326 - #getStoreHomedir(Path, String, byte[])
331 * [HBASE-25685](https://issues.apache.org/jira/browse/HBASE-25685) | *Major* | **asyncprofiler2.0 no longer supports svg; wants html**
333 If asyncprofiler 1.x, all is good. If asyncprofiler 2.x and it is hbase-2.3.x or hbase-2.4.x, add '?output=html' to get flamegraphs from the profiler.
335 Otherwise, if hbase-2.5+ and asyncprofiler2, all works. If asyncprofiler1 and hbase-2.5+, you may have to add '?output=svg' to the query.
340 * [HBASE-25518](https://issues.apache.org/jira/browse/HBASE-25518) | *Major* | **Support separate child regions to different region servers**
342 Config key for enable/disable automatically separate child regions to different region servers in the procedure of split regions. One child will be kept to the server where parent region is on, and the other child will be assigned to a random server.
344 hbase.master.auto.separate.child.regions.after.split.enabled
346 Default setting is false/off.
351 * [HBASE-25374](https://issues.apache.org/jira/browse/HBASE-25374) | *Minor* | **Make REST Client connection and socket time out configurable**
353 Configuration parameter to set rest client connection timeout
355 "hbase.rest.client.conn.timeout" Default is 2 \* 1000
357 "hbase.rest.client.socket.timeout" Default of 30 \* 1000
362 * [HBASE-25587](https://issues.apache.org/jira/browse/HBASE-25587) | *Major* | **[hbck2] Schedule SCP for all unknown servers**
364 Adds scheduleSCPsForUnknownServers to Hbck Service.
369 * [HBASE-25636](https://issues.apache.org/jira/browse/HBASE-25636) | *Minor* | **Expose HBCK report as metrics**
371 Expose HBCK repost results in metrics, includes: "orphanRegionsOnRS", "orphanRegionsOnFS", "inconsistentRegions", "holes", "overlaps", "unknownServerRegions" and "emptyRegionInfoRegions".
376 * [HBASE-24305](https://issues.apache.org/jira/browse/HBASE-24305) | *Minor* | **Handle deprecations in ServerName**
378 The following methods were removed or made private from ServerName (due to HBASE-17624):
380 - getHostNameMinusDomain(String): Was made private without a replacement.
381 - parseHostname(String): Use #valueOf(String) instead.
382 - parsePort(String): Use #valueOf(String) instead.
383 - parseStartcode(String): Use #valueOf(String) instead.
384 - getServerName(String, int, long): Was made private. Use #valueOf(String, int, long) instead.
385 - getServerName(String, long): Use #valueOf(String, long) instead.
386 - getHostAndPort(): Use #getAddress() instead.
387 - getServerStartcodeFromServerName(String): Use instance of ServerName to pull out start code)
388 - getServerNameLessStartCode(String): Use #getAddress() instead.
392 # HBASE  2.4.2 Release Notes
394 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
399 * [HBASE-25492](https://issues.apache.org/jira/browse/HBASE-25492) | *Major* | **Create table with rsgroup info in branch-2**
401 HBASE-25492 added a new interface in TableDescriptor which allows user to define RSGroup name while creating or modifying a table.
406 * [HBASE-25460](https://issues.apache.org/jira/browse/HBASE-25460) | *Major* | **Expose drainingServers as cluster metric**
408 Exposed new jmx metrics: "draininigRegionServers" and "numDrainingRegionServers" to provide "comma separated names for regionservers that are put in draining mode" and "num of such regionservers" respectively.
413 * [HBASE-25615](https://issues.apache.org/jira/browse/HBASE-25615) | *Major* | **Upgrade java version in pre commit docker file**
415 jdk8u232-b09 -\> jdk8u282-b08
416 jdk-11.0.6\_10 -\> jdk-11.0.10\_9
421 * [HBASE-23887](https://issues.apache.org/jira/browse/HBASE-23887) | *Major* | **New L1 cache : AdaptiveLRU**
423 Introduced new L1 cache: AdaptiveLRU. This is supposed to provide better performance than default LRU cache.
424 Set config key "hfile.block.cache.policy" to "AdaptiveLRU" in hbase-site in order to start using this new cache.
428 # HBASE  2.4.1 Release Notes
430 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
435 * [HBASE-25449](https://issues.apache.org/jira/browse/HBASE-25449) | *Major* | **'dfs.client.read.shortcircuit' should not be set in hbase-default.xml**
437 The presence of HDFS short-circuit read configuration properties in hbase-default.xml inadvertently causes short-circuit reads to not happen inside of RegionServers, despite short-circuit reads being enabled in hdfs-site.xml.
442 * [HBASE-25333](https://issues.apache.org/jira/browse/HBASE-25333) | *Major* | **Add maven enforcer rule to ban VisibleForTesting imports**
444 Ban the imports of guava VisiableForTesting, which means you should not use this annotation in HBase any more.
445 For IA.Public and IA.LimitedPrivate classes, typically you should not expose any test related fields/methods there, and if you want to hide something, use IA.Private on the specific fields/methods.
446 For IA.Private classes, if you want to expose something only for tests, use the RestrictedApi annotation from error prone, where it could cause a compilation error if someone break the rule in the future.
451 * [HBASE-25441](https://issues.apache.org/jira/browse/HBASE-25441) | *Critical* | **add security check for some APIs in RSRpcServices**
453 RsRpcServices APIs that can be accessed only through Admin rights:
454 - stopServer
455 - updateFavoredNodes
456 - updateConfiguration
457 - clearRegionBlockCache
458 - clearSlowLogsResponses
463 * [HBASE-25432](https://issues.apache.org/jira/browse/HBASE-25432) | *Blocker* | **we should add security checks for setTableStateInMeta and fixMeta**
465 setTableStateInMeta and fixMeta can be accessed only through Admin rights
470 * [HBASE-25318](https://issues.apache.org/jira/browse/HBASE-25318) | *Minor* | **Configure where IntegrationTestImportTsv generates HFiles**
472 Added IntegrationTestImportTsv.generatedHFileFolder configuration property to override the default location in IntegrationTestImportTsv. Useful for running the integration test when HDFS Transparent Encryption is enabled.
477 * [HBASE-25456](https://issues.apache.org/jira/browse/HBASE-25456) | *Critical* | **setRegionStateInMeta need security check**
479 setRegionStateInMeta can be accessed only through Admin rights
483 # HBASE  2.4.0 Release Notes
485 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
490 * [HBASE-25127](https://issues.apache.org/jira/browse/HBASE-25127) | *Major* | **Enhance PerformanceEvaluation to profile meta replica performance.**
492 Three new commands are added to PE:
494 metaWrite, metaRandomRead and cleanMeta.
496 Usage example:
497 hbase pe  --rows=100000 metaWrite  1
498 hbase pe  --nomapreduce --rows=100000 metaRandomRead  32
499 hbase pe  --rows=100000 cleanMeta 1
501 metaWrite and cleanMeta should be run with only 1 thread and the same number of rows so all the rows inserted will be cleaned up properly.
503 metaRandomRead can be run with multiple threads. The rows option should set to within the range of rows inserted by metaWrite
508 * [HBASE-25237](https://issues.apache.org/jira/browse/HBASE-25237) | *Major* | **'hbase master stop' shuts down the cluster, not the master only**
510 \`hbase master stop\` should shutdown only master by default. 
511 1. Help added to \`hbase master stop\`:
512 To stop cluster, use \`stop-hbase.sh\` or \`hbase master stop --shutDownCluster\`
514 2. Help added to \`stop-hbase.sh\`:
515 stop-hbase.sh can only be used for shutting down entire cluster. To shut down (HMaster\|HRegionServer) use hbase-daemon.sh stop (master\|regionserver)
520 * [HBASE-25242](https://issues.apache.org/jira/browse/HBASE-25242) | *Critical* | **Add Increment/Append support to RowMutations**
522 After HBASE-25242, we can add Increment/Append operations to RowMutations and perform those operations atomically in a single row.
523 HBASE-25242 includes an API change where the mutateRow() API returns a Result object to get the result of the Increment/Append operations.
528 * [HBASE-25263](https://issues.apache.org/jira/browse/HBASE-25263) | *Major* | **Change encryption key generation algorithm used in the HBase shell**
530 Since the backward-compatible change we introduced in HBASE-25263,  we use the more secure PBKDF2WithHmacSHA384  key generation algorithm (instead of PBKDF2WithHmacSHA1) to generate a secret key for HFile / WalFile encryption, when the user is defining a string encryption key in the hbase shell.
535 * [HBASE-24268](https://issues.apache.org/jira/browse/HBASE-24268) | *Minor* | **REST and Thrift server do not handle the "doAs" parameter case insensitively**
537 This change allows the REST and Thrift servers to handle the "doAs" parameter case-insensitively, which is deemed as correct per the "specification" provided by the Hadoop community.
542 * [HBASE-25278](https://issues.apache.org/jira/browse/HBASE-25278) | *Minor* | **Add option to toggle CACHE\_BLOCKS in count.rb**
544 A new option, CACHE\_BLOCKS, was added to the \`count\` shell command which will force the data for a table to be loaded into the block cache. By default, the \`count\` command will not cache any blocks. This option can serve as a means to for a table's data to be loaded into block cache on demand. See the help message on the count shell command for usage details.
549 * [HBASE-18070](https://issues.apache.org/jira/browse/HBASE-18070) | *Critical* | **Enable memstore replication for meta replica**
551 "Async WAL Replication" [1] was added by HBASE-11183 "Timeline Consistent region replicas - Phase 2 design" but only for user-space tables. This feature adds "Async WAL Replication" for the hbase:meta table.  It also adds a client 'LoadBalance' mode that has reads go to replicas first and to the primary only on fail so as to shed read load from the primary to alleviate \*hotspotting\* on the hbase:meta Region.
553 Configuration is as it was for the user-space 'Async WAL Replication'. See [2] and [3] for details on how to enable.
555 1. http://hbase.apache.org/book.html#async.wal.replication
556 2. http://hbase.apache.org/book.html#async.wal.replication.meta
557 3. http://hbase.apache.org/book.html#\_async\_wal\_replication\_for\_meta\_table\_as\_of\_hbase\_2\_4\_0
562 * [HBASE-25126](https://issues.apache.org/jira/browse/HBASE-25126) | *Major* | **Add load balance logic in hbase-client to distribute read load over meta replica regions.**
564 See parent issue, HBASE-18070, release notes for how to enable.
569 * [HBASE-25026](https://issues.apache.org/jira/browse/HBASE-25026) | *Minor* | **Create a metric to track full region scans RPCs**
571 Adds a new metric where we collect the number of full region scan requests at the RPC layer. This will be collected under "name" : "Hadoop:service=HBase,name=RegionServer,sub=Server"
576 * [HBASE-25253](https://issues.apache.org/jira/browse/HBASE-25253) | *Major* | **Deprecated master carrys regions related methods and configs**
578 Since 2.4.0, deprecated all master carrys regions related methods(LoadBalancer,BaseLoadBalancer,ZNodeClearer) and configs(hbase.balancer.tablesOnMaster, hbase.balancer.tablesOnMaster.systemTablesOnly), they will be removed in 3.0.0.
583 * [HBASE-20598](https://issues.apache.org/jira/browse/HBASE-20598) | *Major* | **Upgrade to JRuby 9.2**
585 <!-- markdown -->
586 The HBase shell now relies on JRuby 9.2. This is a new major version change for JRuby. The most significant change is Ruby compatibility changed from Ruby 2.3 to Ruby 2.5. For more detailed changes please see [the JRuby release announcement for the start of the 9.2 series](https://www.jruby.org/2018/05/24/jruby-9-2-0-0.html) as well as the [general release announcement page for updates since that version](https://www.jruby.org/news).
588 The runtime dependency versions present on the server side classpath for the Joni (now 2.1.31) and JCodings (now 1.0.55) libraries have also been updated to match those found in the JRuby version shipped with HBase. These version changes are maintenance releases and should be backwards compatible when updated in tandem.
593 * [HBASE-25181](https://issues.apache.org/jira/browse/HBASE-25181) | *Major* | **Add options for disabling column family encryption and choosing hash algorithm for wrapped encryption keys.**
595 <!-- markdown -->
596 This change adds options for disabling column family encryption and choosing hash algorithm for wrapped encryption keys. Changes are done such that defaults will keep the same behavior prior to this issue.
597     
598 Prior to this change HBase always used the MD5 hash algorithm to store a hash for encryption keys. This hash is needed to verify the secret key of the subject. (e.g. making sure that the same secrey key is used during encrypted HFile read and write). The MD5 algorithm is considered weak, and can not be used in some (e.g. FIPS compliant) clusters. Having a configurable hash enables us to use newer and more secure hash algorithms like SHA-384 or SHA-512 (which are FIPS compliant).
600 The hash is set via the configuration option `hbase.crypto.key.hash.algorithm`. It should be set to a JDK `MessageDigest` algorithm like "MD5", "SHA-256" or "SHA-384". The default is "MD5" for backward compatibility.
602 Alternatively, clusters which rely on an encryption at rest mechanism outside of HBase (e.g. those offered by HDFS) and wish to ensure HBase's encryption at rest system is inactive can set `hbase.crypto.enabled` to `false`.
607 * [HBASE-25238](https://issues.apache.org/jira/browse/HBASE-25238) | *Critical* | **Upgrading HBase from 2.2.0 to 2.3.x fails because of “Message missing required fields: state”**
609 Fixes master procedure store migration issues going from 2.0.x to 2.2.x and/or 2.3.x. Also fixes failed heartbeat parse during rolling upgrade from 2.0.x. to 2.3.x.
614 * [HBASE-25234](https://issues.apache.org/jira/browse/HBASE-25234) | *Major* | **[Upgrade]Incompatibility in reading RS report from 2.1 RS when Master is upgraded to a version containing HBASE-21406**
616 Fixes so auto-migration of master procedure store works again going from 2.0.x =\> 2.2+. Also make it so heartbeats work when rolling upgrading from 2.0.x =\> 2.3+.
621 * [HBASE-25212](https://issues.apache.org/jira/browse/HBASE-25212) | *Major* | **Optionally abort requests in progress after deciding a region should close**
623 If hbase.regionserver.close.wait.abort is set to true, interrupt RPC handler threads holding the region close lock. 
625 Until requests in progress can be aborted, wait on the region close lock for a configurable interval (specified by hbase.regionserver.close.wait.time.ms, default 60000 (1 minute)). If we have failed to acquire the close lock after this interval elapses, if allowed (also specified by hbase.regionserver.close.wait.abort), abort the regionserver.
627 We will attempt to interrupt any running handlers every hbase.regionserver.close.wait.interval.ms (default 10000 (10 seconds)) until either the close lock is acquired or we reach the maximum wait time.
632 * [HBASE-25167](https://issues.apache.org/jira/browse/HBASE-25167) | *Major* | **Normalizer support for hot config reloading**
634 <!-- markdown -->
635 This patch adds [dynamic configuration](https://hbase.apache.org/book.html#dyn_config) support for the following configuration keys related to the normalizer:
636 * hbase.normalizer.throughput.max_bytes_per_sec
637 * hbase.normalizer.split.enabled
638 * hbase.normalizer.merge.enabled
639 * hbase.normalizer.min.region.count
640 * hbase.normalizer.merge.min_region_age.days
641 * hbase.normalizer.merge.min_region_size.mb
646 * [HBASE-25224](https://issues.apache.org/jira/browse/HBASE-25224) | *Major* | **Maximize sleep for checking meta and namespace regions availability**
648 Changed the max sleep time during meta and namespace regions availability check to be 60 sec. Previously there was no such cap
653 * [HBASE-24628](https://issues.apache.org/jira/browse/HBASE-24628) | *Major* | **Region normalizer now respects a rate limit**
655 <!-- markdown -->
656 Introduces a new configuration, `hbase.normalizer.throughput.max_bytes_per_sec`, for specifying a limit on the throughput of actions executed by the normalizer. Note that while this configuration value is in bytes, the minimum honored valued is `1,000,000`, or `1m`. Supports values configured using the human-readable suffixes honored by [`Configuration.getLongBytes`](https://hadoop.apache.org/docs/current/api/org/apache/hadoop/conf/Configuration.html#getLongBytes-java.lang.String-long-)
661 * [HBASE-14067](https://issues.apache.org/jira/browse/HBASE-14067) | *Major* | **bundle ruby files for hbase shell into a jar.**
663 <!-- markdown -->
664 The `hbase-shell` artifact now contains the ruby files that implement the hbase shell. There should be no downstream impact for users of the shell that rely on the `hbase shell` command.
666 Folks that wish to include the HBase ruby classes defined for the shell in their own JRuby scripts should add the `hbase-shell.jar` file to their classpath rather than add `${HBASE_HOME}/lib/ruby` to their load paths.
671 * [HBASE-24875](https://issues.apache.org/jira/browse/HBASE-24875) | *Major* | **Remove the force param for unassign since it dose not take effect any more**
673 <!-- markdown -->
674 The "force" flag to various unassign commands (java api, shell, etc) has been ignored since HBase 2. As of this change the methods that take it are now deprecated. Downstream users should stop passing/using this flag.
676 The Admin and AsyncAdmin Java APIs will have the deprecated version of the unassign method with a force flag removed in HBase 4. Callers can safely continue to use the deprecated API until then; the internal implementation just calls the new method.
678 The MasterObserver coprocessor API deprecates the `preUnassign` and `postUnassign` methods that include the force parameter and replaces them with versions that omit this parameter. The deprecated methods will be removed from the API in HBase 3. Until then downstream coprocessor implementations can safely continue to *just* implement the deprecated method if they wish; the replacement methods provide a default implementation that calls the deprecated method with force set to `false`.
683 * [HBASE-25099](https://issues.apache.org/jira/browse/HBASE-25099) | *Major* | **Change meta replica count by altering meta table descriptor**
685 Now you can change the region replication config for meta table by altering meta table.
686 The old "hbase.meta.replica.count" is deprecated and will be removed in 4.0.0. But if it is set, we will still honor it, which means, when master restart, if we find out that the value of 'hbase.meta.replica.count' is different with the region replication config of meta table, we will schedule an alter table operation to change the region replication config to the value you configured for 'hbase.meta.replica.count'.
691 * [HBASE-23834](https://issues.apache.org/jira/browse/HBASE-23834) | *Major* | **HBase fails to run on Hadoop 3.3.0/3.2.2/3.1.4 due to jetty version mismatch**
693 Use shaded json and jersey in HBase.
694 Ban the imports of unshaded json and jersey in code.
699 * [HBASE-25163](https://issues.apache.org/jira/browse/HBASE-25163) | *Major* | **Increase the timeout value for nightly jobs**
701 Increase timeout value for nightly jobs to 16 hours since the new build machines are dedicated to hbase project, so we are allowed to use it all the time.
706 * [HBASE-22976](https://issues.apache.org/jira/browse/HBASE-22976) | *Major* | **[HBCK2] Add RecoveredEditsPlayer**
708 WALPlayer can replay the content of recovered.edits directories.
710 Side-effect is that WAL filename timestamp is now factored when setting start/end times for WALInputFormat; i.e. wal.start.time and wal.end.time values on a job context. Previous we looked at wal.end.time only. Now we consider wal.start.time too. If a file has a name outside of wal.start.time\<-\>wal.end.time, it'll be by-passed. This change-in-behavior will make it easier on operator crafting timestamp filters processing WALs.
715 * [HBASE-25165](https://issues.apache.org/jira/browse/HBASE-25165) | *Minor* | **Change 'State time' in UI so sorts**
717 Start time on the Master UI is now displayed using ISO8601 format instead of java Date#toString().
722 * [HBASE-25124](https://issues.apache.org/jira/browse/HBASE-25124) | *Major* | **Support changing region replica count without disabling table**
724 Now you do not need to disable a table before changing its 'region replication' property.
725 If you are decreasing the replica count, the excess region replicas will be closed before reopening other replicas.
726 If you are increasing the replica count, the new region replicas will be opened after reopening the existing replicas.
731 * [HBASE-25154](https://issues.apache.org/jira/browse/HBASE-25154) | *Major* | **Set java.io.tmpdir to project build directory to avoid writing std\*deferred files to /tmp**
733 Change the java.io.tmpdir to project.build.directory in surefire-maven-plugin, to avoid writing std\*deferred files to /tmp which may blow up the /tmp disk on our jenkins build node.
738 * [HBASE-25055](https://issues.apache.org/jira/browse/HBASE-25055) | *Major* | **Add ReplicationSource for meta WALs; add enable/disable when hbase:meta assigned to RS**
740 Set hbase.region.replica.replication.catalog.enabled to enable async WAL Replication for hbase:meta region replicas. Its off by default.
742 Defaults to the RegionReadReplicaEndpoint.class shipping edits -- set hbase.region.replica.catalog.replication to target a different endpoint implementation.
747 * [HBASE-25109](https://issues.apache.org/jira/browse/HBASE-25109) | *Major* | **Add MR Counters to WALPlayer; currently hard to tell if it is doing anything**
749 Adds a WALPlayer to MR Counter output:
751         org.apache.hadoop.hbase.mapreduce.WALPlayer$Counter
752                 CELLS\_READ=89574
753                 CELLS\_WRITTEN=89572
754                 DELETES=64
755                 PUTS=5305
756                 WALEDITS=4375
761 * [HBASE-24896](https://issues.apache.org/jira/browse/HBASE-24896) | *Major* | **'Stuck' in static initialization creating RegionInfo instance**
763 1. Untangle RegionInfo, RegionInfoBuilder, and MutableRegionInfo static
764 initializations.
765 2. Undo static initializing references from RegionInfo to RegionInfoBuilder.
766 3. Mark RegionInfo#UNDEFINED IA.Private and deprecated;
767 it is for internal use only and likely to be removed in HBase4. (sub-task HBASE-24918)
768 4. Move MutableRegionInfo from inner-class of
769 RegionInfoBuilder to be (package private) standalone. (sub-task HBASE-24918)
774 * [HBASE-24956](https://issues.apache.org/jira/browse/HBASE-24956) | *Major* | **ConnectionManager#locateRegionInMeta waits for user region lock indefinitely.**
776 <!-- markdown -->
778 Without this fix there are situations in which locateRegionInMeta() on a client is not bound by a timeout. This happens because of a global lock whose acquisition was not under any lock scope. This affects client facing API calls that rely on this method to locate a table region in meta. This fix brings the lock acquisition under the scope of "hbase.client.meta.operation.timeout" and that guarantees a bounded wait time.
783 * [HBASE-24764](https://issues.apache.org/jira/browse/HBASE-24764) | *Minor* | **Add support of adding base peer configs via hbase-site.xml for all replication peers.**
785 <!-- markdown -->
787 Adds a new configuration parameter "hbase.replication.peer.base.config" which accepts a semi-colon separated key=CSV pairs (example: k1=v1;k2=v2_1,v3...). When this configuration is set on the server side, these kv pairs are added to every peer configuration if not already set. Peer specific configuration overrides have precedence over the above default configuration. This is useful in cases when some configuration has to be set for all the peers by default and one does not want to add to every peer definition.
792 * [HBASE-24994](https://issues.apache.org/jira/browse/HBASE-24994) | *Minor* | **Add hedgedReadOpsInCurThread metric**
794 Expose Hadoop hedgedReadOpsInCurThread metric to HBase.
795 This metric counts the number of times the hedged reads service executor rejected a read task, falling back to the current thread.
796 This will help determine the proper size of the thread pool (dfs.client.hedged.read.threadpool.size).
801 * [HBASE-24776](https://issues.apache.org/jira/browse/HBASE-24776) | *Major* | **[hbtop] Support Batch mode**
803 HBASE-24776 added the following command line parameters to hbtop:
804 \| Argument \| Description \| 
805 \|---\|---\|
806 \| -n,--numberOfIterations \<arg\> \| The number of iterations \|
807 \| -O,--outputFieldNames \| Print each of the available field names on a separate line, then quit \|
808 \| -f,--fields \<arg\> \| Show only the given fields. Specify comma separated fields to show multiple fields \|
809 \| -s,--sortField \<arg\> \| The initial sort field. You can prepend a \`+' or \`-' to the field name to also override the sort direction. A leading \`+' will force sorting high to low, whereas a \`-' will ensure a low to high ordering \|
810 \| -i,--filters \<arg\> \| The initial filters. Specify comma separated filters to set multiple filters \|
811 \| -b,--batchMode \| Starts hbtop in Batch mode, which could be useful for sending output from hbtop to other programs or to a file. In this mode, hbtop will not accept input and runs until the iterations limit you've set with the \`-n' command-line option or until killed \|
816 * [HBASE-24602](https://issues.apache.org/jira/browse/HBASE-24602) | *Major* | **Add Increment and Append support to CheckAndMutate**
818 Summary of the change of HBASE-24602:
819 - Add \`build(Increment)\` and \`build(Append)\` methods to the \`Builder\` class of the \`CheckAndMutate\` class. After this change, we can perform checkAndIncrement/Append operations as follows:
820 \`\`\`
821 // Build a CheckAndMutate object with a Increment object
822 CheckAndMutate checkAndMutate = CheckAndMutate.newBuilder(row)
823   .ifEquals(family, qualifier, value)
824   .build(increment);
826 // Perform a CheckAndIncrement operation
827 CheckAndMutateResult checkAndMutateResult = table.checkAndMutate(checkAndMutate);
829 // Get whether or not the CheckAndIncrement operation is successful
830 boolean success = checkAndMutateResult.isSuccess();
832 // Get the result of the increment operation
833 Result result = checkAndMutateResult.getResult();
834 \`\`\`
835 - After this change, \`HRegion.batchMutate()\` is used for increment/append operations.
836 - As the side effect of the above change, the following coprocessor methods of RegionObserver are called when increment/append operations are performed:
837   - preBatchMutate()
838   - postBatchMutate()
839   - postBatchMutateIndispensably()
844 * [HBASE-24694](https://issues.apache.org/jira/browse/HBASE-24694) | *Major* | **Support flush a single column family of table**
846 Adds option for the flush command to flush all stores from the specified column family only, among all regions of the given table (stores from other column families on this table would not get flushed).
851 * [HBASE-24625](https://issues.apache.org/jira/browse/HBASE-24625) | *Critical* | **AsyncFSWAL.getLogFileSizeIfBeingWritten does not return the expected synced file length.**
853 We add a method getSyncedLength in  WALProvider.WriterBase interface for  WALFileLengthProvider used for replication, considering the case if we use  AsyncFSWAL,we write to 3 DNs concurrently,according to the visibility guarantee of HDFS, the data will be available immediately
854 when arriving at DN since all the DNs will be considered as the last one in pipeline.This means replication may read uncommitted data and replicate it to the remote cluster and cause data inconsistency.The method WriterBase#getLength may return length which just in hdfs client buffer and not successfully synced to HDFS, so we use this method WriterBase#getSyncedLength to return the length successfully synced to HDFS and replication thread could only read writing WAL file limited by this length.
855 see also HBASE-14004 and this document for more details:
856 https://docs.google.com/document/d/11AyWtGhItQs6vsLRIx32PwTxmBY3libXwGXI25obVEY/edit#
858 Before this patch, replication may read uncommitted data and replicate it to the slave cluster and cause data inconsistency between master and slave cluster, we could use FSHLog instead of AsyncFSWAL  to reduce probability of inconsistency without this patch applied.
863 * [HBASE-24779](https://issues.apache.org/jira/browse/HBASE-24779) | *Minor* | **Improve insight into replication WAL readers hung on checkQuota**
865 New metrics are exposed, on the global source, for replication which indicate the "WAL entry buffer" that was introduced in HBASE-15995. When this usage reaches the limit, that RegionServer will cease to read more data for the sake of trying to replicate it. This usage (and limit) is local to each RegionServer is shared across all peers being handled by that RegionServer.
870 * [HBASE-24404](https://issues.apache.org/jira/browse/HBASE-24404) | *Major* | **Support flush a single column family of region**
872 This adds an extra "flush" command option that allows for specifying an individual family to have its store flushed.
874 Usage:
875 flush 'REGIONNAME','FAMILYNAME' 
876 flush 'ENCODED\_REGIONNAME','FAMILYNAME'
881 * [HBASE-24805](https://issues.apache.org/jira/browse/HBASE-24805) | *Major* | **HBaseTestingUtility.getConnection should be threadsafe**
883 <!-- markdown -->
884 Users of `HBaseTestingUtility` can now safely call the `getConnection` method from multiple threads.
886 As a consequence of refactoring to improve the thread safety of the HBase testing classes, the protected `conf` member of the  `HBaseCommonTestingUtility` class has been marked final. Downstream users who extend from the class hierarchy rooted at this class will need to pass the Configuration instance they want used to their super constructor rather than overwriting the instance variable.
891 * [HBASE-24767](https://issues.apache.org/jira/browse/HBASE-24767) | *Major* | **Change default to false for HBASE-15519 per-user metrics**
893 Disables per-user metrics. They were enabled by default for the first time in hbase-2.3.0 but they need some work before they can be on all the time (See HBASE-15519)
898 * [HBASE-24704](https://issues.apache.org/jira/browse/HBASE-24704) | *Major* | **Make the Table Schema easier to view even there are multiple families**
900 Improve the layout of column family from vertical to horizontal in table UI.
905 * [HBASE-11686](https://issues.apache.org/jira/browse/HBASE-11686) | *Minor* | **Shell code should create a binding / irb workspace instead of polluting the root namespace**
907 In shell, all HBase constants and commands have been moved out of the top-level and into an IRB Workspace. Piped stdin and scripts passed by name to the shell will be evaluated within this workspace. If you absolutely need the top-level definitions, use the new compatibility flag, ie. hbase shell --top-level-defs or hbase shell --top-level-defs script2run.rb.
912 * [HBASE-24632](https://issues.apache.org/jira/browse/HBASE-24632) | *Major* | **Enable procedure-based log splitting as default in hbase3**
914 Enables procedure-based distributed WAL splitting as default (HBASE-20610). To use 'classic' zk-coordinated splitting instead, set 'hbase.split.wal.zk.coordinated' to 'true'.
919 * [HBASE-24698](https://issues.apache.org/jira/browse/HBASE-24698) | *Major* | **Turn OFF Canary WebUI as default**
921 Flips default for 'HBASE-23994 Add WebUI to Canary' The UI defaulted to on at port 16050. This JIRA changes it so new UI is off by default.
923 To enable the UI, set property 'hbase.canary.info.port' to the port you want the UI to use.
928 * [HBASE-24650](https://issues.apache.org/jira/browse/HBASE-24650) | *Major* | **Change the return types of the new checkAndMutate methods introduced in HBASE-8458**
930 HBASE-24650 introduced CheckAndMutateResult class and changed the return type of checkAndMutate methods to this class in order to support CheckAndMutate with Increment/Append. CheckAndMutateResult class has two fields, one is \*success\* that indicates whether the operation is successful or not, and the other one is \*result\* that's the result of the operation and is used for  CheckAndMutate with Increment/Append.
932 The new APIs for the Table interface:
933 \`\`\`
934 /\*\*
935  \* checkAndMutate that atomically checks if a row matches the specified condition. If it does,
936  \* it performs the specified action.
937  \*
938  \* @param checkAndMutate The CheckAndMutate object.
939  \* @return A CheckAndMutateResult object that represents the result for the CheckAndMutate.
940  \* @throws IOException if a remote or network exception occurs.
941  \*/
942 default CheckAndMutateResult checkAndMutate(CheckAndMutate checkAndMutate) throws IOException {
943   return checkAndMutate(Collections.singletonList(checkAndMutate)).get(0);
946 /\*\*
947  \* Batch version of checkAndMutate. The specified CheckAndMutates are batched only in the sense
948  \* that they are sent to a RS in one RPC, but each CheckAndMutate operation is still executed
949  \* atomically (and thus, each may fail independently of others).
950  \*
951  \* @param checkAndMutates The list of CheckAndMutate.
952  \* @return A list of CheckAndMutateResult objects that represents the result for each
953  \*   CheckAndMutate.
954  \* @throws IOException if a remote or network exception occurs.
955  \*/
956 default List\<CheckAndMutateResult\> checkAndMutate(List\<CheckAndMutate\> checkAndMutates)
957   throws IOException {
958   throw new NotImplementedException("Add an implementation!");
960 {code}
962 The new APIs for the AsyncTable interface:
963 {code}
964 /\*\*
965  \* checkAndMutate that atomically checks if a row matches the specified condition. If it does,
966  \* it performs the specified action.
967  \*
968  \* @param checkAndMutate The CheckAndMutate object.
969  \* @return A {@link CompletableFuture}s that represent the result for the CheckAndMutate.
970  \*/
971 CompletableFuture\<CheckAndMutateResult\> checkAndMutate(CheckAndMutate checkAndMutate);
973 /\*\*
974  \* Batch version of checkAndMutate. The specified CheckAndMutates are batched only in the sense
975  \* that they are sent to a RS in one RPC, but each CheckAndMutate operation is still executed
976  \* atomically (and thus, each may fail independently of others).
977  \*
978  \* @param checkAndMutates The list of CheckAndMutate.
979  \* @return A list of {@link CompletableFuture}s that represent the result for each
980  \*   CheckAndMutate.
981  \*/
982 List\<CompletableFuture\<CheckAndMutateResult\>\> checkAndMutate(
983   List\<CheckAndMutate\> checkAndMutates);
985 /\*\*
986  \* A simple version of batch checkAndMutate. It will fail if there are any failures.
987  \*
988  \* @param checkAndMutates The list of rows to apply.
989  \* @return A {@link CompletableFuture} that wrapper the result list.
990  \*/
991 default CompletableFuture\<List\<CheckAndMutateResult\>\> checkAndMutateAll(
992   List\<CheckAndMutate\> checkAndMutates) {
993   return allOf(checkAndMutate(checkAndMutates));
995 \`\`\`
1000 * [HBASE-24671](https://issues.apache.org/jira/browse/HBASE-24671) | *Major* | **Add excludefile and designatedfile options to graceful\_stop.sh**
1002 Add excludefile and designatedfile options to graceful\_stop.sh. 
1004 Designated file with \<hostname:port\> per line as unload targets.
1006 Exclude file should have \<hostname:port\> per line. We do not unload regions to hostnames given in exclude file.
1008 Here is a simple example using graceful\_stop.sh with designatedfile option:
1009 ./bin/graceful\_stop.sh --maxthreads 4 --designatedfile /path/designatedfile hostname
1010 The usage of the excludefile option is the same as the above.
1015 * [HBASE-24560](https://issues.apache.org/jira/browse/HBASE-24560) | *Major* | **Add a new option of designatedfile in RegionMover**
1017 Add a new option "designatedfile" in RegionMover.
1019 If designated file is present with some contents, we will unload regions to hostnames provided in designated file.
1021 Designated file should have 'host:port' per line.
1026 * [HBASE-24289](https://issues.apache.org/jira/browse/HBASE-24289) | *Major* | **Heterogeneous Storage for Date Tiered Compaction**
1028 Enhance DateTieredCompaction to support HDFS storage policy within one class family. 
1029 # First you need enable DTCP.
1030 To turn on Date Tiered Compaction (It is not recommended to turn on for the whole cluster because that will put meta table on it too and random get on meta table will be impacted):
1031 hbase.hstore.compaction.compaction.policy=org.apache.hadoop.hbase.regionserver.compactions.DateTieredCompactionPolicy
1032 ## Parameters for Date Tiered Compaction:
1033 hbase.hstore.compaction.date.tiered.max.storefile.age.millis: Files with max-timestamp smaller than this will no longer be compacted.Default at Long.MAX\_VALUE.
1034 hbase.hstore.compaction.date.tiered.base.window.millis: base window size in milliseconds. Default at 6 hours.
1035 hbase.hstore.compaction.date.tiered.windows.per.tier: number of windows per tier. Default at 4.
1036 hbase.hstore.compaction.date.tiered.incoming.window.min: minimal number of files to compact in the incoming window. Set it to expected number of files in the window to avoid wasteful compaction. Default at 6.
1038 # Then enable HDTCP(Heterogeneous Date Tiered Compaction) as follow example configurations:  
1039 hbase.hstore.compaction.date.tiered.storage.policy.enable=true
1040 hbase.hstore.compaction.date.tiered.hot.window.age.millis=3600000
1041 hbase.hstore.compaction.date.tiered.hot.window.storage.policy=ALL\_SSD
1042 hbase.hstore.compaction.date.tiered.warm.window.age.millis=20600000
1043 hbase.hstore.compaction.date.tiered.warm.window.storage.policy=ONE\_SSD
1044 hbase.hstore.compaction.date.tiered.cold.window.storage.policy=HOT
1045 ## It is better to enable WAL and flushing HFile storage policy with HDTCP. You can tune follow settings as well:
1046 hbase.wal.storage.policy=ALL\_SSD
1047 create 'table',{NAME=\>'f1',CONFIGURATION=\>{'hbase.hstore.block.storage.policy'=\>'ALL\_SSD'}}
1049 # Disable HDTCP as follow:
1050 hbase.hstore.compaction.date.tiered.storage.policy.enable=false
1055 * [HBASE-24648](https://issues.apache.org/jira/browse/HBASE-24648) | *Major* | **Remove the legacy 'forceSplit' related code at region server side**
1057 Add a canSplit method to RegionSplitPolicy to determine whether we can split a region. Usually it is not related to RegionSplitPolicy so in the default implementation, it will test whether region is available and does not have reference file, but in DisabledRegionSplitPolicy, we will always return false.
1062 * [HBASE-24382](https://issues.apache.org/jira/browse/HBASE-24382) | *Major* | **Flush partial stores of region filtered by seqId when archive wal due to too many wals**
1064 Change the flush level from region to store when there are too many wals, benefit from this we can reduce unnessary flush tasks and small hfiles.
1069 * [HBASE-24038](https://issues.apache.org/jira/browse/HBASE-24038) | *Major* | **Add a metric to show the locality of ssd in table.jsp**
1071 Add a metric to show the locality of ssd in table.jsp, and move the locality related metrics to a new tab named localities.
1076 * [HBASE-8458](https://issues.apache.org/jira/browse/HBASE-8458) | *Major* | **Support for batch version of checkAndMutate()**
1078 HBASE-8458 introduced CheckAndMutate class that's used to perform CheckAndMutate operations. Use the builder class to instantiate a CheckAndMutate object. This builder class is fluent style APIs, the code are like:
1079 \`\`\`
1080 // A CheckAndMutate operation where do the specified action if the column (specified by the
1081 family and the qualifier) of the row equals to the specified value
1082 CheckAndMutate checkAndMutate = CheckAndMutate.newBuilder(row)
1083   .ifEquals(family, qualifier, value)
1084   .build(put);
1086 // A CheckAndMutate operation where do the specified action if the column (specified by the
1087 // family and the qualifier) of the row doesn't exist
1088 CheckAndMutate checkAndMutate = CheckAndMutate.newBuilder(row)
1089   .ifNotExists(family, qualifier)
1090   .build(put);
1092 // A CheckAndMutate operation where do the specified action if the row matches the filter
1093 CheckAndMutate checkAndMutate = CheckAndMutate.newBuilder(row)
1094   .ifMatches(filter)
1095   .build(delete);
1096 \`\`\`
1098 And This added new checkAndMutate APIs to the Table and AsyncTable interfaces, and deprecated the old checkAndMutate APIs. The example code for the new APIs are as follows:
1099 \`\`\`
1100 Table table = ...;
1102 CheckAndMutate checkAndMutate = ...;
1104 // Perform the checkAndMutate operation
1105 boolean success = table.checkAndMutate(checkAndMutate);
1107 CheckAndMutate checkAndMutate1 = ...;
1108 CheckAndMutate checkAndMutate2 = ...;
1110 // Batch version
1111 List\<Boolean\> successList = table.checkAndMutate(Arrays.asList(checkAndMutate1, checkAndMutate2));
1112 \`\`\`
1114 This also has Protocol Buffers level changes. Old clients without this patch will work against new servers with this patch. However, new clients will break against old servers without this patch for checkAndMutate with RM and mutateRow. So, for rolling upgrade, we will need to upgrade servers first, and then roll out the new clients.
1119 * [HBASE-24471](https://issues.apache.org/jira/browse/HBASE-24471) | *Major* | **The way we bootstrap meta table is confusing**
1121 Move all the meta initialization code in MasterFileSystem and HRegionServer to InitMetaProcedure. Add a new step for InitMetaProcedure called INIT\_META\_WRITE\_FS\_LAYOUT to place the moved code.
1123 This is an incompatible change, but should not have much impact. InitMetaProcedure will only be executed once when bootstraping a fresh new cluster, so typically this will not effect rolling upgrading. And even if you hit this problem, as long as InitMetaProcedure has not been finished, we can make sure that there is no user data in the cluster, you can just clean up the cluster and try again. There will be no data loss.
1128 * [HBASE-24017](https://issues.apache.org/jira/browse/HBASE-24017) | *Major* | **Turn down flakey rerun rate on all but hot branches**
1130 Changed master, branch-2, and branch-2.1 to twice a day.
1131 Left branch-2.3, branch-2.2, and branch-1 at every 4 hours.
1132 Changed branch-1.4 and branch-1.3 to @daily (1.3 was running every hour).
1136 # HBASE  2.3.0 Release Notes
1138 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
1143 * [HBASE-24603](https://issues.apache.org/jira/browse/HBASE-24603) | *Critical* | **Zookeeper sync() call is async**
1145 <!-- markdown -->
1147 Fixes a couple of bugs in ZooKeeper interaction. Firstly, zk sync() call that is used to sync the lagging followers with leader so that the client sees a consistent snapshot state was actually asynchronous under the hood. We make it synchronous for correctness. Second, zookeeper events are now processed in a separate thread rather than doing it in the thread context of zookeeper client connection. This decoupling frees up client connection quickly and avoids deadlocks.
1152 * [HBASE-24631](https://issues.apache.org/jira/browse/HBASE-24631) | *Major* | **Loosen Dockerfile pinned package versions of the "debian-revision"**
1154 <!-- markdown -->
1155 Update our package version numbers throughout the Dockerfiles to be pinned to their epic:upstream-version components only. Previously we'd specify the full debian package version number, including the debian-revision. This lead to instability as debian packaging details changed.
1156 See also [man deb-version](http://manpages.ubuntu.com/manpages/xenial/en/man5/deb-version.5.html)
1161 * [HBASE-24205](https://issues.apache.org/jira/browse/HBASE-24205) | *Major* | **Create metric to know the number of reads that happens from memstore**
1163 Adds a new metric where we collect the number of read requests (tracked per row) whether the row was fetched completely from memstore or it was pulled from files  and memstore. 
1164 The metric is now collected under the mbean for Tables and under the mbean for regions.
1165 Under table mbean ie.- 
1166 'name": "Hadoop:service=HBase,name=RegionServer,sub=Tables'
1167 The new metrics will be listed as 
1168 {code}
1169     "Namespace\_default\_table\_t3\_columnfamily\_f1\_metric\_memstoreOnlyRowReadsCount": 5,
1170  "Namespace\_default\_table\_t3\_columnfamily\_f1\_metric\_mixedRowReadsCount": 1,
1171 {code}
1172 Where the format is Namespace\_\<namespacename\>\_table\_\<tableName\>\_columnfamily\_\<columnfamilyname\>\_metric\_memstoreOnlyRowReadsCount
1173 Namespace\_\<namespacename\>\_table\_\<tableName\>\_columnfamily\_\<columnfamilyname\>\_metric\_mixedRowReadsCount
1174 {code}
1176 The same one under the region ie. 
1177 "name": "Hadoop:service=HBase,name=RegionServer,sub=Regions",
1178 comes as
1179 {code}
1180    "Namespace\_default\_table\_t3\_region\_75a7846f4ac4a2805071a855f7d0dbdc\_store\_f1\_metric\_memstoreOnlyRowReadsCount": 5,
1181     "Namespace\_default\_table\_t3\_region\_75a7846f4ac4a2805071a855f7d0dbdc\_store\_f1\_metric\_mixedRowReadsCount": 1,
1182 {code}
1183 where
1184 Namespace\_\<namespacename\_table\_\<tableName\>\_region\_\<regionName\>\_store\_\<storeName\>\_metric\_memstoreOnlyRowReadsCount
1185 Namespace\_\<namespacename\_table\_\<tableName\>\_region\_\<regionName\>\_store\_\<storeName\>\_metric\_mixedRowReadsCount
1186 This is also an aggregate against every store the number of reads that happened purely from the memstore or it was a  mixed read that happened from memstore and file.
1191 * [HBASE-21773](https://issues.apache.org/jira/browse/HBASE-21773) | *Critical* | **rowcounter utility should respond to pleas for help**
1193 This adds [-h\|-help] options to rowcounter. Passing either -h or -help will print rowcounter guide as below: 
1195 $hbase rowcounter -h
1197 usage: hbase rowcounter \<tablename\> [options] [\<column1\> \<column2\>...]
1198 Options:
1199     --starttime=\<arg\>       starting time filter to start counting rows from.
1200     --endtime=\<arg\>         end time filter limit, to only count rows up to this timestamp.
1201     --range=\<arg\>           [startKey],[endKey][;[startKey],[endKey]...]]
1202     --expectedCount=\<arg\>   expected number of rows to be count.
1203 For performance, consider the following configuration properties:
1204 -Dhbase.client.scanner.caching=100
1205 -Dmapreduce.map.speculative=false
1210 * [HBASE-24217](https://issues.apache.org/jira/browse/HBASE-24217) | *Major* | **Add hadoop 3.2.x support**
1212 CI coverage has been extended to include Hadoop 3.2.x for HBase 2.2+.
1217 * [HBASE-23055](https://issues.apache.org/jira/browse/HBASE-23055) | *Major* | **Alter hbase:meta**
1219 Adds being able to edit hbase:meta table schema. For example,
1221 hbase(main):006:0\> alter 'hbase:meta', {NAME =\> 'info', DATA\_BLOCK\_ENCODING =\> 'ROW\_INDEX\_V1'}
1222 Updating all regions with the new schema...
1223 All regions updated.
1224 Done.
1225 Took 1.2138 seconds
1227 You can even add columnfamilies. Howevert, you cannot delete any of the core hbase:meta column families such as 'info' and 'table'.
1232 * [HBASE-15161](https://issues.apache.org/jira/browse/HBASE-15161) | *Major* | **Umbrella: Miscellaneous improvements from production usage**
1234 This ticket summarizes significant improvements and expansion to the metrics surface area. Interested users should review the individual sub-tasks.
1239 * [HBASE-24545](https://issues.apache.org/jira/browse/HBASE-24545) | *Major* | **Add backoff to SCP check on WAL split completion**
1241 Adds backoff in ServerCrashProcedure wait on WAL split to complete if large backlog of files to split (Its possible to avoid SCP blocking, waiting on WALs to split if you use procedure-based splitting --  set 'hbase.split.wal.zk.coordinated' to false to enable procedure based wal splitting.)
1246 * [HBASE-24524](https://issues.apache.org/jira/browse/HBASE-24524) | *Minor* | **SyncTable logging improvements**
1248 Notice this has changed log level for mismatching row keys, originally those were being logged at INFO level, now it's logged at DEBUG level. This is consistent with the logging of mismatching cells. Also, for missing row keys, it now logs row key values in human readable format, making it more meaningful for operators troubleshooting mismatches.
1253 * [HBASE-24359](https://issues.apache.org/jira/browse/HBASE-24359) | *Major* | **Optionally ignore edits for deleted CFs for replication.**
1255 Introduce a new config hbase.replication.drop.on.deleted.columnfamily, default is false. When config to true, the replication will drop the edits for columnfamily that has been deleted from the replication source and target.
1260 * [HBASE-24418](https://issues.apache.org/jira/browse/HBASE-24418) | *Major* | **Consolidate Normalizer implementations**
1262 <!-- markdown -->
1263 This change extends the Normalizer with a handful of new configurations. The configuration points supported are:
1264 * `hbase.normalizer.split.enabled` Whether to split a region as part of normalization. Default: `true`.
1265 * `hbase.normalizer.merge.enabled` Whether to merge a region as part of normalization. Default `true`.
1266 * `hbase.normalizer.min.region.count` The minimum number of regions in a table to consider it for merge normalization. Default: 3.
1267 * `hbase.normalizer.merge.min_region_age.days` The minimum age for a region to be considered for a merge, in days. Default: 3.
1268 * `hbase.normalizer.merge.min_region_size.mb` The minimum size for a region to be considered for a merge, in whole MBs. Default: 1.
1273 * [HBASE-24309](https://issues.apache.org/jira/browse/HBASE-24309) | *Major* | **Avoid introducing log4j and slf4j-log4j dependencies for modules other than hbase-assembly**
1275 Add a hbase-logging module, put the log4j related code in this module only so other modules do not need to depend on log4j at compile scope. See the comments of Log4jUtils and InternalLog4jUtils for more details.
1277 Add a log4j.properties to the test jar of hbase-logging module, so for other sub modules we just need to depend on the test jar of hbase-logging module at test scope to output the log to console, without placing a log4j.properties in the test resources as they all (almost) have the same content. And this test module will not be included in the assembly tarball so it will not mess up the binary distribution.
1279 Ban direct commons-logging dependency, and ban commons-logging and log4j imports in non-test code, to avoid mess up the downstream users logging framework. In hbase-logging module we do need to use log4j classes and the trick is to use full class name.
1281 Add jcl-over-slf4j and jul-to-slf4j dependencies, as some of our dependencies use jcl or jul as logging framework, we should also redirect their log message to slf4j.
1286 * [HBASE-21406](https://issues.apache.org/jira/browse/HBASE-21406) | *Minor* | **"status 'replication'" should not show SINK if the cluster does not act as sink**
1288 Added new metric to differentiate sink startup time from last OP applied time.
1290 Original behaviour was to always set startup time to TimestampsOfLastAppliedOp, and always show it on "status 'replication'" command, regardless if the sink ever applied any OP. 
1292 This was confusing, specially for scenarios where cluster was just acting as source, the output could lead to wrong interpretations about sink not applying edits or replication being stuck. 
1294 With the new metric, we now compare the two metrics values, assuming that if both are the same, there's never been any OP shipped to the given sink, so output would reflect it more clearly, to something as for example:
1296 SINK: TimeStampStarted=Thu Dec 06 23:59:47 GMT 2018, Waiting for OPs...
1301 * [HBASE-24132](https://issues.apache.org/jira/browse/HBASE-24132) | *Major* | **Upgrade to Apache ZooKeeper 3.5.7**
1303 <!-- markdown -->
1304 HBase ships ZooKeeper 3.5.x. Was the EOL'd 3.4.x. 3.5.x client can talk to 3.4.x ensemble.
1306 The ZooKeeper project has built a [FAQ](https://cwiki.apache.org/confluence/display/ZOOKEEPER/Upgrade+FAQ) that documents known issues and work-arounds when upgrading existing deployments.
1311 * [HBASE-22287](https://issues.apache.org/jira/browse/HBASE-22287) | *Major* | **inifinite retries on failed server in RSProcedureDispatcher**
1313 Add backoff. Avoid retrying every 100ms.
1318 * [HBASE-24425](https://issues.apache.org/jira/browse/HBASE-24425) | *Major* | **Run hbck\_chore\_run and catalogjanitor\_run on draw of 'HBCK Report' page**
1320 Runs 'catalogjanitor\_run' and 'hbck\_chore\_run' inline with the loading of the 'HBCK Report' page.
1322 Pass '?cache=true' to skip inline invocation of 'catalogjanitor\_run' and 'hbck\_chore\_run' drawing the page.
1327 * [HBASE-24408](https://issues.apache.org/jira/browse/HBASE-24408) | *Blocker* | **Introduce a general 'local region' to store data on master**
1329 Introduced a general 'local region' at master side to store the procedure data, etc.
1331 The hfile of this region will be stored on the root fs while the wal will be stored on the wal fs. This issue supercedes part of the code for HBASE-23326, as now we store the data in 'MasterData' directory instead of 'MasterProcs'.
1333 The old hfiles will be moved to the global hfile archived directory with the suffix $-masterlocalhfile-$. The wal files will be moved to the global old wal directory with the suffix $masterlocalwal$. The TimeToLiveMasterLocalStoreHFileCleaner and TimeToLiveMasterLocalStoreWALCleaner are configured by default for cleaning the old hfiles and wal files, and the default TTLs are both 7 days.
1338 * [HBASE-24115](https://issues.apache.org/jira/browse/HBASE-24115) | *Major* | **Relocate test-only REST "client" from src/ to test/ and mark Private**
1340 Relocate test-only REST RemoteHTable and RemoteAdmin from src/ to test/. And mark them as InterfaceAudience.Private.
1345 * [HBASE-23938](https://issues.apache.org/jira/browse/HBASE-23938) | *Major* | **Replicate slow/large RPC calls to HDFS**
1347 Config key: hbase.regionserver.slowlog.systable.enabled
1348 Default value: false
1350 This config can be enabled if hbase.regionserver.slowlog.buffer.enabled is already enabled. While hbase.regionserver.slowlog.buffer.enabled ensures that any slow/large RPC logs with complete details are written to ring buffer available at each RegionServer, hbase.regionserver.slowlog.systable.enabled would ensure that all such logs are also persisted in new system table hbase:slowlog. 
1351 Operator can scan hbase:slowlog with filters to retrieve specific attribute matching records and this table would be useful to capture historical performance of slowness of RPC calls with detailed analysis.
1353 hbase:slowlog consists of single ColumnFamily info. info consists of multiple qualifiers similar to the attributes available to query as part of Admin API: get\_slowlog\_responses.
1355 One example of a row from hbase:slowlog scan result (Attached a sample screenshot in the Jira) :
1357  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:call\_details, timestamp=2020-05-16T14:59:58.764Z, value=Scan(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ScanRequest)                             
1358  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:client\_address, timestamp=2020-05-16T14:59:58.764Z, value=172.20.10.2:57348                                                                                          
1359  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:method\_name, timestamp=2020-05-16T14:59:58.764Z, value=Scan                                                                                                          
1360  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:param, timestamp=2020-05-16T14:59:58.764Z, value=region { type: REGION\_NAME value: "cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf." } scan { a
1361                                                              ttribute { name: "\_isolationlevel\_" value: "\\x5C000" } start\_row: "cccccccc" time\_range { from: 0 to: 9223372036854775807 } max\_versions: 1 cache\_blocks: true max\_result\_size: 2
1362                                                              097152 caching: 2147483647 include\_stop\_row: false } number\_of\_rows: 2147483647 close\_scanner: false client\_handles\_partials: true client\_handles\_heartbeats: true track\_scan\_met
1363                                                              rics: false                                                                                                                                                                      
1364  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:processing\_time, timestamp=2020-05-16T14:59:58.764Z, value=24                                                                                                        
1365  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:queue\_time, timestamp=2020-05-16T14:59:58.764Z, value=0                                                                                                              
1366  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:region\_name, timestamp=2020-05-16T14:59:58.764Z, value=cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf.                                         
1367  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:response\_size, timestamp=2020-05-16T14:59:58.764Z, value=211227                                                                                                      
1368  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:server\_class, timestamp=2020-05-16T14:59:58.764Z, value=HRegionServer                                                                                                
1369  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:start\_time, timestamp=2020-05-16T14:59:58.764Z, value=1589640743932                                                                                                  
1370  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:type, timestamp=2020-05-16T14:59:58.764Z, value=ALL                                                                                                                  
1371  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:username, timestamp=2020-05-16T14:59:58.764Z, value=vjasani
1376 * [HBASE-24271](https://issues.apache.org/jira/browse/HBASE-24271) | *Major* | **Set values in \`conf/hbase-site.xml\` that enable running on \`LocalFileSystem\` out of the box**
1378 <!-- markdown -->
1379 HBASE-24271 makes changes the the default `conf/hbase-site.xml` such that `bin/hbase` will run directly out of the binary tarball or a compiled source tree without any configuration modifications vs. Hadoop 2.8+. This changes our long-standing history of shipping no configured values in `conf/hbase-site.xml`, so existing processes that assume this file is empty of configuration properties may require attention.
1384 * [HBASE-24310](https://issues.apache.org/jira/browse/HBASE-24310) | *Major* | **Use Slf4jRequestLog for hbase-http**
1386 Use Slf4jRequestLog instead of the log4j HttpRequestLogAppender in HttpServer.
1388 The request log is disabled by default in conf/log4j.properties by the following lines:
1390 # Disable request log by default, you can enable this by changing the appender
1391 log4j.category.http.requests=INFO,NullAppender
1392 log4j.additivity.http.requests=false
1394 Change the 'NullAppender' to what ever you want if you want to enable request log.
1396 Notice that, the logger name for master status http server is 'http.requests.master', and for region server it is 'http.requests.regionserver'
1401 * [HBASE-24335](https://issues.apache.org/jira/browse/HBASE-24335) | *Major* | **Support deleteall with ts but without column in shell mode**
1403 Use a empty string to represent no column specified for deleteall in shell mode.
1404 useage:  
1405 deleteall 'test','r1','',12345
1406 deleteall 'test', {ROWPREFIXFILTER =\> 'prefix'}, '', 12345
1411 * [HBASE-24304](https://issues.apache.org/jira/browse/HBASE-24304) | *Major* | **Separate a hbase-asyncfs module**
1413 Added a new hbase-asyncfs module to hold the asynchronous dfs output stream implementation for implementing WAL.
1418 * [HBASE-22710](https://issues.apache.org/jira/browse/HBASE-22710) | *Major* | **Wrong result in one case of scan that use  raw and versions and filter together**
1420 Make the logic of the versions chosen more reasonable for raw scan, to avoid lose result when using filter.
1425 * [HBASE-24285](https://issues.apache.org/jira/browse/HBASE-24285) | *Major* | **Move to hbase-thirdparty-3.3.0**
1427 Moved to hbase-thirdparty 3.3.0.
1432 * [HBASE-24252](https://issues.apache.org/jira/browse/HBASE-24252) | *Major* | **Implement proxyuser/doAs mechanism for hbase-http**
1434 This feature enables the HBase Web UI's to accept a 'proxyuser' via the HTTP Request's query string. When the parameter \`hbase.security.authentication.spnego.kerberos.proxyuser.enable\` is set to \`true\` in hbase-site.xml (default is \`false\`), the HBase UI will attempt to impersonate the user specified by the query parameter "doAs". This query parameter is checked case-insensitively. When this option is not provided, the user who executed the request is the "real" user and there is no ability to execute impersonation against the WebUI.
1436 For example, if the user "bob" with Kerberos credentials executes a request against the WebUI with this feature enabled and a query string which includes \`doAs=alice\`, the HBase UI will treat this request as executed as \`alice\`, not \`bob\`.
1438 The standard Hadoop proxyuser configuration properties to limit users who may impersonate others apply to this change (e.g. to enable \`bob\` to impersonate \`alice\`). See the Hadoop documentation for more information on how to configure these proxyuser rules.
1443 * [HBASE-24143](https://issues.apache.org/jira/browse/HBASE-24143) | *Major* | **[JDK11] Switch default garbage collector from CMS**
1445 <!-- markdown -->
1446 `bin/hbase` will now dynamically select a Garbage Collector implementation based on the detected JVM version. JDKs 8,9,10 use `-XX:+UseConcMarkSweepGC`, while JDK11+ use `-XX:+UseG1GC`.
1448 Notice a slight compatibility change. Previously, the garbage collector choice would always be appended to a user-provided value for `HBASE_OPTS`. As of this change, this setting will only be applied when `HBASE_OPTS` is unset. That means that operators who provide a value for this variable will now need to also specify the collector. This is especially important for those on JDK8, where the vm default GC is not the recommended ConcMarkSweep.
1453 * [HBASE-24024](https://issues.apache.org/jira/browse/HBASE-24024) | *Major* | **Optionally reject multi() requests with very high no of rows**
1455 New Config: hbase.rpc.rows.size.threshold.reject
1456 -----------------------------------------------------------------------
1458 Default value: false
1459 Description:
1460 If value is true, RegionServer will abort batch requests of Put/Delete with number of rows in a batch operation exceeding threshold defined by value of config: hbase.rpc.rows.warning.threshold.
1465 * [HBASE-24139](https://issues.apache.org/jira/browse/HBASE-24139) | *Critical* | **Balancer should avoid leaving idle region servers**
1467 StochasticLoadBalancer functional improvement:
1469 StochasticLoadBalancer would rebalance the cluster if there are any idle RegionServers in the cluster (RegionServer having no region), while other RegionServers have at least 1 region available.
1474 * [HBASE-24196](https://issues.apache.org/jira/browse/HBASE-24196) | *Major* | **[Shell] Add rename rsgroup command in hbase shell**
1476 user or admin can now use
1477 hbase shell \> rename\_rsgroup 'oldname', 'newname'
1478 to rename rsgroup.
1483 * [HBASE-24218](https://issues.apache.org/jira/browse/HBASE-24218) | *Major* | **Add hadoop 3.2.x in hadoop check**
1485 Add hadoop-3.2.0 and hadoop-3.2.1 in hadoop check and when '--quick-hadoopcheck' we will only check hadoop-3.2.1.
1487 Notice that, for aligning the personality scripts across all the active branches, we will commit the patch to all active branches, but the hadoop-3.2.x support in hadoopcheck is only applied to branch-2.2+.
1492 * [HBASE-23829](https://issues.apache.org/jira/browse/HBASE-23829) | *Major* | **Get \`-PrunSmallTests\` passing on JDK11**
1494 \`-PrunSmallTests\` now pass on JDK11 when using \`-Phadoop.profile=3.0\`.
1499 * [HBASE-24185](https://issues.apache.org/jira/browse/HBASE-24185) | *Major* | **Junit tests do not behave well with System.exit or Runtime.halt or JVM exits in general.**
1501 Tests that fail because a process -- RegionServer or Master -- called System.exit, will now instead throw an exception.
1506 * [HBASE-24072](https://issues.apache.org/jira/browse/HBASE-24072) | *Major* | **Nightlies reporting OutOfMemoryError: unable to create new native thread**
1508 Hadoop hosts have had their ulimit -u raised from 10000 to 30000 (per user, by INFRA). The Docker build container has had its limit raised from 10000 to 12500.
1513 * [HBASE-24112](https://issues.apache.org/jira/browse/HBASE-24112) | *Major* | **[RSGroup] Support renaming rsgroup**
1515 Support RSGroup renaming in core codebase. New API Admin#renameRSGroup(String, String) is introduced in 3.0.0.
1520 * [HBASE-23994](https://issues.apache.org/jira/browse/HBASE-23994) | *Trivial* | ** Add WebUI to Canary**
1522 <!-- markdown -->
1523 The Canary tool now offers a WebUI when run in `region` mode (the default mode). It is enabled by default, and by default, it binds to `0.0.0.0:16050`. This can be overridden by setting `hbase.canary.info.bindAddress` and `hbase.canary.info.port`. To disable entirely, set the port to `-1`.
1528 * [HBASE-23779](https://issues.apache.org/jira/browse/HBASE-23779) | *Major* | **Up the default fork count to make builds complete faster; make count relative to CPU count**
1530 Pass --threads=2 building on jenkins. It shortens nightly build times by about ~25%.
1532 It works by running module build/test in parallel when dependencies allow. Upping the forkcount beyond the pom default of 0.25C would have us broach our CPU budget on jenkins when two modules are running in parallel (2 modules at 0.25% of CPU each makes 0.5C and on jenkins, hadoop nodes run two jenkins executors per host).  Higher forkcounts also seems to threaten build stability.
1534 For running tests locally, to go faster, up fork count.
1536 $ x="0.5C"  ;  mvn --threads=2  -Dsurefire.firstPartForkCount=$x -Dsurefire.secondPartForkCount=$x test -PrunAllTests
1538 You could up the x from 0.5C to 1.0C but YMMV (On overcommitted hardware, tests start bombing out pretty soon after startup). You could try upping thread count but on occasion are likely to overcommit hardware.
1543 * [HBASE-24126](https://issues.apache.org/jira/browse/HBASE-24126) | *Major* | **Up the container nproc uplimit from 10000 to 12500**
1545 Start docker with upped ulimit for nproc passing '--ulimit nproc=12500'. It was 10000, the default, but made it 12500. Then, set PROC\_LIMIT in hbase-personality so when yetus runs, it is w/ the new 12500 value.
1550 * [HBASE-24150](https://issues.apache.org/jira/browse/HBASE-24150) | *Major* | **Allow module tests run in parallel**
1552 Pass -T2 to mvn. Makes it so we do two modules-at-a-time dependencies willing. Helps speed build and testing. Doubles the resource usage when running modules in parallel.
1557 * [HBASE-24121](https://issues.apache.org/jira/browse/HBASE-24121) | *Major* | **[Authorization] ServiceAuthorizationManager isn't dynamically updatable. And it should be.**
1559 Master & RegionService now support refresh policy authorization defined in hbase-policy.xml without restarting service. To refresh policy, please execute hbase shell command: update\_config or update\_config\_all after policy file updated and synced on all nodes.
1564 * [HBASE-24099](https://issues.apache.org/jira/browse/HBASE-24099) | *Major* | **Use a fair ReentrantReadWriteLock for the region close lock**
1566 This change modifies the default acquisition policy for the region's close lock in order to prevent observed starvation of close requests. The new boolean configuration parameter 'hbase.regionserver.fair.region.close.lock' controls the lock acquisition policy: if true, the lock is created in fair mode (default); if false, the lock is created in nonfair mode (the old default).
1571 * [HBASE-23153](https://issues.apache.org/jira/browse/HBASE-23153) | *Major* | **PrimaryRegionCountSkewCostFunction SLB function should implement CostFunction#isNeeded**
1573 <!-- markdown -->
1574 The `PrimaryRegionCountSkewCostFunction` for the `StochasticLoadBalancer` is only needed when the read replicas feature is enabled. With this change, that function now properly indicates that it is not needed when the read replica feature is off.
1576 If this improvement is not available, operators with clusters that are not using the read replica feature should manually disable it by setting `hbase.master.balancer.stochastic.primaryRegionCountCost` to `0.0` in hbase-site.xml for all HBase Masters.
1581 * [HBASE-24055](https://issues.apache.org/jira/browse/HBASE-24055) | *Major* | **Make AsyncFSWAL can run on EC cluster**
1583 Now AsyncFSWAL can also be used against the directory which has EC enabled. Need to make sure you also make use of the hadoop 3.x client as the option is only available in hadoop 3.x.
1588 * [HBASE-24113](https://issues.apache.org/jira/browse/HBASE-24113) | *Major* | **Upgrade the maven we use from 3.5.4 to 3.6.3 in nightlies**
1590 Branches-2.3+ use maven 3.5.3 building. Older branches use 3.5.4 still.
1595 * [HBASE-24122](https://issues.apache.org/jira/browse/HBASE-24122) | *Major* | **Change machine ulimit-l to ulimit-a so dumps full ulimit rather than just 'max locked memory'**
1597 Our 'Build Artifacts' have a machine directory under which we emit vitals on the host the build was run on. We used to emit the result of 'ulimit -l' as a file named 'ulimit-l'. This has been hijacked to instead emit result of running 'ulimit -a' which includes stat on ulimit -l.
1602 * [HBASE-23678](https://issues.apache.org/jira/browse/HBASE-23678) | *Major* | **Literate builder API for version management in schema**
1604 ColumnFamilyDescriptor new builder API:
1606     /\*\*
1607      \* Retain all versions for a given TTL(retentionInterval), and then only a specific number
1608      \* of versions(versionAfterInterval) after that interval elapses.
1609      \*
1610      \* @param retentionInterval Retain all versions for this interval
1611      \* @param versionAfterInterval Retain no of versions to retain after retentionInterval
1612      \*/
1613     public ModifyableColumnFamilyDescriptor setVersionsWithTimeToLive(
1614         final int retentionInterval, final int versionAfterInterval)
1619 * [HBASE-24050](https://issues.apache.org/jira/browse/HBASE-24050) | *Major* | **Deprecated PBType on all 2.x branches**
1621 org.apache.hadoop.hbase.types.PBType is marked as deprecated without any replacement. It will be moved to hbase-example module and marked as IA.Private in 3.0.0. This is a mistake as it should not be part of our public API. Users who depend on this class should just copy the code your own code base.
1626 * [HBASE-8868](https://issues.apache.org/jira/browse/HBASE-8868) | *Minor* | **add metric to report client shortcircuit reads**
1628 Expose file system level read metrics for RegionServer.
1630 If the HBase RS runs on top of HDFS, calculate the aggregation of
1631 ReadStatistics of each HdfsFileInputStream. These metrics include:
1632 (1) total number of bytes read from HDFS.
1633 (2) total number of bytes read from local DataNode.
1634 (3) total number of bytes read locally through short-circuit read.
1635 (4) total number of bytes read locally through zero-copy read.
1637 Because HDFS ReadStatistics is calculated per input stream, it is not
1638 feasible to update the aggregated number in real time. Instead, the
1639 metrics are updated when an input stream is closed.
1644 * [HBASE-24032](https://issues.apache.org/jira/browse/HBASE-24032) | *Major* | **[RSGroup] Assign created tables to respective rsgroup automatically instead of manual operations**
1646 Admin can determine which tables go to which rsgroup by script  (setting hbase.rsgroup.table.mapping.script with local filystem path) on Master side which aims to lighten the burden of admin operations.  Note, since HBase 3+, rsgroup can be specified in TableDescriptor as well, if clients specify this, master will skip the determination from script.
1648 Here is a simple example of script:
1649 {code}
1650 # Input consists of two string, 1st is the namespace of the table, 2nd is the table name of the table
1651 #!/bin/bash
1652 namespace=$1
1653 tablename=$2
1654 if [[ $namespace == test ]]; then
1655   echo test
1656 elif [[ $tablename == \*foo\* ]]; then
1657   echo other
1658 else
1659   echo default
1661 {code}
1666 * [HBASE-23993](https://issues.apache.org/jira/browse/HBASE-23993) | *Major* | **Use loopback for zk standalone server in minizkcluster**
1668 MiniZKCluster now puts up its standalone node listening on loopback/127.0.0.1 rather than "localhost".
1673 * [HBASE-23986](https://issues.apache.org/jira/browse/HBASE-23986) | *Major* | **Bump hadoop-two.version to 2.10.0 on master and branch-2**
1675 Bumped hadoop-two.version to 2.10.0, which means we will drop the support for hadoop-2.8.x and hadoop-2.9.x.
1680 * [HBASE-23930](https://issues.apache.org/jira/browse/HBASE-23930) | *Minor* | **Shell should attempt to format \`timestamp\` attributes as ISO-8601**
1682 Change timestamp display to be ISO8601 when toString on Cell and outputting in shell....
1684 User used to see....
1685     
1686   column=table:state, timestamp=1583967620343 .....
1688 ... but now sees:
1690   column=table:state, timestamp=2020-03-11T23:00:20.343Z ....
1695 * [HBASE-22827](https://issues.apache.org/jira/browse/HBASE-22827) | *Major* | **Expose multi-region merge in shell and Admin API**
1697 merge\_region shell command can now be used to merge more than 2 regions as well. It takes a list of regions as comma separated values or as an array of regions, and not just 2 regions. The full regionnames and encoded regionnames are continued to be accepted.
1702 * [HBASE-23767](https://issues.apache.org/jira/browse/HBASE-23767) | *Major* | **Add JDK11 compilation and unit test support to Github precommit**
1704 Rebuild our Dockerfile with support for multiple JDK versions. Use multiple stages in the Jenkinsfile instead of yetus's multijdk because of YETUS-953. Run those multiple stages in parallel to speed up results.
1706 Note that multiple stages means multiple Yetus invocations means multiple comments on the PreCommit. This should become more obvious to users once we can make use of GitHub Checks API, HBASE-23902.
1711 * [HBASE-22978](https://issues.apache.org/jira/browse/HBASE-22978) | *Minor* | **Online slow response log**
1713 get\_slowlog\_responses and clear\_slowlog\_responses are used to retrieve and clear slow RPC logs from RingBuffer maintained by RegionServers.
1715 New Admin APIs:
1716 1.   List\<SlowLogRecord\> getSlowLogResponses(final Set\<ServerName\> serverNames,
1717       final SlowLogQueryFilter slowLogQueryFilter) throws IOException;
1719 2.   List\<Boolean\> clearSlowLogResponses(final Set\<ServerName\> serverNames)
1720       throws IOException;
1722 Configs:
1724 1. hbase.regionserver.slowlog.ringbuffer.size:
1725 Default size of ringbuffer to be maintained by each RegionServer in order to store online slowlog responses. This is an in-memory ring buffer of requests that were judged to be too slow in addition to the responseTooSlow logging. The in-memory representation would be complete. For more details, please look into Doc Section: Get Slow Response Log from shell
1727 Default
1730 2. hbase.regionserver.slowlog.buffer.enabled:
1731 Indicates whether RegionServers have ring buffer running for storing Online Slow logs in FIFO manner with limited entries. The size of the ring buffer is indicated by config: hbase.regionserver.slowlog.ringbuffer.size The default value is false, turn this on and get latest slowlog responses with complete data.
1733 Default
1734 false
1737 For more details, please look into "Get Slow Response Log from shell" section from HBase book.
1742 * [HBASE-23926](https://issues.apache.org/jira/browse/HBASE-23926) | *Major* | **[Flakey Tests] Down the flakies re-run ferocity; it makes for too many fails.**
1744 Down the flakey re-rerun fork count from 1.0C -- i.e. a fork per CPU -- to 0.25C. On a recent run, the machine had 16 cores. 0.25 is 4 cores. We'd hardcoded fork count at 3 previous to changes made by parent.
1749 * [HBASE-23146](https://issues.apache.org/jira/browse/HBASE-23146) | *Major* | **Support CheckAndMutate with multiple conditions**
1751 Add a checkAndMutate(row, filter) method in the AsyncTable interface and the Table interface.
1753 This method atomically checks if the row matches the specified filter. If it does, it adds the Put/Delete/RowMutations.
1755 This is a fluent style API, the code is like:
1757 For Table interface:
1758 {code}
1759 table.checkAndMutate(row, filter).thenPut(put);
1760 {code}
1762 For AsyncTable interface:
1763 {code}
1764 table.checkAndMutate(row, filter).thenPut(put)
1765     .thenAccept(succ -\> {
1766       if (succ) {
1767         System.out.println("Check and put succeeded");
1768       } else {
1769         System.out.println("Check and put failed");
1770       }
1771     });
1772 {code}
1777 * [HBASE-23874](https://issues.apache.org/jira/browse/HBASE-23874) | *Minor* | **Move Jira-attached file precommit definition from script in Jenkins config to dev-support**
1779 The Jira Precommit job (https://builds.apache.org/job/PreCommit-HBASE-Build/) will now look for a file within the source tree (dev-support/jenkins\_precommit\_jira\_yetus.sh) instead of depending on a script section embedded in the job.
1784 * [HBASE-23865](https://issues.apache.org/jira/browse/HBASE-23865) | *Major* | **Up flakey history from 5 to 10**
1786 Changed flakey list reporting to show 5 rather than 10 items. Also changed the second and first part fort counts to be 1C rather than hardcoded 3.
1791 * [HBASE-23554](https://issues.apache.org/jira/browse/HBASE-23554) | *Major* | **Encoded regionname to regionname utility**
1793     Adds shell command regioninfo:
1795       hbase(main):001:0\>  regioninfo '0e6aa5c19ae2b2627649dc7708ce27d0'
1796       {ENCODED =\> 0e6aa5c19ae2b2627649dc7708ce27d0, NAME =\> 'TestTable,,1575941375972.0e6aa5c19ae2b2627649dc7708ce27d0.', STARTKEY =\> '', ENDKEY =\> '00000000000000000000299441'}
1797       Took 0.4737 seconds
1802 * [HBASE-23350](https://issues.apache.org/jira/browse/HBASE-23350) | *Major* | **Make compaction files cacheonWrite configurable based on threshold**
1804 This JIRA adds a new configuration - \`hbase.rs.cachecompactedblocksonwrite.threshold\`. This configuration is the maximum total size (in bytes) of the compacted files below which the configuration \`hbase.rs.cachecompactedblocksonwrite\` is honoured. If the total size of the compacted fies exceeds this threshold, even when \`hbase.rs.cachecompactedblocksonwrite\` is enabled, the data blocks are not cached. Caching index and bloom blocks is not affected by this configuration (user configuration is always honoured).
1806 Default value of this configuration is Long.MAX\_VALUE. This means whatever the total size of the compacted files, it wil be cached.
1811 * [HBASE-17115](https://issues.apache.org/jira/browse/HBASE-17115) | *Major* | **HMaster/HRegion Info Server does not honour admin.acl**
1813 Implements authorization for the HBase Web UI by limiting access to certain endpoints which could be used to extract sensitive information from HBase.
1815 Access to these restricted endpoints can be limited to a group of administrators, identified either by a list of users (hbase.security.authentication.spnego.admin.users) or by a list of groups
1816 (hbase.security.authentication.spnego.admin.groups).  By default, neither of these values are set which will preserve backwards compatibility (allowing all authenticated users to access all endpoints).
1818 Further, users who have sensitive information in the HBase service configuration can set hbase.security.authentication.ui.config.protected to true which will treat the configuration endpoint as a protected, admin-only resource. By default, all authenticated users may access the configuration endpoint.
1823 * [HBASE-23647](https://issues.apache.org/jira/browse/HBASE-23647) | *Major* | **Make MasterRegistry the default registry impl**
1825 <!-- markdown -->
1826 Enables master based registry as the default registry used by clients to fetch connection metadata.
1827 Refer to the section "Master Registry" in the client documentation for more details and advantages
1828 of this implementation over the default Zookeeper based registry. 
1830 Configuration parameter that controls the registry in use: `hbase.client.registry.impl`
1832 Where to set this: HBase client configuration (hbase-site.xml)
1834 Possible values:
1835 - `org.apache.hadoop.hbase.client.ZKConnectionRegistry` (For ZK based registry implementation)
1836 - `org.apache.hadoop.hbase.client.MasterRegistry` (New, for master based registry implementation)
1838 Notes on defaults:
1840 - For v3.0.0 and later, MasterRegistry is the default registry
1841 - For all releases in 2.x line, ZK based registry is the default.
1843 This feature has been back ported to 2.3.0 and later releases. MasterRegistry can be enabled by setting the following client configuration.
1846 <property>
1847   <name>hbase.client.registry.impl</name>
1848   <value>org.apache.hadoop.hbase.client.MasterRegistry</value>
1849 </property>
1855 * [HBASE-23069](https://issues.apache.org/jira/browse/HBASE-23069) | *Critical* | **periodic dependency bump for Sep 2019**
1857 caffeine: 2.6.2 =\> 2.8.1
1858 commons-codec: 1.10 =\> 1.13
1859 commons-io: 2.5 =\> 2.6
1860 disrupter: 3.3.6 =\> 3.4.2
1861 httpcore: 4.4.6 =\> 4.4.13
1862 jackson: 2.9.10 =\> 2.10.1
1863 jackson.databind: 2.9.10.1 =\> 2.10.1
1864 jetty: 9.3.27.v20190418 =\> 9.3.28.v20191105
1865 protobuf.plugin: 0.5.0 =\> 0.6.1
1866 zookeeper: 3.4.10 =\> 3.4.14
1867 slf4j: 1.7.25 =\> 1.7.30
1868 rat: 0.12 =\> 0.13
1869 asciidoctor: 1.5.5 =\> 1.5.8
1870 asciidoctor.pdf: 1.5.0-alpha.15 =\> 1.5.0-rc.2
1871 error-prone: 2.3.3 =\> 2.3.4
1876 * [HBASE-23686](https://issues.apache.org/jira/browse/HBASE-23686) | *Major* | **Revert binary incompatible change and remove reflection**
1878 - Reverts a binary incompatible binary change for ByteRangeUtils
1879 - Usage of reflection inside CommonFSUtils removed
1884 * [HBASE-23347](https://issues.apache.org/jira/browse/HBASE-23347) | *Major* | **Pluggable RPC authentication**
1886 This change introduces an internal abstraction layer which allows for new SASL-based authentication mechanisms to be used inside HBase services. All existing SASL-based authentication mechanism were ported to the new abstraction, making no external change in runtime semantics, client API, or RPC serialization format.
1888 Developers familiar with extending HBase can implement authentication mechanism beyond simple Kerberos and DelegationTokens which authenticate HBase users against some other user database. HBase service authentication (Master to/from RegionServer) continue to operate solely over Kerberos.
1893 * [HBASE-23156](https://issues.apache.org/jira/browse/HBASE-23156) | *Major* | **start-hbase.sh failed with ClassNotFoundException when build with hadoop3**
1895 Introduce a new hbase-assembly/src/main/assembly/hadoop-three-compat.xml for build with hadoop 3.x.
1900 * [HBASE-23680](https://issues.apache.org/jira/browse/HBASE-23680) | *Major* | **RegionProcedureStore missing cleaning of hfile archive**
1902 Add a new config to hbase-default.xml
1904   \<property\>
1905     \<name\>hbase.procedure.store.region.hfilecleaner.plugins\</name\>
1906     \<value\>org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner\</value\>
1907     \<description\>A comma-separated list of BaseHFileCleanerDelegate invoked by
1908     the RegionProcedureStore HFileCleaner service. These HFiles cleaners are
1909     called in order, so put the cleaner that prunes the most files in front. To
1910     implement your own BaseHFileCleanerDelegate, just put it in HBase's classpath
1911     and add the fully qualified class name here. Always add the above
1912     default hfile cleaners in the list as they will be overwritten in
1913     hbase-site.xml.\</description\>
1914   \</property\>
1916 It will share the same TTL with other HFileCleaners. And you can also implement your own cleaner and change this property to enable it.
1921 * [HBASE-23675](https://issues.apache.org/jira/browse/HBASE-23675) | *Minor* | **Move to Apache parent POM version 22**
1923 Updated parent pom to Apache version 22.
1928 * [HBASE-23679](https://issues.apache.org/jira/browse/HBASE-23679) | *Critical* | **FileSystem instance leaks due to bulk loads with Kerberos enabled**
1930 This issues fixes an issue with Bulk Loading on installations with Kerberos enabled and more than a single RegionServer. When multiple tables are involved in hosting a table's regions which are being bulk-loaded into, all but the RegionServer hosting the table's first Region will "leak" one DistributedFileSystem object onto the heap, never freeing that memory. Eventually, with enough bulk loads, this will create a situation for RegionServers where they have no free heap space and will either spend all time in JVM GC, lose their ZK session, or crash with an OutOfMemoryError.
1932 The only mitigation for this issue is to periodically restart RegionServers. All earlier versions of HBase 2.x are subject to this issue (2.0.x, \<=2.1.8, \<=2.2.3)
1937 * [HBASE-23286](https://issues.apache.org/jira/browse/HBASE-23286) | *Major* | **Improve MTTR: Split WAL to HFile**
1939 Add a new feature to improve MTTR which have 3 steps to failover:
1940 1. Read WAL and write HFile to region’s column family’s recovered.hfiles directory.
1941 2. Open region.
1942 3. Bulkload the recovered.hfiles for every column family.
1944 Compared to DLS(distributed log split), this feature will reduce region open time significantly.
1946 Config hbase.wal.split.to.hfile to true to enable this featue.
1951 * [HBASE-23619](https://issues.apache.org/jira/browse/HBASE-23619) | *Trivial* | **Use built-in formatting for logging in hbase-zookeeper**
1953 Changed the logging in hbase-zookeeper to use built-in formatting
1958 * [HBASE-23628](https://issues.apache.org/jira/browse/HBASE-23628) | *Minor* | **Replace Apache Commons Digest Base64 with JDK8 Base64**
1960 From the PR:
1962 "Yes. The two create the same output... I just wrote a small test suite to increase my confidence on that. I generated many tens of millions of random byte patterns and compared the output of the two algorithms. They came back identical every time.
1964 "Just in case any inquiring minds would like to know, there is no longer an encoding required when generating the strings. The JDK implementation specifically specifies that strings returned are StandardCharsets.ISO\_8859\_1. This does not change anything because UTF8 and ISO\_8859 overlap for the limited character set (64 characters) the encoding uses."
1969 * [HBASE-23651](https://issues.apache.org/jira/browse/HBASE-23651) | *Major* | **Region balance throttling can be disabled**
1971 Set hbase.balancer.max.balancing to a int value which \<=0 will disable region balance throttling.
1976 * [HBASE-23588](https://issues.apache.org/jira/browse/HBASE-23588) | *Major* | **Cache index blocks and bloom blocks on write if CacheCompactedBlocksOnWrite is enabled**
1978 If cacheOnWrite is enabled during flush or compaction, index and bloom blocks(with data blocks) would be automatically cached during write.
1983 * [HBASE-23369](https://issues.apache.org/jira/browse/HBASE-23369) | *Major* | **Auto-close 'unknown' Regions reported as OPEN on RegionServers**
1985 If a RegionServer reports a Region as OPEN in disagreement with Master's status on the Region, the Master now tells the RegionServer to silently close the Region.
1990 * [HBASE-23596](https://issues.apache.org/jira/browse/HBASE-23596) | *Major* | **HBCKServerCrashProcedure can double assign**
1992 Makes it so the recently added HBCKServerCrashProcedure -- the SCP that gets invoked when an operator schedules an SCP via hbck2 scheduleRecoveries command -- now works the same as SCP EXCEPT if master knows nothing of the scheduled servername. In this latter case, HBCKSCP will do a full scan of hbase:meta looking for instances of the passed servername. If any found it will attempt cleanup of hbase:meta references by reassigning any found OPEN or OPENING and by closing any in CLOSING state.
1994 Used to fix instances of what the 'HBCK Report' page shows as 'Unknown Servers'.
1999 * [HBASE-23624](https://issues.apache.org/jira/browse/HBASE-23624) | *Major* | **Add a tool to dump the procedure info in HFile**
2001 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.HFileProcedurePrettyPrinter to run the tool.
2006 * [HBASE-23590](https://issues.apache.org/jira/browse/HBASE-23590) | *Major* | **Update maxStoreFileRefCount to maxCompactedStoreFileRefCount**
2008 RegionsRecoveryChore introduced as part of HBASE-22460 tries to reopen regions based on config: hbase.regions.recovery.store.file.ref.count.
2009 Region reopen needs to take into consideration all compacted away store files that belong to the region and not store files(non-compacted).
2011 Fixed this bug as part of this Jira. 
2012 Updated description for corresponding configs:
2014 1. hbase.master.regions.recovery.check.interval :
2016 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
2018 2. hbase.regions.recovery.store.file.ref.count :
2020 Very large number of ref count on a compacted store file indicates that it is a ref leak on that object(compacted store file). Such files can not be removed after it is invalidated via compaction. Only way to recover in such scenario is to reopen the region which can release all resources, like the refcount, leases, etc. This config represents Store files Ref Count threshold value considered for reopening regions. Any region with compacted store files ref count \> this value would be eligible for reopening by master. Here, we get the max refCount among all refCounts on all compacted away store files that belong to a particular region. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
2025 * [HBASE-23618](https://issues.apache.org/jira/browse/HBASE-23618) | *Major* | **Add a tool to dump procedure info in the WAL file**
2027 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.WALProcedurePrettyPrinter to run the tool.
2032 * [HBASE-23617](https://issues.apache.org/jira/browse/HBASE-23617) | *Major* | **Add a stress test tool for region based procedure store**
2034 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.RegionProcedureStorePerformanceEvaluation to run the tool.
2039 * [HBASE-23326](https://issues.apache.org/jira/browse/HBASE-23326) | *Critical* | **Implement a ProcedureStore which stores procedures in a HRegion**
2041 Use a region based procedure store to replace the old customized WAL based procedure store. The procedure data migration is done automatically during upgrading. After upgrading, the MasterProcWALs directory will be deleted and a new MasterProc directory will be created. And notice that a region will still write WAL so we still have WAL files and they will be moved to the oldWALs directory. The file name is mostly like a normal WAL file, and the only difference is that it is ended with "$masterproc$".
2046 * [HBASE-23320](https://issues.apache.org/jira/browse/HBASE-23320) | *Major* | **Upgrade surefire plugin to 3.0.0-M4**
2048 Bumped surefire plugin to 3.0.0-M4
2053 * [HBASE-20461](https://issues.apache.org/jira/browse/HBASE-20461) | *Major* | **Implement fsync for AsyncFSWAL**
2055 Now AsyncFSWAL also supports Durability.FSYNC\_WAL.
2060 * [HBASE-23066](https://issues.apache.org/jira/browse/HBASE-23066) | *Minor* | **Create a config that forces to cache blocks on compaction**
2062 The configuration 'hbase.rs.cacheblocksonwrite' was used to enable caching the blocks on write. But purposefully we were not caching the blocks when we do compaction (since it may be very aggressive) as the caching happens as and when the writer completes a block. 
2063 In cloud environments since they have bigger sized caches - though they try to enable 'hbase.rs.prefetchblocksonopen' (non - aggressive way of caching the blocks proactively on reader creation) it does not help them because it takes time to cache the compacted blocks. 
2064 This feature creates a new configuration  'hbase.rs.cachecompactedblocksonwrite' which when set to 'true' will enable the blocks created out of compaction. 
2065 Remember that since it is aggressive caching the user should be having enough cache space - if not it may lead to other active blocks getting evicted.
2066 From the shell this can be enabled by using the option per Column Family also by using the below format
2067 {code}
2068 create 't1', 'f1', {NUMREGIONS =\> 15, SPLITALGO =\> 'HexStringSplit', CONFIGURATION =\> {'hbase.rs.cachecompactedblocksonwrite' =\> 'true'}}
2069 {code}
2074 * [HBASE-23239](https://issues.apache.org/jira/browse/HBASE-23239) | *Major* | **Reporting on status of backing MOB files from client-facing cells**
2076 <!-- markdown -->
2078 Users of the MOB feature can now use the `mobrefs` utility to get statistics about data in the MOB system and verify the health of backing files on HDFS.
2081 HADOOP_CLASSPATH=/etc/hbase/conf:$(hbase mapredcp) yarn jar \
2082     /some/path/to/hbase-shaded-mapreduce.jar mobrefs mobrefs-report-output some_table foo
2085 See javadocs of the class `MobRefReporter` for more details.
2087 the reference guide has added some information about MOB internals and troubleshooting.
2092 * [HBASE-23549](https://issues.apache.org/jira/browse/HBASE-23549) | *Minor* | **Document steps to disable MOB for a column family**
2094 The reference guide now includes a walk through of disabling the MOB feature if needed while maintaining availability.
2099 * [HBASE-23582](https://issues.apache.org/jira/browse/HBASE-23582) | *Minor* | **Unbalanced braces in string representation of table descriptor**
2101 Fixed unbalanced braces in string representation within HBase shell
2106 * [HBASE-23293](https://issues.apache.org/jira/browse/HBASE-23293) | *Minor* | **[REPLICATION] make ship edits timeout configurable**
2108 The default rpc timeout for ReplicationSourceShipper#shipEdits is 60s, when bulkload replication enabled, timeout exception may be occurred.
2109 Now we can conf the timeout value through replication.source.shipedits.timeout, and it’s adaptive.
2114 * [HBASE-23312](https://issues.apache.org/jira/browse/HBASE-23312) | *Major* | **HBase Thrift SPNEGO configs (HBASE-19852) should be backwards compatible**
2116 The newer HBase Thrift SPNEGO configs should not be required. The hbase.thrift.spnego.keytab.file and hbase.thrift.spnego.principal configs will fall back to the hbase.thrift.keytab.file and hbase.thrift.kerberos.principal original configs. The older configs will log a deprecation warning. It is preferred to new the newer SPNEGO configurations.
2121 * [HBASE-22969](https://issues.apache.org/jira/browse/HBASE-22969) | *Minor* | **A new binary component comparator(BinaryComponentComparator) to perform comparison of arbitrary length and position**
2123 With BinaryComponentCompartor applications will be able to design diverse and powerful set of filters for rows and columns. See https://issues.apache.org/jira/browse/HBASE-22969 for example. In general, the comparator can be used with any filter taking ByteArrayComparable. As of now, following filters take ByteArrayComparable: 
2125 1. RowFilter
2126 2. ValueFilter
2127 3. QualifierFilter
2128 4. FamilyFilter
2129 5. ColumnValueFilter
2134 * [HBASE-23234](https://issues.apache.org/jira/browse/HBASE-23234) | *Major* | **Provide .editorconfig based on checkstyle configuration**
2136 Adds a .editorconfig file with configurations populated by IntelliJ, based on our checkstyle configuration. There's lots of IntelliJ-specific configs in here that I assume are not replicated to Eclipse or Netbeans users. Any devs using those tools should push whatever updates they see fit, but please start with the checkstyle configs as the origin of truth.
2141 * [HBASE-23322](https://issues.apache.org/jira/browse/HBASE-23322) | *Minor* | **[hbck2] Simplification on HBCKSCP scheduling**
2143 An hbck2 scheduleRecoveries will run a subclass of ServerCrashProcedure which asks Master what Regions were on the dead Server but it will also do a hbase:meta table scan to see if any vestiges of the old Server remain (for the case where an SCP failed mid-point leaving references in place or where Master and hbase:meta deviated in accounting).
2148 * [HBASE-23321](https://issues.apache.org/jira/browse/HBASE-23321) | *Minor* | **[hbck2] fixHoles of fixMeta doesn't update in-memory state**
2150 If holes in hbase:meta, hbck2 fixMeta now will update Master in-memory state so you do not need to restart master just so you can assign the new hole-bridging regions.
2155 * [HBASE-23282](https://issues.apache.org/jira/browse/HBASE-23282) | *Major* | **HBCKServerCrashProcedure for 'Unknown Servers'**
2157 hbck2 scheduleRecoveries will now run a SCP that also looks in hbase:meta for any references to the scheduled server -- not just consult Master in-memory state -- just in case vestiges of the server are leftover in hbase:meta
2162 * [HBASE-19450](https://issues.apache.org/jira/browse/HBASE-19450) | *Minor* | **Add log about average execution time for ScheduledChore**
2164 <!-- markdown -->
2165 HBase internal chores now log a moving average of how long execution of each chore takes at `INFO` level for the logger `org.apache.hadoop.hbase.ScheduledChore`.
2167 Such messages will happen at most once per five minutes.
2172 * [HBASE-23250](https://issues.apache.org/jira/browse/HBASE-23250) | *Minor* | **Log message about CleanerChore delegate initialization should be at INFO**
2174 CleanerChore delegate initialization is now logged at INFO level instead of DEBUG
2179 * [HBASE-23243](https://issues.apache.org/jira/browse/HBASE-23243) | *Major* | **[pv2] Filter out SUCCESS procedures; on decent-sized cluster, plethora overwhelms problems**
2181 The 'Procedures & Locks' tab in Master UI only displays problematic Procedures now (RUNNABLE, WAITING-TIMEOUT, etc.). It no longer notes procedures whose state is SUCCESS.
2186 * [HBASE-23227](https://issues.apache.org/jira/browse/HBASE-23227) | *Blocker* | **Upgrade jackson-databind to 2.9.10.1 to avoid recent CVEs**
2188 <!-- markdown -->
2190 the Apache HBase REST Proxy now uses Jackson Databind version 2.9.10.1 to address the following CVEs
2192   - CVE-2019-16942
2193   - CVE-2019-16943
2195 Users of prior releases with Jackson Databind 2.9.10 are advised to either upgrade to this release or to upgrade their local Jackson Databind jar directly.
2200 * [HBASE-23222](https://issues.apache.org/jira/browse/HBASE-23222) | *Critical* | **Better logging and mitigation for MOB compaction failures**
2202 <!-- markdown -->
2204 The MOB compaction process in the HBase Master now logs more about its activity.
2206 In the event that you run into the problems described in HBASE-22075, there is a new HFileCleanerDelegate that will stop all removal of MOB hfiles from the archive area. It can be configured by adding `org.apache.hadoop.hbase.mob.ManualMobMaintHFileCleaner` to the list configured for `hbase.master.hfilecleaner.plugins`. This new cleaner delegate will cause your archive area to grow unbounded; you will have to manually prune files which may be prohibitively complex. Consider if your use case will allow you to mitigate by disabling mob compactions instead.
2208 Caveats:
2209 * Be sure the list of cleaner delegates still includes the default cleaners you will likely need: ttl, snapshot, and hlink.
2210 * Be mindful that if you enable this cleaner delegate then there will be *no* automated process for removing these mob hfiles. You should see a single region per table in `%hbase_root%/archive` that accumulates files over time. You will have to determine which of these files are safe or not to remove.
2211 * You should list this cleaner delegate after the snapshot and hlink delegates so that you can enable sufficient logging to determine when an archived mob hfile is needed by those subsystems. When set to `TRACE` logging, the CleanerChore logger will include archive retention decision justifications.
2212 * If your use case creates a large number of uniquely named tables, this new delegate will cause memory pressure on the master.
2217 * [HBASE-15519](https://issues.apache.org/jira/browse/HBASE-15519) | *Major* | **Add per-user metrics**
2219 Adds per-user metrics for reads/writes to each RegionServer. These metrics are exported by default. hbase.regionserver.user.metrics.enabled can be used to disable the feature if desired for any reason.
2224 * [HBASE-22460](https://issues.apache.org/jira/browse/HBASE-22460) | *Minor* | **Reopen a region if store reader references may have leaked**
2226 Leaked store files can not be removed even after it is invalidated via compaction. A reasonable mitigation for a reader reference leak would be a fast reopen of the region on the same server.
2228 Configs:
2230 1. hbase.master.regions.recovery.check.interval :
2232 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
2234 2. hbase.regions.recovery.store.file.ref.count :
2236 This config represents Store files Ref Count threshold value considered for reopening regions. Any region with store files ref count \> this value would be eligible for reopening by master. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
2241 * [HBASE-23172](https://issues.apache.org/jira/browse/HBASE-23172) | *Minor* | **HBase Canary region success count metrics reflect column family successes, not region successes**
2243 Added a comment to make clear that read/write success counts are tallying column family success counts, not region success counts. 
2245 Additionally, the region read and write latencies previously only stored the latencies of the last column family of the region reads/writes. This has been fixed by using a map of each region to a list of read and write latency values.
2250 * [HBASE-23177](https://issues.apache.org/jira/browse/HBASE-23177) | *Major* | **If fail to open reference because FNFE, make it plain it is a Reference**
2252 Changes the message on the FNFE exception thrown when the file a Reference points to is missing; the message now includes detail on Reference as well as pointed-to file so can connect how FNFE relates to region open.
2257 * [HBASE-20626](https://issues.apache.org/jira/browse/HBASE-20626) | *Major* | **Change the value of "Requests Per Second" on WEBUI**
2259 Use 'totalRowActionRequestCount' to calculate QPS on web UI.
2264 * [HBASE-22874](https://issues.apache.org/jira/browse/HBASE-22874) | *Critical* | **Define a public interface for Canary and move existing implementation to LimitedPrivate**
2266 <!-- markdown -->
2267 Downstream users who wish to programmatically check the health of their HBase cluster may now rely on a public interface derived from the previously private implementation of the canary cli tool. The interface is named `Canary` and can be found in the user facing javadocs.
2269 Downstream users who previously relied on the invoking the canary via the Java classname (either on the command line or programmatically) will need to change how they do so because the non-public implementation has moved.
2274 * [HBASE-23035](https://issues.apache.org/jira/browse/HBASE-23035) | *Major* | **Retain region to the last RegionServer make the failover slower**
2276 Since 2.0.0,when one regionserver crashed and back online again, AssignmentManager will retain the region locations and try assign the regions to this regionserver(same host:port with the crashed one) again. But for 1.x.x, the behavior is round-robin assignment for the regions belong to the crashed regionserver. This jira change the "retain" assignment to round-robin assignment, which is same with 1.x.x version. This change will make the failover faster and improve availability.
2281 * [HBASE-23046](https://issues.apache.org/jira/browse/HBASE-23046) | *Minor* | **Remove compatibility case from truncate command**
2283 Remove backward compatibility from \`truncate\` and \`truncate\_preserve\` shell commands. This means that these commands from HBase Clients are not compatible with pre-0.99 HBase clusters.
2288 * [HBASE-23040](https://issues.apache.org/jira/browse/HBASE-23040) | *Minor* | **region mover gives NullPointerException instead of saying a host isn't in the cluster**
2290 giving the region mover "unload" command a region server name that isn't recognized by the cluster results in a "I don't know about that host" message instead of a NPE.
2292 set log level to DEBUG if you'd like the region mover to log the set of region server names it got back from the cluster.
2297 * [HBASE-21874](https://issues.apache.org/jira/browse/HBASE-21874) | *Major* | **Bucket cache on Persistent memory**
2299 Added a new IOEngine type for Bucket cache ie Persistent memory. In order to use BC over pmem configure IOEngine as 
2300 \<property\>
2301     \<name\>hbase.bucketcache.ioengine\</name\>
2302     \<value\> pmem:///path in persistent memory \</value\>
2303   \</property\>
2308 * [HBASE-22760](https://issues.apache.org/jira/browse/HBASE-22760) | *Major* | **Stop/Resume Snapshot Auto-Cleanup activity with shell command**
2310 By default, snapshot auto cleanup based on TTL would be enabled for any new cluster. At any point in time, if snapshot cleanup is supposed to be stopped due to some snapshot restore activity or any other reason, it is advisable to disable it using shell command:
2311 hbase\> snapshot\_cleanup\_switch false
2313 We can re-enable it using:
2314 hbase\> snapshot\_cleanup\_switch true
2316 We can query whether snapshot auto cleanup is enabled for cluster using:
2317 hbase\> snapshot\_cleanup\_enabled
2322 * [HBASE-22796](https://issues.apache.org/jira/browse/HBASE-22796) | *Major* | **[HBCK2] Add fix of overlaps to fixMeta hbck Service**
2324 Adds fix of overlaps to the fixMeta hbck service method. Uses the bulk-merge facility. Merges a max of 10 at a time. Set hbase.master.metafixer.max.merge.count to higher if you want to do more than 10 in the one go.
2329 * [HBASE-21745](https://issues.apache.org/jira/browse/HBASE-21745) | *Critical* | **Make HBCK2 be able to fix issues other than region assignment**
2331 This issue adds via its subtasks:
2333  \* An 'HBCK Report' page to the Master UI added by HBASE-22527+HBASE-22709+HBASE-22723+ (since 2.1.6, 2.2.1, 2.3.0). Lists consistency or anomalies found via new hbase:meta consistency checking extensions added to CatalogJanitor (holes, overlaps, bad servers) and by a new 'HBCK chore' that runs at a lesser periodicity that will note filesystem orphans and overlaps as well as the following conditions:
2334  \*\* Master thought this region opened, but no regionserver reported it. 
2335  \*\* Master thought this region opened on Server1, but regionserver reported Server2 
2336  \*\* More than one regionservers reported opened this region
2337  Both chores can be triggered from the shell to regenerate ‘new’ reports.
2338  \* Means of scheduling a ServerCrashProcedure (HBASE-21393).
2339  \* An ‘offline’ hbase:meta rebuild (HBASE-22680).
2340  \* Offline replace of hbase.version and hbase.id
2341  \* Documentation on how to use completebulkload tool to ‘adopt’ orphaned data found by new HBCK2 ‘filesystem’ check (see below) and ‘HBCK chore’ (HBASE-22859)
2342  \* A ‘holes’ and ‘overlaps’ fix that runs in the master that uses new bulk-merge facility to collapse many overlaps in the one go.
2343  \* hbase-operator-tools HBCK2 client tool got a bunch of additions:
2344  \*\* A specialized 'fix' for the case where operators ran old hbck 'offlinemeta' repair and destroyed their hbase:meta; it ties together holes in meta with orphaned data in the fs (HBASE-22567)
2345  \*\* A ‘filesystem’ command that reports on orphan data as well as bad references and hlinks with a ‘fix’ for the latter two options (based on hbck1 facility updated).
2346  \*\* Adds back the ‘replication’ fix facility from hbck1 (HBASE-22717)
2348 The compound result is that hbck2 is now in excess of hbck1 abilities. The provided functionality is disaggregated as per the hbck2 philosophy of providing 'plumbing' rather than 'porcelain' so there is work to do still adding fix-it playbooks, scripting across outages, and automation.
2353 * [HBASE-22802](https://issues.apache.org/jira/browse/HBASE-22802) | *Major* | **Avoid temp ByteBuffer allocation in FileIOEngine#read**
2355 HBASE-21879 introduces a utility class (org.apache.hadoop.hbase.io.ByteBuffAllocator) used for allocating/freeing ByteBuffers from/to NIO ByteBuffer pool, when BucketCache enabled with file or mmap engine, we will use this ByteBuffer pool to avoid temp ByteBuffer allocation a lot.
2360 * [HBASE-11062](https://issues.apache.org/jira/browse/HBASE-11062) | *Major* | **hbtop**
2362 Introduces hbtop that's a real-time monitoring tool for HBase like Unix's top command. See the ref guide for the details: https://hbase.apache.org/book.html#hbtop
2367 * [HBASE-21879](https://issues.apache.org/jira/browse/HBASE-21879) | *Major* | **Read HFile's block to ByteBuffer directly instead of to byte for reducing young gc purpose**
2369 Before this issue, read path was 100% offheap when block is in the BucketCache. But if a cache miss, then the RS needs to read the block via an on-heap API which causes high young-GC pressure.
2371 This issue adds reading the block via offheap even if reading the block from filesystem directly.  It requires hadoop version(\>=2.9.3) but can also work with older hadoop versions (all works but we continue to read block onheap). It also requires HBASE-21946 which is not yet in place as of this writing/hbase-2.3.0.
2373 We have written a careful doc about the implementation, performance and practice here: https://docs.google.com/document/d/1xSy9axGxafoH-Qc17zbD2Bd--rWjjI00xTWQZ8ZwI\_E/edit#heading=h.nch5d72p27ex
2378 * [HBASE-22618](https://issues.apache.org/jira/browse/HBASE-22618) | *Major* | **added the possibility to load custom cost functions**
2380 <!-- markdown -->
2381 Extends `StochasticLoadBalancer` to support user-provided cost function. These are loaded in addition to the default set of cost functions. Custom function implementations must extend `StochasticLoadBalancer$CostFunction`. Enable any additional functions by placing them on the master class path and configuring `hbase.master.balancer.stochastic.additionalCostFunctions` with a comma-separated list of fully-qualified class names.
2386 * [HBASE-22867](https://issues.apache.org/jira/browse/HBASE-22867) | *Critical* | **The ForkJoinPool in CleanerChore will spawn thousands of threads in our cluster with thousands table**
2388 Replace the ForkJoinPool in CleanerChore by ThreadPoolExecutor which can limit the spawn thread size and avoid  the master GC frequently.  The replacement is an internal implementation in CleanerChore,  so no config key change, the upstream users can just upgrade the hbase master without any other change.
2393 * [HBASE-22810](https://issues.apache.org/jira/browse/HBASE-22810) | *Major* | **Initialize an separate ThreadPoolExecutor for taking/restoring snapshot**
2395 Introduced a new config key for the snapshot taking/restoring operations at master side:  hbase.master.executor.snapshot.threads, its default value is 3.  means we can have 3 snapshot operations running at the same time.
2400 * [HBASE-22863](https://issues.apache.org/jira/browse/HBASE-22863) | *Major* | **Avoid Jackson versions and dependencies with known CVEs**
2402 1. Stopped exposing vulnerable Jackson1 dependencies so that downstreamers would not pull it in from HBase.
2403 2. However, since Hadoop requires some Jackson1 dependencies, put vulnerable Jackson mapper at test scope in some HBase modules and hence, HBase tarball created by hbase-assembly contains Jackson1 mapper jar in lib. Still, downsteam applications can't pull in Jackson1 from HBase.
2408 * [HBASE-22841](https://issues.apache.org/jira/browse/HBASE-22841) | *Major* | **TimeRange's factory functions do not support ranges, only \`allTime\` and \`at\`**
2410 Add serveral API in TimeRange class for avoiding using the deprecated TimeRange constructor: 
2411 \* TimeRange#from: Represents the time interval [minStamp, Long.MAX\_VALUE)
2412 \* TimeRange#until: Represents the time interval [0, maxStamp)
2413 \* TimeRange#between: Represents the time interval [minStamp, maxStamp)
2418 * [HBASE-22833](https://issues.apache.org/jira/browse/HBASE-22833) | *Minor* | **MultiRowRangeFilter should provide a method for creating a filter which is functionally equivalent to multiple prefix filters**
2420 Provide a public method in MultiRowRangeFilter class to speed the requirement of filtering with multiple row prefixes, it will expand the row prefixes as multiple rowkey ranges by MultiRowRangeFilter, it's more efficient.
2421 {code}
2422 public MultiRowRangeFilter(byte[][] rowKeyPrefixes);
2423 {code}
2428 * [HBASE-22856](https://issues.apache.org/jira/browse/HBASE-22856) | *Major* | **HBASE-Find-Flaky-Tests fails with pip error**
2430 Update the base docker image to ubuntu 18.04 for the find flaky tests jenkins job.
2435 * [HBASE-22771](https://issues.apache.org/jira/browse/HBASE-22771) | *Major* | **[HBCK2] fixMeta method and server-side support**
2437 Adds a fixMeta method to hbck Service. Fixes holes in hbase:meta. Follow-up to fix overlaps. See HBASE-22567 also.
2439 Follow-on is adding a client-side to hbase-operator-tools that can exploit this new addition (HBASE-22825)
2444 * [HBASE-22777](https://issues.apache.org/jira/browse/HBASE-22777) | *Major* | **Add a multi-region merge (for fixing overlaps, etc.)**
2446 Changes merge so you can merge more than two regions at a time.  Currently only available inside HBase. HBASE-22827, a follow-on, is about exposing the facility in the Admin API (and then via the shell).
2451 * [HBASE-15666](https://issues.apache.org/jira/browse/HBASE-15666) | *Critical* | **shaded dependencies for hbase-testing-util**
2453 New shaded artifact for testing: hbase-shaded-testing-util.
2458 * [HBASE-22776](https://issues.apache.org/jira/browse/HBASE-22776) | *Major* | **Rename config names in user scan snapshot feature**
2460 After HBASE-22776, the steps to config user scan snapshot feature is as followings:
2461 1. Check HDFS configuration
2462 2. Add master coprocessor:
2463     hbase.coprocessor.master.classes=
2464     “org.apache.hadoop.hbase.security.access.AccessController,
2465 org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController”
2466 3. Enable this feature:
2467     hbase.acl.sync.to.hdfs.enable=true
2468 4. Modify table scheme to enable this feature for a table:
2469     alter 't1', CONFIGURATION =\> {'hbase.acl.sync.to.hdfs.enable' =\> 'true'}
2474 * [HBASE-22539](https://issues.apache.org/jira/browse/HBASE-22539) | *Blocker* | **WAL corruption due to early DBBs re-use when Durability.ASYNC\_WAL is used**
2476 We found a critical bug which can lead to WAL corruption when Durability.ASYNC\_WAL is used. The reason is that we release a ByteBuffer before actually persist the content into WAL file.
2478 The problem maybe lead to several errors, for example, ArrayIndexOfOutBounds when replaying WAL. This is because that the ByteBuffer is reused by others.
2480 ERROR org.apache.hadoop.hbase.executor.EventHandler: Caught throwable while processing event RS\_LOG\_REPLAY
2481 java.lang.ArrayIndexOutOfBoundsException: 18056
2482         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1365)
2483         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1358)
2484         at org.apache.hadoop.hbase.PrivateCellUtil.matchingFamily(PrivateCellUtil.java:735)
2485         at org.apache.hadoop.hbase.CellUtil.matchingFamily(CellUtil.java:816)
2486         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEditFamily(WALEdit.java:143)
2487         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEdit(WALEdit.java:148)
2488         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:297)
2489         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:195)
2490         at org.apache.hadoop.hbase.regionserver.SplitLogWorker$1.exec(SplitLogWorker.java:100)
2492 And may even cause segmentation fault and crash the JVM directly. You will see a hs\_err\_pidXXX.log file and usually the problem is SIGSEGV. This is usually because that the ByteBuffer has already been returned to the OS and used for other purpose.
2494 The problem has been reported several times in the past and this time Wellington Ramos Chevreuil provided the full logs and deeply analyzed the logs so we can find the root cause. And Lijin Bin figured out that the problem may only happen when Durability.ASYNC\_WAL is used. Thanks to them.
2496 The problem only effects the 2.x releases, all users are highly recommand to upgrade to a release which has this fix in, especially that if you use Durability.ASYNC\_WAL.
2501 * [HBASE-22737](https://issues.apache.org/jira/browse/HBASE-22737) | *Major* | **Add a new admin method and shell cmd to trigger the hbck chore to run**
2503 Add a new method runHbckChore in Hbck interface and a new shell cmd hbck\_chore\_run to request HBCK chore to run at master side.
2508 * [HBASE-22741](https://issues.apache.org/jira/browse/HBASE-22741) | *Major* | **Show catalogjanitor consistency complaints in new 'HBCK Report' page**
2510 Adds a "CatalogJanitor hbase:meta Consistency Issues" section to the new 'HBCK Report' page added by HBASE-22709. This section is empty unless the most recent CatalogJanitor scan turned up problems. If so, will show table of issues found.
2515 * [HBASE-22723](https://issues.apache.org/jira/browse/HBASE-22723) | *Major* | **Have CatalogJanitor report holes and overlaps; i.e. problems it sees when doing its regular scan of hbase:meta**
2517 When CatalogJanitor runs, it now checks for holes, overlaps, empty info:regioninfo columns and bad servers. Dumps findings into log. Follow-up adds report to new 'HBCK Report' linked off the Master UI.
2519 NOTE: All features but the badserver check made it into branch-2.1 and branch-2.0 backports.
2524 * [HBASE-22714](https://issues.apache.org/jira/browse/HBASE-22714) | *Trivial* | **BuffferedMutatorParams opertationTimeOut() is misspelt**
2526 The misspelled BufferedMutatorParams.opertationTimeout method has been marked as deprecated, and will be removed in 4.0.0. Please use the BufferedMutatorParams.operationTimeout method instead.
2531 * [HBASE-22580](https://issues.apache.org/jira/browse/HBASE-22580) | *Major* | **Add a table attribute to make user scan snapshot feature configurable for table**
2533 If a table user scan snapshots of the table, please config the following table scheme attribute to make granted users' ACLs are added to hfiles:
2534 alter 't1', CONFIGURATION =\> {'hbase.user.scan.snapshot.enable' =\> 'true'}
2539 * [HBASE-22709](https://issues.apache.org/jira/browse/HBASE-22709) | *Major* | **Add a chore thread in master to do hbck checking and display results in 'HBCK Report' page**
2541 1. Add a new chore thread in master to do hbck checking
2542 2. Add a new web ui "HBCK Report" page to display checking results.
2544 This feature is enabled by default. And the hbck chore run per 60 minutes by default. You can config "hbase.master.hbck.checker.interval" to a value lesser than or equal to 0 for disabling the chore.
2546 Notice: the config "hbase.master.hbck.checker.interval" was renamed to "hbase.master.hbck.chore.interval" in HBASE-22737.
2551 * [HBASE-22578](https://issues.apache.org/jira/browse/HBASE-22578) | *Major* | **HFileCleaner should not delete empty ns/table directories used for user san snapshot feature**
2553 The HFileCleaner will clean the empty directories under archive, but if enable user scan snaphot feature, the user ACLs are set at there directories, so please config the following cleaner to make the directories with user ACLs not be cleaned:
2554 hbase.master.hfilecleaner.plugins=org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclCleaner
2559 * [HBASE-22722](https://issues.apache.org/jira/browse/HBASE-22722) | *Blocker* | **Upgrade jackson databind dependencies to 2.9.9.1**
2561 Upgrade jackson databind dependency to 2.9.9.1 due to CVEs
2563 https://nvd.nist.gov/vuln/detail/CVE-2019-12814
2565 https://nvd.nist.gov/vuln/detail/CVE-2019-12384
2570 * [HBASE-22527](https://issues.apache.org/jira/browse/HBASE-22527) | *Major* | **[hbck2] Add a master web ui to show the problematic regions**
2572 Add a new master web UI to show the potentially problematic opened regions. There are three case:
2573 1. Master thought this region opened, but no regionserver reported it.
2574 2. Master thought this region opened on Server1, but regionserver reported Server2
2575 3. More than one regionservers reported opened this region
2580 * [HBASE-22648](https://issues.apache.org/jira/browse/HBASE-22648) | *Minor* | **Snapshot TTL**
2582 Feature: Take a Snapshot With TTL for auto-cleanup
2584 Attribute: 
2585 1. TTL
2586      - Specify TTL in sec while creating snapshot. e.g. snapshot 'mytable', 'snapshot1234', {TTL =\> 86400}  (snapshot to be auto-cleaned after 24 hr)
2588 Configs:
2589 1. Default Snapshot TTL:
2590      - FOREVER by default
2591      - User specified Default TTL(sec) with config: hbase.master.snapshot.ttl
2593 2. If Snapshot cleanup is supposed to be stopped due to some snapshot restore activity, disable it with config:
2594      - hbase.master.cleaner.snapshot.disable: "true"
2595     With this config, HMaster needs restart just like any other hbase-site config.
2598 For more details, see the section "Take a Snapshot With TTL" in the HBase Reference Guide.
2603 * [HBASE-22610](https://issues.apache.org/jira/browse/HBASE-22610) | *Trivial* | **[BucketCache] Rename "hbase.offheapcache.minblocksize"**
2605 The config point "hbase.offheapcache.minblocksize" was wrong and is now deprecated. The new config point is "hbase.blockcache.minblocksize".
2610 * [HBASE-22690](https://issues.apache.org/jira/browse/HBASE-22690) | *Major* | **Deprecate / Remove OfflineMetaRepair in hbase-2+**
2612 OfflineMetaRepair is no longer supported in HBase-2+. Please refer to https://hbase.apache.org/book.html#HBCK2
2614 This tool is deprecated in 2.x and will be removed in 3.0.
2619 * [HBASE-22673](https://issues.apache.org/jira/browse/HBASE-22673) | *Major* | **Avoid to expose protobuf stuff in Hbck interface**
2621 Mark the Hbck#scheduleServerCrashProcedure(List\<HBaseProtos.ServerName\> serverNames) as deprecated. Use Hbck#scheduleServerCrashProcedures(List\<ServerName\> serverNames) instead.
2626 * [HBASE-22617](https://issues.apache.org/jira/browse/HBASE-22617) | *Blocker* | **Recovered WAL directories not getting cleaned up**
2628 In HBASE-20734 we moved the recovered.edits onto the wal file system but when constructing the directory we missed the BASE\_NAMESPACE\_DIR('data'). So when using the default config, you will find that there are lots of new directories at the same level with the 'data' directory.
2630 In this issue, we add the BASE\_NAMESPACE\_DIR back, and also try our best to clean up the wrong directories. But we can only clean up the region level directories, so if you want a clean fs layout on HDFS you still need to manually delete the empty directories at the same level with 'data'.
2632 The effect versions are 2.2.0, 2.1.[1-5], 1.4.[8-10], 1.3.[3-5].
2637 * [HBASE-21995](https://issues.apache.org/jira/browse/HBASE-21995) | *Major* | **Add a coprocessor to set HDFS ACL for hbase granted user**
2639 Add a coprocessor to set HDFS acls to make hbase granted users with READ permission have the access to scan snapshots.
2640 To use this feature, please make sure the HDFS config is set:
2641 dfs.namenode.acls.enabled=true
2642 fs.permissions.umask-mode=027
2644 and set the HBase config:
2645 hbase.coprocessor.master.classes="org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController"
2646 hbase.user.scan.snapshot.enable=true
2651 * [HBASE-22596](https://issues.apache.org/jira/browse/HBASE-22596) | *Minor* | **[Chore] Separate the execution period between CompactionChecker and PeriodicMemStoreFlusher**
2653 hbase.regionserver.compaction.check.period is used for controlling how often the compaction checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
2655 hbase.regionserver.flush.check.period is used for controlling how ofter the flush checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
2660 * [HBASE-22588](https://issues.apache.org/jira/browse/HBASE-22588) | *Major* | **Upgrade jaxws-ri dependency to 2.3.2**
2662 <!-- markdown -->
2664 When run with JDK11 HBase now uses more recent version of the jaxws reference implementation (v2.3.2).
2669 * [HBASE-21536](https://issues.apache.org/jira/browse/HBASE-21536) | *Trivial* | **Fix completebulkload usage instructions**
2671 Added completebulkload short name for BulkLoadHFilesTool to bin/hbase.
2676 * [HBASE-22500](https://issues.apache.org/jira/browse/HBASE-22500) | *Blocker* | **Modify pom and jenkins jobs for hadoop versions**
2678 Change the default hadoop-3 version to 3.1.2. Drop the support for the releases which are effected by CVE-2018-8029, see this email https://lists.apache.org/thread.html/3d6831c3893cd27b6850aea2feff7d536888286d588e703c6ffd2e82@%3Cuser.hadoop.apache.org%3E
2683 * [HBASE-22459](https://issues.apache.org/jira/browse/HBASE-22459) | *Minor* | **Expose store reader reference count**
2685 This change exposes the aggregate count of store reader references for a given store as 'storeRefCount' in region metrics and ClusterStatus.
2690 * [HBASE-22469](https://issues.apache.org/jira/browse/HBASE-22469) | *Minor* | **replace md5 checksum in saveVersion script with sha512 for hbase version information**
2692 The HBase "source checksum" now uses SHA512 instead of MD5.
2697 * [HBASE-22148](https://issues.apache.org/jira/browse/HBASE-22148) | *Blocker* | **Provide an alternative to CellUtil.setTimestamp**
2699 <!-- markdown -->
2701 The `CellUtil.setTimestamp` method changes to be an API with audience `LimitedPrivate(COPROC)` in HBase 3.0. With that designation the API should remain stable within a given minor release line, but may change between minor releases.
2703 Previously, this method was deprecated in HBase 2.0 for removal in HBase 3.0. Deprecation messages in HBase 2.y releases have been updated to indicate the expected API audience change.
2708 * [HBASE-20782](https://issues.apache.org/jira/browse/HBASE-20782) | *Minor* | **Fix duplication of TestServletFilter.access**
2710 The access method was used to the HttpServerFunctionalTest class as a common place.
2715 * [HBASE-21991](https://issues.apache.org/jira/browse/HBASE-21991) | *Major* | **Fix MetaMetrics issues - [Race condition, Faulty remove logic], few improvements**
2717 The class LossyCounting was unintentionally marked Public but was never intended to be part of our public API. This oversight has been corrected and LossyCounting is now marked as Private and going forward may be subject to additional breaking changes or removal without notice. If you have taken a dependency on this class we recommend cloning it locally into your project before upgrading to this release.
2722 * [HBASE-22226](https://issues.apache.org/jira/browse/HBASE-22226) | *Trivial* | **Incorrect level for headings in asciidoc**
2724 Warnings for level headings are corrected in the book for the HBase Incompatibilities section.
2729 * [HBASE-20970](https://issues.apache.org/jira/browse/HBASE-20970) | *Major* | **Update hadoop check versions for hadoop3 in hbase-personality**
2731 Add hadoop 3.0.3, 3.1.1 3.1.2 in our hadoop check jobs.
2736 * [HBASE-21784](https://issues.apache.org/jira/browse/HBASE-21784) | *Major* | **Dump replication queue should show list of wal files ordered chronologically**
2738 The DumpReplicationQueues tool will now list replication queues sorted in chronological order.
2743 * [HBASE-21048](https://issues.apache.org/jira/browse/HBASE-21048) | *Major* | **Get LogLevel is not working from console in secure environment**
2745 Support get\|set LogLevel in secure(kerberized) environment.
2750 * [HBASE-22384](https://issues.apache.org/jira/browse/HBASE-22384) | *Minor* | **Formatting issues in administration section of book**
2752 Fixes a formatting issue in the administration section of the book, where listing indentation were a little bit off.
2757 * [HBASE-22377](https://issues.apache.org/jira/browse/HBASE-22377) | *Major* | **Provide API to check the existence of a namespace which does not require ADMIN permissions**
2759 This change adds the new method listNamespaces to the Admin interface, which can be used to retrieve a list of the namespaces present in the schema as an unprivileged operation. Formerly the only available method for accomplishing this was listNamespaceDescriptors, which requires GLOBAL CREATE or ADMIN permissions.
2764 * [HBASE-22399](https://issues.apache.org/jira/browse/HBASE-22399) | *Major* | **Change default hadoop-two.version to 2.8.x and remove the 2.7.x hadoop checks**
2766 Now the default hadoop-two.version has been changed to 2.8.5, and all hadoop versions before 2.8.2(exclude) will not be supported any more.
2771 * [HBASE-22392](https://issues.apache.org/jira/browse/HBASE-22392) | *Trivial* | **Remove extra/useless +**
2773 Removed extra + in HRegion, HStore and LoadIncrementalHFiles for branch-2 and HRegion and HStore for branch-1.
2778 * [HBASE-20494](https://issues.apache.org/jira/browse/HBASE-20494) | *Major* | **Upgrade com.yammer.metrics dependency**
2780 Updated metrics core from 3.2.1 to 3.2.6.
2785 * [HBASE-22358](https://issues.apache.org/jira/browse/HBASE-22358) | *Minor* | **Change rubocop configuration for method length**
2787 The rubocop definition for the maximum method length was set to 75.
2792 * [HBASE-22379](https://issues.apache.org/jira/browse/HBASE-22379) | *Minor* | **Fix Markdown for "Voting on Release Candidates" in book**
2794 Fixes the formatting of the "Voting on Release Candidates" to actually show the quote and code formatting of the RAT check.
2799 * [HBASE-20851](https://issues.apache.org/jira/browse/HBASE-20851) | *Minor* | **Change rubocop config for max line length of 100**
2801 The rubocop configuration in the hbase-shell module now allows a line length with 100 characters, instead of 80 as before. For everything before 2.1.5 this change introduces rubocop itself.
2806 * [HBASE-22301](https://issues.apache.org/jira/browse/HBASE-22301) | *Minor* | **Consider rolling the WAL if the HDFS write pipeline is slow**
2808 This change adds new conditions for rolling the WAL for when syncs on the HDFS writer pipeline are perceived to be slow. 
2810 As before the configuration parameter hbase.regionserver.wal.slowsync.ms sets the slow sync warning threshold. 
2812 If we encounter hbase.regionserver.wal.slowsync.roll.threshold number of slow syncs (default 100) within the interval defined by hbase.regionserver.wal.slowsync.roll.interval.ms (default 1 minute), we will request a WAL roll. 
2814 Or, if the time for any sync exceeds the threshold set by hbase.regionserver.wal.roll.on.sync.ms (default 10 seconds) we will request a WAL roll immediately.
2816 Operators can monitor how often these new thresholds result in a WAL roll by looking at newly added metrics to the WAL related metric group:
2817 \* slowSyncRollRequest - How many times a roll was requested due to sync too slow on the write pipeline.
2819 Additionally, as a part of this change there are also additional metrics for existing reasons for a WAL roll:
2820 \* errorRollRequest - How many times a roll was requested due to I/O or other errors.
2821 \* sizeRollRequest - How many times a roll was requested due to file size roll threshold.
2826 * [HBASE-21883](https://issues.apache.org/jira/browse/HBASE-21883) | *Minor* | **Enhancements to Major Compaction tool**
2828 MajorCompactorTTL Tool allows to compact all regions in a table that have been TTLed out. This saves space on DFS and is useful for tables which are similar to time series data. This is typically scheduled to run frequently (say via cron) to cleanup old data on an ongoing basis.
2830 RSGroupMajorCompactionTTL tool is similar to MajorCompactorTTL but runs at a region server group level. If multiple tables in an rsgroup are similar to time-series data, then it runs a single command to clean them up. As more tables are added/removed from rsgroup, it's easy to have a single command to take care of all of them.
2835 * [HBASE-22054](https://issues.apache.org/jira/browse/HBASE-22054) | *Minor* | **Space Quota: Compaction is not working for super user in case of NO\_WRITES\_COMPACTIONS**
2837 This change allows the system and superusers to initiate compactions, even when a space quota violation policy disallows compactions from happening. The original intent behind disallowing of compactions was to prevent end-user compactions from creating undue I/O load, not disallowing \*any\* compaction in the system.
2842 * [HBASE-22083](https://issues.apache.org/jira/browse/HBASE-22083) | *Minor* | **move eclipse specific configs into a profile**
2844 <!-- markdown -->
2845 Maven project integration for Eclipse has been isolated into a maven profile to ensure it only is active when in an Eclipse project.
2847 Things should continue to behave the same for Eclipse users. If something should go wrong folks should manually activate the `eclipse-specific` profile.
2852 * [HBASE-22307](https://issues.apache.org/jira/browse/HBASE-22307) | *Major* | **Deprecated Preemptive Fail Fast**
2854 Deprecated Preemptive Fail Fast related constants in HConstants, the support of this feature will be removed in 3.0.0 so use these constants will have no effect for 3.0.0+ releases. And the constants will be kept till 4.0.0.
2856 Users can use 'hbase.client.perserver.requests.threshold' to control the number of concurrent requests to the same region server. Please see the release note of HBASE-16388 for more details.
2861 * [HBASE-22292](https://issues.apache.org/jira/browse/HBASE-22292) | *Blocker* | **PreemptiveFastFailInterceptor clean repeatedFailuresMap issue**
2863 Adds new configuration hbase.client.failure.map.cleanup.interval which defaults to ten minutes.
2868 * [HBASE-19222](https://issues.apache.org/jira/browse/HBASE-19222) | *Major* | **update jruby to 9.1.17.0**
2870 <!-- markdown -->
2872 The default version of JRuby shipped with HBase has been updated to the JRuby 9.1.17.0 release.
2874 For details on changes see [the release notes for JRuby 9.1.17.0](https://www.jruby.org/2018/04/23/jruby-9-1-17-0)
2879 * [HBASE-22279](https://issues.apache.org/jira/browse/HBASE-22279) | *Major* | **Add a getRegionLocator method in Table/AsyncTable interface**
2881 Add below method in Table interface:
2883 RegionLocator getRegionLocator() throws IOException;
2885 Add below methods in AsyncTable interface:
2887 AsyncTableRegionLocator getRegionLocator();
2888 CompletableFuture\<TableDescriptor\> getDescriptor();
2893 * [HBASE-15560](https://issues.apache.org/jira/browse/HBASE-15560) | *Major* | **TinyLFU-based BlockCache**
2895 LruBlockCache uses the Segmented LRU (SLRU) policy to capture frequency and recency of the working set. It achieves concurrency by using an O(n) background thread to prioritize the entries and evict. Accessing an entry is O(1) by a hash table lookup, recording its logical access time, and setting a frequency flag. A write is performed in O(1) time by updating the hash table and triggering an async eviction thread. This provides ideal concurrency and minimizes the latencies by penalizing the thread instead of the caller. However the policy does not age the frequencies and may not be resilient to various workload patterns. 
2897 This change introduces a new L1 policy, TinyLfuBlockCache, which records the frequency in a counting sketch, ages periodically by halving the counters, and orders entries by SLRU. An entry is discarded by comparing the frequency of the new arrival to the SLRU's victim, and keeping the one with the highest frequency. This allows the operations to be performed in O(1) time and, though the use of a compact sketch, a much larger history is retained beyond the current working set. In a variety of real world traces the policy had near optimal hit rates.
2899 New configuration variable hfile.block.cache.policy sets the eviction policy for the L1 block cache. The default is "LRU" (LruBlockCache). Set to "TinyLFU" to use TinyLfuBlockCache instead.
2904 * [HBASE-22178](https://issues.apache.org/jira/browse/HBASE-22178) | *Major* | **Introduce a createTableAsync with TableDescriptor method in Admin**
2906 Introduced
2908 Future\<Void\> createTableAsync(TableDescriptor);
2913 * [HBASE-22108](https://issues.apache.org/jira/browse/HBASE-22108) | *Major* | **Avoid passing null in Admin methods**
2915 Introduced these methods:
2916 void move(byte[]);
2917 void move(byte[], ServerName);
2918 Future\<Void\> splitRegionAsync(byte[]);
2920 These methods are deprecated:
2921 void move(byte[], byte[])
2926 * [HBASE-22152](https://issues.apache.org/jira/browse/HBASE-22152) | *Major* | **Create a jenkins file for yetus to processing GitHub PR**
2928 Add a new jenkins file for running pre commit check for GitHub PR.
2933 * [HBASE-22007](https://issues.apache.org/jira/browse/HBASE-22007) | *Major* | **Add restoreSnapshot and cloneSnapshot with acl methods in AsyncAdmin**
2935 Add cloneSnapshot/restoreSnapshot with acl methods in AsyncAdmin.
2940 * [HBASE-22123](https://issues.apache.org/jira/browse/HBASE-22123) | *Minor* | **REST gateway reports Insufficient permissions exceptions as 404 Not Found**
2942 When insufficient permissions, you now get:
2944 HTTP/1.1 403 Forbidden
2946 on the HTTP side, and in the message
2948 Forbidden
2949 org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘myuser',action: get, tableName:mytable, family:cf.
2950 at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.authorizeAccess(RangerAuthorizationCoprocessor.java:547)
2951 and the rest of the ADE stack
2956 * [HBASE-22100](https://issues.apache.org/jira/browse/HBASE-22100) | *Minor* | **False positive for error prone warnings in pre commit job**
2958 Now we will sort the javac WARNING/ERROR before generating diff in pre-commit so we can get a stable output for the error prone. The downside is that we just sort the output lexicographically so the line number will also be sorted lexicographically, which is a bit strange to human.
2963 * [HBASE-22057](https://issues.apache.org/jira/browse/HBASE-22057) | *Major* | **Impose upper-bound on size of ZK ops sent in a single multi()**
2965 Exposes a new configuration property "zookeeper.multi.max.size" which dictates the maximum size of deletes that HBase will make to ZooKeeper in a single RPC. This property defaults to 1MB, which should fall beneath the default ZooKeeper limit of 2MB, controlled by "jute.maxbuffer".
2970 * [HBASE-22052](https://issues.apache.org/jira/browse/HBASE-22052) | *Major* | **pom cleaning; filter out jersey-core in hadoop2 to match hadoop3 and remove redunant version specifications**
2972 <!-- markdown -->
2973 Fixed awkward dependency issue that prevented site building.
2975 #### note specific to HBase 2.1.4
2976 HBase 2.1.4 shipped with an early version of this fix that incorrectly altered the libraries included in our binary assembly for using Apache Hadoop 2.7 (the current build default Hadoop version for 2.1.z). For folks running out of the box against a Hadoop 2.7 cluster (or folks who skip the installation step of [replacing the bundled Hadoop libraries](http://hbase.apache.org/book.html#hadoop)) this will result in a failure at Region Server startup due to a missing class definition. e.g.:
2978 2019-03-27 09:02:05,779 ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
2979 java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
2980         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
2981         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
2982         at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
2983         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
2984         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
2985         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
2986         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
2987         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
2988         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:171)
2989         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:356)
2990         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
2991         at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
2992         at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
2993         at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
2994         at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:704)
2995         at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:613)
2996         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
2997         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
2998         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
2999         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
3000         at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:3029)
3001         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:63)
3002         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
3003         at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
3004         at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
3005         at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:3047)
3006 Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
3007         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
3008         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
3009         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
3010         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
3011         ... 26 more
3015 Workaround via any _one_ of the following:
3016 * If you are running against a Hadoop cluster that is 2.8+, ensure you replace the Hadoop libaries in the default binary assembly with those for your version.
3017 * If you are running against a Hadoop cluster that is 2.8+, build the binary assembly from the source release while specifying your Hadoop version.
3018 * If you are running against a Hadoop cluster that is a supported 2.7 release, ensure the `hadoop` executable is in the `PATH` seen at Region Server startup and that you are not using the `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP` bypass.
3019 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers via the HBASE_CLASSPATH environment variable.
3020 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers by copying it into the directory `${HBASE_HOME}/lib/client-facing-thirdparty/`.
3025 * [HBASE-22065](https://issues.apache.org/jira/browse/HBASE-22065) | *Major* | **Add listTableDescriptors(List\<TableName\>) method in AsyncAdmin**
3027 Add a listTableDescriptors(List\<TableName\>) method in the AsyncAdmin interface, to align with the Admin interface.
3032 * [HBASE-22063](https://issues.apache.org/jira/browse/HBASE-22063) | *Major* | **Deprecated Admin.deleteSnapshot(byte[])**
3034 Deprecate Admin.deleteSnapshot(byte[]), please use the String version instead.
3039 * [HBASE-22040](https://issues.apache.org/jira/browse/HBASE-22040) | *Major* | **Add mergeRegionsAsync with a List of region names method in AsyncAdmin**
3041 Add a mergeRegionsAsync(byte[][], boolean) method in the AsyncAdmin interface.
3043 Instead of using assert, now we will throw IllegalArgumentException when you want to merge less than 2 regions at client side. And also, at master side, instead of using assert, now we will throw DoNotRetryIOException if you want merge more than 2 regions, since we only support merging two regions at once for now.
3048 * [HBASE-22039](https://issues.apache.org/jira/browse/HBASE-22039) | *Major* | **Should add the synchronous parameter for the XXXSwitch method in AsyncAdmin**
3050 Add drainXXX parameter for balancerSwitch/splitSwitch/mergeSwitch methods in the AsyncAdmin interface, which has the same meaning with the synchronous parameter for these methods in the Admin interface.
3055 * [HBASE-22044](https://issues.apache.org/jira/browse/HBASE-22044) | *Major* | **ByteBufferUtils should not be IA.Public API**
3057 <!-- markdown -->
3059 As of HBase 3.0, the ByteBufferUtils class is now marked as a Private API for internal project use only. Downstream users are advised that it no longer has any compatibility promises across releases.
3061 As of earlier HBase release lines the class is now marked as deprecated to call attention to this planned transition.
3066 * [HBASE-21810](https://issues.apache.org/jira/browse/HBASE-21810) | *Major* | **bulkload  support set hfile compression on client**
3068 bulkload (HFileOutputFormat2)  support config the compression on client ,you can set the job configuration "hbase.mapreduce.hfileoutputformat.compression"  override the auto-detection of the target table's compression
3073 * [HBASE-22001](https://issues.apache.org/jira/browse/HBASE-22001) | *Major* | **Polish the Admin interface**
3075 Add a cloneSnapshotAsync method with restoreAcl parameter.
3076 Deprecated restoreSnapshotAsync method as it just ignores the failsafe configuration.
3077 Make snapshotAsync method returns a Future\<Void\>.
3078 Deprecated the snapshot related methods which take a 'byte[]' as the snapshot name.
3079 Use default methods to reduce the code base for implementation classes.
3084 * [HBASE-22000](https://issues.apache.org/jira/browse/HBASE-22000) | *Major* | **Deprecated isTableAvailable with splitKeys**
3086 Deprecated AsyncTable.isTableAvailable(TableName, byte[][]).
3091 * [HBASE-21871](https://issues.apache.org/jira/browse/HBASE-21871) | *Major* | **Support to specify a peer table name in VerifyReplication tool**
3093 After HBASE-21871, we can specify a peer table name with --peerTableName in VerifyReplication tool like the following:
3094 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable 5 TestTable
3096 In addition, we can compare any 2 tables in any remote clusters with specifying both peerId and --peerTableName.
3098 For example:
3099 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable zk1,zk2,zk3:2181/hbase TestTable
3104 * [HBASE-15728](https://issues.apache.org/jira/browse/HBASE-15728) | *Major* | **Add remaining per-table region / store / flush / compaction related metrics**
3106 Adds below flush, split, and compaction metrics
3108  +  // split related metrics
3109  +  private MutableFastCounter splitRequest;
3110  +  private MutableFastCounter splitSuccess;
3111  +  private MetricHistogram splitTimeHisto;
3113  +  // flush related metrics
3114  +  private MetricHistogram flushTimeHisto;
3115  +  private MetricHistogram flushMemstoreSizeHisto;
3116  +  private MetricHistogram flushOutputSizeHisto;
3117  +  private MutableFastCounter flushedMemstoreBytes;
3118  +  private MutableFastCounter flushedOutputBytes;
3120  +  // compaction related metrics
3121  +  private MetricHistogram compactionTimeHisto;
3122  +  private MetricHistogram compactionInputFileCountHisto;
3123  +  private MetricHistogram compactionInputSizeHisto;
3124  +  private MetricHistogram compactionOutputFileCountHisto;
3125  +  private MetricHistogram compactionOutputSizeHisto;
3126  +  private MutableFastCounter compactedInputBytes;
3127  +  private MutableFastCounter compactedOutputBytes;
3129  +  private MetricHistogram majorCompactionTimeHisto;
3130  +  private MetricHistogram majorCompactionInputFileCountHisto;
3131  +  private MetricHistogram majorCompactionInputSizeHisto;
3132  +  private MetricHistogram majorCompactionOutputFileCountHisto;
3133  +  private MetricHistogram majorCompactionOutputSizeHisto;
3134  +  private MutableFastCounter majorCompactedInputBytes;
3135  +  private MutableFastCounter majorCompactedOutputBytes;
3140 * [HBASE-21481](https://issues.apache.org/jira/browse/HBASE-21481) | *Major* | **[acl] Superuser's permissions should not be granted or revoked by any non-su global admin**
3142 HBASE-21481 improves the quality of access control, by strengthening the protection of super users's privileges.
3147 * [HBASE-21082](https://issues.apache.org/jira/browse/HBASE-21082) | *Critical* | **Reimplement assign/unassign related procedure metrics**
3149 Now we have four types of RIT procedure metrics, assign, unassign, move, reopen. The meaning of assign/unassign is changed, as we will not increase the unassign metric and then the assign metric when moving a region.
3150 Also introduced two new procedure metrics, open and close, which are used to track the open/close region calls to region server. We may send open/close multiple times to finish a RIT since we may retry multiple times.
3155 * [HBASE-20724](https://issues.apache.org/jira/browse/HBASE-20724) | *Critical* | **Sometimes some compacted storefiles are still opened after region failover**
3157 Problem: This is an old problem since HBASE-2231. The compaction event marker was only writed to WAL. But after flush, the WAL may be archived, which means an useful compaction event marker be deleted, too. So the compacted store files cannot be archived when region open and replay WAL.
3159 Solution: After this jira, the compaction event tracker will be writed to HFile. When region open and load store files, read the compaction evnet tracker from HFile and archive the compacted store files which still exist.
3164 * [HBASE-21820](https://issues.apache.org/jira/browse/HBASE-21820) | *Major* | **Implement CLUSTER quota scope**
3166 HBase contains two quota scopes: MACHINE and CLUSTER. Before this patch, set quota operations did not expose scope option to client api and use MACHINE as default, CLUSTER scope can not be set and used. 
3167 Shell commands are as follows:
3168 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
3170 This issue implements CLUSTER scope in a simple way: For user, namespace, user over namespace quota, use [ClusterLimit / RSNum] as machine limit. For table and user over table quota, use [ClusterLimit / TotalTableRegionNum \* MachineTableRegionNum] as machine limit.
3171 After this patch, user can set CLUSTER scope quota, but MACHINE is still default if user ignore scope. 
3172 Shell commands are as follows:
3173 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
3174 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> MACHINE
3175 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> CLUSTER
3180 * [HBASE-21057](https://issues.apache.org/jira/browse/HBASE-21057) | *Minor* | **upgrade to latest spotbugs**
3182 Change spotbugs version to 3.1.11.
3187 * [HBASE-21505](https://issues.apache.org/jira/browse/HBASE-21505) | *Major* | **Several inconsistencies on information reported for Replication Sources by hbase shell status 'replication' command.**
3189 This modifies "status 'replication'" output, fixing inconsistencies on the reporting times and ages of last shipped edits, as well as wrong calculation of replication lags. 
3191 It also introduces additional info for each recovery queue, which was not accounted by this command before.
3193 The new output for "status 'replication'" command is explained in details below:
3194 a) Source started, target stopped, no edits arrived on source yet:
3196  SOURCE: PeerID=1
3197          Normal Queue: 1
3198            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
3200 b) Source started, target stopped, add edit on source:
3202 Normal Queue: 1
3203            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:21:00 GMT 2018, Replication Lag=2459
3205 c) Source started, target stopped, edit added on source, restart source:
3207 SOURCE: PeerID=1
3208          Normal Queue: 1
3209            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
3210          Recovered Queue: 1-hbase01.home,16020,1542784524057
3211            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:23:00 GMT 2018, Replication Lag=201495
3213 d) Source started, target stopped, add edit on source, restart source, add another edit on source:
3215 SOURCE: PeerID=1
3216          Normal Queue: 1
3217            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=6349
3218          Recovered Queue: 1-hbase01.home,16020,1542782758742
3219            No Ops shipped since last restart, SizeOfLogQueue=0, TimeStampOfLastArrivedInSource=Wed Nov 21 06:53:05 GMT 2018, Replication Lag=569394
3221 e) Source started, target stopped, add edit on source, restart source, add another edit on source, start target:
3223        SOURCE: PeerID=1
3224          Normal Queue: 1
3225            AgeOfLastShippedOp=30000, TimeStampOfLastShippedOp=Wed Nov 21 07:07:58 GMT 2018, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=0
3227 f) Source started, target stopped, add edit on source, restart source, restart target:
3229 SOURCE: PeerID=1
3230          Normal Queue: 1
3231            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
3237 * [HBASE-21922](https://issues.apache.org/jira/browse/HBASE-21922) | *Major* | **BloomContext#sanityCheck may failed when use ROWPREFIX\_DELIMITED bloom filter**
3239 Remove bloom filter type ROWPREFIX\_DELIMITED. May add it back when find a better solution.
3244 * [HBASE-21783](https://issues.apache.org/jira/browse/HBASE-21783) | *Major* | **Support exceed user/table/ns throttle quota if region server has available quota**
3246 Support enable or disable exceed throttle quota. Exceed throttle quota means, user can over consume user/namespace/table quota if region server has additional available quota because other users don't consume at the same time. 
3247 Use the following shell commands to enable/disable exceed throttle quota: enable\_exceed\_throttle\_quota
3248 disable\_exceed\_throttle\_quota
3249 There are two limits when enable exceed throttle quota: 
3250 1. Must set at least one read and one write region server throttle quota; 
3251 2. All region server throttle quotas must be in seconds time unit. Because once previous requests exceed their quota and consume region server quota, quota in other time units may be refilled in a long time, this may affect later requests.
3256 * [HBASE-20587](https://issues.apache.org/jira/browse/HBASE-20587) | *Major* | **Replace Jackson with shaded thirdparty gson**
3258 Remove jackson dependencies from most hbase modules except hbase-rest, use shaded gson instead. The output json will be a bit different since jackson can use getter/setter, but gson will always use the fields.
3263 * [HBASE-21928](https://issues.apache.org/jira/browse/HBASE-21928) | *Major* | **Deprecated HConstants.META\_QOS**
3265 Mark HConstants.META\_QOS as deprecated. It is for internal use only, which is the highest priority. You should not try to set a priority greater than or equal to this value, although it is no harm but also useless.
3270 * [HBASE-17942](https://issues.apache.org/jira/browse/HBASE-17942) | *Major* | **Disable region splits and merges per table**
3272 This patch adds the ability to disable split and/or merge for a table (By default, split and merge are enabled for a table).
3277 * [HBASE-21636](https://issues.apache.org/jira/browse/HBASE-21636) | *Major* | **Enhance the shell scan command to support missing scanner specifications like ReadType, IsolationLevel etc.**
3279 Allows shell to set Scan options previously not exposed. See additions as part of the scan help by typing following hbase shell:
3281 hbase\> help 'scan'
3286 * [HBASE-21201](https://issues.apache.org/jira/browse/HBASE-21201) | *Major* | **Support to run VerifyReplication MR tool without peerid**
3288 We can specify peerQuorumAddress instead of peerId in VerifyReplication tool. So it no longer requires peerId to be setup when using this tool.
3290 For example:
3291 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication zk1,zk2,zk3:2181/hbase testTable
3296 * [HBASE-21838](https://issues.apache.org/jira/browse/HBASE-21838) | *Major* | **Create a special ReplicationEndpoint just for verifying the WAL entries are fine**
3298 Introduce a VerifyWALEntriesReplicationEndpoint which replicates nothing but only verifies if all the cells are valid.
3299 It can be used to capture bugs for writing WAL, as most times we will not read the WALs again after writing it if there are no region server crashes.
3304 * [HBASE-21764](https://issues.apache.org/jira/browse/HBASE-21764) | *Major* | **Size of in-memory compaction thread pool should be configurable**
3306 Introduced an new config key in this issue: hbase.regionserver.inmemory.compaction.pool.size. the default value would be 10.  you can configure this to set the pool size of in-memory compaction pool. Note that all memstores in one region server will share the same pool, so if you have many regions in one region server,  you need to set this larger to compact faster for better read performance.
3311 * [HBASE-21684](https://issues.apache.org/jira/browse/HBASE-21684) | *Major* | **Throw DNRIOE when connection or rpc client is closed**
3313 Make StoppedRpcClientException extend DoNotRetryIOException.
3318 * [HBASE-21739](https://issues.apache.org/jira/browse/HBASE-21739) | *Major* | **Move grant/revoke from regionserver to master**
3320 To implement user permission control in Precedure V2, move grant and revoke method from AccessController to master firstly.
3321 Mark AccessController#grant and AccessController#revoke as deprecated and please use Admin#grant and Admin#revoke instead.
3326 * [HBASE-21791](https://issues.apache.org/jira/browse/HBASE-21791) | *Blocker* | **Upgrade thrift dependency to 0.12.0**
3328 IMPORTANT: Due to security issues, all users who use hbase thrift should avoid using releases which do not have this fix.
3330 The effect releases are:
3331 2.1.x: 2.1.2 and below
3332 2.0.x: 2.0.4 and below
3333 1.x: 1.4.x and below
3335 If you are using the effect releases above, please consider upgrading to a newer release ASAP.
3340 * [HBASE-20894](https://issues.apache.org/jira/browse/HBASE-20894) | *Major* | **Move BucketCache from java serialization to protobuf**
3342 For users who have configured hbase.bucketcache.ioengine with either the file:, files:, or mmap: prefix, and configured it to be persistent via the hbase.bucketcache.persistent.path property, the serialization format of the bucket cache has changed between versions. The old state will not be read during startup, and there is currently no migration path. The impact is expected to be minimal, however, since the cache will rebuild over time as access patterns dictate.
3346 # HBASE  2.3.0 Release Notes
3348 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
3353 * [HBASE-24603](https://issues.apache.org/jira/browse/HBASE-24603) | *Critical* | **Zookeeper sync() call is async**
3355 <!-- markdown -->
3357 Fixes a couple of bugs in ZooKeeper interaction. Firstly, zk sync() call that is used to sync the lagging followers with leader so that the client sees a consistent snapshot state was actually asynchronous under the hood. We make it synchronous for correctness. Second, zookeeper events are now processed in a separate thread rather than doing it in the thread context of zookeeper client connection. This decoupling frees up client connection quickly and avoids deadlocks.
3362 * [HBASE-24631](https://issues.apache.org/jira/browse/HBASE-24631) | *Major* | **Loosen Dockerfile pinned package versions of the "debian-revision"**
3364 <!-- markdown -->
3365 Update our package version numbers throughout the Dockerfiles to be pinned to their epic:upstream-version components only. Previously we'd specify the full debian package version number, including the debian-revision. This lead to instability as debian packaging details changed.
3366 See also [man deb-version](http://manpages.ubuntu.com/manpages/xenial/en/man5/deb-version.5.html)
3371 * [HBASE-24205](https://issues.apache.org/jira/browse/HBASE-24205) | *Major* | **Create metric to know the number of reads that happens from memstore**
3373 Adds a new metric where we collect the number of read requests (tracked per row) whether the row was fetched completely from memstore or it was pulled from files  and memstore. 
3374 The metric is now collected under the mbean for Tables and under the mbean for regions.
3375 Under table mbean ie.- 
3376 'name": "Hadoop:service=HBase,name=RegionServer,sub=Tables'
3377 The new metrics will be listed as 
3378 {code}
3379     "Namespace\_default\_table\_t3\_columnfamily\_f1\_metric\_memstoreOnlyRowReadsCount": 5,
3380  "Namespace\_default\_table\_t3\_columnfamily\_f1\_metric\_mixedRowReadsCount": 1,
3381 {code}
3382 Where the format is Namespace\_\<namespacename\>\_table\_\<tableName\>\_columnfamily\_\<columnfamilyname\>\_metric\_memstoreOnlyRowReadsCount
3383 Namespace\_\<namespacename\>\_table\_\<tableName\>\_columnfamily\_\<columnfamilyname\>\_metric\_mixedRowReadsCount
3384 {code}
3386 The same one under the region ie. 
3387 "name": "Hadoop:service=HBase,name=RegionServer,sub=Regions",
3388 comes as
3389 {code}
3390    "Namespace\_default\_table\_t3\_region\_75a7846f4ac4a2805071a855f7d0dbdc\_store\_f1\_metric\_memstoreOnlyRowReadsCount": 5,
3391     "Namespace\_default\_table\_t3\_region\_75a7846f4ac4a2805071a855f7d0dbdc\_store\_f1\_metric\_mixedRowReadsCount": 1,
3392 {code}
3393 where
3394 Namespace\_\<namespacename\_table\_\<tableName\>\_region\_\<regionName\>\_store\_\<storeName\>\_metric\_memstoreOnlyRowReadsCount
3395 Namespace\_\<namespacename\_table\_\<tableName\>\_region\_\<regionName\>\_store\_\<storeName\>\_metric\_mixedRowReadsCount
3396 This is also an aggregate against every store the number of reads that happened purely from the memstore or it was a  mixed read that happened from memstore and file.
3401 * [HBASE-21773](https://issues.apache.org/jira/browse/HBASE-21773) | *Critical* | **rowcounter utility should respond to pleas for help**
3403 This adds [-h\|-help] options to rowcounter. Passing either -h or -help will print rowcounter guide as below: 
3405 $hbase rowcounter -h
3407 usage: hbase rowcounter \<tablename\> [options] [\<column1\> \<column2\>...]
3408 Options:
3409     --starttime=\<arg\>       starting time filter to start counting rows from.
3410     --endtime=\<arg\>         end time filter limit, to only count rows up to this timestamp.
3411     --range=\<arg\>           [startKey],[endKey][;[startKey],[endKey]...]]
3412     --expectedCount=\<arg\>   expected number of rows to be count.
3413 For performance, consider the following configuration properties:
3414 -Dhbase.client.scanner.caching=100
3415 -Dmapreduce.map.speculative=false
3420 * [HBASE-24217](https://issues.apache.org/jira/browse/HBASE-24217) | *Major* | **Add hadoop 3.2.x support**
3422 CI coverage has been extended to include Hadoop 3.2.x for HBase 2.2+.
3427 * [HBASE-23055](https://issues.apache.org/jira/browse/HBASE-23055) | *Major* | **Alter hbase:meta**
3429 Adds being able to edit hbase:meta table schema. For example,
3431 hbase(main):006:0\> alter 'hbase:meta', {NAME =\> 'info', DATA\_BLOCK\_ENCODING =\> 'ROW\_INDEX\_V1'}
3432 Updating all regions with the new schema...
3433 All regions updated.
3434 Done.
3435 Took 1.2138 seconds
3437 You can even add columnfamilies. Howevert, you cannot delete any of the core hbase:meta column families such as 'info' and 'table'.
3442 * [HBASE-15161](https://issues.apache.org/jira/browse/HBASE-15161) | *Major* | **Umbrella: Miscellaneous improvements from production usage**
3444 This ticket summarizes significant improvements and expansion to the metrics surface area. Interested users should review the individual sub-tasks.
3449 * [HBASE-24545](https://issues.apache.org/jira/browse/HBASE-24545) | *Major* | **Add backoff to SCP check on WAL split completion**
3451 Adds backoff in ServerCrashProcedure wait on WAL split to complete if large backlog of files to split (Its possible to avoid SCP blocking, waiting on WALs to split if you use procedure-based splitting --  set 'hbase.split.wal.zk.coordinated' to false to enable procedure based wal splitting.)
3456 * [HBASE-24524](https://issues.apache.org/jira/browse/HBASE-24524) | *Minor* | **SyncTable logging improvements**
3458 Notice this has changed log level for mismatching row keys, originally those were being logged at INFO level, now it's logged at DEBUG level. This is consistent with the logging of mismatching cells. Also, for missing row keys, it now logs row key values in human readable format, making it more meaningful for operators troubleshooting mismatches.
3463 * [HBASE-24359](https://issues.apache.org/jira/browse/HBASE-24359) | *Major* | **Optionally ignore edits for deleted CFs for replication.**
3465 Introduce a new config hbase.replication.drop.on.deleted.columnfamily, default is false. When config to true, the replication will drop the edits for columnfamily that has been deleted from the replication source and target.
3470 * [HBASE-24418](https://issues.apache.org/jira/browse/HBASE-24418) | *Major* | **Consolidate Normalizer implementations**
3472 <!-- markdown -->
3473 This change extends the Normalizer with a handful of new configurations. The configuration points supported are:
3474 * `hbase.normalizer.split.enabled` Whether to split a region as part of normalization. Default: `true`.
3475 * `hbase.normalizer.merge.enabled` Whether to merge a region as part of normalization. Default `true`.
3476 * `hbase.normalizer.min.region.count` The minimum number of regions in a table to consider it for merge normalization. Default: 3.
3477 * `hbase.normalizer.merge.min_region_age.days` The minimum age for a region to be considered for a merge, in days. Default: 3.
3478 * `hbase.normalizer.merge.min_region_size.mb` The minimum size for a region to be considered for a merge, in whole MBs. Default: 1.
3483 * [HBASE-24309](https://issues.apache.org/jira/browse/HBASE-24309) | *Major* | **Avoid introducing log4j and slf4j-log4j dependencies for modules other than hbase-assembly**
3485 Add a hbase-logging module, put the log4j related code in this module only so other modules do not need to depend on log4j at compile scope. See the comments of Log4jUtils and InternalLog4jUtils for more details.
3487 Add a log4j.properties to the test jar of hbase-logging module, so for other sub modules we just need to depend on the test jar of hbase-logging module at test scope to output the log to console, without placing a log4j.properties in the test resources as they all (almost) have the same content. And this test module will not be included in the assembly tarball so it will not mess up the binary distribution.
3489 Ban direct commons-logging dependency, and ban commons-logging and log4j imports in non-test code, to avoid mess up the downstream users logging framework. In hbase-logging module we do need to use log4j classes and the trick is to use full class name.
3491 Add jcl-over-slf4j and jul-to-slf4j dependencies, as some of our dependencies use jcl or jul as logging framework, we should also redirect their log message to slf4j.
3496 * [HBASE-21406](https://issues.apache.org/jira/browse/HBASE-21406) | *Minor* | **"status 'replication'" should not show SINK if the cluster does not act as sink**
3498 Added new metric to differentiate sink startup time from last OP applied time.
3500 Original behaviour was to always set startup time to TimestampsOfLastAppliedOp, and always show it on "status 'replication'" command, regardless if the sink ever applied any OP. 
3502 This was confusing, specially for scenarios where cluster was just acting as source, the output could lead to wrong interpretations about sink not applying edits or replication being stuck. 
3504 With the new metric, we now compare the two metrics values, assuming that if both are the same, there's never been any OP shipped to the given sink, so output would reflect it more clearly, to something as for example:
3506 SINK: TimeStampStarted=Thu Dec 06 23:59:47 GMT 2018, Waiting for OPs...
3511 * [HBASE-24132](https://issues.apache.org/jira/browse/HBASE-24132) | *Major* | **Upgrade to Apache ZooKeeper 3.5.7**
3513 <!-- markdown -->
3514 HBase ships ZooKeeper 3.5.x. Was the EOL'd 3.4.x. 3.5.x client can talk to 3.4.x ensemble.
3516 The ZooKeeper project has built a [FAQ](https://cwiki.apache.org/confluence/display/ZOOKEEPER/Upgrade+FAQ) that documents known issues and work-arounds when upgrading existing deployments.
3521 * [HBASE-22287](https://issues.apache.org/jira/browse/HBASE-22287) | *Major* | **inifinite retries on failed server in RSProcedureDispatcher**
3523 Add backoff. Avoid retrying every 100ms.
3528 * [HBASE-24425](https://issues.apache.org/jira/browse/HBASE-24425) | *Major* | **Run hbck\_chore\_run and catalogjanitor\_run on draw of 'HBCK Report' page**
3530 Runs 'catalogjanitor\_run' and 'hbck\_chore\_run' inline with the loading of the 'HBCK Report' page.
3532 Pass '?cache=true' to skip inline invocation of 'catalogjanitor\_run' and 'hbck\_chore\_run' drawing the page.
3537 * [HBASE-24408](https://issues.apache.org/jira/browse/HBASE-24408) | *Blocker* | **Introduce a general 'local region' to store data on master**
3539 Introduced a general 'local region' at master side to store the procedure data, etc.
3541 The hfile of this region will be stored on the root fs while the wal will be stored on the wal fs. This issue supercedes part of the code for HBASE-23326, as now we store the data in 'MasterData' directory instead of 'MasterProcs'.
3543 The old hfiles will be moved to the global hfile archived directory with the suffix $-masterlocalhfile-$. The wal files will be moved to the global old wal directory with the suffix $masterlocalwal$. The TimeToLiveMasterLocalStoreHFileCleaner and TimeToLiveMasterLocalStoreWALCleaner are configured by default for cleaning the old hfiles and wal files, and the default TTLs are both 7 days.
3548 * [HBASE-24115](https://issues.apache.org/jira/browse/HBASE-24115) | *Major* | **Relocate test-only REST "client" from src/ to test/ and mark Private**
3550 Relocate test-only REST RemoteHTable and RemoteAdmin from src/ to test/. And mark them as InterfaceAudience.Private.
3555 * [HBASE-23938](https://issues.apache.org/jira/browse/HBASE-23938) | *Major* | **Replicate slow/large RPC calls to HDFS**
3557 Config key: hbase.regionserver.slowlog.systable.enabled
3558 Default value: false
3560 This config can be enabled if hbase.regionserver.slowlog.buffer.enabled is already enabled. While hbase.regionserver.slowlog.buffer.enabled ensures that any slow/large RPC logs with complete details are written to ring buffer available at each RegionServer, hbase.regionserver.slowlog.systable.enabled would ensure that all such logs are also persisted in new system table hbase:slowlog. 
3561 Operator can scan hbase:slowlog with filters to retrieve specific attribute matching records and this table would be useful to capture historical performance of slowness of RPC calls with detailed analysis.
3563 hbase:slowlog consists of single ColumnFamily info. info consists of multiple qualifiers similar to the attributes available to query as part of Admin API: get\_slowlog\_responses.
3565 One example of a row from hbase:slowlog scan result (Attached a sample screenshot in the Jira) :
3567  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:call\_details, timestamp=2020-05-16T14:59:58.764Z, value=Scan(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ScanRequest)                             
3568  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:client\_address, timestamp=2020-05-16T14:59:58.764Z, value=172.20.10.2:57348                                                                                          
3569  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:method\_name, timestamp=2020-05-16T14:59:58.764Z, value=Scan                                                                                                          
3570  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:param, timestamp=2020-05-16T14:59:58.764Z, value=region { type: REGION\_NAME value: "cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf." } scan { a
3571                                                              ttribute { name: "\_isolationlevel\_" value: "\\x5C000" } start\_row: "cccccccc" time\_range { from: 0 to: 9223372036854775807 } max\_versions: 1 cache\_blocks: true max\_result\_size: 2
3572                                                              097152 caching: 2147483647 include\_stop\_row: false } number\_of\_rows: 2147483647 close\_scanner: false client\_handles\_partials: true client\_handles\_heartbeats: true track\_scan\_met
3573                                                              rics: false                                                                                                                                                                      
3574  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:processing\_time, timestamp=2020-05-16T14:59:58.764Z, value=24                                                                                                        
3575  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:queue\_time, timestamp=2020-05-16T14:59:58.764Z, value=0                                                                                                              
3576  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:region\_name, timestamp=2020-05-16T14:59:58.764Z, value=cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf.                                         
3577  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:response\_size, timestamp=2020-05-16T14:59:58.764Z, value=211227                                                                                                      
3578  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:server\_class, timestamp=2020-05-16T14:59:58.764Z, value=HRegionServer                                                                                                
3579  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:start\_time, timestamp=2020-05-16T14:59:58.764Z, value=1589640743932                                                                                                  
3580  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:type, timestamp=2020-05-16T14:59:58.764Z, value=ALL                                                                                                                  
3581  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:username, timestamp=2020-05-16T14:59:58.764Z, value=vjasani
3586 * [HBASE-24271](https://issues.apache.org/jira/browse/HBASE-24271) | *Major* | **Set values in \`conf/hbase-site.xml\` that enable running on \`LocalFileSystem\` out of the box**
3588 <!-- markdown -->
3589 HBASE-24271 makes changes the the default `conf/hbase-site.xml` such that `bin/hbase` will run directly out of the binary tarball or a compiled source tree without any configuration modifications vs. Hadoop 2.8+. This changes our long-standing history of shipping no configured values in `conf/hbase-site.xml`, so existing processes that assume this file is empty of configuration properties may require attention.
3594 * [HBASE-24310](https://issues.apache.org/jira/browse/HBASE-24310) | *Major* | **Use Slf4jRequestLog for hbase-http**
3596 Use Slf4jRequestLog instead of the log4j HttpRequestLogAppender in HttpServer.
3598 The request log is disabled by default in conf/log4j.properties by the following lines:
3600 # Disable request log by default, you can enable this by changing the appender
3601 log4j.category.http.requests=INFO,NullAppender
3602 log4j.additivity.http.requests=false
3604 Change the 'NullAppender' to what ever you want if you want to enable request log.
3606 Notice that, the logger name for master status http server is 'http.requests.master', and for region server it is 'http.requests.regionserver'
3611 * [HBASE-24335](https://issues.apache.org/jira/browse/HBASE-24335) | *Major* | **Support deleteall with ts but without column in shell mode**
3613 Use a empty string to represent no column specified for deleteall in shell mode.
3614 useage:  
3615 deleteall 'test','r1','',12345
3616 deleteall 'test', {ROWPREFIXFILTER =\> 'prefix'}, '', 12345
3621 * [HBASE-24304](https://issues.apache.org/jira/browse/HBASE-24304) | *Major* | **Separate a hbase-asyncfs module**
3623 Added a new hbase-asyncfs module to hold the asynchronous dfs output stream implementation for implementing WAL.
3628 * [HBASE-22710](https://issues.apache.org/jira/browse/HBASE-22710) | *Major* | **Wrong result in one case of scan that use  raw and versions and filter together**
3630 Make the logic of the versions chosen more reasonable for raw scan, to avoid lose result when using filter.
3635 * [HBASE-24285](https://issues.apache.org/jira/browse/HBASE-24285) | *Major* | **Move to hbase-thirdparty-3.3.0**
3637 Moved to hbase-thirdparty 3.3.0.
3642 * [HBASE-24252](https://issues.apache.org/jira/browse/HBASE-24252) | *Major* | **Implement proxyuser/doAs mechanism for hbase-http**
3644 This feature enables the HBase Web UI's to accept a 'proxyuser' via the HTTP Request's query string. When the parameter \`hbase.security.authentication.spnego.kerberos.proxyuser.enable\` is set to \`true\` in hbase-site.xml (default is \`false\`), the HBase UI will attempt to impersonate the user specified by the query parameter "doAs". This query parameter is checked case-insensitively. When this option is not provided, the user who executed the request is the "real" user and there is no ability to execute impersonation against the WebUI.
3646 For example, if the user "bob" with Kerberos credentials executes a request against the WebUI with this feature enabled and a query string which includes \`doAs=alice\`, the HBase UI will treat this request as executed as \`alice\`, not \`bob\`.
3648 The standard Hadoop proxyuser configuration properties to limit users who may impersonate others apply to this change (e.g. to enable \`bob\` to impersonate \`alice\`). See the Hadoop documentation for more information on how to configure these proxyuser rules.
3653 * [HBASE-24143](https://issues.apache.org/jira/browse/HBASE-24143) | *Major* | **[JDK11] Switch default garbage collector from CMS**
3655 <!-- markdown -->
3656 `bin/hbase` will now dynamically select a Garbage Collector implementation based on the detected JVM version. JDKs 8,9,10 use `-XX:+UseConcMarkSweepGC`, while JDK11+ use `-XX:+UseG1GC`.
3658 Notice a slight compatibility change. Previously, the garbage collector choice would always be appended to a user-provided value for `HBASE_OPTS`. As of this change, this setting will only be applied when `HBASE_OPTS` is unset. That means that operators who provide a value for this variable will now need to also specify the collector. This is especially important for those on JDK8, where the vm default GC is not the recommended ConcMarkSweep.
3663 * [HBASE-24024](https://issues.apache.org/jira/browse/HBASE-24024) | *Major* | **Optionally reject multi() requests with very high no of rows**
3665 New Config: hbase.rpc.rows.size.threshold.reject
3666 -----------------------------------------------------------------------
3668 Default value: false
3669 Description:
3670 If value is true, RegionServer will abort batch requests of Put/Delete with number of rows in a batch operation exceeding threshold defined by value of config: hbase.rpc.rows.warning.threshold.
3675 * [HBASE-24139](https://issues.apache.org/jira/browse/HBASE-24139) | *Critical* | **Balancer should avoid leaving idle region servers**
3677 StochasticLoadBalancer functional improvement:
3679 StochasticLoadBalancer would rebalance the cluster if there are any idle RegionServers in the cluster (RegionServer having no region), while other RegionServers have at least 1 region available.
3684 * [HBASE-24196](https://issues.apache.org/jira/browse/HBASE-24196) | *Major* | **[Shell] Add rename rsgroup command in hbase shell**
3686 user or admin can now use
3687 hbase shell \> rename\_rsgroup 'oldname', 'newname'
3688 to rename rsgroup.
3693 * [HBASE-24218](https://issues.apache.org/jira/browse/HBASE-24218) | *Major* | **Add hadoop 3.2.x in hadoop check**
3695 Add hadoop-3.2.0 and hadoop-3.2.1 in hadoop check and when '--quick-hadoopcheck' we will only check hadoop-3.2.1.
3697 Notice that, for aligning the personality scripts across all the active branches, we will commit the patch to all active branches, but the hadoop-3.2.x support in hadoopcheck is only applied to branch-2.2+.
3702 * [HBASE-23829](https://issues.apache.org/jira/browse/HBASE-23829) | *Major* | **Get \`-PrunSmallTests\` passing on JDK11**
3704 \`-PrunSmallTests\` now pass on JDK11 when using \`-Phadoop.profile=3.0\`.
3709 * [HBASE-24185](https://issues.apache.org/jira/browse/HBASE-24185) | *Major* | **Junit tests do not behave well with System.exit or Runtime.halt or JVM exits in general.**
3711 Tests that fail because a process -- RegionServer or Master -- called System.exit, will now instead throw an exception.
3716 * [HBASE-24072](https://issues.apache.org/jira/browse/HBASE-24072) | *Major* | **Nightlies reporting OutOfMemoryError: unable to create new native thread**
3718 Hadoop hosts have had their ulimit -u raised from 10000 to 30000 (per user, by INFRA). The Docker build container has had its limit raised from 10000 to 12500.
3723 * [HBASE-24112](https://issues.apache.org/jira/browse/HBASE-24112) | *Major* | **[RSGroup] Support renaming rsgroup**
3725 Support RSGroup renaming in core codebase. New API Admin#renameRSGroup(String, String) is introduced in 3.0.0.
3730 * [HBASE-23994](https://issues.apache.org/jira/browse/HBASE-23994) | *Trivial* | ** Add WebUI to Canary**
3732 <!-- markdown -->
3733 The Canary tool now offers a WebUI when run in `region` mode (the default mode). It is enabled by default, and by default, it binds to `0.0.0.0:16050`. This can be overridden by setting `hbase.canary.info.bindAddress` and `hbase.canary.info.port`. To disable entirely, set the port to `-1`.
3738 * [HBASE-23779](https://issues.apache.org/jira/browse/HBASE-23779) | *Major* | **Up the default fork count to make builds complete faster; make count relative to CPU count**
3740 Pass --threads=2 building on jenkins. It shortens nightly build times by about ~25%.
3742 It works by running module build/test in parallel when dependencies allow. Upping the forkcount beyond the pom default of 0.25C would have us broach our CPU budget on jenkins when two modules are running in parallel (2 modules at 0.25% of CPU each makes 0.5C and on jenkins, hadoop nodes run two jenkins executors per host).  Higher forkcounts also seems to threaten build stability.
3744 For running tests locally, to go faster, up fork count.
3746 $ x="0.5C"  ;  mvn --threads=2  -Dsurefire.firstPartForkCount=$x -Dsurefire.secondPartForkCount=$x test -PrunAllTests
3748 You could up the x from 0.5C to 1.0C but YMMV (On overcommitted hardware, tests start bombing out pretty soon after startup). You could try upping thread count but on occasion are likely to overcommit hardware.
3753 * [HBASE-24126](https://issues.apache.org/jira/browse/HBASE-24126) | *Major* | **Up the container nproc uplimit from 10000 to 12500**
3755 Start docker with upped ulimit for nproc passing '--ulimit nproc=12500'. It was 10000, the default, but made it 12500. Then, set PROC\_LIMIT in hbase-personality so when yetus runs, it is w/ the new 12500 value.
3760 * [HBASE-24150](https://issues.apache.org/jira/browse/HBASE-24150) | *Major* | **Allow module tests run in parallel**
3762 Pass -T2 to mvn. Makes it so we do two modules-at-a-time dependencies willing. Helps speed build and testing. Doubles the resource usage when running modules in parallel.
3767 * [HBASE-24121](https://issues.apache.org/jira/browse/HBASE-24121) | *Major* | **[Authorization] ServiceAuthorizationManager isn't dynamically updatable. And it should be.**
3769 Master & RegionService now support refresh policy authorization defined in hbase-policy.xml without restarting service. To refresh policy, please execute hbase shell command: update\_config or update\_config\_all after policy file updated and synced on all nodes.
3774 * [HBASE-24099](https://issues.apache.org/jira/browse/HBASE-24099) | *Major* | **Use a fair ReentrantReadWriteLock for the region close lock**
3776 This change modifies the default acquisition policy for the region's close lock in order to prevent observed starvation of close requests. The new boolean configuration parameter 'hbase.regionserver.fair.region.close.lock' controls the lock acquisition policy: if true, the lock is created in fair mode (default); if false, the lock is created in nonfair mode (the old default).
3781 * [HBASE-23153](https://issues.apache.org/jira/browse/HBASE-23153) | *Major* | **PrimaryRegionCountSkewCostFunction SLB function should implement CostFunction#isNeeded**
3783 <!-- markdown -->
3784 The `PrimaryRegionCountSkewCostFunction` for the `StochasticLoadBalancer` is only needed when the read replicas feature is enabled. With this change, that function now properly indicates that it is not needed when the read replica feature is off.
3786 If this improvement is not available, operators with clusters that are not using the read replica feature should manually disable it by setting `hbase.master.balancer.stochastic.primaryRegionCountCost` to `0.0` in hbase-site.xml for all HBase Masters.
3791 * [HBASE-24055](https://issues.apache.org/jira/browse/HBASE-24055) | *Major* | **Make AsyncFSWAL can run on EC cluster**
3793 Now AsyncFSWAL can also be used against the directory which has EC enabled. Need to make sure you also make use of the hadoop 3.x client as the option is only available in hadoop 3.x.
3798 * [HBASE-24113](https://issues.apache.org/jira/browse/HBASE-24113) | *Major* | **Upgrade the maven we use from 3.5.4 to 3.6.3 in nightlies**
3800 Branches-2.3+ use maven 3.5.3 building. Older branches use 3.5.4 still.
3805 * [HBASE-24122](https://issues.apache.org/jira/browse/HBASE-24122) | *Major* | **Change machine ulimit-l to ulimit-a so dumps full ulimit rather than just 'max locked memory'**
3807 Our 'Build Artifacts' have a machine directory under which we emit vitals on the host the build was run on. We used to emit the result of 'ulimit -l' as a file named 'ulimit-l'. This has been hijacked to instead emit result of running 'ulimit -a' which includes stat on ulimit -l.
3812 * [HBASE-23678](https://issues.apache.org/jira/browse/HBASE-23678) | *Major* | **Literate builder API for version management in schema**
3814 ColumnFamilyDescriptor new builder API:
3816     /\*\*
3817      \* Retain all versions for a given TTL(retentionInterval), and then only a specific number
3818      \* of versions(versionAfterInterval) after that interval elapses.
3819      \*
3820      \* @param retentionInterval Retain all versions for this interval
3821      \* @param versionAfterInterval Retain no of versions to retain after retentionInterval
3822      \*/
3823     public ModifyableColumnFamilyDescriptor setVersionsWithTimeToLive(
3824         final int retentionInterval, final int versionAfterInterval)
3829 * [HBASE-24050](https://issues.apache.org/jira/browse/HBASE-24050) | *Major* | **Deprecated PBType on all 2.x branches**
3831 org.apache.hadoop.hbase.types.PBType is marked as deprecated without any replacement. It will be moved to hbase-example module and marked as IA.Private in 3.0.0. This is a mistake as it should not be part of our public API. Users who depend on this class should just copy the code your own code base.
3836 * [HBASE-8868](https://issues.apache.org/jira/browse/HBASE-8868) | *Minor* | **add metric to report client shortcircuit reads**
3838 Expose file system level read metrics for RegionServer.
3840 If the HBase RS runs on top of HDFS, calculate the aggregation of
3841 ReadStatistics of each HdfsFileInputStream. These metrics include:
3842 (1) total number of bytes read from HDFS.
3843 (2) total number of bytes read from local DataNode.
3844 (3) total number of bytes read locally through short-circuit read.
3845 (4) total number of bytes read locally through zero-copy read.
3847 Because HDFS ReadStatistics is calculated per input stream, it is not
3848 feasible to update the aggregated number in real time. Instead, the
3849 metrics are updated when an input stream is closed.
3854 * [HBASE-24032](https://issues.apache.org/jira/browse/HBASE-24032) | *Major* | **[RSGroup] Assign created tables to respective rsgroup automatically instead of manual operations**
3856 Admin can determine which tables go to which rsgroup by script  (setting hbase.rsgroup.table.mapping.script with local filystem path) on Master side which aims to lighten the burden of admin operations.  Note, since HBase 3+, rsgroup can be specified in TableDescriptor as well, if clients specify this, master will skip the determination from script.
3858 Here is a simple example of script:
3859 {code}
3860 # Input consists of two string, 1st is the namespace of the table, 2nd is the table name of the table
3861 #!/bin/bash
3862 namespace=$1
3863 tablename=$2
3864 if [[ $namespace == test ]]; then
3865   echo test
3866 elif [[ $tablename == \*foo\* ]]; then
3867   echo other
3868 else
3869   echo default
3871 {code}
3876 * [HBASE-23993](https://issues.apache.org/jira/browse/HBASE-23993) | *Major* | **Use loopback for zk standalone server in minizkcluster**
3878 MiniZKCluster now puts up its standalone node listening on loopback/127.0.0.1 rather than "localhost".
3883 * [HBASE-23986](https://issues.apache.org/jira/browse/HBASE-23986) | *Major* | **Bump hadoop-two.version to 2.10.0 on master and branch-2**
3885 Bumped hadoop-two.version to 2.10.0, which means we will drop the support for hadoop-2.8.x and hadoop-2.9.x.
3890 * [HBASE-23930](https://issues.apache.org/jira/browse/HBASE-23930) | *Minor* | **Shell should attempt to format \`timestamp\` attributes as ISO-8601**
3892 Change timestamp display to be ISO8601 when toString on Cell and outputting in shell....
3894 User used to see....
3895     
3896   column=table:state, timestamp=1583967620343 .....
3898 ... but now sees:
3900   column=table:state, timestamp=2020-03-11T23:00:20.343Z ....
3905 * [HBASE-22827](https://issues.apache.org/jira/browse/HBASE-22827) | *Major* | **Expose multi-region merge in shell and Admin API**
3907 merge\_region shell command can now be used to merge more than 2 regions as well. It takes a list of regions as comma separated values or as an array of regions, and not just 2 regions. The full regionnames and encoded regionnames are continued to be accepted.
3912 * [HBASE-23767](https://issues.apache.org/jira/browse/HBASE-23767) | *Major* | **Add JDK11 compilation and unit test support to Github precommit**
3914 Rebuild our Dockerfile with support for multiple JDK versions. Use multiple stages in the Jenkinsfile instead of yetus's multijdk because of YETUS-953. Run those multiple stages in parallel to speed up results.
3916 Note that multiple stages means multiple Yetus invocations means multiple comments on the PreCommit. This should become more obvious to users once we can make use of GitHub Checks API, HBASE-23902.
3921 * [HBASE-22978](https://issues.apache.org/jira/browse/HBASE-22978) | *Minor* | **Online slow response log**
3923 get\_slowlog\_responses and clear\_slowlog\_responses are used to retrieve and clear slow RPC logs from RingBuffer maintained by RegionServers.
3925 New Admin APIs:
3926 1.   List\<SlowLogRecord\> getSlowLogResponses(final Set\<ServerName\> serverNames,
3927       final SlowLogQueryFilter slowLogQueryFilter) throws IOException;
3929 2.   List\<Boolean\> clearSlowLogResponses(final Set\<ServerName\> serverNames)
3930       throws IOException;
3932 Configs:
3934 1. hbase.regionserver.slowlog.ringbuffer.size:
3935 Default size of ringbuffer to be maintained by each RegionServer in order to store online slowlog responses. This is an in-memory ring buffer of requests that were judged to be too slow in addition to the responseTooSlow logging. The in-memory representation would be complete. For more details, please look into Doc Section: Get Slow Response Log from shell
3937 Default
3940 2. hbase.regionserver.slowlog.buffer.enabled:
3941 Indicates whether RegionServers have ring buffer running for storing Online Slow logs in FIFO manner with limited entries. The size of the ring buffer is indicated by config: hbase.regionserver.slowlog.ringbuffer.size The default value is false, turn this on and get latest slowlog responses with complete data.
3943 Default
3944 false
3947 For more details, please look into "Get Slow Response Log from shell" section from HBase book.
3952 * [HBASE-23926](https://issues.apache.org/jira/browse/HBASE-23926) | *Major* | **[Flakey Tests] Down the flakies re-run ferocity; it makes for too many fails.**
3954 Down the flakey re-rerun fork count from 1.0C -- i.e. a fork per CPU -- to 0.25C. On a recent run, the machine had 16 cores. 0.25 is 4 cores. We'd hardcoded fork count at 3 previous to changes made by parent.
3959 * [HBASE-23146](https://issues.apache.org/jira/browse/HBASE-23146) | *Major* | **Support CheckAndMutate with multiple conditions**
3961 Add a checkAndMutate(row, filter) method in the AsyncTable interface and the Table interface.
3963 This method atomically checks if the row matches the specified filter. If it does, it adds the Put/Delete/RowMutations.
3965 This is a fluent style API, the code is like:
3967 For Table interface:
3968 {code}
3969 table.checkAndMutate(row, filter).thenPut(put);
3970 {code}
3972 For AsyncTable interface:
3973 {code}
3974 table.checkAndMutate(row, filter).thenPut(put)
3975     .thenAccept(succ -\> {
3976       if (succ) {
3977         System.out.println("Check and put succeeded");
3978       } else {
3979         System.out.println("Check and put failed");
3980       }
3981     });
3982 {code}
3987 * [HBASE-23874](https://issues.apache.org/jira/browse/HBASE-23874) | *Minor* | **Move Jira-attached file precommit definition from script in Jenkins config to dev-support**
3989 The Jira Precommit job (https://builds.apache.org/job/PreCommit-HBASE-Build/) will now look for a file within the source tree (dev-support/jenkins\_precommit\_jira\_yetus.sh) instead of depending on a script section embedded in the job.
3994 * [HBASE-23865](https://issues.apache.org/jira/browse/HBASE-23865) | *Major* | **Up flakey history from 5 to 10**
3996 Changed flakey list reporting to show 5 rather than 10 items. Also changed the second and first part fort counts to be 1C rather than hardcoded 3.
4001 * [HBASE-23554](https://issues.apache.org/jira/browse/HBASE-23554) | *Major* | **Encoded regionname to regionname utility**
4003     Adds shell command regioninfo:
4005       hbase(main):001:0\>  regioninfo '0e6aa5c19ae2b2627649dc7708ce27d0'
4006       {ENCODED =\> 0e6aa5c19ae2b2627649dc7708ce27d0, NAME =\> 'TestTable,,1575941375972.0e6aa5c19ae2b2627649dc7708ce27d0.', STARTKEY =\> '', ENDKEY =\> '00000000000000000000299441'}
4007       Took 0.4737 seconds
4012 * [HBASE-23350](https://issues.apache.org/jira/browse/HBASE-23350) | *Major* | **Make compaction files cacheonWrite configurable based on threshold**
4014 This JIRA adds a new configuration - \`hbase.rs.cachecompactedblocksonwrite.threshold\`. This configuration is the maximum total size (in bytes) of the compacted files below which the configuration \`hbase.rs.cachecompactedblocksonwrite\` is honoured. If the total size of the compacted fies exceeds this threshold, even when \`hbase.rs.cachecompactedblocksonwrite\` is enabled, the data blocks are not cached. Caching index and bloom blocks is not affected by this configuration (user configuration is always honoured).
4016 Default value of this configuration is Long.MAX\_VALUE. This means whatever the total size of the compacted files, it wil be cached.
4021 * [HBASE-17115](https://issues.apache.org/jira/browse/HBASE-17115) | *Major* | **HMaster/HRegion Info Server does not honour admin.acl**
4023 Implements authorization for the HBase Web UI by limiting access to certain endpoints which could be used to extract sensitive information from HBase.
4025 Access to these restricted endpoints can be limited to a group of administrators, identified either by a list of users (hbase.security.authentication.spnego.admin.users) or by a list of groups
4026 (hbase.security.authentication.spnego.admin.groups).  By default, neither of these values are set which will preserve backwards compatibility (allowing all authenticated users to access all endpoints).
4028 Further, users who have sensitive information in the HBase service configuration can set hbase.security.authentication.ui.config.protected to true which will treat the configuration endpoint as a protected, admin-only resource. By default, all authenticated users may access the configuration endpoint.
4033 * [HBASE-23647](https://issues.apache.org/jira/browse/HBASE-23647) | *Major* | **Make MasterRegistry the default registry impl**
4035 <!-- markdown -->
4036 Enables master based registry as the default registry used by clients to fetch connection metadata.
4037 Refer to the section "Master Registry" in the client documentation for more details and advantages
4038 of this implementation over the default Zookeeper based registry. 
4040 Configuration parameter that controls the registry in use: `hbase.client.registry.impl`
4042 Where to set this: HBase client configuration (hbase-site.xml)
4044 Possible values:
4045 - `org.apache.hadoop.hbase.client.ZKConnectionRegistry` (For ZK based registry implementation)
4046 - `org.apache.hadoop.hbase.client.MasterRegistry` (New, for master based registry implementation)
4048 Notes on defaults:
4050 - For v3.0.0 and later, MasterRegistry is the default registry
4051 - For all releases in 2.x line, ZK based registry is the default.
4053 This feature has been back ported to 2.3.0 and later releases. MasterRegistry can be enabled by setting the following client configuration.
4056 <property>
4057   <name>hbase.client.registry.impl</name>
4058   <value>org.apache.hadoop.hbase.client.MasterRegistry</value>
4059 </property>
4065 * [HBASE-23069](https://issues.apache.org/jira/browse/HBASE-23069) | *Critical* | **periodic dependency bump for Sep 2019**
4067 caffeine: 2.6.2 =\> 2.8.1
4068 commons-codec: 1.10 =\> 1.13
4069 commons-io: 2.5 =\> 2.6
4070 disrupter: 3.3.6 =\> 3.4.2
4071 httpcore: 4.4.6 =\> 4.4.13
4072 jackson: 2.9.10 =\> 2.10.1
4073 jackson.databind: 2.9.10.1 =\> 2.10.1
4074 jetty: 9.3.27.v20190418 =\> 9.3.28.v20191105
4075 protobuf.plugin: 0.5.0 =\> 0.6.1
4076 zookeeper: 3.4.10 =\> 3.4.14
4077 slf4j: 1.7.25 =\> 1.7.30
4078 rat: 0.12 =\> 0.13
4079 asciidoctor: 1.5.5 =\> 1.5.8
4080 asciidoctor.pdf: 1.5.0-alpha.15 =\> 1.5.0-rc.2
4081 error-prone: 2.3.3 =\> 2.3.4
4086 * [HBASE-23686](https://issues.apache.org/jira/browse/HBASE-23686) | *Major* | **Revert binary incompatible change and remove reflection**
4088 - Reverts a binary incompatible binary change for ByteRangeUtils
4089 - Usage of reflection inside CommonFSUtils removed
4094 * [HBASE-23347](https://issues.apache.org/jira/browse/HBASE-23347) | *Major* | **Pluggable RPC authentication**
4096 This change introduces an internal abstraction layer which allows for new SASL-based authentication mechanisms to be used inside HBase services. All existing SASL-based authentication mechanism were ported to the new abstraction, making no external change in runtime semantics, client API, or RPC serialization format.
4098 Developers familiar with extending HBase can implement authentication mechanism beyond simple Kerberos and DelegationTokens which authenticate HBase users against some other user database. HBase service authentication (Master to/from RegionServer) continue to operate solely over Kerberos.
4103 * [HBASE-23156](https://issues.apache.org/jira/browse/HBASE-23156) | *Major* | **start-hbase.sh failed with ClassNotFoundException when build with hadoop3**
4105 Introduce a new hbase-assembly/src/main/assembly/hadoop-three-compat.xml for build with hadoop 3.x.
4110 * [HBASE-23680](https://issues.apache.org/jira/browse/HBASE-23680) | *Major* | **RegionProcedureStore missing cleaning of hfile archive**
4112 Add a new config to hbase-default.xml
4114   \<property\>
4115     \<name\>hbase.procedure.store.region.hfilecleaner.plugins\</name\>
4116     \<value\>org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner\</value\>
4117     \<description\>A comma-separated list of BaseHFileCleanerDelegate invoked by
4118     the RegionProcedureStore HFileCleaner service. These HFiles cleaners are
4119     called in order, so put the cleaner that prunes the most files in front. To
4120     implement your own BaseHFileCleanerDelegate, just put it in HBase's classpath
4121     and add the fully qualified class name here. Always add the above
4122     default hfile cleaners in the list as they will be overwritten in
4123     hbase-site.xml.\</description\>
4124   \</property\>
4126 It will share the same TTL with other HFileCleaners. And you can also implement your own cleaner and change this property to enable it.
4131 * [HBASE-23675](https://issues.apache.org/jira/browse/HBASE-23675) | *Minor* | **Move to Apache parent POM version 22**
4133 Updated parent pom to Apache version 22.
4138 * [HBASE-23679](https://issues.apache.org/jira/browse/HBASE-23679) | *Critical* | **FileSystem instance leaks due to bulk loads with Kerberos enabled**
4140 This issues fixes an issue with Bulk Loading on installations with Kerberos enabled and more than a single RegionServer. When multiple tables are involved in hosting a table's regions which are being bulk-loaded into, all but the RegionServer hosting the table's first Region will "leak" one DistributedFileSystem object onto the heap, never freeing that memory. Eventually, with enough bulk loads, this will create a situation for RegionServers where they have no free heap space and will either spend all time in JVM GC, lose their ZK session, or crash with an OutOfMemoryError.
4142 The only mitigation for this issue is to periodically restart RegionServers. All earlier versions of HBase 2.x are subject to this issue (2.0.x, \<=2.1.8, \<=2.2.3)
4147 * [HBASE-23286](https://issues.apache.org/jira/browse/HBASE-23286) | *Major* | **Improve MTTR: Split WAL to HFile**
4149 Add a new feature to improve MTTR which have 3 steps to failover:
4150 1. Read WAL and write HFile to region’s column family’s recovered.hfiles directory.
4151 2. Open region.
4152 3. Bulkload the recovered.hfiles for every column family.
4154 Compared to DLS(distributed log split), this feature will reduce region open time significantly.
4156 Config hbase.wal.split.to.hfile to true to enable this featue.
4161 * [HBASE-23619](https://issues.apache.org/jira/browse/HBASE-23619) | *Trivial* | **Use built-in formatting for logging in hbase-zookeeper**
4163 Changed the logging in hbase-zookeeper to use built-in formatting
4168 * [HBASE-23628](https://issues.apache.org/jira/browse/HBASE-23628) | *Minor* | **Replace Apache Commons Digest Base64 with JDK8 Base64**
4170 From the PR:
4172 "Yes. The two create the same output... I just wrote a small test suite to increase my confidence on that. I generated many tens of millions of random byte patterns and compared the output of the two algorithms. They came back identical every time.
4174 "Just in case any inquiring minds would like to know, there is no longer an encoding required when generating the strings. The JDK implementation specifically specifies that strings returned are StandardCharsets.ISO\_8859\_1. This does not change anything because UTF8 and ISO\_8859 overlap for the limited character set (64 characters) the encoding uses."
4179 * [HBASE-23651](https://issues.apache.org/jira/browse/HBASE-23651) | *Major* | **Region balance throttling can be disabled**
4181 Set hbase.balancer.max.balancing to a int value which \<=0 will disable region balance throttling.
4186 * [HBASE-23588](https://issues.apache.org/jira/browse/HBASE-23588) | *Major* | **Cache index blocks and bloom blocks on write if CacheCompactedBlocksOnWrite is enabled**
4188 If cacheOnWrite is enabled during flush or compaction, index and bloom blocks(with data blocks) would be automatically cached during write.
4193 * [HBASE-23369](https://issues.apache.org/jira/browse/HBASE-23369) | *Major* | **Auto-close 'unknown' Regions reported as OPEN on RegionServers**
4195 If a RegionServer reports a Region as OPEN in disagreement with Master's status on the Region, the Master now tells the RegionServer to silently close the Region.
4200 * [HBASE-23596](https://issues.apache.org/jira/browse/HBASE-23596) | *Major* | **HBCKServerCrashProcedure can double assign**
4202 Makes it so the recently added HBCKServerCrashProcedure -- the SCP that gets invoked when an operator schedules an SCP via hbck2 scheduleRecoveries command -- now works the same as SCP EXCEPT if master knows nothing of the scheduled servername. In this latter case, HBCKSCP will do a full scan of hbase:meta looking for instances of the passed servername. If any found it will attempt cleanup of hbase:meta references by reassigning any found OPEN or OPENING and by closing any in CLOSING state.
4204 Used to fix instances of what the 'HBCK Report' page shows as 'Unknown Servers'.
4209 * [HBASE-23624](https://issues.apache.org/jira/browse/HBASE-23624) | *Major* | **Add a tool to dump the procedure info in HFile**
4211 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.HFileProcedurePrettyPrinter to run the tool.
4216 * [HBASE-23590](https://issues.apache.org/jira/browse/HBASE-23590) | *Major* | **Update maxStoreFileRefCount to maxCompactedStoreFileRefCount**
4218 RegionsRecoveryChore introduced as part of HBASE-22460 tries to reopen regions based on config: hbase.regions.recovery.store.file.ref.count.
4219 Region reopen needs to take into consideration all compacted away store files that belong to the region and not store files(non-compacted).
4221 Fixed this bug as part of this Jira. 
4222 Updated description for corresponding configs:
4224 1. hbase.master.regions.recovery.check.interval :
4226 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
4228 2. hbase.regions.recovery.store.file.ref.count :
4230 Very large number of ref count on a compacted store file indicates that it is a ref leak on that object(compacted store file). Such files can not be removed after it is invalidated via compaction. Only way to recover in such scenario is to reopen the region which can release all resources, like the refcount, leases, etc. This config represents Store files Ref Count threshold value considered for reopening regions. Any region with compacted store files ref count \> this value would be eligible for reopening by master. Here, we get the max refCount among all refCounts on all compacted away store files that belong to a particular region. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
4235 * [HBASE-23618](https://issues.apache.org/jira/browse/HBASE-23618) | *Major* | **Add a tool to dump procedure info in the WAL file**
4237 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.WALProcedurePrettyPrinter to run the tool.
4242 * [HBASE-23617](https://issues.apache.org/jira/browse/HBASE-23617) | *Major* | **Add a stress test tool for region based procedure store**
4244 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.RegionProcedureStorePerformanceEvaluation to run the tool.
4249 * [HBASE-23326](https://issues.apache.org/jira/browse/HBASE-23326) | *Critical* | **Implement a ProcedureStore which stores procedures in a HRegion**
4251 Use a region based procedure store to replace the old customized WAL based procedure store. The procedure data migration is done automatically during upgrading. After upgrading, the MasterProcWALs directory will be deleted and a new MasterProc directory will be created. And notice that a region will still write WAL so we still have WAL files and they will be moved to the oldWALs directory. The file name is mostly like a normal WAL file, and the only difference is that it is ended with "$masterproc$".
4256 * [HBASE-23320](https://issues.apache.org/jira/browse/HBASE-23320) | *Major* | **Upgrade surefire plugin to 3.0.0-M4**
4258 Bumped surefire plugin to 3.0.0-M4
4263 * [HBASE-20461](https://issues.apache.org/jira/browse/HBASE-20461) | *Major* | **Implement fsync for AsyncFSWAL**
4265 Now AsyncFSWAL also supports Durability.FSYNC\_WAL.
4270 * [HBASE-23066](https://issues.apache.org/jira/browse/HBASE-23066) | *Minor* | **Create a config that forces to cache blocks on compaction**
4272 The configuration 'hbase.rs.cacheblocksonwrite' was used to enable caching the blocks on write. But purposefully we were not caching the blocks when we do compaction (since it may be very aggressive) as the caching happens as and when the writer completes a block. 
4273 In cloud environments since they have bigger sized caches - though they try to enable 'hbase.rs.prefetchblocksonopen' (non - aggressive way of caching the blocks proactively on reader creation) it does not help them because it takes time to cache the compacted blocks. 
4274 This feature creates a new configuration  'hbase.rs.cachecompactedblocksonwrite' which when set to 'true' will enable the blocks created out of compaction. 
4275 Remember that since it is aggressive caching the user should be having enough cache space - if not it may lead to other active blocks getting evicted.
4276 From the shell this can be enabled by using the option per Column Family also by using the below format
4277 {code}
4278 create 't1', 'f1', {NUMREGIONS =\> 15, SPLITALGO =\> 'HexStringSplit', CONFIGURATION =\> {'hbase.rs.cachecompactedblocksonwrite' =\> 'true'}}
4279 {code}
4284 * [HBASE-23239](https://issues.apache.org/jira/browse/HBASE-23239) | *Major* | **Reporting on status of backing MOB files from client-facing cells**
4286 <!-- markdown -->
4288 Users of the MOB feature can now use the `mobrefs` utility to get statistics about data in the MOB system and verify the health of backing files on HDFS.
4291 HADOOP_CLASSPATH=/etc/hbase/conf:$(hbase mapredcp) yarn jar \
4292     /some/path/to/hbase-shaded-mapreduce.jar mobrefs mobrefs-report-output some_table foo
4295 See javadocs of the class `MobRefReporter` for more details.
4297 the reference guide has added some information about MOB internals and troubleshooting.
4302 * [HBASE-23549](https://issues.apache.org/jira/browse/HBASE-23549) | *Minor* | **Document steps to disable MOB for a column family**
4304 The reference guide now includes a walk through of disabling the MOB feature if needed while maintaining availability.
4309 * [HBASE-23582](https://issues.apache.org/jira/browse/HBASE-23582) | *Minor* | **Unbalanced braces in string representation of table descriptor**
4311 Fixed unbalanced braces in string representation within HBase shell
4316 * [HBASE-23293](https://issues.apache.org/jira/browse/HBASE-23293) | *Minor* | **[REPLICATION] make ship edits timeout configurable**
4318 The default rpc timeout for ReplicationSourceShipper#shipEdits is 60s, when bulkload replication enabled, timeout exception may be occurred.
4319 Now we can conf the timeout value through replication.source.shipedits.timeout, and it’s adaptive.
4324 * [HBASE-23312](https://issues.apache.org/jira/browse/HBASE-23312) | *Major* | **HBase Thrift SPNEGO configs (HBASE-19852) should be backwards compatible**
4326 The newer HBase Thrift SPNEGO configs should not be required. The hbase.thrift.spnego.keytab.file and hbase.thrift.spnego.principal configs will fall back to the hbase.thrift.keytab.file and hbase.thrift.kerberos.principal original configs. The older configs will log a deprecation warning. It is preferred to new the newer SPNEGO configurations.
4331 * [HBASE-22969](https://issues.apache.org/jira/browse/HBASE-22969) | *Minor* | **A new binary component comparator(BinaryComponentComparator) to perform comparison of arbitrary length and position**
4333 With BinaryComponentCompartor applications will be able to design diverse and powerful set of filters for rows and columns. See https://issues.apache.org/jira/browse/HBASE-22969 for example. In general, the comparator can be used with any filter taking ByteArrayComparable. As of now, following filters take ByteArrayComparable: 
4335 1. RowFilter
4336 2. ValueFilter
4337 3. QualifierFilter
4338 4. FamilyFilter
4339 5. ColumnValueFilter
4344 * [HBASE-23234](https://issues.apache.org/jira/browse/HBASE-23234) | *Major* | **Provide .editorconfig based on checkstyle configuration**
4346 Adds a .editorconfig file with configurations populated by IntelliJ, based on our checkstyle configuration. There's lots of IntelliJ-specific configs in here that I assume are not replicated to Eclipse or Netbeans users. Any devs using those tools should push whatever updates they see fit, but please start with the checkstyle configs as the origin of truth.
4351 * [HBASE-23322](https://issues.apache.org/jira/browse/HBASE-23322) | *Minor* | **[hbck2] Simplification on HBCKSCP scheduling**
4353 An hbck2 scheduleRecoveries will run a subclass of ServerCrashProcedure which asks Master what Regions were on the dead Server but it will also do a hbase:meta table scan to see if any vestiges of the old Server remain (for the case where an SCP failed mid-point leaving references in place or where Master and hbase:meta deviated in accounting).
4358 * [HBASE-23321](https://issues.apache.org/jira/browse/HBASE-23321) | *Minor* | **[hbck2] fixHoles of fixMeta doesn't update in-memory state**
4360 If holes in hbase:meta, hbck2 fixMeta now will update Master in-memory state so you do not need to restart master just so you can assign the new hole-bridging regions.
4365 * [HBASE-23282](https://issues.apache.org/jira/browse/HBASE-23282) | *Major* | **HBCKServerCrashProcedure for 'Unknown Servers'**
4367 hbck2 scheduleRecoveries will now run a SCP that also looks in hbase:meta for any references to the scheduled server -- not just consult Master in-memory state -- just in case vestiges of the server are leftover in hbase:meta
4372 * [HBASE-19450](https://issues.apache.org/jira/browse/HBASE-19450) | *Minor* | **Add log about average execution time for ScheduledChore**
4374 <!-- markdown -->
4375 HBase internal chores now log a moving average of how long execution of each chore takes at `INFO` level for the logger `org.apache.hadoop.hbase.ScheduledChore`.
4377 Such messages will happen at most once per five minutes.
4382 * [HBASE-23250](https://issues.apache.org/jira/browse/HBASE-23250) | *Minor* | **Log message about CleanerChore delegate initialization should be at INFO**
4384 CleanerChore delegate initialization is now logged at INFO level instead of DEBUG
4389 * [HBASE-23243](https://issues.apache.org/jira/browse/HBASE-23243) | *Major* | **[pv2] Filter out SUCCESS procedures; on decent-sized cluster, plethora overwhelms problems**
4391 The 'Procedures & Locks' tab in Master UI only displays problematic Procedures now (RUNNABLE, WAITING-TIMEOUT, etc.). It no longer notes procedures whose state is SUCCESS.
4396 * [HBASE-23227](https://issues.apache.org/jira/browse/HBASE-23227) | *Blocker* | **Upgrade jackson-databind to 2.9.10.1 to avoid recent CVEs**
4398 <!-- markdown -->
4400 the Apache HBase REST Proxy now uses Jackson Databind version 2.9.10.1 to address the following CVEs
4402   - CVE-2019-16942
4403   - CVE-2019-16943
4405 Users of prior releases with Jackson Databind 2.9.10 are advised to either upgrade to this release or to upgrade their local Jackson Databind jar directly.
4410 * [HBASE-23222](https://issues.apache.org/jira/browse/HBASE-23222) | *Critical* | **Better logging and mitigation for MOB compaction failures**
4412 <!-- markdown -->
4414 The MOB compaction process in the HBase Master now logs more about its activity.
4416 In the event that you run into the problems described in HBASE-22075, there is a new HFileCleanerDelegate that will stop all removal of MOB hfiles from the archive area. It can be configured by adding `org.apache.hadoop.hbase.mob.ManualMobMaintHFileCleaner` to the list configured for `hbase.master.hfilecleaner.plugins`. This new cleaner delegate will cause your archive area to grow unbounded; you will have to manually prune files which may be prohibitively complex. Consider if your use case will allow you to mitigate by disabling mob compactions instead.
4418 Caveats:
4419 * Be sure the list of cleaner delegates still includes the default cleaners you will likely need: ttl, snapshot, and hlink.
4420 * Be mindful that if you enable this cleaner delegate then there will be *no* automated process for removing these mob hfiles. You should see a single region per table in `%hbase_root%/archive` that accumulates files over time. You will have to determine which of these files are safe or not to remove.
4421 * You should list this cleaner delegate after the snapshot and hlink delegates so that you can enable sufficient logging to determine when an archived mob hfile is needed by those subsystems. When set to `TRACE` logging, the CleanerChore logger will include archive retention decision justifications.
4422 * If your use case creates a large number of uniquely named tables, this new delegate will cause memory pressure on the master.
4427 * [HBASE-15519](https://issues.apache.org/jira/browse/HBASE-15519) | *Major* | **Add per-user metrics**
4429 Adds per-user metrics for reads/writes to each RegionServer. These metrics are exported by default. hbase.regionserver.user.metrics.enabled can be used to disable the feature if desired for any reason.
4434 * [HBASE-22460](https://issues.apache.org/jira/browse/HBASE-22460) | *Minor* | **Reopen a region if store reader references may have leaked**
4436 Leaked store files can not be removed even after it is invalidated via compaction. A reasonable mitigation for a reader reference leak would be a fast reopen of the region on the same server.
4438 Configs:
4440 1. hbase.master.regions.recovery.check.interval :
4442 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
4444 2. hbase.regions.recovery.store.file.ref.count :
4446 This config represents Store files Ref Count threshold value considered for reopening regions. Any region with store files ref count \> this value would be eligible for reopening by master. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
4451 * [HBASE-23172](https://issues.apache.org/jira/browse/HBASE-23172) | *Minor* | **HBase Canary region success count metrics reflect column family successes, not region successes**
4453 Added a comment to make clear that read/write success counts are tallying column family success counts, not region success counts. 
4455 Additionally, the region read and write latencies previously only stored the latencies of the last column family of the region reads/writes. This has been fixed by using a map of each region to a list of read and write latency values.
4460 * [HBASE-23177](https://issues.apache.org/jira/browse/HBASE-23177) | *Major* | **If fail to open reference because FNFE, make it plain it is a Reference**
4462 Changes the message on the FNFE exception thrown when the file a Reference points to is missing; the message now includes detail on Reference as well as pointed-to file so can connect how FNFE relates to region open.
4467 * [HBASE-20626](https://issues.apache.org/jira/browse/HBASE-20626) | *Major* | **Change the value of "Requests Per Second" on WEBUI**
4469 Use 'totalRowActionRequestCount' to calculate QPS on web UI.
4474 * [HBASE-22874](https://issues.apache.org/jira/browse/HBASE-22874) | *Critical* | **Define a public interface for Canary and move existing implementation to LimitedPrivate**
4476 <!-- markdown -->
4477 Downstream users who wish to programmatically check the health of their HBase cluster may now rely on a public interface derived from the previously private implementation of the canary cli tool. The interface is named `Canary` and can be found in the user facing javadocs.
4479 Downstream users who previously relied on the invoking the canary via the Java classname (either on the command line or programmatically) will need to change how they do so because the non-public implementation has moved.
4484 * [HBASE-23035](https://issues.apache.org/jira/browse/HBASE-23035) | *Major* | **Retain region to the last RegionServer make the failover slower**
4486 Since 2.0.0,when one regionserver crashed and back online again, AssignmentManager will retain the region locations and try assign the regions to this regionserver(same host:port with the crashed one) again. But for 1.x.x, the behavior is round-robin assignment for the regions belong to the crashed regionserver. This jira change the "retain" assignment to round-robin assignment, which is same with 1.x.x version. This change will make the failover faster and improve availability.
4491 * [HBASE-23046](https://issues.apache.org/jira/browse/HBASE-23046) | *Minor* | **Remove compatibility case from truncate command**
4493 Remove backward compatibility from \`truncate\` and \`truncate\_preserve\` shell commands. This means that these commands from HBase Clients are not compatible with pre-0.99 HBase clusters.
4498 * [HBASE-23040](https://issues.apache.org/jira/browse/HBASE-23040) | *Minor* | **region mover gives NullPointerException instead of saying a host isn't in the cluster**
4500 giving the region mover "unload" command a region server name that isn't recognized by the cluster results in a "I don't know about that host" message instead of a NPE.
4502 set log level to DEBUG if you'd like the region mover to log the set of region server names it got back from the cluster.
4507 * [HBASE-21874](https://issues.apache.org/jira/browse/HBASE-21874) | *Major* | **Bucket cache on Persistent memory**
4509 Added a new IOEngine type for Bucket cache ie Persistent memory. In order to use BC over pmem configure IOEngine as 
4510 \<property\>
4511     \<name\>hbase.bucketcache.ioengine\</name\>
4512     \<value\> pmem:///path in persistent memory \</value\>
4513   \</property\>
4518 * [HBASE-22760](https://issues.apache.org/jira/browse/HBASE-22760) | *Major* | **Stop/Resume Snapshot Auto-Cleanup activity with shell command**
4520 By default, snapshot auto cleanup based on TTL would be enabled for any new cluster. At any point in time, if snapshot cleanup is supposed to be stopped due to some snapshot restore activity or any other reason, it is advisable to disable it using shell command:
4521 hbase\> snapshot\_cleanup\_switch false
4523 We can re-enable it using:
4524 hbase\> snapshot\_cleanup\_switch true
4526 We can query whether snapshot auto cleanup is enabled for cluster using:
4527 hbase\> snapshot\_cleanup\_enabled
4532 * [HBASE-22796](https://issues.apache.org/jira/browse/HBASE-22796) | *Major* | **[HBCK2] Add fix of overlaps to fixMeta hbck Service**
4534 Adds fix of overlaps to the fixMeta hbck service method. Uses the bulk-merge facility. Merges a max of 10 at a time. Set hbase.master.metafixer.max.merge.count to higher if you want to do more than 10 in the one go.
4539 * [HBASE-21745](https://issues.apache.org/jira/browse/HBASE-21745) | *Critical* | **Make HBCK2 be able to fix issues other than region assignment**
4541 This issue adds via its subtasks:
4543  \* An 'HBCK Report' page to the Master UI added by HBASE-22527+HBASE-22709+HBASE-22723+ (since 2.1.6, 2.2.1, 2.3.0). Lists consistency or anomalies found via new hbase:meta consistency checking extensions added to CatalogJanitor (holes, overlaps, bad servers) and by a new 'HBCK chore' that runs at a lesser periodicity that will note filesystem orphans and overlaps as well as the following conditions:
4544  \*\* Master thought this region opened, but no regionserver reported it. 
4545  \*\* Master thought this region opened on Server1, but regionserver reported Server2 
4546  \*\* More than one regionservers reported opened this region
4547  Both chores can be triggered from the shell to regenerate ‘new’ reports.
4548  \* Means of scheduling a ServerCrashProcedure (HBASE-21393).
4549  \* An ‘offline’ hbase:meta rebuild (HBASE-22680).
4550  \* Offline replace of hbase.version and hbase.id
4551  \* Documentation on how to use completebulkload tool to ‘adopt’ orphaned data found by new HBCK2 ‘filesystem’ check (see below) and ‘HBCK chore’ (HBASE-22859)
4552  \* A ‘holes’ and ‘overlaps’ fix that runs in the master that uses new bulk-merge facility to collapse many overlaps in the one go.
4553  \* hbase-operator-tools HBCK2 client tool got a bunch of additions:
4554  \*\* A specialized 'fix' for the case where operators ran old hbck 'offlinemeta' repair and destroyed their hbase:meta; it ties together holes in meta with orphaned data in the fs (HBASE-22567)
4555  \*\* A ‘filesystem’ command that reports on orphan data as well as bad references and hlinks with a ‘fix’ for the latter two options (based on hbck1 facility updated).
4556  \*\* Adds back the ‘replication’ fix facility from hbck1 (HBASE-22717)
4558 The compound result is that hbck2 is now in excess of hbck1 abilities. The provided functionality is disaggregated as per the hbck2 philosophy of providing 'plumbing' rather than 'porcelain' so there is work to do still adding fix-it playbooks, scripting across outages, and automation.
4563 * [HBASE-22802](https://issues.apache.org/jira/browse/HBASE-22802) | *Major* | **Avoid temp ByteBuffer allocation in FileIOEngine#read**
4565 HBASE-21879 introduces a utility class (org.apache.hadoop.hbase.io.ByteBuffAllocator) used for allocating/freeing ByteBuffers from/to NIO ByteBuffer pool, when BucketCache enabled with file or mmap engine, we will use this ByteBuffer pool to avoid temp ByteBuffer allocation a lot.
4570 * [HBASE-11062](https://issues.apache.org/jira/browse/HBASE-11062) | *Major* | **hbtop**
4572 Introduces hbtop that's a real-time monitoring tool for HBase like Unix's top command. See the ref guide for the details: https://hbase.apache.org/book.html#hbtop
4577 * [HBASE-21879](https://issues.apache.org/jira/browse/HBASE-21879) | *Major* | **Read HFile's block to ByteBuffer directly instead of to byte for reducing young gc purpose**
4579 Before this issue, read path was 100% offheap when block is in the BucketCache. But if a cache miss, then the RS needs to read the block via an on-heap API which causes high young-GC pressure.
4581 This issue adds reading the block via offheap even if reading the block from filesystem directly.  It requires hadoop version(\>=2.9.3) but can also work with older hadoop versions (all works but we continue to read block onheap). It also requires HBASE-21946 which is not yet in place as of this writing/hbase-2.3.0.
4583 We have written a careful doc about the implementation, performance and practice here: https://docs.google.com/document/d/1xSy9axGxafoH-Qc17zbD2Bd--rWjjI00xTWQZ8ZwI\_E/edit#heading=h.nch5d72p27ex
4588 * [HBASE-22618](https://issues.apache.org/jira/browse/HBASE-22618) | *Major* | **added the possibility to load custom cost functions**
4590 <!-- markdown -->
4591 Extends `StochasticLoadBalancer` to support user-provided cost function. These are loaded in addition to the default set of cost functions. Custom function implementations must extend `StochasticLoadBalancer$CostFunction`. Enable any additional functions by placing them on the master class path and configuring `hbase.master.balancer.stochastic.additionalCostFunctions` with a comma-separated list of fully-qualified class names.
4596 * [HBASE-22867](https://issues.apache.org/jira/browse/HBASE-22867) | *Critical* | **The ForkJoinPool in CleanerChore will spawn thousands of threads in our cluster with thousands table**
4598 Replace the ForkJoinPool in CleanerChore by ThreadPoolExecutor which can limit the spawn thread size and avoid  the master GC frequently.  The replacement is an internal implementation in CleanerChore,  so no config key change, the upstream users can just upgrade the hbase master without any other change.
4603 * [HBASE-22810](https://issues.apache.org/jira/browse/HBASE-22810) | *Major* | **Initialize an separate ThreadPoolExecutor for taking/restoring snapshot**
4605 Introduced a new config key for the snapshot taking/restoring operations at master side:  hbase.master.executor.snapshot.threads, its default value is 3.  means we can have 3 snapshot operations running at the same time.
4610 * [HBASE-22863](https://issues.apache.org/jira/browse/HBASE-22863) | *Major* | **Avoid Jackson versions and dependencies with known CVEs**
4612 1. Stopped exposing vulnerable Jackson1 dependencies so that downstreamers would not pull it in from HBase.
4613 2. However, since Hadoop requires some Jackson1 dependencies, put vulnerable Jackson mapper at test scope in some HBase modules and hence, HBase tarball created by hbase-assembly contains Jackson1 mapper jar in lib. Still, downsteam applications can't pull in Jackson1 from HBase.
4618 * [HBASE-22841](https://issues.apache.org/jira/browse/HBASE-22841) | *Major* | **TimeRange's factory functions do not support ranges, only \`allTime\` and \`at\`**
4620 Add serveral API in TimeRange class for avoiding using the deprecated TimeRange constructor: 
4621 \* TimeRange#from: Represents the time interval [minStamp, Long.MAX\_VALUE)
4622 \* TimeRange#until: Represents the time interval [0, maxStamp)
4623 \* TimeRange#between: Represents the time interval [minStamp, maxStamp)
4628 * [HBASE-22833](https://issues.apache.org/jira/browse/HBASE-22833) | *Minor* | **MultiRowRangeFilter should provide a method for creating a filter which is functionally equivalent to multiple prefix filters**
4630 Provide a public method in MultiRowRangeFilter class to speed the requirement of filtering with multiple row prefixes, it will expand the row prefixes as multiple rowkey ranges by MultiRowRangeFilter, it's more efficient.
4631 {code}
4632 public MultiRowRangeFilter(byte[][] rowKeyPrefixes);
4633 {code}
4638 * [HBASE-22856](https://issues.apache.org/jira/browse/HBASE-22856) | *Major* | **HBASE-Find-Flaky-Tests fails with pip error**
4640 Update the base docker image to ubuntu 18.04 for the find flaky tests jenkins job.
4645 * [HBASE-22771](https://issues.apache.org/jira/browse/HBASE-22771) | *Major* | **[HBCK2] fixMeta method and server-side support**
4647 Adds a fixMeta method to hbck Service. Fixes holes in hbase:meta. Follow-up to fix overlaps. See HBASE-22567 also.
4649 Follow-on is adding a client-side to hbase-operator-tools that can exploit this new addition (HBASE-22825)
4654 * [HBASE-22777](https://issues.apache.org/jira/browse/HBASE-22777) | *Major* | **Add a multi-region merge (for fixing overlaps, etc.)**
4656 Changes merge so you can merge more than two regions at a time.  Currently only available inside HBase. HBASE-22827, a follow-on, is about exposing the facility in the Admin API (and then via the shell).
4661 * [HBASE-15666](https://issues.apache.org/jira/browse/HBASE-15666) | *Critical* | **shaded dependencies for hbase-testing-util**
4663 New shaded artifact for testing: hbase-shaded-testing-util.
4668 * [HBASE-22776](https://issues.apache.org/jira/browse/HBASE-22776) | *Major* | **Rename config names in user scan snapshot feature**
4670 After HBASE-22776, the steps to config user scan snapshot feature is as followings:
4671 1. Check HDFS configuration
4672 2. Add master coprocessor:
4673     hbase.coprocessor.master.classes=
4674     “org.apache.hadoop.hbase.security.access.AccessController,
4675 org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController”
4676 3. Enable this feature:
4677     hbase.acl.sync.to.hdfs.enable=true
4678 4. Modify table scheme to enable this feature for a table:
4679     alter 't1', CONFIGURATION =\> {'hbase.acl.sync.to.hdfs.enable' =\> 'true'}
4684 * [HBASE-22539](https://issues.apache.org/jira/browse/HBASE-22539) | *Blocker* | **WAL corruption due to early DBBs re-use when Durability.ASYNC\_WAL is used**
4686 We found a critical bug which can lead to WAL corruption when Durability.ASYNC\_WAL is used. The reason is that we release a ByteBuffer before actually persist the content into WAL file.
4688 The problem maybe lead to several errors, for example, ArrayIndexOfOutBounds when replaying WAL. This is because that the ByteBuffer is reused by others.
4690 ERROR org.apache.hadoop.hbase.executor.EventHandler: Caught throwable while processing event RS\_LOG\_REPLAY
4691 java.lang.ArrayIndexOutOfBoundsException: 18056
4692         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1365)
4693         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1358)
4694         at org.apache.hadoop.hbase.PrivateCellUtil.matchingFamily(PrivateCellUtil.java:735)
4695         at org.apache.hadoop.hbase.CellUtil.matchingFamily(CellUtil.java:816)
4696         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEditFamily(WALEdit.java:143)
4697         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEdit(WALEdit.java:148)
4698         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:297)
4699         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:195)
4700         at org.apache.hadoop.hbase.regionserver.SplitLogWorker$1.exec(SplitLogWorker.java:100)
4702 And may even cause segmentation fault and crash the JVM directly. You will see a hs\_err\_pidXXX.log file and usually the problem is SIGSEGV. This is usually because that the ByteBuffer has already been returned to the OS and used for other purpose.
4704 The problem has been reported several times in the past and this time Wellington Ramos Chevreuil provided the full logs and deeply analyzed the logs so we can find the root cause. And Lijin Bin figured out that the problem may only happen when Durability.ASYNC\_WAL is used. Thanks to them.
4706 The problem only effects the 2.x releases, all users are highly recommand to upgrade to a release which has this fix in, especially that if you use Durability.ASYNC\_WAL.
4711 * [HBASE-22737](https://issues.apache.org/jira/browse/HBASE-22737) | *Major* | **Add a new admin method and shell cmd to trigger the hbck chore to run**
4713 Add a new method runHbckChore in Hbck interface and a new shell cmd hbck\_chore\_run to request HBCK chore to run at master side.
4718 * [HBASE-22741](https://issues.apache.org/jira/browse/HBASE-22741) | *Major* | **Show catalogjanitor consistency complaints in new 'HBCK Report' page**
4720 Adds a "CatalogJanitor hbase:meta Consistency Issues" section to the new 'HBCK Report' page added by HBASE-22709. This section is empty unless the most recent CatalogJanitor scan turned up problems. If so, will show table of issues found.
4725 * [HBASE-22723](https://issues.apache.org/jira/browse/HBASE-22723) | *Major* | **Have CatalogJanitor report holes and overlaps; i.e. problems it sees when doing its regular scan of hbase:meta**
4727 When CatalogJanitor runs, it now checks for holes, overlaps, empty info:regioninfo columns and bad servers. Dumps findings into log. Follow-up adds report to new 'HBCK Report' linked off the Master UI.
4729 NOTE: All features but the badserver check made it into branch-2.1 and branch-2.0 backports.
4734 * [HBASE-22714](https://issues.apache.org/jira/browse/HBASE-22714) | *Trivial* | **BuffferedMutatorParams opertationTimeOut() is misspelt**
4736 The misspelled BufferedMutatorParams.opertationTimeout method has been marked as deprecated, and will be removed in 4.0.0. Please use the BufferedMutatorParams.operationTimeout method instead.
4741 * [HBASE-22580](https://issues.apache.org/jira/browse/HBASE-22580) | *Major* | **Add a table attribute to make user scan snapshot feature configurable for table**
4743 If a table user scan snapshots of the table, please config the following table scheme attribute to make granted users' ACLs are added to hfiles:
4744 alter 't1', CONFIGURATION =\> {'hbase.user.scan.snapshot.enable' =\> 'true'}
4749 * [HBASE-22709](https://issues.apache.org/jira/browse/HBASE-22709) | *Major* | **Add a chore thread in master to do hbck checking and display results in 'HBCK Report' page**
4751 1. Add a new chore thread in master to do hbck checking
4752 2. Add a new web ui "HBCK Report" page to display checking results.
4754 This feature is enabled by default. And the hbck chore run per 60 minutes by default. You can config "hbase.master.hbck.checker.interval" to a value lesser than or equal to 0 for disabling the chore.
4756 Notice: the config "hbase.master.hbck.checker.interval" was renamed to "hbase.master.hbck.chore.interval" in HBASE-22737.
4761 * [HBASE-22578](https://issues.apache.org/jira/browse/HBASE-22578) | *Major* | **HFileCleaner should not delete empty ns/table directories used for user san snapshot feature**
4763 The HFileCleaner will clean the empty directories under archive, but if enable user scan snaphot feature, the user ACLs are set at there directories, so please config the following cleaner to make the directories with user ACLs not be cleaned:
4764 hbase.master.hfilecleaner.plugins=org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclCleaner
4769 * [HBASE-22722](https://issues.apache.org/jira/browse/HBASE-22722) | *Blocker* | **Upgrade jackson databind dependencies to 2.9.9.1**
4771 Upgrade jackson databind dependency to 2.9.9.1 due to CVEs
4773 https://nvd.nist.gov/vuln/detail/CVE-2019-12814
4775 https://nvd.nist.gov/vuln/detail/CVE-2019-12384
4780 * [HBASE-22527](https://issues.apache.org/jira/browse/HBASE-22527) | *Major* | **[hbck2] Add a master web ui to show the problematic regions**
4782 Add a new master web UI to show the potentially problematic opened regions. There are three case:
4783 1. Master thought this region opened, but no regionserver reported it.
4784 2. Master thought this region opened on Server1, but regionserver reported Server2
4785 3. More than one regionservers reported opened this region
4790 * [HBASE-22648](https://issues.apache.org/jira/browse/HBASE-22648) | *Minor* | **Snapshot TTL**
4792 Feature: Take a Snapshot With TTL for auto-cleanup
4794 Attribute: 
4795 1. TTL
4796      - Specify TTL in sec while creating snapshot. e.g. snapshot 'mytable', 'snapshot1234', {TTL =\> 86400}  (snapshot to be auto-cleaned after 24 hr)
4798 Configs:
4799 1. Default Snapshot TTL:
4800      - FOREVER by default
4801      - User specified Default TTL(sec) with config: hbase.master.snapshot.ttl
4803 2. If Snapshot cleanup is supposed to be stopped due to some snapshot restore activity, disable it with config:
4804      - hbase.master.cleaner.snapshot.disable: "true"
4805     With this config, HMaster needs restart just like any other hbase-site config.
4808 For more details, see the section "Take a Snapshot With TTL" in the HBase Reference Guide.
4813 * [HBASE-22610](https://issues.apache.org/jira/browse/HBASE-22610) | *Trivial* | **[BucketCache] Rename "hbase.offheapcache.minblocksize"**
4815 The config point "hbase.offheapcache.minblocksize" was wrong and is now deprecated. The new config point is "hbase.blockcache.minblocksize".
4820 * [HBASE-22690](https://issues.apache.org/jira/browse/HBASE-22690) | *Major* | **Deprecate / Remove OfflineMetaRepair in hbase-2+**
4822 OfflineMetaRepair is no longer supported in HBase-2+. Please refer to https://hbase.apache.org/book.html#HBCK2
4824 This tool is deprecated in 2.x and will be removed in 3.0.
4829 * [HBASE-22673](https://issues.apache.org/jira/browse/HBASE-22673) | *Major* | **Avoid to expose protobuf stuff in Hbck interface**
4831 Mark the Hbck#scheduleServerCrashProcedure(List\<HBaseProtos.ServerName\> serverNames) as deprecated. Use Hbck#scheduleServerCrashProcedures(List\<ServerName\> serverNames) instead.
4836 * [HBASE-22617](https://issues.apache.org/jira/browse/HBASE-22617) | *Blocker* | **Recovered WAL directories not getting cleaned up**
4838 In HBASE-20734 we moved the recovered.edits onto the wal file system but when constructing the directory we missed the BASE\_NAMESPACE\_DIR('data'). So when using the default config, you will find that there are lots of new directories at the same level with the 'data' directory.
4840 In this issue, we add the BASE\_NAMESPACE\_DIR back, and also try our best to clean up the wrong directories. But we can only clean up the region level directories, so if you want a clean fs layout on HDFS you still need to manually delete the empty directories at the same level with 'data'.
4842 The effect versions are 2.2.0, 2.1.[1-5], 1.4.[8-10], 1.3.[3-5].
4847 * [HBASE-21995](https://issues.apache.org/jira/browse/HBASE-21995) | *Major* | **Add a coprocessor to set HDFS ACL for hbase granted user**
4849 Add a coprocessor to set HDFS acls to make hbase granted users with READ permission have the access to scan snapshots.
4850 To use this feature, please make sure the HDFS config is set:
4851 dfs.namenode.acls.enabled=true
4852 fs.permissions.umask-mode=027
4854 and set the HBase config:
4855 hbase.coprocessor.master.classes="org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController"
4856 hbase.user.scan.snapshot.enable=true
4861 * [HBASE-22596](https://issues.apache.org/jira/browse/HBASE-22596) | *Minor* | **[Chore] Separate the execution period between CompactionChecker and PeriodicMemStoreFlusher**
4863 hbase.regionserver.compaction.check.period is used for controlling how often the compaction checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
4865 hbase.regionserver.flush.check.period is used for controlling how ofter the flush checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
4870 * [HBASE-22588](https://issues.apache.org/jira/browse/HBASE-22588) | *Major* | **Upgrade jaxws-ri dependency to 2.3.2**
4872 <!-- markdown -->
4874 When run with JDK11 HBase now uses more recent version of the jaxws reference implementation (v2.3.2).
4879 * [HBASE-21536](https://issues.apache.org/jira/browse/HBASE-21536) | *Trivial* | **Fix completebulkload usage instructions**
4881 Added completebulkload short name for BulkLoadHFilesTool to bin/hbase.
4886 * [HBASE-22500](https://issues.apache.org/jira/browse/HBASE-22500) | *Blocker* | **Modify pom and jenkins jobs for hadoop versions**
4888 Change the default hadoop-3 version to 3.1.2. Drop the support for the releases which are effected by CVE-2018-8029, see this email https://lists.apache.org/thread.html/3d6831c3893cd27b6850aea2feff7d536888286d588e703c6ffd2e82@%3Cuser.hadoop.apache.org%3E
4893 * [HBASE-22459](https://issues.apache.org/jira/browse/HBASE-22459) | *Minor* | **Expose store reader reference count**
4895 This change exposes the aggregate count of store reader references for a given store as 'storeRefCount' in region metrics and ClusterStatus.
4900 * [HBASE-22469](https://issues.apache.org/jira/browse/HBASE-22469) | *Minor* | **replace md5 checksum in saveVersion script with sha512 for hbase version information**
4902 The HBase "source checksum" now uses SHA512 instead of MD5.
4907 * [HBASE-22148](https://issues.apache.org/jira/browse/HBASE-22148) | *Blocker* | **Provide an alternative to CellUtil.setTimestamp**
4909 <!-- markdown -->
4911 The `CellUtil.setTimestamp` method changes to be an API with audience `LimitedPrivate(COPROC)` in HBase 3.0. With that designation the API should remain stable within a given minor release line, but may change between minor releases.
4913 Previously, this method was deprecated in HBase 2.0 for removal in HBase 3.0. Deprecation messages in HBase 2.y releases have been updated to indicate the expected API audience change.
4918 * [HBASE-20782](https://issues.apache.org/jira/browse/HBASE-20782) | *Minor* | **Fix duplication of TestServletFilter.access**
4920 The access method was used to the HttpServerFunctionalTest class as a common place.
4925 * [HBASE-21991](https://issues.apache.org/jira/browse/HBASE-21991) | *Major* | **Fix MetaMetrics issues - [Race condition, Faulty remove logic], few improvements**
4927 The class LossyCounting was unintentionally marked Public but was never intended to be part of our public API. This oversight has been corrected and LossyCounting is now marked as Private and going forward may be subject to additional breaking changes or removal without notice. If you have taken a dependency on this class we recommend cloning it locally into your project before upgrading to this release.
4932 * [HBASE-22226](https://issues.apache.org/jira/browse/HBASE-22226) | *Trivial* | **Incorrect level for headings in asciidoc**
4934 Warnings for level headings are corrected in the book for the HBase Incompatibilities section.
4939 * [HBASE-20970](https://issues.apache.org/jira/browse/HBASE-20970) | *Major* | **Update hadoop check versions for hadoop3 in hbase-personality**
4941 Add hadoop 3.0.3, 3.1.1 3.1.2 in our hadoop check jobs.
4946 * [HBASE-21784](https://issues.apache.org/jira/browse/HBASE-21784) | *Major* | **Dump replication queue should show list of wal files ordered chronologically**
4948 The DumpReplicationQueues tool will now list replication queues sorted in chronological order.
4953 * [HBASE-21048](https://issues.apache.org/jira/browse/HBASE-21048) | *Major* | **Get LogLevel is not working from console in secure environment**
4955 Support get\|set LogLevel in secure(kerberized) environment.
4960 * [HBASE-22384](https://issues.apache.org/jira/browse/HBASE-22384) | *Minor* | **Formatting issues in administration section of book**
4962 Fixes a formatting issue in the administration section of the book, where listing indentation were a little bit off.
4967 * [HBASE-22377](https://issues.apache.org/jira/browse/HBASE-22377) | *Major* | **Provide API to check the existence of a namespace which does not require ADMIN permissions**
4969 This change adds the new method listNamespaces to the Admin interface, which can be used to retrieve a list of the namespaces present in the schema as an unprivileged operation. Formerly the only available method for accomplishing this was listNamespaceDescriptors, which requires GLOBAL CREATE or ADMIN permissions.
4974 * [HBASE-22399](https://issues.apache.org/jira/browse/HBASE-22399) | *Major* | **Change default hadoop-two.version to 2.8.x and remove the 2.7.x hadoop checks**
4976 Now the default hadoop-two.version has been changed to 2.8.5, and all hadoop versions before 2.8.2(exclude) will not be supported any more.
4981 * [HBASE-22392](https://issues.apache.org/jira/browse/HBASE-22392) | *Trivial* | **Remove extra/useless +**
4983 Removed extra + in HRegion, HStore and LoadIncrementalHFiles for branch-2 and HRegion and HStore for branch-1.
4988 * [HBASE-20494](https://issues.apache.org/jira/browse/HBASE-20494) | *Major* | **Upgrade com.yammer.metrics dependency**
4990 Updated metrics core from 3.2.1 to 3.2.6.
4995 * [HBASE-22358](https://issues.apache.org/jira/browse/HBASE-22358) | *Minor* | **Change rubocop configuration for method length**
4997 The rubocop definition for the maximum method length was set to 75.
5002 * [HBASE-22379](https://issues.apache.org/jira/browse/HBASE-22379) | *Minor* | **Fix Markdown for "Voting on Release Candidates" in book**
5004 Fixes the formatting of the "Voting on Release Candidates" to actually show the quote and code formatting of the RAT check.
5009 * [HBASE-20851](https://issues.apache.org/jira/browse/HBASE-20851) | *Minor* | **Change rubocop config for max line length of 100**
5011 The rubocop configuration in the hbase-shell module now allows a line length with 100 characters, instead of 80 as before. For everything before 2.1.5 this change introduces rubocop itself.
5016 * [HBASE-22301](https://issues.apache.org/jira/browse/HBASE-22301) | *Minor* | **Consider rolling the WAL if the HDFS write pipeline is slow**
5018 This change adds new conditions for rolling the WAL for when syncs on the HDFS writer pipeline are perceived to be slow. 
5020 As before the configuration parameter hbase.regionserver.wal.slowsync.ms sets the slow sync warning threshold. 
5022 If we encounter hbase.regionserver.wal.slowsync.roll.threshold number of slow syncs (default 100) within the interval defined by hbase.regionserver.wal.slowsync.roll.interval.ms (default 1 minute), we will request a WAL roll. 
5024 Or, if the time for any sync exceeds the threshold set by hbase.regionserver.wal.roll.on.sync.ms (default 10 seconds) we will request a WAL roll immediately.
5026 Operators can monitor how often these new thresholds result in a WAL roll by looking at newly added metrics to the WAL related metric group:
5027 \* slowSyncRollRequest - How many times a roll was requested due to sync too slow on the write pipeline.
5029 Additionally, as a part of this change there are also additional metrics for existing reasons for a WAL roll:
5030 \* errorRollRequest - How many times a roll was requested due to I/O or other errors.
5031 \* sizeRollRequest - How many times a roll was requested due to file size roll threshold.
5036 * [HBASE-21883](https://issues.apache.org/jira/browse/HBASE-21883) | *Minor* | **Enhancements to Major Compaction tool**
5038 MajorCompactorTTL Tool allows to compact all regions in a table that have been TTLed out. This saves space on DFS and is useful for tables which are similar to time series data. This is typically scheduled to run frequently (say via cron) to cleanup old data on an ongoing basis.
5040 RSGroupMajorCompactionTTL tool is similar to MajorCompactorTTL but runs at a region server group level. If multiple tables in an rsgroup are similar to time-series data, then it runs a single command to clean them up. As more tables are added/removed from rsgroup, it's easy to have a single command to take care of all of them.
5045 * [HBASE-22054](https://issues.apache.org/jira/browse/HBASE-22054) | *Minor* | **Space Quota: Compaction is not working for super user in case of NO\_WRITES\_COMPACTIONS**
5047 This change allows the system and superusers to initiate compactions, even when a space quota violation policy disallows compactions from happening. The original intent behind disallowing of compactions was to prevent end-user compactions from creating undue I/O load, not disallowing \*any\* compaction in the system.
5052 * [HBASE-22083](https://issues.apache.org/jira/browse/HBASE-22083) | *Minor* | **move eclipse specific configs into a profile**
5054 <!-- markdown -->
5055 Maven project integration for Eclipse has been isolated into a maven profile to ensure it only is active when in an Eclipse project.
5057 Things should continue to behave the same for Eclipse users. If something should go wrong folks should manually activate the `eclipse-specific` profile.
5062 * [HBASE-22307](https://issues.apache.org/jira/browse/HBASE-22307) | *Major* | **Deprecated Preemptive Fail Fast**
5064 Deprecated Preemptive Fail Fast related constants in HConstants, the support of this feature will be removed in 3.0.0 so use these constants will have no effect for 3.0.0+ releases. And the constants will be kept till 4.0.0.
5066 Users can use 'hbase.client.perserver.requests.threshold' to control the number of concurrent requests to the same region server. Please see the release note of HBASE-16388 for more details.
5071 * [HBASE-22292](https://issues.apache.org/jira/browse/HBASE-22292) | *Blocker* | **PreemptiveFastFailInterceptor clean repeatedFailuresMap issue**
5073 Adds new configuration hbase.client.failure.map.cleanup.interval which defaults to ten minutes.
5078 * [HBASE-19222](https://issues.apache.org/jira/browse/HBASE-19222) | *Major* | **update jruby to 9.1.17.0**
5080 <!-- markdown -->
5082 The default version of JRuby shipped with HBase has been updated to the JRuby 9.1.17.0 release.
5084 For details on changes see [the release notes for JRuby 9.1.17.0](https://www.jruby.org/2018/04/23/jruby-9-1-17-0)
5089 * [HBASE-22279](https://issues.apache.org/jira/browse/HBASE-22279) | *Major* | **Add a getRegionLocator method in Table/AsyncTable interface**
5091 Add below method in Table interface:
5093 RegionLocator getRegionLocator() throws IOException;
5095 Add below methods in AsyncTable interface:
5097 AsyncTableRegionLocator getRegionLocator();
5098 CompletableFuture\<TableDescriptor\> getDescriptor();
5103 * [HBASE-15560](https://issues.apache.org/jira/browse/HBASE-15560) | *Major* | **TinyLFU-based BlockCache**
5105 LruBlockCache uses the Segmented LRU (SLRU) policy to capture frequency and recency of the working set. It achieves concurrency by using an O(n) background thread to prioritize the entries and evict. Accessing an entry is O(1) by a hash table lookup, recording its logical access time, and setting a frequency flag. A write is performed in O(1) time by updating the hash table and triggering an async eviction thread. This provides ideal concurrency and minimizes the latencies by penalizing the thread instead of the caller. However the policy does not age the frequencies and may not be resilient to various workload patterns. 
5107 This change introduces a new L1 policy, TinyLfuBlockCache, which records the frequency in a counting sketch, ages periodically by halving the counters, and orders entries by SLRU. An entry is discarded by comparing the frequency of the new arrival to the SLRU's victim, and keeping the one with the highest frequency. This allows the operations to be performed in O(1) time and, though the use of a compact sketch, a much larger history is retained beyond the current working set. In a variety of real world traces the policy had near optimal hit rates.
5109 New configuration variable hfile.block.cache.policy sets the eviction policy for the L1 block cache. The default is "LRU" (LruBlockCache). Set to "TinyLFU" to use TinyLfuBlockCache instead.
5114 * [HBASE-22178](https://issues.apache.org/jira/browse/HBASE-22178) | *Major* | **Introduce a createTableAsync with TableDescriptor method in Admin**
5116 Introduced
5118 Future\<Void\> createTableAsync(TableDescriptor);
5123 * [HBASE-22108](https://issues.apache.org/jira/browse/HBASE-22108) | *Major* | **Avoid passing null in Admin methods**
5125 Introduced these methods:
5126 void move(byte[]);
5127 void move(byte[], ServerName);
5128 Future\<Void\> splitRegionAsync(byte[]);
5130 These methods are deprecated:
5131 void move(byte[], byte[])
5136 * [HBASE-22152](https://issues.apache.org/jira/browse/HBASE-22152) | *Major* | **Create a jenkins file for yetus to processing GitHub PR**
5138 Add a new jenkins file for running pre commit check for GitHub PR.
5143 * [HBASE-22007](https://issues.apache.org/jira/browse/HBASE-22007) | *Major* | **Add restoreSnapshot and cloneSnapshot with acl methods in AsyncAdmin**
5145 Add cloneSnapshot/restoreSnapshot with acl methods in AsyncAdmin.
5150 * [HBASE-22123](https://issues.apache.org/jira/browse/HBASE-22123) | *Minor* | **REST gateway reports Insufficient permissions exceptions as 404 Not Found**
5152 When insufficient permissions, you now get:
5154 HTTP/1.1 403 Forbidden
5156 on the HTTP side, and in the message
5158 Forbidden
5159 org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘myuser',action: get, tableName:mytable, family:cf.
5160 at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.authorizeAccess(RangerAuthorizationCoprocessor.java:547)
5161 and the rest of the ADE stack
5166 * [HBASE-22100](https://issues.apache.org/jira/browse/HBASE-22100) | *Minor* | **False positive for error prone warnings in pre commit job**
5168 Now we will sort the javac WARNING/ERROR before generating diff in pre-commit so we can get a stable output for the error prone. The downside is that we just sort the output lexicographically so the line number will also be sorted lexicographically, which is a bit strange to human.
5173 * [HBASE-22057](https://issues.apache.org/jira/browse/HBASE-22057) | *Major* | **Impose upper-bound on size of ZK ops sent in a single multi()**
5175 Exposes a new configuration property "zookeeper.multi.max.size" which dictates the maximum size of deletes that HBase will make to ZooKeeper in a single RPC. This property defaults to 1MB, which should fall beneath the default ZooKeeper limit of 2MB, controlled by "jute.maxbuffer".
5180 * [HBASE-22052](https://issues.apache.org/jira/browse/HBASE-22052) | *Major* | **pom cleaning; filter out jersey-core in hadoop2 to match hadoop3 and remove redunant version specifications**
5182 <!-- markdown -->
5183 Fixed awkward dependency issue that prevented site building.
5185 #### note specific to HBase 2.1.4
5186 HBase 2.1.4 shipped with an early version of this fix that incorrectly altered the libraries included in our binary assembly for using Apache Hadoop 2.7 (the current build default Hadoop version for 2.1.z). For folks running out of the box against a Hadoop 2.7 cluster (or folks who skip the installation step of [replacing the bundled Hadoop libraries](http://hbase.apache.org/book.html#hadoop)) this will result in a failure at Region Server startup due to a missing class definition. e.g.:
5188 2019-03-27 09:02:05,779 ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
5189 java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
5190         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
5191         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
5192         at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
5193         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
5194         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
5195         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
5196         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
5197         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
5198         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:171)
5199         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:356)
5200         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
5201         at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
5202         at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
5203         at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
5204         at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:704)
5205         at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:613)
5206         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
5207         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
5208         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
5209         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
5210         at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:3029)
5211         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:63)
5212         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
5213         at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
5214         at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
5215         at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:3047)
5216 Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
5217         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
5218         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
5219         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
5220         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
5221         ... 26 more
5225 Workaround via any _one_ of the following:
5226 * If you are running against a Hadoop cluster that is 2.8+, ensure you replace the Hadoop libaries in the default binary assembly with those for your version.
5227 * If you are running against a Hadoop cluster that is 2.8+, build the binary assembly from the source release while specifying your Hadoop version.
5228 * If you are running against a Hadoop cluster that is a supported 2.7 release, ensure the `hadoop` executable is in the `PATH` seen at Region Server startup and that you are not using the `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP` bypass.
5229 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers via the HBASE_CLASSPATH environment variable.
5230 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers by copying it into the directory `${HBASE_HOME}/lib/client-facing-thirdparty/`.
5235 * [HBASE-22065](https://issues.apache.org/jira/browse/HBASE-22065) | *Major* | **Add listTableDescriptors(List\<TableName\>) method in AsyncAdmin**
5237 Add a listTableDescriptors(List\<TableName\>) method in the AsyncAdmin interface, to align with the Admin interface.
5242 * [HBASE-22063](https://issues.apache.org/jira/browse/HBASE-22063) | *Major* | **Deprecated Admin.deleteSnapshot(byte[])**
5244 Deprecate Admin.deleteSnapshot(byte[]), please use the String version instead.
5249 * [HBASE-22040](https://issues.apache.org/jira/browse/HBASE-22040) | *Major* | **Add mergeRegionsAsync with a List of region names method in AsyncAdmin**
5251 Add a mergeRegionsAsync(byte[][], boolean) method in the AsyncAdmin interface.
5253 Instead of using assert, now we will throw IllegalArgumentException when you want to merge less than 2 regions at client side. And also, at master side, instead of using assert, now we will throw DoNotRetryIOException if you want merge more than 2 regions, since we only support merging two regions at once for now.
5258 * [HBASE-22039](https://issues.apache.org/jira/browse/HBASE-22039) | *Major* | **Should add the synchronous parameter for the XXXSwitch method in AsyncAdmin**
5260 Add drainXXX parameter for balancerSwitch/splitSwitch/mergeSwitch methods in the AsyncAdmin interface, which has the same meaning with the synchronous parameter for these methods in the Admin interface.
5265 * [HBASE-22044](https://issues.apache.org/jira/browse/HBASE-22044) | *Major* | **ByteBufferUtils should not be IA.Public API**
5267 <!-- markdown -->
5269 As of HBase 3.0, the ByteBufferUtils class is now marked as a Private API for internal project use only. Downstream users are advised that it no longer has any compatibility promises across releases.
5271 As of earlier HBase release lines the class is now marked as deprecated to call attention to this planned transition.
5276 * [HBASE-21810](https://issues.apache.org/jira/browse/HBASE-21810) | *Major* | **bulkload  support set hfile compression on client**
5278 bulkload (HFileOutputFormat2)  support config the compression on client ,you can set the job configuration "hbase.mapreduce.hfileoutputformat.compression"  override the auto-detection of the target table's compression
5283 * [HBASE-22001](https://issues.apache.org/jira/browse/HBASE-22001) | *Major* | **Polish the Admin interface**
5285 Add a cloneSnapshotAsync method with restoreAcl parameter.
5286 Deprecated restoreSnapshotAsync method as it just ignores the failsafe configuration.
5287 Make snapshotAsync method returns a Future\<Void\>.
5288 Deprecated the snapshot related methods which take a 'byte[]' as the snapshot name.
5289 Use default methods to reduce the code base for implementation classes.
5294 * [HBASE-22000](https://issues.apache.org/jira/browse/HBASE-22000) | *Major* | **Deprecated isTableAvailable with splitKeys**
5296 Deprecated AsyncTable.isTableAvailable(TableName, byte[][]).
5301 * [HBASE-21871](https://issues.apache.org/jira/browse/HBASE-21871) | *Major* | **Support to specify a peer table name in VerifyReplication tool**
5303 After HBASE-21871, we can specify a peer table name with --peerTableName in VerifyReplication tool like the following:
5304 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable 5 TestTable
5306 In addition, we can compare any 2 tables in any remote clusters with specifying both peerId and --peerTableName.
5308 For example:
5309 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable zk1,zk2,zk3:2181/hbase TestTable
5314 * [HBASE-15728](https://issues.apache.org/jira/browse/HBASE-15728) | *Major* | **Add remaining per-table region / store / flush / compaction related metrics**
5316 Adds below flush, split, and compaction metrics
5318  +  // split related metrics
5319  +  private MutableFastCounter splitRequest;
5320  +  private MutableFastCounter splitSuccess;
5321  +  private MetricHistogram splitTimeHisto;
5323  +  // flush related metrics
5324  +  private MetricHistogram flushTimeHisto;
5325  +  private MetricHistogram flushMemstoreSizeHisto;
5326  +  private MetricHistogram flushOutputSizeHisto;
5327  +  private MutableFastCounter flushedMemstoreBytes;
5328  +  private MutableFastCounter flushedOutputBytes;
5330  +  // compaction related metrics
5331  +  private MetricHistogram compactionTimeHisto;
5332  +  private MetricHistogram compactionInputFileCountHisto;
5333  +  private MetricHistogram compactionInputSizeHisto;
5334  +  private MetricHistogram compactionOutputFileCountHisto;
5335  +  private MetricHistogram compactionOutputSizeHisto;
5336  +  private MutableFastCounter compactedInputBytes;
5337  +  private MutableFastCounter compactedOutputBytes;
5339  +  private MetricHistogram majorCompactionTimeHisto;
5340  +  private MetricHistogram majorCompactionInputFileCountHisto;
5341  +  private MetricHistogram majorCompactionInputSizeHisto;
5342  +  private MetricHistogram majorCompactionOutputFileCountHisto;
5343  +  private MetricHistogram majorCompactionOutputSizeHisto;
5344  +  private MutableFastCounter majorCompactedInputBytes;
5345  +  private MutableFastCounter majorCompactedOutputBytes;
5350 * [HBASE-21481](https://issues.apache.org/jira/browse/HBASE-21481) | *Major* | **[acl] Superuser's permissions should not be granted or revoked by any non-su global admin**
5352 HBASE-21481 improves the quality of access control, by strengthening the protection of super users's privileges.
5357 * [HBASE-21082](https://issues.apache.org/jira/browse/HBASE-21082) | *Critical* | **Reimplement assign/unassign related procedure metrics**
5359 Now we have four types of RIT procedure metrics, assign, unassign, move, reopen. The meaning of assign/unassign is changed, as we will not increase the unassign metric and then the assign metric when moving a region.
5360 Also introduced two new procedure metrics, open and close, which are used to track the open/close region calls to region server. We may send open/close multiple times to finish a RIT since we may retry multiple times.
5365 * [HBASE-20724](https://issues.apache.org/jira/browse/HBASE-20724) | *Critical* | **Sometimes some compacted storefiles are still opened after region failover**
5367 Problem: This is an old problem since HBASE-2231. The compaction event marker was only writed to WAL. But after flush, the WAL may be archived, which means an useful compaction event marker be deleted, too. So the compacted store files cannot be archived when region open and replay WAL.
5369 Solution: After this jira, the compaction event tracker will be writed to HFile. When region open and load store files, read the compaction evnet tracker from HFile and archive the compacted store files which still exist.
5374 * [HBASE-21820](https://issues.apache.org/jira/browse/HBASE-21820) | *Major* | **Implement CLUSTER quota scope**
5376 HBase contains two quota scopes: MACHINE and CLUSTER. Before this patch, set quota operations did not expose scope option to client api and use MACHINE as default, CLUSTER scope can not be set and used. 
5377 Shell commands are as follows:
5378 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
5380 This issue implements CLUSTER scope in a simple way: For user, namespace, user over namespace quota, use [ClusterLimit / RSNum] as machine limit. For table and user over table quota, use [ClusterLimit / TotalTableRegionNum \* MachineTableRegionNum] as machine limit.
5381 After this patch, user can set CLUSTER scope quota, but MACHINE is still default if user ignore scope. 
5382 Shell commands are as follows:
5383 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
5384 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> MACHINE
5385 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> CLUSTER
5390 * [HBASE-21057](https://issues.apache.org/jira/browse/HBASE-21057) | *Minor* | **upgrade to latest spotbugs**
5392 Change spotbugs version to 3.1.11.
5397 * [HBASE-21505](https://issues.apache.org/jira/browse/HBASE-21505) | *Major* | **Several inconsistencies on information reported for Replication Sources by hbase shell status 'replication' command.**
5399 This modifies "status 'replication'" output, fixing inconsistencies on the reporting times and ages of last shipped edits, as well as wrong calculation of replication lags. 
5401 It also introduces additional info for each recovery queue, which was not accounted by this command before.
5403 The new output for "status 'replication'" command is explained in details below:
5404 a) Source started, target stopped, no edits arrived on source yet:
5406  SOURCE: PeerID=1
5407          Normal Queue: 1
5408            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
5410 b) Source started, target stopped, add edit on source:
5412 Normal Queue: 1
5413            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:21:00 GMT 2018, Replication Lag=2459
5415 c) Source started, target stopped, edit added on source, restart source:
5417 SOURCE: PeerID=1
5418          Normal Queue: 1
5419            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
5420          Recovered Queue: 1-hbase01.home,16020,1542784524057
5421            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:23:00 GMT 2018, Replication Lag=201495
5423 d) Source started, target stopped, add edit on source, restart source, add another edit on source:
5425 SOURCE: PeerID=1
5426          Normal Queue: 1
5427            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=6349
5428          Recovered Queue: 1-hbase01.home,16020,1542782758742
5429            No Ops shipped since last restart, SizeOfLogQueue=0, TimeStampOfLastArrivedInSource=Wed Nov 21 06:53:05 GMT 2018, Replication Lag=569394
5431 e) Source started, target stopped, add edit on source, restart source, add another edit on source, start target:
5433        SOURCE: PeerID=1
5434          Normal Queue: 1
5435            AgeOfLastShippedOp=30000, TimeStampOfLastShippedOp=Wed Nov 21 07:07:58 GMT 2018, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=0
5437 f) Source started, target stopped, add edit on source, restart source, restart target:
5439 SOURCE: PeerID=1
5440          Normal Queue: 1
5441            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
5447 * [HBASE-21922](https://issues.apache.org/jira/browse/HBASE-21922) | *Major* | **BloomContext#sanityCheck may failed when use ROWPREFIX\_DELIMITED bloom filter**
5449 Remove bloom filter type ROWPREFIX\_DELIMITED. May add it back when find a better solution.
5454 * [HBASE-21783](https://issues.apache.org/jira/browse/HBASE-21783) | *Major* | **Support exceed user/table/ns throttle quota if region server has available quota**
5456 Support enable or disable exceed throttle quota. Exceed throttle quota means, user can over consume user/namespace/table quota if region server has additional available quota because other users don't consume at the same time. 
5457 Use the following shell commands to enable/disable exceed throttle quota: enable\_exceed\_throttle\_quota
5458 disable\_exceed\_throttle\_quota
5459 There are two limits when enable exceed throttle quota: 
5460 1. Must set at least one read and one write region server throttle quota; 
5461 2. All region server throttle quotas must be in seconds time unit. Because once previous requests exceed their quota and consume region server quota, quota in other time units may be refilled in a long time, this may affect later requests.
5466 * [HBASE-20587](https://issues.apache.org/jira/browse/HBASE-20587) | *Major* | **Replace Jackson with shaded thirdparty gson**
5468 Remove jackson dependencies from most hbase modules except hbase-rest, use shaded gson instead. The output json will be a bit different since jackson can use getter/setter, but gson will always use the fields.
5473 * [HBASE-21928](https://issues.apache.org/jira/browse/HBASE-21928) | *Major* | **Deprecated HConstants.META\_QOS**
5475 Mark HConstants.META\_QOS as deprecated. It is for internal use only, which is the highest priority. You should not try to set a priority greater than or equal to this value, although it is no harm but also useless.
5480 * [HBASE-17942](https://issues.apache.org/jira/browse/HBASE-17942) | *Major* | **Disable region splits and merges per table**
5482 This patch adds the ability to disable split and/or merge for a table (By default, split and merge are enabled for a table).
5487 * [HBASE-21636](https://issues.apache.org/jira/browse/HBASE-21636) | *Major* | **Enhance the shell scan command to support missing scanner specifications like ReadType, IsolationLevel etc.**
5489 Allows shell to set Scan options previously not exposed. See additions as part of the scan help by typing following hbase shell:
5491 hbase\> help 'scan'
5496 * [HBASE-21201](https://issues.apache.org/jira/browse/HBASE-21201) | *Major* | **Support to run VerifyReplication MR tool without peerid**
5498 We can specify peerQuorumAddress instead of peerId in VerifyReplication tool. So it no longer requires peerId to be setup when using this tool.
5500 For example:
5501 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication zk1,zk2,zk3:2181/hbase testTable
5506 * [HBASE-21838](https://issues.apache.org/jira/browse/HBASE-21838) | *Major* | **Create a special ReplicationEndpoint just for verifying the WAL entries are fine**
5508 Introduce a VerifyWALEntriesReplicationEndpoint which replicates nothing but only verifies if all the cells are valid.
5509 It can be used to capture bugs for writing WAL, as most times we will not read the WALs again after writing it if there are no region server crashes.
5514 * [HBASE-21764](https://issues.apache.org/jira/browse/HBASE-21764) | *Major* | **Size of in-memory compaction thread pool should be configurable**
5516 Introduced an new config key in this issue: hbase.regionserver.inmemory.compaction.pool.size. the default value would be 10.  you can configure this to set the pool size of in-memory compaction pool. Note that all memstores in one region server will share the same pool, so if you have many regions in one region server,  you need to set this larger to compact faster for better read performance.
5521 * [HBASE-21684](https://issues.apache.org/jira/browse/HBASE-21684) | *Major* | **Throw DNRIOE when connection or rpc client is closed**
5523 Make StoppedRpcClientException extend DoNotRetryIOException.
5528 * [HBASE-21739](https://issues.apache.org/jira/browse/HBASE-21739) | *Major* | **Move grant/revoke from regionserver to master**
5530 To implement user permission control in Precedure V2, move grant and revoke method from AccessController to master firstly.
5531 Mark AccessController#grant and AccessController#revoke as deprecated and please use Admin#grant and Admin#revoke instead.
5536 * [HBASE-21791](https://issues.apache.org/jira/browse/HBASE-21791) | *Blocker* | **Upgrade thrift dependency to 0.12.0**
5538 IMPORTANT: Due to security issues, all users who use hbase thrift should avoid using releases which do not have this fix.
5540 The effect releases are:
5541 2.1.x: 2.1.2 and below
5542 2.0.x: 2.0.4 and below
5543 1.x: 1.4.x and below
5545 If you are using the effect releases above, please consider upgrading to a newer release ASAP.
5550 * [HBASE-20894](https://issues.apache.org/jira/browse/HBASE-20894) | *Major* | **Move BucketCache from java serialization to protobuf**
5552 For users who have configured hbase.bucketcache.ioengine with either the file:, files:, or mmap: prefix, and configured it to be persistent via the hbase.bucketcache.persistent.path property, the serialization format of the bucket cache has changed between versions. The old state will not be read during startup, and there is currently no migration path. The impact is expected to be minimal, however, since the cache will rebuild over time as access patterns dictate.
5556 # HBASE  2.3.0 Release Notes
5558 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
5563 * [HBASE-24631](https://issues.apache.org/jira/browse/HBASE-24631) | *Major* | **Loosen Dockerfile pinned package versions of the "debian-revision"**
5565 <!-- markdown -->
5566 Update our package version numbers throughout the Dockerfiles to be pinned to their epic:upstream-version components only. Previously we'd specify the full debian package version number, including the debian-revision. This lead to instability as debian packaging details changed.
5567 See also [man deb-version](http://manpages.ubuntu.com/manpages/xenial/en/man5/deb-version.5.html)
5572 * [HBASE-24205](https://issues.apache.org/jira/browse/HBASE-24205) | *Major* | **Create metric to know the number of reads that happens from memstore**
5574 Adds a new metric where we collect the number of read requests (tracked per row) whether the row was fetched completely from memstore or it was pulled from files  and memstore. 
5575 The metric is now collected under the mbean for Tables and under the mbean for regions.
5576 Under table mbean ie.- 
5577 'name": "Hadoop:service=HBase,name=RegionServer,sub=Tables'
5578 The new metrics will be listed as 
5579 {code}
5580     "Namespace\_default\_table\_t3\_columnfamily\_f1\_metric\_memstoreOnlyRowReadsCount": 5,
5581  "Namespace\_default\_table\_t3\_columnfamily\_f1\_metric\_mixedRowReadsCount": 1,
5582 {code}
5583 Where the format is Namespace\_\<namespacename\>\_table\_\<tableName\>\_columnfamily\_\<columnfamilyname\>\_metric\_memstoreOnlyRowReadsCount
5584 Namespace\_\<namespacename\>\_table\_\<tableName\>\_columnfamily\_\<columnfamilyname\>\_metric\_mixedRowReadsCount
5585 {code}
5587 The same one under the region ie. 
5588 "name": "Hadoop:service=HBase,name=RegionServer,sub=Regions",
5589 comes as
5590 {code}
5591    "Namespace\_default\_table\_t3\_region\_75a7846f4ac4a2805071a855f7d0dbdc\_store\_f1\_metric\_memstoreOnlyRowReadsCount": 5,
5592     "Namespace\_default\_table\_t3\_region\_75a7846f4ac4a2805071a855f7d0dbdc\_store\_f1\_metric\_mixedRowReadsCount": 1,
5593 {code}
5594 where
5595 Namespace\_\<namespacename\_table\_\<tableName\>\_region\_\<regionName\>\_store\_\<storeName\>\_metric\_memstoreOnlyRowReadsCount
5596 Namespace\_\<namespacename\_table\_\<tableName\>\_region\_\<regionName\>\_store\_\<storeName\>\_metric\_mixedRowReadsCount
5597 This is also an aggregate against every store the number of reads that happened purely from the memstore or it was a  mixed read that happened from memstore and file.
5602 * [HBASE-21773](https://issues.apache.org/jira/browse/HBASE-21773) | *Critical* | **rowcounter utility should respond to pleas for help**
5604 This adds [-h\|-help] options to rowcounter. Passing either -h or -help will print rowcounter guide as below: 
5606 $hbase rowcounter -h
5608 usage: hbase rowcounter \<tablename\> [options] [\<column1\> \<column2\>...]
5609 Options:
5610     --starttime=\<arg\>       starting time filter to start counting rows from.
5611     --endtime=\<arg\>         end time filter limit, to only count rows up to this timestamp.
5612     --range=\<arg\>           [startKey],[endKey][;[startKey],[endKey]...]]
5613     --expectedCount=\<arg\>   expected number of rows to be count.
5614 For performance, consider the following configuration properties:
5615 -Dhbase.client.scanner.caching=100
5616 -Dmapreduce.map.speculative=false
5621 * [HBASE-24217](https://issues.apache.org/jira/browse/HBASE-24217) | *Major* | **Add hadoop 3.2.x support**
5623 CI coverage has been extended to include Hadoop 3.2.x for HBase 2.2+.
5628 * [HBASE-23055](https://issues.apache.org/jira/browse/HBASE-23055) | *Major* | **Alter hbase:meta**
5630 Adds being able to edit hbase:meta table schema. For example,
5632 hbase(main):006:0\> alter 'hbase:meta', {NAME =\> 'info', DATA\_BLOCK\_ENCODING =\> 'ROW\_INDEX\_V1'}
5633 Updating all regions with the new schema...
5634 All regions updated.
5635 Done.
5636 Took 1.2138 seconds
5638 You can even add columnfamilies. Howevert, you cannot delete any of the core hbase:meta column families such as 'info' and 'table'.
5643 * [HBASE-15161](https://issues.apache.org/jira/browse/HBASE-15161) | *Major* | **Umbrella: Miscellaneous improvements from production usage**
5645 This ticket summarizes significant improvements and expansion to the metrics surface area. Interested users should review the individual sub-tasks.
5650 * [HBASE-24545](https://issues.apache.org/jira/browse/HBASE-24545) | *Major* | **Add backoff to SCP check on WAL split completion**
5652 Adds backoff in ServerCrashProcedure wait on WAL split to complete if large backlog of files to split (Its possible to avoid SCP blocking, waiting on WALs to split if you use procedure-based splitting --  set 'hbase.split.wal.zk.coordinated' to false to enable procedure based wal splitting.)
5657 * [HBASE-24524](https://issues.apache.org/jira/browse/HBASE-24524) | *Minor* | **SyncTable logging improvements**
5659 Notice this has changed log level for mismatching row keys, originally those were being logged at INFO level, now it's logged at DEBUG level. This is consistent with the logging of mismatching cells. Also, for missing row keys, it now logs row key values in human readable format, making it more meaningful for operators troubleshooting mismatches.
5664 * [HBASE-24359](https://issues.apache.org/jira/browse/HBASE-24359) | *Major* | **Optionally ignore edits for deleted CFs for replication.**
5666 Introduce a new config hbase.replication.drop.on.deleted.columnfamily, default is false. When config to true, the replication will drop the edits for columnfamily that has been deleted from the replication source and target.
5671 * [HBASE-24418](https://issues.apache.org/jira/browse/HBASE-24418) | *Major* | **Consolidate Normalizer implementations**
5673 <!-- markdown -->
5674 This change extends the Normalizer with a handful of new configurations. The configuration points supported are:
5675 * `hbase.normalizer.split.enabled` Whether to split a region as part of normalization. Default: `true`.
5676 * `hbase.normalizer.merge.enabled` Whether to merge a region as part of normalization. Default `true`.
5677 * `hbase.normalizer.min.region.count` The minimum number of regions in a table to consider it for merge normalization. Default: 3.
5678 * `hbase.normalizer.merge.min_region_age.days` The minimum age for a region to be considered for a merge, in days. Default: 3.
5679 * `hbase.normalizer.merge.min_region_size.mb` The minimum size for a region to be considered for a merge, in whole MBs. Default: 1.
5684 * [HBASE-24309](https://issues.apache.org/jira/browse/HBASE-24309) | *Major* | **Avoid introducing log4j and slf4j-log4j dependencies for modules other than hbase-assembly**
5686 Add a hbase-logging module, put the log4j related code in this module only so other modules do not need to depend on log4j at compile scope. See the comments of Log4jUtils and InternalLog4jUtils for more details.
5688 Add a log4j.properties to the test jar of hbase-logging module, so for other sub modules we just need to depend on the test jar of hbase-logging module at test scope to output the log to console, without placing a log4j.properties in the test resources as they all (almost) have the same content. And this test module will not be included in the assembly tarball so it will not mess up the binary distribution.
5690 Ban direct commons-logging dependency, and ban commons-logging and log4j imports in non-test code, to avoid mess up the downstream users logging framework. In hbase-logging module we do need to use log4j classes and the trick is to use full class name.
5692 Add jcl-over-slf4j and jul-to-slf4j dependencies, as some of our dependencies use jcl or jul as logging framework, we should also redirect their log message to slf4j.
5697 * [HBASE-21406](https://issues.apache.org/jira/browse/HBASE-21406) | *Minor* | **"status 'replication'" should not show SINK if the cluster does not act as sink**
5699 Added new metric to differentiate sink startup time from last OP applied time.
5701 Original behaviour was to always set startup time to TimestampsOfLastAppliedOp, and always show it on "status 'replication'" command, regardless if the sink ever applied any OP. 
5703 This was confusing, specially for scenarios where cluster was just acting as source, the output could lead to wrong interpretations about sink not applying edits or replication being stuck. 
5705 With the new metric, we now compare the two metrics values, assuming that if both are the same, there's never been any OP shipped to the given sink, so output would reflect it more clearly, to something as for example:
5707 SINK: TimeStampStarted=Thu Dec 06 23:59:47 GMT 2018, Waiting for OPs...
5712 * [HBASE-24132](https://issues.apache.org/jira/browse/HBASE-24132) | *Major* | **Upgrade to Apache ZooKeeper 3.5.7**
5714 <!-- markdown -->
5715 HBase ships ZooKeeper 3.5.x. Was the EOL'd 3.4.x. 3.5.x client can talk to 3.4.x ensemble.
5717 The ZooKeeper project has built a [FAQ](https://cwiki.apache.org/confluence/display/ZOOKEEPER/Upgrade+FAQ) that documents known issues and work-arounds when upgrading existing deployments.
5722 * [HBASE-22287](https://issues.apache.org/jira/browse/HBASE-22287) | *Major* | **inifinite retries on failed server in RSProcedureDispatcher**
5724 Add backoff. Avoid retrying every 100ms.
5729 * [HBASE-24425](https://issues.apache.org/jira/browse/HBASE-24425) | *Major* | **Run hbck\_chore\_run and catalogjanitor\_run on draw of 'HBCK Report' page**
5731 Runs 'catalogjanitor\_run' and 'hbck\_chore\_run' inline with the loading of the 'HBCK Report' page.
5733 Pass '?cache=true' to skip inline invocation of 'catalogjanitor\_run' and 'hbck\_chore\_run' drawing the page.
5738 * [HBASE-24408](https://issues.apache.org/jira/browse/HBASE-24408) | *Blocker* | **Introduce a general 'local region' to store data on master**
5740 Introduced a general 'local region' at master side to store the procedure data, etc.
5742 The hfile of this region will be stored on the root fs while the wal will be stored on the wal fs. This issue supercedes part of the code for HBASE-23326, as now we store the data in 'MasterData' directory instead of 'MasterProcs'.
5744 The old hfiles will be moved to the global hfile archived directory with the suffix $-masterlocalhfile-$. The wal files will be moved to the global old wal directory with the suffix $masterlocalwal$. The TimeToLiveMasterLocalStoreHFileCleaner and TimeToLiveMasterLocalStoreWALCleaner are configured by default for cleaning the old hfiles and wal files, and the default TTLs are both 7 days.
5749 * [HBASE-24115](https://issues.apache.org/jira/browse/HBASE-24115) | *Major* | **Relocate test-only REST "client" from src/ to test/ and mark Private**
5751 Relocate test-only REST RemoteHTable and RemoteAdmin from src/ to test/. And mark them as InterfaceAudience.Private.
5756 * [HBASE-23938](https://issues.apache.org/jira/browse/HBASE-23938) | *Major* | **Replicate slow/large RPC calls to HDFS**
5758 Config key: hbase.regionserver.slowlog.systable.enabled
5759 Default value: false
5761 This config can be enabled if hbase.regionserver.slowlog.buffer.enabled is already enabled. While hbase.regionserver.slowlog.buffer.enabled ensures that any slow/large RPC logs with complete details are written to ring buffer available at each RegionServer, hbase.regionserver.slowlog.systable.enabled would ensure that all such logs are also persisted in new system table hbase:slowlog. 
5762 Operator can scan hbase:slowlog with filters to retrieve specific attribute matching records and this table would be useful to capture historical performance of slowness of RPC calls with detailed analysis.
5764 hbase:slowlog consists of single ColumnFamily info. info consists of multiple qualifiers similar to the attributes available to query as part of Admin API: get\_slowlog\_responses.
5766 One example of a row from hbase:slowlog scan result (Attached a sample screenshot in the Jira) :
5768  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:call\_details, timestamp=2020-05-16T14:59:58.764Z, value=Scan(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ScanRequest)                             
5769  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:client\_address, timestamp=2020-05-16T14:59:58.764Z, value=172.20.10.2:57348                                                                                          
5770  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:method\_name, timestamp=2020-05-16T14:59:58.764Z, value=Scan                                                                                                          
5771  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:param, timestamp=2020-05-16T14:59:58.764Z, value=region { type: REGION\_NAME value: "cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf." } scan { a
5772                                                              ttribute { name: "\_isolationlevel\_" value: "\\x5C000" } start\_row: "cccccccc" time\_range { from: 0 to: 9223372036854775807 } max\_versions: 1 cache\_blocks: true max\_result\_size: 2
5773                                                              097152 caching: 2147483647 include\_stop\_row: false } number\_of\_rows: 2147483647 close\_scanner: false client\_handles\_partials: true client\_handles\_heartbeats: true track\_scan\_met
5774                                                              rics: false                                                                                                                                                                      
5775  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:processing\_time, timestamp=2020-05-16T14:59:58.764Z, value=24                                                                                                        
5776  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:queue\_time, timestamp=2020-05-16T14:59:58.764Z, value=0                                                                                                              
5777  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:region\_name, timestamp=2020-05-16T14:59:58.764Z, value=cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf.                                         
5778  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:response\_size, timestamp=2020-05-16T14:59:58.764Z, value=211227                                                                                                      
5779  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:server\_class, timestamp=2020-05-16T14:59:58.764Z, value=HRegionServer                                                                                                
5780  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:start\_time, timestamp=2020-05-16T14:59:58.764Z, value=1589640743932                                                                                                  
5781  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:type, timestamp=2020-05-16T14:59:58.764Z, value=ALL                                                                                                                  
5782  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:username, timestamp=2020-05-16T14:59:58.764Z, value=vjasani
5787 * [HBASE-24271](https://issues.apache.org/jira/browse/HBASE-24271) | *Major* | **Set values in \`conf/hbase-site.xml\` that enable running on \`LocalFileSystem\` out of the box**
5789 <!-- markdown -->
5790 HBASE-24271 makes changes the the default `conf/hbase-site.xml` such that `bin/hbase` will run directly out of the binary tarball or a compiled source tree without any configuration modifications vs. Hadoop 2.8+. This changes our long-standing history of shipping no configured values in `conf/hbase-site.xml`, so existing processes that assume this file is empty of configuration properties may require attention.
5795 * [HBASE-24310](https://issues.apache.org/jira/browse/HBASE-24310) | *Major* | **Use Slf4jRequestLog for hbase-http**
5797 Use Slf4jRequestLog instead of the log4j HttpRequestLogAppender in HttpServer.
5799 The request log is disabled by default in conf/log4j.properties by the following lines:
5801 # Disable request log by default, you can enable this by changing the appender
5802 log4j.category.http.requests=INFO,NullAppender
5803 log4j.additivity.http.requests=false
5805 Change the 'NullAppender' to what ever you want if you want to enable request log.
5807 Notice that, the logger name for master status http server is 'http.requests.master', and for region server it is 'http.requests.regionserver'
5812 * [HBASE-24335](https://issues.apache.org/jira/browse/HBASE-24335) | *Major* | **Support deleteall with ts but without column in shell mode**
5814 Use a empty string to represent no column specified for deleteall in shell mode.
5815 useage:  
5816 deleteall 'test','r1','',12345
5817 deleteall 'test', {ROWPREFIXFILTER =\> 'prefix'}, '', 12345
5822 * [HBASE-24304](https://issues.apache.org/jira/browse/HBASE-24304) | *Major* | **Separate a hbase-asyncfs module**
5824 Added a new hbase-asyncfs module to hold the asynchronous dfs output stream implementation for implementing WAL.
5829 * [HBASE-22710](https://issues.apache.org/jira/browse/HBASE-22710) | *Major* | **Wrong result in one case of scan that use  raw and versions and filter together**
5831 Make the logic of the versions chosen more reasonable for raw scan, to avoid lose result when using filter.
5836 * [HBASE-24285](https://issues.apache.org/jira/browse/HBASE-24285) | *Major* | **Move to hbase-thirdparty-3.3.0**
5838 Moved to hbase-thirdparty 3.3.0.
5843 * [HBASE-24252](https://issues.apache.org/jira/browse/HBASE-24252) | *Major* | **Implement proxyuser/doAs mechanism for hbase-http**
5845 This feature enables the HBase Web UI's to accept a 'proxyuser' via the HTTP Request's query string. When the parameter \`hbase.security.authentication.spnego.kerberos.proxyuser.enable\` is set to \`true\` in hbase-site.xml (default is \`false\`), the HBase UI will attempt to impersonate the user specified by the query parameter "doAs". This query parameter is checked case-insensitively. When this option is not provided, the user who executed the request is the "real" user and there is no ability to execute impersonation against the WebUI.
5847 For example, if the user "bob" with Kerberos credentials executes a request against the WebUI with this feature enabled and a query string which includes \`doAs=alice\`, the HBase UI will treat this request as executed as \`alice\`, not \`bob\`.
5849 The standard Hadoop proxyuser configuration properties to limit users who may impersonate others apply to this change (e.g. to enable \`bob\` to impersonate \`alice\`). See the Hadoop documentation for more information on how to configure these proxyuser rules.
5854 * [HBASE-24143](https://issues.apache.org/jira/browse/HBASE-24143) | *Major* | **[JDK11] Switch default garbage collector from CMS**
5856 <!-- markdown -->
5857 `bin/hbase` will now dynamically select a Garbage Collector implementation based on the detected JVM version. JDKs 8,9,10 use `-XX:+UseConcMarkSweepGC`, while JDK11+ use `-XX:+UseG1GC`.
5859 Notice a slight compatibility change. Previously, the garbage collector choice would always be appended to a user-provided value for `HBASE_OPTS`. As of this change, this setting will only be applied when `HBASE_OPTS` is unset. That means that operators who provide a value for this variable will now need to also specify the collector. This is especially important for those on JDK8, where the vm default GC is not the recommended ConcMarkSweep.
5864 * [HBASE-24024](https://issues.apache.org/jira/browse/HBASE-24024) | *Major* | **Optionally reject multi() requests with very high no of rows**
5866 New Config: hbase.rpc.rows.size.threshold.reject
5867 -----------------------------------------------------------------------
5869 Default value: false
5870 Description:
5871 If value is true, RegionServer will abort batch requests of Put/Delete with number of rows in a batch operation exceeding threshold defined by value of config: hbase.rpc.rows.warning.threshold.
5876 * [HBASE-24139](https://issues.apache.org/jira/browse/HBASE-24139) | *Critical* | **Balancer should avoid leaving idle region servers**
5878 StochasticLoadBalancer functional improvement:
5880 StochasticLoadBalancer would rebalance the cluster if there are any idle RegionServers in the cluster (RegionServer having no region), while other RegionServers have at least 1 region available.
5885 * [HBASE-24196](https://issues.apache.org/jira/browse/HBASE-24196) | *Major* | **[Shell] Add rename rsgroup command in hbase shell**
5887 user or admin can now use
5888 hbase shell \> rename\_rsgroup 'oldname', 'newname'
5889 to rename rsgroup.
5894 * [HBASE-24218](https://issues.apache.org/jira/browse/HBASE-24218) | *Major* | **Add hadoop 3.2.x in hadoop check**
5896 Add hadoop-3.2.0 and hadoop-3.2.1 in hadoop check and when '--quick-hadoopcheck' we will only check hadoop-3.2.1.
5898 Notice that, for aligning the personality scripts across all the active branches, we will commit the patch to all active branches, but the hadoop-3.2.x support in hadoopcheck is only applied to branch-2.2+.
5903 * [HBASE-23829](https://issues.apache.org/jira/browse/HBASE-23829) | *Major* | **Get \`-PrunSmallTests\` passing on JDK11**
5905 \`-PrunSmallTests\` now pass on JDK11 when using \`-Phadoop.profile=3.0\`.
5910 * [HBASE-24185](https://issues.apache.org/jira/browse/HBASE-24185) | *Major* | **Junit tests do not behave well with System.exit or Runtime.halt or JVM exits in general.**
5912 Tests that fail because a process -- RegionServer or Master -- called System.exit, will now instead throw an exception.
5917 * [HBASE-24072](https://issues.apache.org/jira/browse/HBASE-24072) | *Major* | **Nightlies reporting OutOfMemoryError: unable to create new native thread**
5919 Hadoop hosts have had their ulimit -u raised from 10000 to 30000 (per user, by INFRA). The Docker build container has had its limit raised from 10000 to 12500.
5924 * [HBASE-24112](https://issues.apache.org/jira/browse/HBASE-24112) | *Major* | **[RSGroup] Support renaming rsgroup**
5926 Support RSGroup renaming in core codebase. New API Admin#renameRSGroup(String, String) is introduced in 3.0.0.
5931 * [HBASE-23994](https://issues.apache.org/jira/browse/HBASE-23994) | *Trivial* | ** Add WebUI to Canary**
5933 <!-- markdown -->
5934 The Canary tool now offers a WebUI when run in `region` mode (the default mode). It is enabled by default, and by default, it binds to `0.0.0.0:16050`. This can be overridden by setting `hbase.canary.info.bindAddress` and `hbase.canary.info.port`. To disable entirely, set the port to `-1`.
5939 * [HBASE-23779](https://issues.apache.org/jira/browse/HBASE-23779) | *Major* | **Up the default fork count to make builds complete faster; make count relative to CPU count**
5941 Pass --threads=2 building on jenkins. It shortens nightly build times by about ~25%.
5943 It works by running module build/test in parallel when dependencies allow. Upping the forkcount beyond the pom default of 0.25C would have us broach our CPU budget on jenkins when two modules are running in parallel (2 modules at 0.25% of CPU each makes 0.5C and on jenkins, hadoop nodes run two jenkins executors per host).  Higher forkcounts also seems to threaten build stability.
5945 For running tests locally, to go faster, up fork count.
5947 $ x="0.5C"  ;  mvn --threads=2  -Dsurefire.firstPartForkCount=$x -Dsurefire.secondPartForkCount=$x test -PrunAllTests
5949 You could up the x from 0.5C to 1.0C but YMMV (On overcommitted hardware, tests start bombing out pretty soon after startup). You could try upping thread count but on occasion are likely to overcommit hardware.
5954 * [HBASE-24126](https://issues.apache.org/jira/browse/HBASE-24126) | *Major* | **Up the container nproc uplimit from 10000 to 12500**
5956 Start docker with upped ulimit for nproc passing '--ulimit nproc=12500'. It was 10000, the default, but made it 12500. Then, set PROC\_LIMIT in hbase-personality so when yetus runs, it is w/ the new 12500 value.
5961 * [HBASE-24150](https://issues.apache.org/jira/browse/HBASE-24150) | *Major* | **Allow module tests run in parallel**
5963 Pass -T2 to mvn. Makes it so we do two modules-at-a-time dependencies willing. Helps speed build and testing. Doubles the resource usage when running modules in parallel.
5968 * [HBASE-24121](https://issues.apache.org/jira/browse/HBASE-24121) | *Major* | **[Authorization] ServiceAuthorizationManager isn't dynamically updatable. And it should be.**
5970 Master & RegionService now support refresh policy authorization defined in hbase-policy.xml without restarting service. To refresh policy, please execute hbase shell command: update\_config or update\_config\_all after policy file updated and synced on all nodes.
5975 * [HBASE-24099](https://issues.apache.org/jira/browse/HBASE-24099) | *Major* | **Use a fair ReentrantReadWriteLock for the region close lock**
5977 This change modifies the default acquisition policy for the region's close lock in order to prevent observed starvation of close requests. The new boolean configuration parameter 'hbase.regionserver.fair.region.close.lock' controls the lock acquisition policy: if true, the lock is created in fair mode (default); if false, the lock is created in nonfair mode (the old default).
5982 * [HBASE-23153](https://issues.apache.org/jira/browse/HBASE-23153) | *Major* | **PrimaryRegionCountSkewCostFunction SLB function should implement CostFunction#isNeeded**
5984 <!-- markdown -->
5985 The `PrimaryRegionCountSkewCostFunction` for the `StochasticLoadBalancer` is only needed when the read replicas feature is enabled. With this change, that function now properly indicates that it is not needed when the read replica feature is off.
5987 If this improvement is not available, operators with clusters that are not using the read replica feature should manually disable it by setting `hbase.master.balancer.stochastic.primaryRegionCountCost` to `0.0` in hbase-site.xml for all HBase Masters.
5992 * [HBASE-24055](https://issues.apache.org/jira/browse/HBASE-24055) | *Major* | **Make AsyncFSWAL can run on EC cluster**
5994 Now AsyncFSWAL can also be used against the directory which has EC enabled. Need to make sure you also make use of the hadoop 3.x client as the option is only available in hadoop 3.x.
5999 * [HBASE-24113](https://issues.apache.org/jira/browse/HBASE-24113) | *Major* | **Upgrade the maven we use from 3.5.4 to 3.6.3 in nightlies**
6001 Branches-2.3+ use maven 3.5.3 building. Older branches use 3.5.4 still.
6006 * [HBASE-24122](https://issues.apache.org/jira/browse/HBASE-24122) | *Major* | **Change machine ulimit-l to ulimit-a so dumps full ulimit rather than just 'max locked memory'**
6008 Our 'Build Artifacts' have a machine directory under which we emit vitals on the host the build was run on. We used to emit the result of 'ulimit -l' as a file named 'ulimit-l'. This has been hijacked to instead emit result of running 'ulimit -a' which includes stat on ulimit -l.
6013 * [HBASE-23678](https://issues.apache.org/jira/browse/HBASE-23678) | *Major* | **Literate builder API for version management in schema**
6015 ColumnFamilyDescriptor new builder API:
6017     /\*\*
6018      \* Retain all versions for a given TTL(retentionInterval), and then only a specific number
6019      \* of versions(versionAfterInterval) after that interval elapses.
6020      \*
6021      \* @param retentionInterval Retain all versions for this interval
6022      \* @param versionAfterInterval Retain no of versions to retain after retentionInterval
6023      \*/
6024     public ModifyableColumnFamilyDescriptor setVersionsWithTimeToLive(
6025         final int retentionInterval, final int versionAfterInterval)
6030 * [HBASE-24050](https://issues.apache.org/jira/browse/HBASE-24050) | *Major* | **Deprecated PBType on all 2.x branches**
6032 org.apache.hadoop.hbase.types.PBType is marked as deprecated without any replacement. It will be moved to hbase-example module and marked as IA.Private in 3.0.0. This is a mistake as it should not be part of our public API. Users who depend on this class should just copy the code your own code base.
6037 * [HBASE-8868](https://issues.apache.org/jira/browse/HBASE-8868) | *Minor* | **add metric to report client shortcircuit reads**
6039 Expose file system level read metrics for RegionServer.
6041 If the HBase RS runs on top of HDFS, calculate the aggregation of
6042 ReadStatistics of each HdfsFileInputStream. These metrics include:
6043 (1) total number of bytes read from HDFS.
6044 (2) total number of bytes read from local DataNode.
6045 (3) total number of bytes read locally through short-circuit read.
6046 (4) total number of bytes read locally through zero-copy read.
6048 Because HDFS ReadStatistics is calculated per input stream, it is not
6049 feasible to update the aggregated number in real time. Instead, the
6050 metrics are updated when an input stream is closed.
6055 * [HBASE-24032](https://issues.apache.org/jira/browse/HBASE-24032) | *Major* | **[RSGroup] Assign created tables to respective rsgroup automatically instead of manual operations**
6057 Admin can determine which tables go to which rsgroup by script  (setting hbase.rsgroup.table.mapping.script with local filystem path) on Master side which aims to lighten the burden of admin operations.  Note, since HBase 3+, rsgroup can be specified in TableDescriptor as well, if clients specify this, master will skip the determination from script.
6059 Here is a simple example of script:
6060 {code}
6061 # Input consists of two string, 1st is the namespace of the table, 2nd is the table name of the table
6062 #!/bin/bash
6063 namespace=$1
6064 tablename=$2
6065 if [[ $namespace == test ]]; then
6066   echo test
6067 elif [[ $tablename == \*foo\* ]]; then
6068   echo other
6069 else
6070   echo default
6072 {code}
6077 * [HBASE-23993](https://issues.apache.org/jira/browse/HBASE-23993) | *Major* | **Use loopback for zk standalone server in minizkcluster**
6079 MiniZKCluster now puts up its standalone node listening on loopback/127.0.0.1 rather than "localhost".
6084 * [HBASE-23986](https://issues.apache.org/jira/browse/HBASE-23986) | *Major* | **Bump hadoop-two.version to 2.10.0 on master and branch-2**
6086 Bumped hadoop-two.version to 2.10.0, which means we will drop the support for hadoop-2.8.x and hadoop-2.9.x.
6091 * [HBASE-23930](https://issues.apache.org/jira/browse/HBASE-23930) | *Minor* | **Shell should attempt to format \`timestamp\` attributes as ISO-8601**
6093 Change timestamp display to be ISO8601 when toString on Cell and outputting in shell....
6095 User used to see....
6096     
6097   column=table:state, timestamp=1583967620343 .....
6099 ... but now sees:
6101   column=table:state, timestamp=2020-03-11T23:00:20.343Z ....
6106 * [HBASE-22827](https://issues.apache.org/jira/browse/HBASE-22827) | *Major* | **Expose multi-region merge in shell and Admin API**
6108 merge\_region shell command can now be used to merge more than 2 regions as well. It takes a list of regions as comma separated values or as an array of regions, and not just 2 regions. The full regionnames and encoded regionnames are continued to be accepted.
6113 * [HBASE-23767](https://issues.apache.org/jira/browse/HBASE-23767) | *Major* | **Add JDK11 compilation and unit test support to Github precommit**
6115 Rebuild our Dockerfile with support for multiple JDK versions. Use multiple stages in the Jenkinsfile instead of yetus's multijdk because of YETUS-953. Run those multiple stages in parallel to speed up results.
6117 Note that multiple stages means multiple Yetus invocations means multiple comments on the PreCommit. This should become more obvious to users once we can make use of GitHub Checks API, HBASE-23902.
6122 * [HBASE-22978](https://issues.apache.org/jira/browse/HBASE-22978) | *Minor* | **Online slow response log**
6124 get\_slowlog\_responses and clear\_slowlog\_responses are used to retrieve and clear slow RPC logs from RingBuffer maintained by RegionServers.
6126 New Admin APIs:
6127 1.   List\<SlowLogRecord\> getSlowLogResponses(final Set\<ServerName\> serverNames,
6128       final SlowLogQueryFilter slowLogQueryFilter) throws IOException;
6130 2.   List\<Boolean\> clearSlowLogResponses(final Set\<ServerName\> serverNames)
6131       throws IOException;
6133 Configs:
6135 1. hbase.regionserver.slowlog.ringbuffer.size:
6136 Default size of ringbuffer to be maintained by each RegionServer in order to store online slowlog responses. This is an in-memory ring buffer of requests that were judged to be too slow in addition to the responseTooSlow logging. The in-memory representation would be complete. For more details, please look into Doc Section: Get Slow Response Log from shell
6138 Default
6141 2. hbase.regionserver.slowlog.buffer.enabled:
6142 Indicates whether RegionServers have ring buffer running for storing Online Slow logs in FIFO manner with limited entries. The size of the ring buffer is indicated by config: hbase.regionserver.slowlog.ringbuffer.size The default value is false, turn this on and get latest slowlog responses with complete data.
6144 Default
6145 false
6148 For more details, please look into "Get Slow Response Log from shell" section from HBase book.
6153 * [HBASE-23926](https://issues.apache.org/jira/browse/HBASE-23926) | *Major* | **[Flakey Tests] Down the flakies re-run ferocity; it makes for too many fails.**
6155 Down the flakey re-rerun fork count from 1.0C -- i.e. a fork per CPU -- to 0.25C. On a recent run, the machine had 16 cores. 0.25 is 4 cores. We'd hardcoded fork count at 3 previous to changes made by parent.
6160 * [HBASE-23146](https://issues.apache.org/jira/browse/HBASE-23146) | *Major* | **Support CheckAndMutate with multiple conditions**
6162 Add a checkAndMutate(row, filter) method in the AsyncTable interface and the Table interface.
6164 This method atomically checks if the row matches the specified filter. If it does, it adds the Put/Delete/RowMutations.
6166 This is a fluent style API, the code is like:
6168 For Table interface:
6169 {code}
6170 table.checkAndMutate(row, filter).thenPut(put);
6171 {code}
6173 For AsyncTable interface:
6174 {code}
6175 table.checkAndMutate(row, filter).thenPut(put)
6176     .thenAccept(succ -\> {
6177       if (succ) {
6178         System.out.println("Check and put succeeded");
6179       } else {
6180         System.out.println("Check and put failed");
6181       }
6182     });
6183 {code}
6188 * [HBASE-23874](https://issues.apache.org/jira/browse/HBASE-23874) | *Minor* | **Move Jira-attached file precommit definition from script in Jenkins config to dev-support**
6190 The Jira Precommit job (https://builds.apache.org/job/PreCommit-HBASE-Build/) will now look for a file within the source tree (dev-support/jenkins\_precommit\_jira\_yetus.sh) instead of depending on a script section embedded in the job.
6195 * [HBASE-23865](https://issues.apache.org/jira/browse/HBASE-23865) | *Major* | **Up flakey history from 5 to 10**
6197 Changed flakey list reporting to show 5 rather than 10 items. Also changed the second and first part fort counts to be 1C rather than hardcoded 3.
6202 * [HBASE-23554](https://issues.apache.org/jira/browse/HBASE-23554) | *Major* | **Encoded regionname to regionname utility**
6204     Adds shell command regioninfo:
6206       hbase(main):001:0\>  regioninfo '0e6aa5c19ae2b2627649dc7708ce27d0'
6207       {ENCODED =\> 0e6aa5c19ae2b2627649dc7708ce27d0, NAME =\> 'TestTable,,1575941375972.0e6aa5c19ae2b2627649dc7708ce27d0.', STARTKEY =\> '', ENDKEY =\> '00000000000000000000299441'}
6208       Took 0.4737 seconds
6213 * [HBASE-23350](https://issues.apache.org/jira/browse/HBASE-23350) | *Major* | **Make compaction files cacheonWrite configurable based on threshold**
6215 This JIRA adds a new configuration - \`hbase.rs.cachecompactedblocksonwrite.threshold\`. This configuration is the maximum total size (in bytes) of the compacted files below which the configuration \`hbase.rs.cachecompactedblocksonwrite\` is honoured. If the total size of the compacted fies exceeds this threshold, even when \`hbase.rs.cachecompactedblocksonwrite\` is enabled, the data blocks are not cached. Caching index and bloom blocks is not affected by this configuration (user configuration is always honoured).
6217 Default value of this configuration is Long.MAX\_VALUE. This means whatever the total size of the compacted files, it wil be cached.
6222 * [HBASE-17115](https://issues.apache.org/jira/browse/HBASE-17115) | *Major* | **HMaster/HRegion Info Server does not honour admin.acl**
6224 Implements authorization for the HBase Web UI by limiting access to certain endpoints which could be used to extract sensitive information from HBase.
6226 Access to these restricted endpoints can be limited to a group of administrators, identified either by a list of users (hbase.security.authentication.spnego.admin.users) or by a list of groups
6227 (hbase.security.authentication.spnego.admin.groups).  By default, neither of these values are set which will preserve backwards compatibility (allowing all authenticated users to access all endpoints).
6229 Further, users who have sensitive information in the HBase service configuration can set hbase.security.authentication.ui.config.protected to true which will treat the configuration endpoint as a protected, admin-only resource. By default, all authenticated users may access the configuration endpoint.
6234 * [HBASE-23647](https://issues.apache.org/jira/browse/HBASE-23647) | *Major* | **Make MasterRegistry the default registry impl**
6236 <!-- markdown -->
6237 Enables master based registry as the default registry used by clients to fetch connection metadata.
6238 Refer to the section "Master Registry" in the client documentation for more details and advantages
6239 of this implementation over the default Zookeeper based registry. 
6241 Configuration parameter that controls the registry in use: `hbase.client.registry.impl`
6243 Where to set this: HBase client configuration (hbase-site.xml)
6245 Possible values:
6246 - `org.apache.hadoop.hbase.client.ZKConnectionRegistry` (For ZK based registry implementation)
6247 - `org.apache.hadoop.hbase.client.MasterRegistry` (New, for master based registry implementation)
6249 Notes on defaults:
6251 - For v3.0.0 and later, MasterRegistry is the default registry
6252 - For all releases in 2.x line, ZK based registry is the default.
6254 This feature has been back ported to 2.3.0 and later releases. MasterRegistry can be enabled by setting the following client configuration.
6257 <property>
6258   <name>hbase.client.registry.impl</name>
6259   <value>org.apache.hadoop.hbase.client.MasterRegistry</value>
6260 </property>
6266 * [HBASE-23069](https://issues.apache.org/jira/browse/HBASE-23069) | *Critical* | **periodic dependency bump for Sep 2019**
6268 caffeine: 2.6.2 =\> 2.8.1
6269 commons-codec: 1.10 =\> 1.13
6270 commons-io: 2.5 =\> 2.6
6271 disrupter: 3.3.6 =\> 3.4.2
6272 httpcore: 4.4.6 =\> 4.4.13
6273 jackson: 2.9.10 =\> 2.10.1
6274 jackson.databind: 2.9.10.1 =\> 2.10.1
6275 jetty: 9.3.27.v20190418 =\> 9.3.28.v20191105
6276 protobuf.plugin: 0.5.0 =\> 0.6.1
6277 zookeeper: 3.4.10 =\> 3.4.14
6278 slf4j: 1.7.25 =\> 1.7.30
6279 rat: 0.12 =\> 0.13
6280 asciidoctor: 1.5.5 =\> 1.5.8
6281 asciidoctor.pdf: 1.5.0-alpha.15 =\> 1.5.0-rc.2
6282 error-prone: 2.3.3 =\> 2.3.4
6287 * [HBASE-23686](https://issues.apache.org/jira/browse/HBASE-23686) | *Major* | **Revert binary incompatible change and remove reflection**
6289 - Reverts a binary incompatible binary change for ByteRangeUtils
6290 - Usage of reflection inside CommonFSUtils removed
6295 * [HBASE-23347](https://issues.apache.org/jira/browse/HBASE-23347) | *Major* | **Pluggable RPC authentication**
6297 This change introduces an internal abstraction layer which allows for new SASL-based authentication mechanisms to be used inside HBase services. All existing SASL-based authentication mechanism were ported to the new abstraction, making no external change in runtime semantics, client API, or RPC serialization format.
6299 Developers familiar with extending HBase can implement authentication mechanism beyond simple Kerberos and DelegationTokens which authenticate HBase users against some other user database. HBase service authentication (Master to/from RegionServer) continue to operate solely over Kerberos.
6304 * [HBASE-23156](https://issues.apache.org/jira/browse/HBASE-23156) | *Major* | **start-hbase.sh failed with ClassNotFoundException when build with hadoop3**
6306 Introduce a new hbase-assembly/src/main/assembly/hadoop-three-compat.xml for build with hadoop 3.x.
6311 * [HBASE-23680](https://issues.apache.org/jira/browse/HBASE-23680) | *Major* | **RegionProcedureStore missing cleaning of hfile archive**
6313 Add a new config to hbase-default.xml
6315   \<property\>
6316     \<name\>hbase.procedure.store.region.hfilecleaner.plugins\</name\>
6317     \<value\>org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner\</value\>
6318     \<description\>A comma-separated list of BaseHFileCleanerDelegate invoked by
6319     the RegionProcedureStore HFileCleaner service. These HFiles cleaners are
6320     called in order, so put the cleaner that prunes the most files in front. To
6321     implement your own BaseHFileCleanerDelegate, just put it in HBase's classpath
6322     and add the fully qualified class name here. Always add the above
6323     default hfile cleaners in the list as they will be overwritten in
6324     hbase-site.xml.\</description\>
6325   \</property\>
6327 It will share the same TTL with other HFileCleaners. And you can also implement your own cleaner and change this property to enable it.
6332 * [HBASE-23675](https://issues.apache.org/jira/browse/HBASE-23675) | *Minor* | **Move to Apache parent POM version 22**
6334 Updated parent pom to Apache version 22.
6339 * [HBASE-23679](https://issues.apache.org/jira/browse/HBASE-23679) | *Critical* | **FileSystem instance leaks due to bulk loads with Kerberos enabled**
6341 This issues fixes an issue with Bulk Loading on installations with Kerberos enabled and more than a single RegionServer. When multiple tables are involved in hosting a table's regions which are being bulk-loaded into, all but the RegionServer hosting the table's first Region will "leak" one DistributedFileSystem object onto the heap, never freeing that memory. Eventually, with enough bulk loads, this will create a situation for RegionServers where they have no free heap space and will either spend all time in JVM GC, lose their ZK session, or crash with an OutOfMemoryError.
6343 The only mitigation for this issue is to periodically restart RegionServers. All earlier versions of HBase 2.x are subject to this issue (2.0.x, \<=2.1.8, \<=2.2.3)
6348 * [HBASE-23286](https://issues.apache.org/jira/browse/HBASE-23286) | *Major* | **Improve MTTR: Split WAL to HFile**
6350 Add a new feature to improve MTTR which have 3 steps to failover:
6351 1. Read WAL and write HFile to region’s column family’s recovered.hfiles directory.
6352 2. Open region.
6353 3. Bulkload the recovered.hfiles for every column family.
6355 Compared to DLS(distributed log split), this feature will reduce region open time significantly.
6357 Config hbase.wal.split.to.hfile to true to enable this featue.
6362 * [HBASE-23619](https://issues.apache.org/jira/browse/HBASE-23619) | *Trivial* | **Use built-in formatting for logging in hbase-zookeeper**
6364 Changed the logging in hbase-zookeeper to use built-in formatting
6369 * [HBASE-23628](https://issues.apache.org/jira/browse/HBASE-23628) | *Minor* | **Replace Apache Commons Digest Base64 with JDK8 Base64**
6371 From the PR:
6373 "Yes. The two create the same output... I just wrote a small test suite to increase my confidence on that. I generated many tens of millions of random byte patterns and compared the output of the two algorithms. They came back identical every time.
6375 "Just in case any inquiring minds would like to know, there is no longer an encoding required when generating the strings. The JDK implementation specifically specifies that strings returned are StandardCharsets.ISO\_8859\_1. This does not change anything because UTF8 and ISO\_8859 overlap for the limited character set (64 characters) the encoding uses."
6380 * [HBASE-23651](https://issues.apache.org/jira/browse/HBASE-23651) | *Major* | **Region balance throttling can be disabled**
6382 Set hbase.balancer.max.balancing to a int value which \<=0 will disable region balance throttling.
6387 * [HBASE-23588](https://issues.apache.org/jira/browse/HBASE-23588) | *Major* | **Cache index blocks and bloom blocks on write if CacheCompactedBlocksOnWrite is enabled**
6389 If cacheOnWrite is enabled during flush or compaction, index and bloom blocks(with data blocks) would be automatically cached during write.
6394 * [HBASE-23369](https://issues.apache.org/jira/browse/HBASE-23369) | *Major* | **Auto-close 'unknown' Regions reported as OPEN on RegionServers**
6396 If a RegionServer reports a Region as OPEN in disagreement with Master's status on the Region, the Master now tells the RegionServer to silently close the Region.
6401 * [HBASE-23596](https://issues.apache.org/jira/browse/HBASE-23596) | *Major* | **HBCKServerCrashProcedure can double assign**
6403 Makes it so the recently added HBCKServerCrashProcedure -- the SCP that gets invoked when an operator schedules an SCP via hbck2 scheduleRecoveries command -- now works the same as SCP EXCEPT if master knows nothing of the scheduled servername. In this latter case, HBCKSCP will do a full scan of hbase:meta looking for instances of the passed servername. If any found it will attempt cleanup of hbase:meta references by reassigning any found OPEN or OPENING and by closing any in CLOSING state.
6405 Used to fix instances of what the 'HBCK Report' page shows as 'Unknown Servers'.
6410 * [HBASE-23624](https://issues.apache.org/jira/browse/HBASE-23624) | *Major* | **Add a tool to dump the procedure info in HFile**
6412 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.HFileProcedurePrettyPrinter to run the tool.
6417 * [HBASE-23590](https://issues.apache.org/jira/browse/HBASE-23590) | *Major* | **Update maxStoreFileRefCount to maxCompactedStoreFileRefCount**
6419 RegionsRecoveryChore introduced as part of HBASE-22460 tries to reopen regions based on config: hbase.regions.recovery.store.file.ref.count.
6420 Region reopen needs to take into consideration all compacted away store files that belong to the region and not store files(non-compacted).
6422 Fixed this bug as part of this Jira. 
6423 Updated description for corresponding configs:
6425 1. hbase.master.regions.recovery.check.interval :
6427 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
6429 2. hbase.regions.recovery.store.file.ref.count :
6431 Very large number of ref count on a compacted store file indicates that it is a ref leak on that object(compacted store file). Such files can not be removed after it is invalidated via compaction. Only way to recover in such scenario is to reopen the region which can release all resources, like the refcount, leases, etc. This config represents Store files Ref Count threshold value considered for reopening regions. Any region with compacted store files ref count \> this value would be eligible for reopening by master. Here, we get the max refCount among all refCounts on all compacted away store files that belong to a particular region. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
6436 * [HBASE-23618](https://issues.apache.org/jira/browse/HBASE-23618) | *Major* | **Add a tool to dump procedure info in the WAL file**
6438 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.WALProcedurePrettyPrinter to run the tool.
6443 * [HBASE-23617](https://issues.apache.org/jira/browse/HBASE-23617) | *Major* | **Add a stress test tool for region based procedure store**
6445 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.RegionProcedureStorePerformanceEvaluation to run the tool.
6450 * [HBASE-23326](https://issues.apache.org/jira/browse/HBASE-23326) | *Critical* | **Implement a ProcedureStore which stores procedures in a HRegion**
6452 Use a region based procedure store to replace the old customized WAL based procedure store. The procedure data migration is done automatically during upgrading. After upgrading, the MasterProcWALs directory will be deleted and a new MasterProc directory will be created. And notice that a region will still write WAL so we still have WAL files and they will be moved to the oldWALs directory. The file name is mostly like a normal WAL file, and the only difference is that it is ended with "$masterproc$".
6457 * [HBASE-23320](https://issues.apache.org/jira/browse/HBASE-23320) | *Major* | **Upgrade surefire plugin to 3.0.0-M4**
6459 Bumped surefire plugin to 3.0.0-M4
6464 * [HBASE-20461](https://issues.apache.org/jira/browse/HBASE-20461) | *Major* | **Implement fsync for AsyncFSWAL**
6466 Now AsyncFSWAL also supports Durability.FSYNC\_WAL.
6471 * [HBASE-23066](https://issues.apache.org/jira/browse/HBASE-23066) | *Minor* | **Create a config that forces to cache blocks on compaction**
6473 The configuration 'hbase.rs.cacheblocksonwrite' was used to enable caching the blocks on write. But purposefully we were not caching the blocks when we do compaction (since it may be very aggressive) as the caching happens as and when the writer completes a block. 
6474 In cloud environments since they have bigger sized caches - though they try to enable 'hbase.rs.prefetchblocksonopen' (non - aggressive way of caching the blocks proactively on reader creation) it does not help them because it takes time to cache the compacted blocks. 
6475 This feature creates a new configuration  'hbase.rs.cachecompactedblocksonwrite' which when set to 'true' will enable the blocks created out of compaction. 
6476 Remember that since it is aggressive caching the user should be having enough cache space - if not it may lead to other active blocks getting evicted.
6477 From the shell this can be enabled by using the option per Column Family also by using the below format
6478 {code}
6479 create 't1', 'f1', {NUMREGIONS =\> 15, SPLITALGO =\> 'HexStringSplit', CONFIGURATION =\> {'hbase.rs.cachecompactedblocksonwrite' =\> 'true'}}
6480 {code}
6485 * [HBASE-23239](https://issues.apache.org/jira/browse/HBASE-23239) | *Major* | **Reporting on status of backing MOB files from client-facing cells**
6487 <!-- markdown -->
6489 Users of the MOB feature can now use the `mobrefs` utility to get statistics about data in the MOB system and verify the health of backing files on HDFS.
6492 HADOOP_CLASSPATH=/etc/hbase/conf:$(hbase mapredcp) yarn jar \
6493     /some/path/to/hbase-shaded-mapreduce.jar mobrefs mobrefs-report-output some_table foo
6496 See javadocs of the class `MobRefReporter` for more details.
6498 the reference guide has added some information about MOB internals and troubleshooting.
6503 * [HBASE-23549](https://issues.apache.org/jira/browse/HBASE-23549) | *Minor* | **Document steps to disable MOB for a column family**
6505 The reference guide now includes a walk through of disabling the MOB feature if needed while maintaining availability.
6510 * [HBASE-23582](https://issues.apache.org/jira/browse/HBASE-23582) | *Minor* | **Unbalanced braces in string representation of table descriptor**
6512 Fixed unbalanced braces in string representation within HBase shell
6517 * [HBASE-23293](https://issues.apache.org/jira/browse/HBASE-23293) | *Minor* | **[REPLICATION] make ship edits timeout configurable**
6519 The default rpc timeout for ReplicationSourceShipper#shipEdits is 60s, when bulkload replication enabled, timeout exception may be occurred.
6520 Now we can conf the timeout value through replication.source.shipedits.timeout, and it’s adaptive.
6525 * [HBASE-23312](https://issues.apache.org/jira/browse/HBASE-23312) | *Major* | **HBase Thrift SPNEGO configs (HBASE-19852) should be backwards compatible**
6527 The newer HBase Thrift SPNEGO configs should not be required. The hbase.thrift.spnego.keytab.file and hbase.thrift.spnego.principal configs will fall back to the hbase.thrift.keytab.file and hbase.thrift.kerberos.principal original configs. The older configs will log a deprecation warning. It is preferred to new the newer SPNEGO configurations.
6532 * [HBASE-22969](https://issues.apache.org/jira/browse/HBASE-22969) | *Minor* | **A new binary component comparator(BinaryComponentComparator) to perform comparison of arbitrary length and position**
6534 With BinaryComponentCompartor applications will be able to design diverse and powerful set of filters for rows and columns. See https://issues.apache.org/jira/browse/HBASE-22969 for example. In general, the comparator can be used with any filter taking ByteArrayComparable. As of now, following filters take ByteArrayComparable: 
6536 1. RowFilter
6537 2. ValueFilter
6538 3. QualifierFilter
6539 4. FamilyFilter
6540 5. ColumnValueFilter
6545 * [HBASE-23234](https://issues.apache.org/jira/browse/HBASE-23234) | *Major* | **Provide .editorconfig based on checkstyle configuration**
6547 Adds a .editorconfig file with configurations populated by IntelliJ, based on our checkstyle configuration. There's lots of IntelliJ-specific configs in here that I assume are not replicated to Eclipse or Netbeans users. Any devs using those tools should push whatever updates they see fit, but please start with the checkstyle configs as the origin of truth.
6552 * [HBASE-23322](https://issues.apache.org/jira/browse/HBASE-23322) | *Minor* | **[hbck2] Simplification on HBCKSCP scheduling**
6554 An hbck2 scheduleRecoveries will run a subclass of ServerCrashProcedure which asks Master what Regions were on the dead Server but it will also do a hbase:meta table scan to see if any vestiges of the old Server remain (for the case where an SCP failed mid-point leaving references in place or where Master and hbase:meta deviated in accounting).
6559 * [HBASE-23321](https://issues.apache.org/jira/browse/HBASE-23321) | *Minor* | **[hbck2] fixHoles of fixMeta doesn't update in-memory state**
6561 If holes in hbase:meta, hbck2 fixMeta now will update Master in-memory state so you do not need to restart master just so you can assign the new hole-bridging regions.
6566 * [HBASE-23282](https://issues.apache.org/jira/browse/HBASE-23282) | *Major* | **HBCKServerCrashProcedure for 'Unknown Servers'**
6568 hbck2 scheduleRecoveries will now run a SCP that also looks in hbase:meta for any references to the scheduled server -- not just consult Master in-memory state -- just in case vestiges of the server are leftover in hbase:meta
6573 * [HBASE-19450](https://issues.apache.org/jira/browse/HBASE-19450) | *Minor* | **Add log about average execution time for ScheduledChore**
6575 <!-- markdown -->
6576 HBase internal chores now log a moving average of how long execution of each chore takes at `INFO` level for the logger `org.apache.hadoop.hbase.ScheduledChore`.
6578 Such messages will happen at most once per five minutes.
6583 * [HBASE-23250](https://issues.apache.org/jira/browse/HBASE-23250) | *Minor* | **Log message about CleanerChore delegate initialization should be at INFO**
6585 CleanerChore delegate initialization is now logged at INFO level instead of DEBUG
6590 * [HBASE-23243](https://issues.apache.org/jira/browse/HBASE-23243) | *Major* | **[pv2] Filter out SUCCESS procedures; on decent-sized cluster, plethora overwhelms problems**
6592 The 'Procedures & Locks' tab in Master UI only displays problematic Procedures now (RUNNABLE, WAITING-TIMEOUT, etc.). It no longer notes procedures whose state is SUCCESS.
6597 * [HBASE-23227](https://issues.apache.org/jira/browse/HBASE-23227) | *Blocker* | **Upgrade jackson-databind to 2.9.10.1 to avoid recent CVEs**
6599 <!-- markdown -->
6601 the Apache HBase REST Proxy now uses Jackson Databind version 2.9.10.1 to address the following CVEs
6603   - CVE-2019-16942
6604   - CVE-2019-16943
6606 Users of prior releases with Jackson Databind 2.9.10 are advised to either upgrade to this release or to upgrade their local Jackson Databind jar directly.
6611 * [HBASE-23222](https://issues.apache.org/jira/browse/HBASE-23222) | *Critical* | **Better logging and mitigation for MOB compaction failures**
6613 <!-- markdown -->
6615 The MOB compaction process in the HBase Master now logs more about its activity.
6617 In the event that you run into the problems described in HBASE-22075, there is a new HFileCleanerDelegate that will stop all removal of MOB hfiles from the archive area. It can be configured by adding `org.apache.hadoop.hbase.mob.ManualMobMaintHFileCleaner` to the list configured for `hbase.master.hfilecleaner.plugins`. This new cleaner delegate will cause your archive area to grow unbounded; you will have to manually prune files which may be prohibitively complex. Consider if your use case will allow you to mitigate by disabling mob compactions instead.
6619 Caveats:
6620 * Be sure the list of cleaner delegates still includes the default cleaners you will likely need: ttl, snapshot, and hlink.
6621 * Be mindful that if you enable this cleaner delegate then there will be *no* automated process for removing these mob hfiles. You should see a single region per table in `%hbase_root%/archive` that accumulates files over time. You will have to determine which of these files are safe or not to remove.
6622 * You should list this cleaner delegate after the snapshot and hlink delegates so that you can enable sufficient logging to determine when an archived mob hfile is needed by those subsystems. When set to `TRACE` logging, the CleanerChore logger will include archive retention decision justifications.
6623 * If your use case creates a large number of uniquely named tables, this new delegate will cause memory pressure on the master.
6628 * [HBASE-15519](https://issues.apache.org/jira/browse/HBASE-15519) | *Major* | **Add per-user metrics**
6630 Adds per-user metrics for reads/writes to each RegionServer. These metrics are exported by default. hbase.regionserver.user.metrics.enabled can be used to disable the feature if desired for any reason.
6635 * [HBASE-22460](https://issues.apache.org/jira/browse/HBASE-22460) | *Minor* | **Reopen a region if store reader references may have leaked**
6637 Leaked store files can not be removed even after it is invalidated via compaction. A reasonable mitigation for a reader reference leak would be a fast reopen of the region on the same server.
6639 Configs:
6641 1. hbase.master.regions.recovery.check.interval :
6643 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
6645 2. hbase.regions.recovery.store.file.ref.count :
6647 This config represents Store files Ref Count threshold value considered for reopening regions. Any region with store files ref count \> this value would be eligible for reopening by master. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
6652 * [HBASE-23172](https://issues.apache.org/jira/browse/HBASE-23172) | *Minor* | **HBase Canary region success count metrics reflect column family successes, not region successes**
6654 Added a comment to make clear that read/write success counts are tallying column family success counts, not region success counts. 
6656 Additionally, the region read and write latencies previously only stored the latencies of the last column family of the region reads/writes. This has been fixed by using a map of each region to a list of read and write latency values.
6661 * [HBASE-23177](https://issues.apache.org/jira/browse/HBASE-23177) | *Major* | **If fail to open reference because FNFE, make it plain it is a Reference**
6663 Changes the message on the FNFE exception thrown when the file a Reference points to is missing; the message now includes detail on Reference as well as pointed-to file so can connect how FNFE relates to region open.
6668 * [HBASE-20626](https://issues.apache.org/jira/browse/HBASE-20626) | *Major* | **Change the value of "Requests Per Second" on WEBUI**
6670 Use 'totalRowActionRequestCount' to calculate QPS on web UI.
6675 * [HBASE-22874](https://issues.apache.org/jira/browse/HBASE-22874) | *Critical* | **Define a public interface for Canary and move existing implementation to LimitedPrivate**
6677 <!-- markdown -->
6678 Downstream users who wish to programmatically check the health of their HBase cluster may now rely on a public interface derived from the previously private implementation of the canary cli tool. The interface is named `Canary` and can be found in the user facing javadocs.
6680 Downstream users who previously relied on the invoking the canary via the Java classname (either on the command line or programmatically) will need to change how they do so because the non-public implementation has moved.
6685 * [HBASE-23035](https://issues.apache.org/jira/browse/HBASE-23035) | *Major* | **Retain region to the last RegionServer make the failover slower**
6687 Since 2.0.0,when one regionserver crashed and back online again, AssignmentManager will retain the region locations and try assign the regions to this regionserver(same host:port with the crashed one) again. But for 1.x.x, the behavior is round-robin assignment for the regions belong to the crashed regionserver. This jira change the "retain" assignment to round-robin assignment, which is same with 1.x.x version. This change will make the failover faster and improve availability.
6692 * [HBASE-23046](https://issues.apache.org/jira/browse/HBASE-23046) | *Minor* | **Remove compatibility case from truncate command**
6694 Remove backward compatibility from \`truncate\` and \`truncate\_preserve\` shell commands. This means that these commands from HBase Clients are not compatible with pre-0.99 HBase clusters.
6699 * [HBASE-23040](https://issues.apache.org/jira/browse/HBASE-23040) | *Minor* | **region mover gives NullPointerException instead of saying a host isn't in the cluster**
6701 giving the region mover "unload" command a region server name that isn't recognized by the cluster results in a "I don't know about that host" message instead of a NPE.
6703 set log level to DEBUG if you'd like the region mover to log the set of region server names it got back from the cluster.
6708 * [HBASE-21874](https://issues.apache.org/jira/browse/HBASE-21874) | *Major* | **Bucket cache on Persistent memory**
6710 Added a new IOEngine type for Bucket cache ie Persistent memory. In order to use BC over pmem configure IOEngine as 
6711 \<property\>
6712     \<name\>hbase.bucketcache.ioengine\</name\>
6713     \<value\> pmem:///path in persistent memory \</value\>
6714   \</property\>
6719 * [HBASE-22760](https://issues.apache.org/jira/browse/HBASE-22760) | *Major* | **Stop/Resume Snapshot Auto-Cleanup activity with shell command**
6721 By default, snapshot auto cleanup based on TTL would be enabled for any new cluster. At any point in time, if snapshot cleanup is supposed to be stopped due to some snapshot restore activity or any other reason, it is advisable to disable it using shell command:
6722 hbase\> snapshot\_cleanup\_switch false
6724 We can re-enable it using:
6725 hbase\> snapshot\_cleanup\_switch true
6727 We can query whether snapshot auto cleanup is enabled for cluster using:
6728 hbase\> snapshot\_cleanup\_enabled
6733 * [HBASE-22796](https://issues.apache.org/jira/browse/HBASE-22796) | *Major* | **[HBCK2] Add fix of overlaps to fixMeta hbck Service**
6735 Adds fix of overlaps to the fixMeta hbck service method. Uses the bulk-merge facility. Merges a max of 10 at a time. Set hbase.master.metafixer.max.merge.count to higher if you want to do more than 10 in the one go.
6740 * [HBASE-21745](https://issues.apache.org/jira/browse/HBASE-21745) | *Critical* | **Make HBCK2 be able to fix issues other than region assignment**
6742 This issue adds via its subtasks:
6744  \* An 'HBCK Report' page to the Master UI added by HBASE-22527+HBASE-22709+HBASE-22723+ (since 2.1.6, 2.2.1, 2.3.0). Lists consistency or anomalies found via new hbase:meta consistency checking extensions added to CatalogJanitor (holes, overlaps, bad servers) and by a new 'HBCK chore' that runs at a lesser periodicity that will note filesystem orphans and overlaps as well as the following conditions:
6745  \*\* Master thought this region opened, but no regionserver reported it. 
6746  \*\* Master thought this region opened on Server1, but regionserver reported Server2 
6747  \*\* More than one regionservers reported opened this region
6748  Both chores can be triggered from the shell to regenerate ‘new’ reports.
6749  \* Means of scheduling a ServerCrashProcedure (HBASE-21393).
6750  \* An ‘offline’ hbase:meta rebuild (HBASE-22680).
6751  \* Offline replace of hbase.version and hbase.id
6752  \* Documentation on how to use completebulkload tool to ‘adopt’ orphaned data found by new HBCK2 ‘filesystem’ check (see below) and ‘HBCK chore’ (HBASE-22859)
6753  \* A ‘holes’ and ‘overlaps’ fix that runs in the master that uses new bulk-merge facility to collapse many overlaps in the one go.
6754  \* hbase-operator-tools HBCK2 client tool got a bunch of additions:
6755  \*\* A specialized 'fix' for the case where operators ran old hbck 'offlinemeta' repair and destroyed their hbase:meta; it ties together holes in meta with orphaned data in the fs (HBASE-22567)
6756  \*\* A ‘filesystem’ command that reports on orphan data as well as bad references and hlinks with a ‘fix’ for the latter two options (based on hbck1 facility updated).
6757  \*\* Adds back the ‘replication’ fix facility from hbck1 (HBASE-22717)
6759 The compound result is that hbck2 is now in excess of hbck1 abilities. The provided functionality is disaggregated as per the hbck2 philosophy of providing 'plumbing' rather than 'porcelain' so there is work to do still adding fix-it playbooks, scripting across outages, and automation.
6764 * [HBASE-22802](https://issues.apache.org/jira/browse/HBASE-22802) | *Major* | **Avoid temp ByteBuffer allocation in FileIOEngine#read**
6766 HBASE-21879 introduces a utility class (org.apache.hadoop.hbase.io.ByteBuffAllocator) used for allocating/freeing ByteBuffers from/to NIO ByteBuffer pool, when BucketCache enabled with file or mmap engine, we will use this ByteBuffer pool to avoid temp ByteBuffer allocation a lot.
6771 * [HBASE-11062](https://issues.apache.org/jira/browse/HBASE-11062) | *Major* | **hbtop**
6773 Introduces hbtop that's a real-time monitoring tool for HBase like Unix's top command. See the ref guide for the details: https://hbase.apache.org/book.html#hbtop
6778 * [HBASE-21879](https://issues.apache.org/jira/browse/HBASE-21879) | *Major* | **Read HFile's block to ByteBuffer directly instead of to byte for reducing young gc purpose**
6780 Before this issue, read path was 100% offheap when block is in the BucketCache. But if a cache miss, then the RS needs to read the block via an on-heap API which causes high young-GC pressure.
6782 This issue adds reading the block via offheap even if reading the block from filesystem directly.  It requires hadoop version(\>=2.9.3) but can also work with older hadoop versions (all works but we continue to read block onheap). It also requires HBASE-21946 which is not yet in place as of this writing/hbase-2.3.0.
6784 We have written a careful doc about the implementation, performance and practice here: https://docs.google.com/document/d/1xSy9axGxafoH-Qc17zbD2Bd--rWjjI00xTWQZ8ZwI\_E/edit#heading=h.nch5d72p27ex
6789 * [HBASE-22618](https://issues.apache.org/jira/browse/HBASE-22618) | *Major* | **added the possibility to load custom cost functions**
6791 <!-- markdown -->
6792 Extends `StochasticLoadBalancer` to support user-provided cost function. These are loaded in addition to the default set of cost functions. Custom function implementations must extend `StochasticLoadBalancer$CostFunction`. Enable any additional functions by placing them on the master class path and configuring `hbase.master.balancer.stochastic.additionalCostFunctions` with a comma-separated list of fully-qualified class names.
6797 * [HBASE-22867](https://issues.apache.org/jira/browse/HBASE-22867) | *Critical* | **The ForkJoinPool in CleanerChore will spawn thousands of threads in our cluster with thousands table**
6799 Replace the ForkJoinPool in CleanerChore by ThreadPoolExecutor which can limit the spawn thread size and avoid  the master GC frequently.  The replacement is an internal implementation in CleanerChore,  so no config key change, the upstream users can just upgrade the hbase master without any other change.
6804 * [HBASE-22810](https://issues.apache.org/jira/browse/HBASE-22810) | *Major* | **Initialize an separate ThreadPoolExecutor for taking/restoring snapshot**
6806 Introduced a new config key for the snapshot taking/restoring operations at master side:  hbase.master.executor.snapshot.threads, its default value is 3.  means we can have 3 snapshot operations running at the same time.
6811 * [HBASE-22863](https://issues.apache.org/jira/browse/HBASE-22863) | *Major* | **Avoid Jackson versions and dependencies with known CVEs**
6813 1. Stopped exposing vulnerable Jackson1 dependencies so that downstreamers would not pull it in from HBase.
6814 2. However, since Hadoop requires some Jackson1 dependencies, put vulnerable Jackson mapper at test scope in some HBase modules and hence, HBase tarball created by hbase-assembly contains Jackson1 mapper jar in lib. Still, downsteam applications can't pull in Jackson1 from HBase.
6819 * [HBASE-22841](https://issues.apache.org/jira/browse/HBASE-22841) | *Major* | **TimeRange's factory functions do not support ranges, only \`allTime\` and \`at\`**
6821 Add serveral API in TimeRange class for avoiding using the deprecated TimeRange constructor: 
6822 \* TimeRange#from: Represents the time interval [minStamp, Long.MAX\_VALUE)
6823 \* TimeRange#until: Represents the time interval [0, maxStamp)
6824 \* TimeRange#between: Represents the time interval [minStamp, maxStamp)
6829 * [HBASE-22833](https://issues.apache.org/jira/browse/HBASE-22833) | *Minor* | **MultiRowRangeFilter should provide a method for creating a filter which is functionally equivalent to multiple prefix filters**
6831 Provide a public method in MultiRowRangeFilter class to speed the requirement of filtering with multiple row prefixes, it will expand the row prefixes as multiple rowkey ranges by MultiRowRangeFilter, it's more efficient.
6832 {code}
6833 public MultiRowRangeFilter(byte[][] rowKeyPrefixes);
6834 {code}
6839 * [HBASE-22856](https://issues.apache.org/jira/browse/HBASE-22856) | *Major* | **HBASE-Find-Flaky-Tests fails with pip error**
6841 Update the base docker image to ubuntu 18.04 for the find flaky tests jenkins job.
6846 * [HBASE-22771](https://issues.apache.org/jira/browse/HBASE-22771) | *Major* | **[HBCK2] fixMeta method and server-side support**
6848 Adds a fixMeta method to hbck Service. Fixes holes in hbase:meta. Follow-up to fix overlaps. See HBASE-22567 also.
6850 Follow-on is adding a client-side to hbase-operator-tools that can exploit this new addition (HBASE-22825)
6855 * [HBASE-22777](https://issues.apache.org/jira/browse/HBASE-22777) | *Major* | **Add a multi-region merge (for fixing overlaps, etc.)**
6857 Changes merge so you can merge more than two regions at a time.  Currently only available inside HBase. HBASE-22827, a follow-on, is about exposing the facility in the Admin API (and then via the shell).
6862 * [HBASE-15666](https://issues.apache.org/jira/browse/HBASE-15666) | *Critical* | **shaded dependencies for hbase-testing-util**
6864 New shaded artifact for testing: hbase-shaded-testing-util.
6869 * [HBASE-22776](https://issues.apache.org/jira/browse/HBASE-22776) | *Major* | **Rename config names in user scan snapshot feature**
6871 After HBASE-22776, the steps to config user scan snapshot feature is as followings:
6872 1. Check HDFS configuration
6873 2. Add master coprocessor:
6874     hbase.coprocessor.master.classes=
6875     “org.apache.hadoop.hbase.security.access.AccessController,
6876 org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController”
6877 3. Enable this feature:
6878     hbase.acl.sync.to.hdfs.enable=true
6879 4. Modify table scheme to enable this feature for a table:
6880     alter 't1', CONFIGURATION =\> {'hbase.acl.sync.to.hdfs.enable' =\> 'true'}
6885 * [HBASE-22539](https://issues.apache.org/jira/browse/HBASE-22539) | *Blocker* | **WAL corruption due to early DBBs re-use when Durability.ASYNC\_WAL is used**
6887 We found a critical bug which can lead to WAL corruption when Durability.ASYNC\_WAL is used. The reason is that we release a ByteBuffer before actually persist the content into WAL file.
6889 The problem maybe lead to several errors, for example, ArrayIndexOfOutBounds when replaying WAL. This is because that the ByteBuffer is reused by others.
6891 ERROR org.apache.hadoop.hbase.executor.EventHandler: Caught throwable while processing event RS\_LOG\_REPLAY
6892 java.lang.ArrayIndexOutOfBoundsException: 18056
6893         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1365)
6894         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1358)
6895         at org.apache.hadoop.hbase.PrivateCellUtil.matchingFamily(PrivateCellUtil.java:735)
6896         at org.apache.hadoop.hbase.CellUtil.matchingFamily(CellUtil.java:816)
6897         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEditFamily(WALEdit.java:143)
6898         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEdit(WALEdit.java:148)
6899         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:297)
6900         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:195)
6901         at org.apache.hadoop.hbase.regionserver.SplitLogWorker$1.exec(SplitLogWorker.java:100)
6903 And may even cause segmentation fault and crash the JVM directly. You will see a hs\_err\_pidXXX.log file and usually the problem is SIGSEGV. This is usually because that the ByteBuffer has already been returned to the OS and used for other purpose.
6905 The problem has been reported several times in the past and this time Wellington Ramos Chevreuil provided the full logs and deeply analyzed the logs so we can find the root cause. And Lijin Bin figured out that the problem may only happen when Durability.ASYNC\_WAL is used. Thanks to them.
6907 The problem only effects the 2.x releases, all users are highly recommand to upgrade to a release which has this fix in, especially that if you use Durability.ASYNC\_WAL.
6912 * [HBASE-22737](https://issues.apache.org/jira/browse/HBASE-22737) | *Major* | **Add a new admin method and shell cmd to trigger the hbck chore to run**
6914 Add a new method runHbckChore in Hbck interface and a new shell cmd hbck\_chore\_run to request HBCK chore to run at master side.
6919 * [HBASE-22741](https://issues.apache.org/jira/browse/HBASE-22741) | *Major* | **Show catalogjanitor consistency complaints in new 'HBCK Report' page**
6921 Adds a "CatalogJanitor hbase:meta Consistency Issues" section to the new 'HBCK Report' page added by HBASE-22709. This section is empty unless the most recent CatalogJanitor scan turned up problems. If so, will show table of issues found.
6926 * [HBASE-22723](https://issues.apache.org/jira/browse/HBASE-22723) | *Major* | **Have CatalogJanitor report holes and overlaps; i.e. problems it sees when doing its regular scan of hbase:meta**
6928 When CatalogJanitor runs, it now checks for holes, overlaps, empty info:regioninfo columns and bad servers. Dumps findings into log. Follow-up adds report to new 'HBCK Report' linked off the Master UI.
6930 NOTE: All features but the badserver check made it into branch-2.1 and branch-2.0 backports.
6935 * [HBASE-22714](https://issues.apache.org/jira/browse/HBASE-22714) | *Trivial* | **BuffferedMutatorParams opertationTimeOut() is misspelt**
6937 The misspelled BufferedMutatorParams.opertationTimeout method has been marked as deprecated, and will be removed in 4.0.0. Please use the BufferedMutatorParams.operationTimeout method instead.
6942 * [HBASE-22580](https://issues.apache.org/jira/browse/HBASE-22580) | *Major* | **Add a table attribute to make user scan snapshot feature configurable for table**
6944 If a table user scan snapshots of the table, please config the following table scheme attribute to make granted users' ACLs are added to hfiles:
6945 alter 't1', CONFIGURATION =\> {'hbase.user.scan.snapshot.enable' =\> 'true'}
6950 * [HBASE-22709](https://issues.apache.org/jira/browse/HBASE-22709) | *Major* | **Add a chore thread in master to do hbck checking and display results in 'HBCK Report' page**
6952 1. Add a new chore thread in master to do hbck checking
6953 2. Add a new web ui "HBCK Report" page to display checking results.
6955 This feature is enabled by default. And the hbck chore run per 60 minutes by default. You can config "hbase.master.hbck.checker.interval" to a value lesser than or equal to 0 for disabling the chore.
6957 Notice: the config "hbase.master.hbck.checker.interval" was renamed to "hbase.master.hbck.chore.interval" in HBASE-22737.
6962 * [HBASE-22578](https://issues.apache.org/jira/browse/HBASE-22578) | *Major* | **HFileCleaner should not delete empty ns/table directories used for user san snapshot feature**
6964 The HFileCleaner will clean the empty directories under archive, but if enable user scan snaphot feature, the user ACLs are set at there directories, so please config the following cleaner to make the directories with user ACLs not be cleaned:
6965 hbase.master.hfilecleaner.plugins=org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclCleaner
6970 * [HBASE-22722](https://issues.apache.org/jira/browse/HBASE-22722) | *Blocker* | **Upgrade jackson databind dependencies to 2.9.9.1**
6972 Upgrade jackson databind dependency to 2.9.9.1 due to CVEs
6974 https://nvd.nist.gov/vuln/detail/CVE-2019-12814
6976 https://nvd.nist.gov/vuln/detail/CVE-2019-12384
6981 * [HBASE-22527](https://issues.apache.org/jira/browse/HBASE-22527) | *Major* | **[hbck2] Add a master web ui to show the problematic regions**
6983 Add a new master web UI to show the potentially problematic opened regions. There are three case:
6984 1. Master thought this region opened, but no regionserver reported it.
6985 2. Master thought this region opened on Server1, but regionserver reported Server2
6986 3. More than one regionservers reported opened this region
6991 * [HBASE-22648](https://issues.apache.org/jira/browse/HBASE-22648) | *Minor* | **Snapshot TTL**
6993 Feature: Take a Snapshot With TTL for auto-cleanup
6995 Attribute: 
6996 1. TTL
6997      - Specify TTL in sec while creating snapshot. e.g. snapshot 'mytable', 'snapshot1234', {TTL =\> 86400}  (snapshot to be auto-cleaned after 24 hr)
6999 Configs:
7000 1. Default Snapshot TTL:
7001      - FOREVER by default
7002      - User specified Default TTL(sec) with config: hbase.master.snapshot.ttl
7004 2. If Snapshot cleanup is supposed to be stopped due to some snapshot restore activity, disable it with config:
7005      - hbase.master.cleaner.snapshot.disable: "true"
7006     With this config, HMaster needs restart just like any other hbase-site config.
7009 For more details, see the section "Take a Snapshot With TTL" in the HBase Reference Guide.
7014 * [HBASE-22610](https://issues.apache.org/jira/browse/HBASE-22610) | *Trivial* | **[BucketCache] Rename "hbase.offheapcache.minblocksize"**
7016 The config point "hbase.offheapcache.minblocksize" was wrong and is now deprecated. The new config point is "hbase.blockcache.minblocksize".
7021 * [HBASE-22690](https://issues.apache.org/jira/browse/HBASE-22690) | *Major* | **Deprecate / Remove OfflineMetaRepair in hbase-2+**
7023 OfflineMetaRepair is no longer supported in HBase-2+. Please refer to https://hbase.apache.org/book.html#HBCK2
7025 This tool is deprecated in 2.x and will be removed in 3.0.
7030 * [HBASE-22673](https://issues.apache.org/jira/browse/HBASE-22673) | *Major* | **Avoid to expose protobuf stuff in Hbck interface**
7032 Mark the Hbck#scheduleServerCrashProcedure(List\<HBaseProtos.ServerName\> serverNames) as deprecated. Use Hbck#scheduleServerCrashProcedures(List\<ServerName\> serverNames) instead.
7037 * [HBASE-22617](https://issues.apache.org/jira/browse/HBASE-22617) | *Blocker* | **Recovered WAL directories not getting cleaned up**
7039 In HBASE-20734 we moved the recovered.edits onto the wal file system but when constructing the directory we missed the BASE\_NAMESPACE\_DIR('data'). So when using the default config, you will find that there are lots of new directories at the same level with the 'data' directory.
7041 In this issue, we add the BASE\_NAMESPACE\_DIR back, and also try our best to clean up the wrong directories. But we can only clean up the region level directories, so if you want a clean fs layout on HDFS you still need to manually delete the empty directories at the same level with 'data'.
7043 The effect versions are 2.2.0, 2.1.[1-5], 1.4.[8-10], 1.3.[3-5].
7048 * [HBASE-21995](https://issues.apache.org/jira/browse/HBASE-21995) | *Major* | **Add a coprocessor to set HDFS ACL for hbase granted user**
7050 Add a coprocessor to set HDFS acls to make hbase granted users with READ permission have the access to scan snapshots.
7051 To use this feature, please make sure the HDFS config is set:
7052 dfs.namenode.acls.enabled=true
7053 fs.permissions.umask-mode=027
7055 and set the HBase config:
7056 hbase.coprocessor.master.classes="org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController"
7057 hbase.user.scan.snapshot.enable=true
7062 * [HBASE-22596](https://issues.apache.org/jira/browse/HBASE-22596) | *Minor* | **[Chore] Separate the execution period between CompactionChecker and PeriodicMemStoreFlusher**
7064 hbase.regionserver.compaction.check.period is used for controlling how often the compaction checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
7066 hbase.regionserver.flush.check.period is used for controlling how ofter the flush checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
7071 * [HBASE-22588](https://issues.apache.org/jira/browse/HBASE-22588) | *Major* | **Upgrade jaxws-ri dependency to 2.3.2**
7073 <!-- markdown -->
7075 When run with JDK11 HBase now uses more recent version of the jaxws reference implementation (v2.3.2).
7080 * [HBASE-21536](https://issues.apache.org/jira/browse/HBASE-21536) | *Trivial* | **Fix completebulkload usage instructions**
7082 Added completebulkload short name for BulkLoadHFilesTool to bin/hbase.
7087 * [HBASE-22500](https://issues.apache.org/jira/browse/HBASE-22500) | *Blocker* | **Modify pom and jenkins jobs for hadoop versions**
7089 Change the default hadoop-3 version to 3.1.2. Drop the support for the releases which are effected by CVE-2018-8029, see this email https://lists.apache.org/thread.html/3d6831c3893cd27b6850aea2feff7d536888286d588e703c6ffd2e82@%3Cuser.hadoop.apache.org%3E
7094 * [HBASE-22459](https://issues.apache.org/jira/browse/HBASE-22459) | *Minor* | **Expose store reader reference count**
7096 This change exposes the aggregate count of store reader references for a given store as 'storeRefCount' in region metrics and ClusterStatus.
7101 * [HBASE-22469](https://issues.apache.org/jira/browse/HBASE-22469) | *Minor* | **replace md5 checksum in saveVersion script with sha512 for hbase version information**
7103 The HBase "source checksum" now uses SHA512 instead of MD5.
7108 * [HBASE-22148](https://issues.apache.org/jira/browse/HBASE-22148) | *Blocker* | **Provide an alternative to CellUtil.setTimestamp**
7110 <!-- markdown -->
7112 The `CellUtil.setTimestamp` method changes to be an API with audience `LimitedPrivate(COPROC)` in HBase 3.0. With that designation the API should remain stable within a given minor release line, but may change between minor releases.
7114 Previously, this method was deprecated in HBase 2.0 for removal in HBase 3.0. Deprecation messages in HBase 2.y releases have been updated to indicate the expected API audience change.
7119 * [HBASE-20782](https://issues.apache.org/jira/browse/HBASE-20782) | *Minor* | **Fix duplication of TestServletFilter.access**
7121 The access method was used to the HttpServerFunctionalTest class as a common place.
7126 * [HBASE-21991](https://issues.apache.org/jira/browse/HBASE-21991) | *Major* | **Fix MetaMetrics issues - [Race condition, Faulty remove logic], few improvements**
7128 The class LossyCounting was unintentionally marked Public but was never intended to be part of our public API. This oversight has been corrected and LossyCounting is now marked as Private and going forward may be subject to additional breaking changes or removal without notice. If you have taken a dependency on this class we recommend cloning it locally into your project before upgrading to this release.
7133 * [HBASE-22226](https://issues.apache.org/jira/browse/HBASE-22226) | *Trivial* | **Incorrect level for headings in asciidoc**
7135 Warnings for level headings are corrected in the book for the HBase Incompatibilities section.
7140 * [HBASE-20970](https://issues.apache.org/jira/browse/HBASE-20970) | *Major* | **Update hadoop check versions for hadoop3 in hbase-personality**
7142 Add hadoop 3.0.3, 3.1.1 3.1.2 in our hadoop check jobs.
7147 * [HBASE-21784](https://issues.apache.org/jira/browse/HBASE-21784) | *Major* | **Dump replication queue should show list of wal files ordered chronologically**
7149 The DumpReplicationQueues tool will now list replication queues sorted in chronological order.
7154 * [HBASE-21048](https://issues.apache.org/jira/browse/HBASE-21048) | *Major* | **Get LogLevel is not working from console in secure environment**
7156 Support get\|set LogLevel in secure(kerberized) environment.
7161 * [HBASE-22384](https://issues.apache.org/jira/browse/HBASE-22384) | *Minor* | **Formatting issues in administration section of book**
7163 Fixes a formatting issue in the administration section of the book, where listing indentation were a little bit off.
7168 * [HBASE-22377](https://issues.apache.org/jira/browse/HBASE-22377) | *Major* | **Provide API to check the existence of a namespace which does not require ADMIN permissions**
7170 This change adds the new method listNamespaces to the Admin interface, which can be used to retrieve a list of the namespaces present in the schema as an unprivileged operation. Formerly the only available method for accomplishing this was listNamespaceDescriptors, which requires GLOBAL CREATE or ADMIN permissions.
7175 * [HBASE-22399](https://issues.apache.org/jira/browse/HBASE-22399) | *Major* | **Change default hadoop-two.version to 2.8.x and remove the 2.7.x hadoop checks**
7177 Now the default hadoop-two.version has been changed to 2.8.5, and all hadoop versions before 2.8.2(exclude) will not be supported any more.
7182 * [HBASE-22392](https://issues.apache.org/jira/browse/HBASE-22392) | *Trivial* | **Remove extra/useless +**
7184 Removed extra + in HRegion, HStore and LoadIncrementalHFiles for branch-2 and HRegion and HStore for branch-1.
7189 * [HBASE-20494](https://issues.apache.org/jira/browse/HBASE-20494) | *Major* | **Upgrade com.yammer.metrics dependency**
7191 Updated metrics core from 3.2.1 to 3.2.6.
7196 * [HBASE-22358](https://issues.apache.org/jira/browse/HBASE-22358) | *Minor* | **Change rubocop configuration for method length**
7198 The rubocop definition for the maximum method length was set to 75.
7203 * [HBASE-22379](https://issues.apache.org/jira/browse/HBASE-22379) | *Minor* | **Fix Markdown for "Voting on Release Candidates" in book**
7205 Fixes the formatting of the "Voting on Release Candidates" to actually show the quote and code formatting of the RAT check.
7210 * [HBASE-20851](https://issues.apache.org/jira/browse/HBASE-20851) | *Minor* | **Change rubocop config for max line length of 100**
7212 The rubocop configuration in the hbase-shell module now allows a line length with 100 characters, instead of 80 as before. For everything before 2.1.5 this change introduces rubocop itself.
7217 * [HBASE-22301](https://issues.apache.org/jira/browse/HBASE-22301) | *Minor* | **Consider rolling the WAL if the HDFS write pipeline is slow**
7219 This change adds new conditions for rolling the WAL for when syncs on the HDFS writer pipeline are perceived to be slow. 
7221 As before the configuration parameter hbase.regionserver.wal.slowsync.ms sets the slow sync warning threshold. 
7223 If we encounter hbase.regionserver.wal.slowsync.roll.threshold number of slow syncs (default 100) within the interval defined by hbase.regionserver.wal.slowsync.roll.interval.ms (default 1 minute), we will request a WAL roll. 
7225 Or, if the time for any sync exceeds the threshold set by hbase.regionserver.wal.roll.on.sync.ms (default 10 seconds) we will request a WAL roll immediately.
7227 Operators can monitor how often these new thresholds result in a WAL roll by looking at newly added metrics to the WAL related metric group:
7228 \* slowSyncRollRequest - How many times a roll was requested due to sync too slow on the write pipeline.
7230 Additionally, as a part of this change there are also additional metrics for existing reasons for a WAL roll:
7231 \* errorRollRequest - How many times a roll was requested due to I/O or other errors.
7232 \* sizeRollRequest - How many times a roll was requested due to file size roll threshold.
7237 * [HBASE-21883](https://issues.apache.org/jira/browse/HBASE-21883) | *Minor* | **Enhancements to Major Compaction tool**
7239 MajorCompactorTTL Tool allows to compact all regions in a table that have been TTLed out. This saves space on DFS and is useful for tables which are similar to time series data. This is typically scheduled to run frequently (say via cron) to cleanup old data on an ongoing basis.
7241 RSGroupMajorCompactionTTL tool is similar to MajorCompactorTTL but runs at a region server group level. If multiple tables in an rsgroup are similar to time-series data, then it runs a single command to clean them up. As more tables are added/removed from rsgroup, it's easy to have a single command to take care of all of them.
7246 * [HBASE-22054](https://issues.apache.org/jira/browse/HBASE-22054) | *Minor* | **Space Quota: Compaction is not working for super user in case of NO\_WRITES\_COMPACTIONS**
7248 This change allows the system and superusers to initiate compactions, even when a space quota violation policy disallows compactions from happening. The original intent behind disallowing of compactions was to prevent end-user compactions from creating undue I/O load, not disallowing \*any\* compaction in the system.
7253 * [HBASE-22083](https://issues.apache.org/jira/browse/HBASE-22083) | *Minor* | **move eclipse specific configs into a profile**
7255 <!-- markdown -->
7256 Maven project integration for Eclipse has been isolated into a maven profile to ensure it only is active when in an Eclipse project.
7258 Things should continue to behave the same for Eclipse users. If something should go wrong folks should manually activate the `eclipse-specific` profile.
7263 * [HBASE-22307](https://issues.apache.org/jira/browse/HBASE-22307) | *Major* | **Deprecated Preemptive Fail Fast**
7265 Deprecated Preemptive Fail Fast related constants in HConstants, the support of this feature will be removed in 3.0.0 so use these constants will have no effect for 3.0.0+ releases. And the constants will be kept till 4.0.0.
7267 Users can use 'hbase.client.perserver.requests.threshold' to control the number of concurrent requests to the same region server. Please see the release note of HBASE-16388 for more details.
7272 * [HBASE-22292](https://issues.apache.org/jira/browse/HBASE-22292) | *Blocker* | **PreemptiveFastFailInterceptor clean repeatedFailuresMap issue**
7274 Adds new configuration hbase.client.failure.map.cleanup.interval which defaults to ten minutes.
7279 * [HBASE-19222](https://issues.apache.org/jira/browse/HBASE-19222) | *Major* | **update jruby to 9.1.17.0**
7281 <!-- markdown -->
7283 The default version of JRuby shipped with HBase has been updated to the JRuby 9.1.17.0 release.
7285 For details on changes see [the release notes for JRuby 9.1.17.0](https://www.jruby.org/2018/04/23/jruby-9-1-17-0)
7290 * [HBASE-22279](https://issues.apache.org/jira/browse/HBASE-22279) | *Major* | **Add a getRegionLocator method in Table/AsyncTable interface**
7292 Add below method in Table interface:
7294 RegionLocator getRegionLocator() throws IOException;
7296 Add below methods in AsyncTable interface:
7298 AsyncTableRegionLocator getRegionLocator();
7299 CompletableFuture\<TableDescriptor\> getDescriptor();
7304 * [HBASE-15560](https://issues.apache.org/jira/browse/HBASE-15560) | *Major* | **TinyLFU-based BlockCache**
7306 LruBlockCache uses the Segmented LRU (SLRU) policy to capture frequency and recency of the working set. It achieves concurrency by using an O(n) background thread to prioritize the entries and evict. Accessing an entry is O(1) by a hash table lookup, recording its logical access time, and setting a frequency flag. A write is performed in O(1) time by updating the hash table and triggering an async eviction thread. This provides ideal concurrency and minimizes the latencies by penalizing the thread instead of the caller. However the policy does not age the frequencies and may not be resilient to various workload patterns. 
7308 This change introduces a new L1 policy, TinyLfuBlockCache, which records the frequency in a counting sketch, ages periodically by halving the counters, and orders entries by SLRU. An entry is discarded by comparing the frequency of the new arrival to the SLRU's victim, and keeping the one with the highest frequency. This allows the operations to be performed in O(1) time and, though the use of a compact sketch, a much larger history is retained beyond the current working set. In a variety of real world traces the policy had near optimal hit rates.
7310 New configuration variable hfile.block.cache.policy sets the eviction policy for the L1 block cache. The default is "LRU" (LruBlockCache). Set to "TinyLFU" to use TinyLfuBlockCache instead.
7315 * [HBASE-22178](https://issues.apache.org/jira/browse/HBASE-22178) | *Major* | **Introduce a createTableAsync with TableDescriptor method in Admin**
7317 Introduced
7319 Future\<Void\> createTableAsync(TableDescriptor);
7324 * [HBASE-22108](https://issues.apache.org/jira/browse/HBASE-22108) | *Major* | **Avoid passing null in Admin methods**
7326 Introduced these methods:
7327 void move(byte[]);
7328 void move(byte[], ServerName);
7329 Future\<Void\> splitRegionAsync(byte[]);
7331 These methods are deprecated:
7332 void move(byte[], byte[])
7337 * [HBASE-22152](https://issues.apache.org/jira/browse/HBASE-22152) | *Major* | **Create a jenkins file for yetus to processing GitHub PR**
7339 Add a new jenkins file for running pre commit check for GitHub PR.
7344 * [HBASE-22007](https://issues.apache.org/jira/browse/HBASE-22007) | *Major* | **Add restoreSnapshot and cloneSnapshot with acl methods in AsyncAdmin**
7346 Add cloneSnapshot/restoreSnapshot with acl methods in AsyncAdmin.
7351 * [HBASE-22123](https://issues.apache.org/jira/browse/HBASE-22123) | *Minor* | **REST gateway reports Insufficient permissions exceptions as 404 Not Found**
7353 When insufficient permissions, you now get:
7355 HTTP/1.1 403 Forbidden
7357 on the HTTP side, and in the message
7359 Forbidden
7360 org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘myuser',action: get, tableName:mytable, family:cf.
7361 at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.authorizeAccess(RangerAuthorizationCoprocessor.java:547)
7362 and the rest of the ADE stack
7367 * [HBASE-22100](https://issues.apache.org/jira/browse/HBASE-22100) | *Minor* | **False positive for error prone warnings in pre commit job**
7369 Now we will sort the javac WARNING/ERROR before generating diff in pre-commit so we can get a stable output for the error prone. The downside is that we just sort the output lexicographically so the line number will also be sorted lexicographically, which is a bit strange to human.
7374 * [HBASE-22057](https://issues.apache.org/jira/browse/HBASE-22057) | *Major* | **Impose upper-bound on size of ZK ops sent in a single multi()**
7376 Exposes a new configuration property "zookeeper.multi.max.size" which dictates the maximum size of deletes that HBase will make to ZooKeeper in a single RPC. This property defaults to 1MB, which should fall beneath the default ZooKeeper limit of 2MB, controlled by "jute.maxbuffer".
7381 * [HBASE-22052](https://issues.apache.org/jira/browse/HBASE-22052) | *Major* | **pom cleaning; filter out jersey-core in hadoop2 to match hadoop3 and remove redunant version specifications**
7383 <!-- markdown -->
7384 Fixed awkward dependency issue that prevented site building.
7386 #### note specific to HBase 2.1.4
7387 HBase 2.1.4 shipped with an early version of this fix that incorrectly altered the libraries included in our binary assembly for using Apache Hadoop 2.7 (the current build default Hadoop version for 2.1.z). For folks running out of the box against a Hadoop 2.7 cluster (or folks who skip the installation step of [replacing the bundled Hadoop libraries](http://hbase.apache.org/book.html#hadoop)) this will result in a failure at Region Server startup due to a missing class definition. e.g.:
7389 2019-03-27 09:02:05,779 ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
7390 java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
7391         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
7392         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
7393         at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
7394         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
7395         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
7396         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
7397         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
7398         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
7399         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:171)
7400         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:356)
7401         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
7402         at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
7403         at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
7404         at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
7405         at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:704)
7406         at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:613)
7407         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
7408         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
7409         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
7410         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
7411         at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:3029)
7412         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:63)
7413         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
7414         at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
7415         at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
7416         at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:3047)
7417 Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
7418         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
7419         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
7420         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
7421         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
7422         ... 26 more
7426 Workaround via any _one_ of the following:
7427 * If you are running against a Hadoop cluster that is 2.8+, ensure you replace the Hadoop libaries in the default binary assembly with those for your version.
7428 * If you are running against a Hadoop cluster that is 2.8+, build the binary assembly from the source release while specifying your Hadoop version.
7429 * If you are running against a Hadoop cluster that is a supported 2.7 release, ensure the `hadoop` executable is in the `PATH` seen at Region Server startup and that you are not using the `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP` bypass.
7430 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers via the HBASE_CLASSPATH environment variable.
7431 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers by copying it into the directory `${HBASE_HOME}/lib/client-facing-thirdparty/`.
7436 * [HBASE-22065](https://issues.apache.org/jira/browse/HBASE-22065) | *Major* | **Add listTableDescriptors(List\<TableName\>) method in AsyncAdmin**
7438 Add a listTableDescriptors(List\<TableName\>) method in the AsyncAdmin interface, to align with the Admin interface.
7443 * [HBASE-22063](https://issues.apache.org/jira/browse/HBASE-22063) | *Major* | **Deprecated Admin.deleteSnapshot(byte[])**
7445 Deprecate Admin.deleteSnapshot(byte[]), please use the String version instead.
7450 * [HBASE-22040](https://issues.apache.org/jira/browse/HBASE-22040) | *Major* | **Add mergeRegionsAsync with a List of region names method in AsyncAdmin**
7452 Add a mergeRegionsAsync(byte[][], boolean) method in the AsyncAdmin interface.
7454 Instead of using assert, now we will throw IllegalArgumentException when you want to merge less than 2 regions at client side. And also, at master side, instead of using assert, now we will throw DoNotRetryIOException if you want merge more than 2 regions, since we only support merging two regions at once for now.
7459 * [HBASE-22039](https://issues.apache.org/jira/browse/HBASE-22039) | *Major* | **Should add the synchronous parameter for the XXXSwitch method in AsyncAdmin**
7461 Add drainXXX parameter for balancerSwitch/splitSwitch/mergeSwitch methods in the AsyncAdmin interface, which has the same meaning with the synchronous parameter for these methods in the Admin interface.
7466 * [HBASE-22044](https://issues.apache.org/jira/browse/HBASE-22044) | *Major* | **ByteBufferUtils should not be IA.Public API**
7468 <!-- markdown -->
7470 As of HBase 3.0, the ByteBufferUtils class is now marked as a Private API for internal project use only. Downstream users are advised that it no longer has any compatibility promises across releases.
7472 As of earlier HBase release lines the class is now marked as deprecated to call attention to this planned transition.
7477 * [HBASE-21810](https://issues.apache.org/jira/browse/HBASE-21810) | *Major* | **bulkload  support set hfile compression on client**
7479 bulkload (HFileOutputFormat2)  support config the compression on client ,you can set the job configuration "hbase.mapreduce.hfileoutputformat.compression"  override the auto-detection of the target table's compression
7484 * [HBASE-22001](https://issues.apache.org/jira/browse/HBASE-22001) | *Major* | **Polish the Admin interface**
7486 Add a cloneSnapshotAsync method with restoreAcl parameter.
7487 Deprecated restoreSnapshotAsync method as it just ignores the failsafe configuration.
7488 Make snapshotAsync method returns a Future\<Void\>.
7489 Deprecated the snapshot related methods which take a 'byte[]' as the snapshot name.
7490 Use default methods to reduce the code base for implementation classes.
7495 * [HBASE-22000](https://issues.apache.org/jira/browse/HBASE-22000) | *Major* | **Deprecated isTableAvailable with splitKeys**
7497 Deprecated AsyncTable.isTableAvailable(TableName, byte[][]).
7502 * [HBASE-21871](https://issues.apache.org/jira/browse/HBASE-21871) | *Major* | **Support to specify a peer table name in VerifyReplication tool**
7504 After HBASE-21871, we can specify a peer table name with --peerTableName in VerifyReplication tool like the following:
7505 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable 5 TestTable
7507 In addition, we can compare any 2 tables in any remote clusters with specifying both peerId and --peerTableName.
7509 For example:
7510 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable zk1,zk2,zk3:2181/hbase TestTable
7515 * [HBASE-15728](https://issues.apache.org/jira/browse/HBASE-15728) | *Major* | **Add remaining per-table region / store / flush / compaction related metrics**
7517 Adds below flush, split, and compaction metrics
7519  +  // split related metrics
7520  +  private MutableFastCounter splitRequest;
7521  +  private MutableFastCounter splitSuccess;
7522  +  private MetricHistogram splitTimeHisto;
7524  +  // flush related metrics
7525  +  private MetricHistogram flushTimeHisto;
7526  +  private MetricHistogram flushMemstoreSizeHisto;
7527  +  private MetricHistogram flushOutputSizeHisto;
7528  +  private MutableFastCounter flushedMemstoreBytes;
7529  +  private MutableFastCounter flushedOutputBytes;
7531  +  // compaction related metrics
7532  +  private MetricHistogram compactionTimeHisto;
7533  +  private MetricHistogram compactionInputFileCountHisto;
7534  +  private MetricHistogram compactionInputSizeHisto;
7535  +  private MetricHistogram compactionOutputFileCountHisto;
7536  +  private MetricHistogram compactionOutputSizeHisto;
7537  +  private MutableFastCounter compactedInputBytes;
7538  +  private MutableFastCounter compactedOutputBytes;
7540  +  private MetricHistogram majorCompactionTimeHisto;
7541  +  private MetricHistogram majorCompactionInputFileCountHisto;
7542  +  private MetricHistogram majorCompactionInputSizeHisto;
7543  +  private MetricHistogram majorCompactionOutputFileCountHisto;
7544  +  private MetricHistogram majorCompactionOutputSizeHisto;
7545  +  private MutableFastCounter majorCompactedInputBytes;
7546  +  private MutableFastCounter majorCompactedOutputBytes;
7551 * [HBASE-21481](https://issues.apache.org/jira/browse/HBASE-21481) | *Major* | **[acl] Superuser's permissions should not be granted or revoked by any non-su global admin**
7553 HBASE-21481 improves the quality of access control, by strengthening the protection of super users's privileges.
7558 * [HBASE-21082](https://issues.apache.org/jira/browse/HBASE-21082) | *Critical* | **Reimplement assign/unassign related procedure metrics**
7560 Now we have four types of RIT procedure metrics, assign, unassign, move, reopen. The meaning of assign/unassign is changed, as we will not increase the unassign metric and then the assign metric when moving a region.
7561 Also introduced two new procedure metrics, open and close, which are used to track the open/close region calls to region server. We may send open/close multiple times to finish a RIT since we may retry multiple times.
7566 * [HBASE-20724](https://issues.apache.org/jira/browse/HBASE-20724) | *Critical* | **Sometimes some compacted storefiles are still opened after region failover**
7568 Problem: This is an old problem since HBASE-2231. The compaction event marker was only writed to WAL. But after flush, the WAL may be archived, which means an useful compaction event marker be deleted, too. So the compacted store files cannot be archived when region open and replay WAL.
7570 Solution: After this jira, the compaction event tracker will be writed to HFile. When region open and load store files, read the compaction evnet tracker from HFile and archive the compacted store files which still exist.
7575 * [HBASE-21820](https://issues.apache.org/jira/browse/HBASE-21820) | *Major* | **Implement CLUSTER quota scope**
7577 HBase contains two quota scopes: MACHINE and CLUSTER. Before this patch, set quota operations did not expose scope option to client api and use MACHINE as default, CLUSTER scope can not be set and used. 
7578 Shell commands are as follows:
7579 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
7581 This issue implements CLUSTER scope in a simple way: For user, namespace, user over namespace quota, use [ClusterLimit / RSNum] as machine limit. For table and user over table quota, use [ClusterLimit / TotalTableRegionNum \* MachineTableRegionNum] as machine limit.
7582 After this patch, user can set CLUSTER scope quota, but MACHINE is still default if user ignore scope. 
7583 Shell commands are as follows:
7584 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
7585 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> MACHINE
7586 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> CLUSTER
7591 * [HBASE-21057](https://issues.apache.org/jira/browse/HBASE-21057) | *Minor* | **upgrade to latest spotbugs**
7593 Change spotbugs version to 3.1.11.
7598 * [HBASE-21505](https://issues.apache.org/jira/browse/HBASE-21505) | *Major* | **Several inconsistencies on information reported for Replication Sources by hbase shell status 'replication' command.**
7600 This modifies "status 'replication'" output, fixing inconsistencies on the reporting times and ages of last shipped edits, as well as wrong calculation of replication lags. 
7602 It also introduces additional info for each recovery queue, which was not accounted by this command before.
7604 The new output for "status 'replication'" command is explained in details below:
7605 a) Source started, target stopped, no edits arrived on source yet:
7607  SOURCE: PeerID=1
7608          Normal Queue: 1
7609            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
7611 b) Source started, target stopped, add edit on source:
7613 Normal Queue: 1
7614            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:21:00 GMT 2018, Replication Lag=2459
7616 c) Source started, target stopped, edit added on source, restart source:
7618 SOURCE: PeerID=1
7619          Normal Queue: 1
7620            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
7621          Recovered Queue: 1-hbase01.home,16020,1542784524057
7622            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:23:00 GMT 2018, Replication Lag=201495
7624 d) Source started, target stopped, add edit on source, restart source, add another edit on source:
7626 SOURCE: PeerID=1
7627          Normal Queue: 1
7628            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=6349
7629          Recovered Queue: 1-hbase01.home,16020,1542782758742
7630            No Ops shipped since last restart, SizeOfLogQueue=0, TimeStampOfLastArrivedInSource=Wed Nov 21 06:53:05 GMT 2018, Replication Lag=569394
7632 e) Source started, target stopped, add edit on source, restart source, add another edit on source, start target:
7634        SOURCE: PeerID=1
7635          Normal Queue: 1
7636            AgeOfLastShippedOp=30000, TimeStampOfLastShippedOp=Wed Nov 21 07:07:58 GMT 2018, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=0
7638 f) Source started, target stopped, add edit on source, restart source, restart target:
7640 SOURCE: PeerID=1
7641          Normal Queue: 1
7642            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
7648 * [HBASE-21922](https://issues.apache.org/jira/browse/HBASE-21922) | *Major* | **BloomContext#sanityCheck may failed when use ROWPREFIX\_DELIMITED bloom filter**
7650 Remove bloom filter type ROWPREFIX\_DELIMITED. May add it back when find a better solution.
7655 * [HBASE-21783](https://issues.apache.org/jira/browse/HBASE-21783) | *Major* | **Support exceed user/table/ns throttle quota if region server has available quota**
7657 Support enable or disable exceed throttle quota. Exceed throttle quota means, user can over consume user/namespace/table quota if region server has additional available quota because other users don't consume at the same time. 
7658 Use the following shell commands to enable/disable exceed throttle quota: enable\_exceed\_throttle\_quota
7659 disable\_exceed\_throttle\_quota
7660 There are two limits when enable exceed throttle quota: 
7661 1. Must set at least one read and one write region server throttle quota; 
7662 2. All region server throttle quotas must be in seconds time unit. Because once previous requests exceed their quota and consume region server quota, quota in other time units may be refilled in a long time, this may affect later requests.
7667 * [HBASE-20587](https://issues.apache.org/jira/browse/HBASE-20587) | *Major* | **Replace Jackson with shaded thirdparty gson**
7669 Remove jackson dependencies from most hbase modules except hbase-rest, use shaded gson instead. The output json will be a bit different since jackson can use getter/setter, but gson will always use the fields.
7674 * [HBASE-21928](https://issues.apache.org/jira/browse/HBASE-21928) | *Major* | **Deprecated HConstants.META\_QOS**
7676 Mark HConstants.META\_QOS as deprecated. It is for internal use only, which is the highest priority. You should not try to set a priority greater than or equal to this value, although it is no harm but also useless.
7681 * [HBASE-17942](https://issues.apache.org/jira/browse/HBASE-17942) | *Major* | **Disable region splits and merges per table**
7683 This patch adds the ability to disable split and/or merge for a table (By default, split and merge are enabled for a table).
7688 * [HBASE-21636](https://issues.apache.org/jira/browse/HBASE-21636) | *Major* | **Enhance the shell scan command to support missing scanner specifications like ReadType, IsolationLevel etc.**
7690 Allows shell to set Scan options previously not exposed. See additions as part of the scan help by typing following hbase shell:
7692 hbase\> help 'scan'
7697 * [HBASE-21201](https://issues.apache.org/jira/browse/HBASE-21201) | *Major* | **Support to run VerifyReplication MR tool without peerid**
7699 We can specify peerQuorumAddress instead of peerId in VerifyReplication tool. So it no longer requires peerId to be setup when using this tool.
7701 For example:
7702 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication zk1,zk2,zk3:2181/hbase testTable
7707 * [HBASE-21838](https://issues.apache.org/jira/browse/HBASE-21838) | *Major* | **Create a special ReplicationEndpoint just for verifying the WAL entries are fine**
7709 Introduce a VerifyWALEntriesReplicationEndpoint which replicates nothing but only verifies if all the cells are valid.
7710 It can be used to capture bugs for writing WAL, as most times we will not read the WALs again after writing it if there are no region server crashes.
7715 * [HBASE-21764](https://issues.apache.org/jira/browse/HBASE-21764) | *Major* | **Size of in-memory compaction thread pool should be configurable**
7717 Introduced an new config key in this issue: hbase.regionserver.inmemory.compaction.pool.size. the default value would be 10.  you can configure this to set the pool size of in-memory compaction pool. Note that all memstores in one region server will share the same pool, so if you have many regions in one region server,  you need to set this larger to compact faster for better read performance.
7722 * [HBASE-21684](https://issues.apache.org/jira/browse/HBASE-21684) | *Major* | **Throw DNRIOE when connection or rpc client is closed**
7724 Make StoppedRpcClientException extend DoNotRetryIOException.
7729 * [HBASE-21739](https://issues.apache.org/jira/browse/HBASE-21739) | *Major* | **Move grant/revoke from regionserver to master**
7731 To implement user permission control in Precedure V2, move grant and revoke method from AccessController to master firstly.
7732 Mark AccessController#grant and AccessController#revoke as deprecated and please use Admin#grant and Admin#revoke instead.
7737 * [HBASE-21791](https://issues.apache.org/jira/browse/HBASE-21791) | *Blocker* | **Upgrade thrift dependency to 0.12.0**
7739 IMPORTANT: Due to security issues, all users who use hbase thrift should avoid using releases which do not have this fix.
7741 The effect releases are:
7742 2.1.x: 2.1.2 and below
7743 2.0.x: 2.0.4 and below
7744 1.x: 1.4.x and below
7746 If you are using the effect releases above, please consider upgrading to a newer release ASAP.
7751 * [HBASE-20894](https://issues.apache.org/jira/browse/HBASE-20894) | *Major* | **Move BucketCache from java serialization to protobuf**
7753 For users who have configured hbase.bucketcache.ioengine with either the file:, files:, or mmap: prefix, and configured it to be persistent via the hbase.bucketcache.persistent.path property, the serialization format of the bucket cache has changed between versions. The old state will not be read during startup, and there is currently no migration path. The impact is expected to be minimal, however, since the cache will rebuild over time as access patterns dictate.
7757 # HBASE  2.3.0 Release Notes
7759 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
7764 * [HBASE-24545](https://issues.apache.org/jira/browse/HBASE-24545) | *Major* | **Add backoff to SCP check on WAL split completion**
7766 Adds backoff in ServerCrashProcedure wait on WAL split to complete if large backlog of files to split (Its possible to avoid SCP blocking, waiting on WALs to split if you use procedure-based splitting --  set 'hbase.split.wal.zk.coordinated' to false to enable procedure based wal splitting.)
7771 * [HBASE-24524](https://issues.apache.org/jira/browse/HBASE-24524) | *Minor* | **SyncTable logging improvements**
7773 Notice this has changed log level for mismatching row keys, originally those were being logged at INFO level, now it's logged at DEBUG level. This is consistent with the logging of mismatching cells. Also, for missing row keys, it now logs row key values in human readable format, making it more meaningful for operators troubleshooting mismatches.
7778 * [HBASE-24359](https://issues.apache.org/jira/browse/HBASE-24359) | *Major* | **Optionally ignore edits for deleted CFs for replication.**
7780 Introduce a new config hbase.replication.drop.on.deleted.columnfamily, default is false. When config to true, the replication will drop the edits for columnfamily that has been deleted from the replication source and target.
7785 * [HBASE-24418](https://issues.apache.org/jira/browse/HBASE-24418) | *Major* | **Consolidate Normalizer implementations**
7787 <!-- markdown -->
7788 This change extends the Normalizer with a handful of new configurations. The configuration points supported are:
7789 * `hbase.normalizer.split.enabled` Whether to split a region as part of normalization. Default: `true`.
7790 * `hbase.normalizer.merge.enabled` Whether to merge a region as part of normalization. Default `true`.
7791 * `hbase.normalizer.min.region.count` The minimum number of regions in a table to consider it for merge normalization. Default: 3.
7792 * `hbase.normalizer.merge.min_region_age.days` The minimum age for a region to be considered for a merge, in days. Default: 3.
7793 * `hbase.normalizer.merge.min_region_size.mb` The minimum size for a region to be considered for a merge, in whole MBs. Default: 1.
7798 * [HBASE-24309](https://issues.apache.org/jira/browse/HBASE-24309) | *Major* | **Avoid introducing log4j and slf4j-log4j dependencies for modules other than hbase-assembly**
7800 Add a hbase-logging module, put the log4j related code in this module only so other modules do not need to depend on log4j at compile scope. See the comments of Log4jUtils and InternalLog4jUtils for more details.
7802 Add a log4j.properties to the test jar of hbase-logging module, so for other sub modules we just need to depend on the test jar of hbase-logging module at test scope to output the log to console, without placing a log4j.properties in the test resources as they all (almost) have the same content. And this test module will not be included in the assembly tarball so it will not mess up the binary distribution.
7804 Ban direct commons-logging dependency, and ban commons-logging and log4j imports in non-test code, to avoid mess up the downstream users logging framework. In hbase-logging module we do need to use log4j classes and the trick is to use full class name.
7806 Add jcl-over-slf4j and jul-to-slf4j dependencies, as some of our dependencies use jcl or jul as logging framework, we should also redirect their log message to slf4j.
7811 * [HBASE-21406](https://issues.apache.org/jira/browse/HBASE-21406) | *Minor* | **"status 'replication'" should not show SINK if the cluster does not act as sink**
7813 Added new metric to differentiate sink startup time from last OP applied time.
7815 Original behaviour was to always set startup time to TimestampsOfLastAppliedOp, and always show it on "status 'replication'" command, regardless if the sink ever applied any OP. 
7817 This was confusing, specially for scenarios where cluster was just acting as source, the output could lead to wrong interpretations about sink not applying edits or replication being stuck. 
7819 With the new metric, we now compare the two metrics values, assuming that if both are the same, there's never been any OP shipped to the given sink, so output would reflect it more clearly, to something as for example:
7821 SINK: TimeStampStarted=Thu Dec 06 23:59:47 GMT 2018, Waiting for OPs...
7826 * [HBASE-24132](https://issues.apache.org/jira/browse/HBASE-24132) | *Major* | **Upgrade to Apache ZooKeeper 3.5.7**
7828 <!-- markdown -->
7829 HBase ships ZooKeeper 3.5.x. Was the EOL'd 3.4.x. 3.5.x client can talk to 3.4.x ensemble.
7831 The ZooKeeper project has built a [FAQ](https://cwiki.apache.org/confluence/display/ZOOKEEPER/Upgrade+FAQ) that documents known issues and work-arounds when upgrading existing deployments.
7836 * [HBASE-22287](https://issues.apache.org/jira/browse/HBASE-22287) | *Major* | **inifinite retries on failed server in RSProcedureDispatcher**
7838 Add backoff. Avoid retrying every 100ms.
7843 * [HBASE-24425](https://issues.apache.org/jira/browse/HBASE-24425) | *Major* | **Run hbck\_chore\_run and catalogjanitor\_run on draw of 'HBCK Report' page**
7845 Runs 'catalogjanitor\_run' and 'hbck\_chore\_run' inline with the loading of the 'HBCK Report' page.
7847 Pass '?cache=true' to skip inline invocation of 'catalogjanitor\_run' and 'hbck\_chore\_run' drawing the page.
7852 * [HBASE-24408](https://issues.apache.org/jira/browse/HBASE-24408) | *Blocker* | **Introduce a general 'local region' to store data on master**
7854 Introduced a general 'local region' at master side to store the procedure data, etc.
7856 The hfile of this region will be stored on the root fs while the wal will be stored on the wal fs. This issue supercedes part of the code for HBASE-23326, as now we store the data in 'MasterData' directory instead of 'MasterProcs'.
7858 The old hfiles will be moved to the global hfile archived directory with the suffix $-masterlocalhfile-$. The wal files will be moved to the global old wal directory with the suffix $masterlocalwal$. The TimeToLiveMasterLocalStoreHFileCleaner and TimeToLiveMasterLocalStoreWALCleaner are configured by default for cleaning the old hfiles and wal files, and the default TTLs are both 7 days.
7863 * [HBASE-24115](https://issues.apache.org/jira/browse/HBASE-24115) | *Major* | **Relocate test-only REST "client" from src/ to test/ and mark Private**
7865 Relocate test-only REST RemoteHTable and RemoteAdmin from src/ to test/. And mark them as InterfaceAudience.Private.
7870 * [HBASE-23938](https://issues.apache.org/jira/browse/HBASE-23938) | *Major* | **Replicate slow/large RPC calls to HDFS**
7872 Config key: hbase.regionserver.slowlog.systable.enabled
7873 Default value: false
7875 This config can be enabled if hbase.regionserver.slowlog.buffer.enabled is already enabled. While hbase.regionserver.slowlog.buffer.enabled ensures that any slow/large RPC logs with complete details are written to ring buffer available at each RegionServer, hbase.regionserver.slowlog.systable.enabled would ensure that all such logs are also persisted in new system table hbase:slowlog. 
7876 Operator can scan hbase:slowlog with filters to retrieve specific attribute matching records and this table would be useful to capture historical performance of slowness of RPC calls with detailed analysis.
7878 hbase:slowlog consists of single ColumnFamily info. info consists of multiple qualifiers similar to the attributes available to query as part of Admin API: get\_slowlog\_responses.
7880 One example of a row from hbase:slowlog scan result (Attached a sample screenshot in the Jira) :
7882  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:call\_details, timestamp=2020-05-16T14:59:58.764Z, value=Scan(org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos$ScanRequest)                             
7883  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:client\_address, timestamp=2020-05-16T14:59:58.764Z, value=172.20.10.2:57348                                                                                          
7884  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:method\_name, timestamp=2020-05-16T14:59:58.764Z, value=Scan                                                                                                          
7885  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:param, timestamp=2020-05-16T14:59:58.764Z, value=region { type: REGION\_NAME value: "cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf." } scan { a
7886                                                              ttribute { name: "\_isolationlevel\_" value: "\\x5C000" } start\_row: "cccccccc" time\_range { from: 0 to: 9223372036854775807 } max\_versions: 1 cache\_blocks: true max\_result\_size: 2
7887                                                              097152 caching: 2147483647 include\_stop\_row: false } number\_of\_rows: 2147483647 close\_scanner: false client\_handles\_partials: true client\_handles\_heartbeats: true track\_scan\_met
7888                                                              rics: false                                                                                                                                                                      
7889  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:processing\_time, timestamp=2020-05-16T14:59:58.764Z, value=24                                                                                                        
7890  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:queue\_time, timestamp=2020-05-16T14:59:58.764Z, value=0                                                                                                              
7891  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:region\_name, timestamp=2020-05-16T14:59:58.764Z, value=cluster\_test,cccccccc,1589635796466.aa45e1571d533f5ed0bb31cdccaaf9cf.                                         
7892  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:response\_size, timestamp=2020-05-16T14:59:58.764Z, value=211227                                                                                                      
7893  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:server\_class, timestamp=2020-05-16T14:59:58.764Z, value=HRegionServer                                                                                                
7894  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:start\_time, timestamp=2020-05-16T14:59:58.764Z, value=1589640743932                                                                                                  
7895  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:type, timestamp=2020-05-16T14:59:58.764Z, value=ALL                                                                                                                  
7896  \\x024\\xC1\\x06X\\x81\\xF6\\xEC                                  column=info:username, timestamp=2020-05-16T14:59:58.764Z, value=vjasani
7901 * [HBASE-24271](https://issues.apache.org/jira/browse/HBASE-24271) | *Major* | **Set values in \`conf/hbase-site.xml\` that enable running on \`LocalFileSystem\` out of the box**
7903 <!-- markdown -->
7904 HBASE-24271 makes changes the the default `conf/hbase-site.xml` such that `bin/hbase` will run directly out of the binary tarball or a compiled source tree without any configuration modifications vs. Hadoop 2.8+. This changes our long-standing history of shipping no configured values in `conf/hbase-site.xml`, so existing processes that assume this file is empty of configuration properties may require attention.
7909 * [HBASE-24310](https://issues.apache.org/jira/browse/HBASE-24310) | *Major* | **Use Slf4jRequestLog for hbase-http**
7911 Use Slf4jRequestLog instead of the log4j HttpRequestLogAppender in HttpServer.
7913 The request log is disabled by default in conf/log4j.properties by the following lines:
7915 # Disable request log by default, you can enable this by changing the appender
7916 log4j.category.http.requests=INFO,NullAppender
7917 log4j.additivity.http.requests=false
7919 Change the 'NullAppender' to what ever you want if you want to enable request log.
7921 Notice that, the logger name for master status http server is 'http.requests.master', and for region server it is 'http.requests.regionserver'
7926 * [HBASE-24335](https://issues.apache.org/jira/browse/HBASE-24335) | *Major* | **Support deleteall with ts but without column in shell mode**
7928 Use a empty string to represent no column specified for deleteall in shell mode.
7929 useage:  
7930 deleteall 'test','r1','',12345
7931 deleteall 'test', {ROWPREFIXFILTER =\> 'prefix'}, '', 12345
7936 * [HBASE-24304](https://issues.apache.org/jira/browse/HBASE-24304) | *Major* | **Separate a hbase-asyncfs module**
7938 Added a new hbase-asyncfs module to hold the asynchronous dfs output stream implementation for implementing WAL.
7943 * [HBASE-22710](https://issues.apache.org/jira/browse/HBASE-22710) | *Major* | **Wrong result in one case of scan that use  raw and versions and filter together**
7945 Make the logic of the versions chosen more reasonable for raw scan, to avoid lose result when using filter.
7950 * [HBASE-24285](https://issues.apache.org/jira/browse/HBASE-24285) | *Major* | **Move to hbase-thirdparty-3.3.0**
7952 Moved to hbase-thirdparty 3.3.0.
7957 * [HBASE-24252](https://issues.apache.org/jira/browse/HBASE-24252) | *Major* | **Implement proxyuser/doAs mechanism for hbase-http**
7959 This feature enables the HBase Web UI's to accept a 'proxyuser' via the HTTP Request's query string. When the parameter \`hbase.security.authentication.spnego.kerberos.proxyuser.enable\` is set to \`true\` in hbase-site.xml (default is \`false\`), the HBase UI will attempt to impersonate the user specified by the query parameter "doAs". This query parameter is checked case-insensitively. When this option is not provided, the user who executed the request is the "real" user and there is no ability to execute impersonation against the WebUI.
7961 For example, if the user "bob" with Kerberos credentials executes a request against the WebUI with this feature enabled and a query string which includes \`doAs=alice\`, the HBase UI will treat this request as executed as \`alice\`, not \`bob\`.
7963 The standard Hadoop proxyuser configuration properties to limit users who may impersonate others apply to this change (e.g. to enable \`bob\` to impersonate \`alice\`). See the Hadoop documentation for more information on how to configure these proxyuser rules.
7968 * [HBASE-24143](https://issues.apache.org/jira/browse/HBASE-24143) | *Major* | **[JDK11] Switch default garbage collector from CMS**
7970 <!-- markdown -->
7971 `bin/hbase` will now dynamically select a Garbage Collector implementation based on the detected JVM version. JDKs 8,9,10 use `-XX:+UseConcMarkSweepGC`, while JDK11+ use `-XX:+UseG1GC`.
7973 Notice a slight compatibility change. Previously, the garbage collector choice would always be appended to a user-provided value for `HBASE_OPTS`. As of this change, this setting will only be applied when `HBASE_OPTS` is unset. That means that operators who provide a value for this variable will now need to also specify the collector. This is especially important for those on JDK8, where the vm default GC is not the recommended ConcMarkSweep.
7978 * [HBASE-24024](https://issues.apache.org/jira/browse/HBASE-24024) | *Major* | **Optionally reject multi() requests with very high no of rows**
7980 New Config: hbase.rpc.rows.size.threshold.reject
7981 -----------------------------------------------------------------------
7983 Default value: false
7984 Description:
7985 If value is true, RegionServer will abort batch requests of Put/Delete with number of rows in a batch operation exceeding threshold defined by value of config: hbase.rpc.rows.warning.threshold.
7990 * [HBASE-24139](https://issues.apache.org/jira/browse/HBASE-24139) | *Critical* | **Balancer should avoid leaving idle region servers**
7992 StochasticLoadBalancer functional improvement:
7994 StochasticLoadBalancer would rebalance the cluster if there are any idle RegionServers in the cluster (RegionServer having no region), while other RegionServers have at least 1 region available.
7999 * [HBASE-24196](https://issues.apache.org/jira/browse/HBASE-24196) | *Major* | **[Shell] Add rename rsgroup command in hbase shell**
8001 user or admin can now use
8002 hbase shell \> rename\_rsgroup 'oldname', 'newname'
8003 to rename rsgroup.
8008 * [HBASE-24218](https://issues.apache.org/jira/browse/HBASE-24218) | *Major* | **Add hadoop 3.2.x in hadoop check**
8010 Add hadoop-3.2.0 and hadoop-3.2.1 in hadoop check and when '--quick-hadoopcheck' we will only check hadoop-3.2.1.
8012 Notice that, for aligning the personality scripts across all the active branches, we will commit the patch to all active branches, but the hadoop-3.2.x support in hadoopcheck is only applied to branch-2.2+.
8017 * [HBASE-23829](https://issues.apache.org/jira/browse/HBASE-23829) | *Major* | **Get \`-PrunSmallTests\` passing on JDK11**
8019 \`-PrunSmallTests\` now pass on JDK11 when using \`-Phadoop.profile=3.0\`.
8024 * [HBASE-24185](https://issues.apache.org/jira/browse/HBASE-24185) | *Major* | **Junit tests do not behave well with System.exit or Runtime.halt or JVM exits in general.**
8026 Tests that fail because a process -- RegionServer or Master -- called System.exit, will now instead throw an exception.
8031 * [HBASE-24072](https://issues.apache.org/jira/browse/HBASE-24072) | *Major* | **Nightlies reporting OutOfMemoryError: unable to create new native thread**
8033 Hadoop hosts have had their ulimit -u raised from 10000 to 30000 (per user, by INFRA). The Docker build container has had its limit raised from 10000 to 12500.
8038 * [HBASE-24112](https://issues.apache.org/jira/browse/HBASE-24112) | *Major* | **[RSGroup] Support renaming rsgroup**
8040 Support RSGroup renaming in core codebase. New API Admin#renameRSGroup(String, String) is introduced in 3.0.0.
8045 * [HBASE-23994](https://issues.apache.org/jira/browse/HBASE-23994) | *Trivial* | ** Add WebUI to Canary**
8047 <!-- markdown -->
8048 The Canary tool now offers a WebUI when run in `region` mode (the default mode). It is enabled by default, and by default, it binds to `0.0.0.0:16050`. This can be overridden by setting `hbase.canary.info.bindAddress` and `hbase.canary.info.port`. To disable entirely, set the port to `-1`.
8053 * [HBASE-23779](https://issues.apache.org/jira/browse/HBASE-23779) | *Major* | **Up the default fork count to make builds complete faster; make count relative to CPU count**
8055 Pass --threads=2 building on jenkins. It shortens nightly build times by about ~25%.
8057 It works by running module build/test in parallel when dependencies allow. Upping the forkcount beyond the pom default of 0.25C would have us broach our CPU budget on jenkins when two modules are running in parallel (2 modules at 0.25% of CPU each makes 0.5C and on jenkins, hadoop nodes run two jenkins executors per host).  Higher forkcounts also seems to threaten build stability.
8059 For running tests locally, to go faster, up fork count.
8061 $ x="0.5C"  ;  mvn --threads=2  -Dsurefire.firstPartForkCount=$x -Dsurefire.secondPartForkCount=$x test -PrunAllTests
8063 You could up the x from 0.5C to 1.0C but YMMV (On overcommitted hardware, tests start bombing out pretty soon after startup). You could try upping thread count but on occasion are likely to overcommit hardware.
8068 * [HBASE-24126](https://issues.apache.org/jira/browse/HBASE-24126) | *Major* | **Up the container nproc uplimit from 10000 to 12500**
8070 Start docker with upped ulimit for nproc passing '--ulimit nproc=12500'. It was 10000, the default, but made it 12500. Then, set PROC\_LIMIT in hbase-personality so when yetus runs, it is w/ the new 12500 value.
8075 * [HBASE-24150](https://issues.apache.org/jira/browse/HBASE-24150) | *Major* | **Allow module tests run in parallel**
8077 Pass -T2 to mvn. Makes it so we do two modules-at-a-time dependencies willing. Helps speed build and testing. Doubles the resource usage when running modules in parallel.
8082 * [HBASE-24121](https://issues.apache.org/jira/browse/HBASE-24121) | *Major* | **[Authorization] ServiceAuthorizationManager isn't dynamically updatable. And it should be.**
8084 Master & RegionService now support refresh policy authorization defined in hbase-policy.xml without restarting service. To refresh policy, please execute hbase shell command: update\_config or update\_config\_all after policy file updated and synced on all nodes.
8089 * [HBASE-24099](https://issues.apache.org/jira/browse/HBASE-24099) | *Major* | **Use a fair ReentrantReadWriteLock for the region close lock**
8091 This change modifies the default acquisition policy for the region's close lock in order to prevent observed starvation of close requests. The new boolean configuration parameter 'hbase.regionserver.fair.region.close.lock' controls the lock acquisition policy: if true, the lock is created in fair mode (default); if false, the lock is created in nonfair mode (the old default).
8096 * [HBASE-23153](https://issues.apache.org/jira/browse/HBASE-23153) | *Major* | **PrimaryRegionCountSkewCostFunction SLB function should implement CostFunction#isNeeded**
8098 <!-- markdown -->
8099 The `PrimaryRegionCountSkewCostFunction` for the `StochasticLoadBalancer` is only needed when the read replicas feature is enabled. With this change, that function now properly indicates that it is not needed when the read replica feature is off.
8101 If this improvement is not available, operators with clusters that are not using the read replica feature should manually disable it by setting `hbase.master.balancer.stochastic.primaryRegionCountCost` to `0.0` in hbase-site.xml for all HBase Masters.
8106 * [HBASE-24055](https://issues.apache.org/jira/browse/HBASE-24055) | *Major* | **Make AsyncFSWAL can run on EC cluster**
8108 Now AsyncFSWAL can also be used against the directory which has EC enabled. Need to make sure you also make use of the hadoop 3.x client as the option is only available in hadoop 3.x.
8113 * [HBASE-24113](https://issues.apache.org/jira/browse/HBASE-24113) | *Major* | **Upgrade the maven we use from 3.5.4 to 3.6.3 in nightlies**
8115 Branches-2.3+ use maven 3.5.3 building. Older branches use 3.5.4 still.
8120 * [HBASE-24122](https://issues.apache.org/jira/browse/HBASE-24122) | *Major* | **Change machine ulimit-l to ulimit-a so dumps full ulimit rather than just 'max locked memory'**
8122 Our 'Build Artifacts' have a machine directory under which we emit vitals on the host the build was run on. We used to emit the result of 'ulimit -l' as a file named 'ulimit-l'. This has been hijacked to instead emit result of running 'ulimit -a' which includes stat on ulimit -l.
8127 * [HBASE-23678](https://issues.apache.org/jira/browse/HBASE-23678) | *Major* | **Literate builder API for version management in schema**
8129 ColumnFamilyDescriptor new builder API:
8131     /\*\*
8132      \* Retain all versions for a given TTL(retentionInterval), and then only a specific number
8133      \* of versions(versionAfterInterval) after that interval elapses.
8134      \*
8135      \* @param retentionInterval Retain all versions for this interval
8136      \* @param versionAfterInterval Retain no of versions to retain after retentionInterval
8137      \*/
8138     public ModifyableColumnFamilyDescriptor setVersionsWithTimeToLive(
8139         final int retentionInterval, final int versionAfterInterval)
8144 * [HBASE-24050](https://issues.apache.org/jira/browse/HBASE-24050) | *Major* | **Deprecated PBType on all 2.x branches**
8146 org.apache.hadoop.hbase.types.PBType is marked as deprecated without any replacement. It will be moved to hbase-example module and marked as IA.Private in 3.0.0. This is a mistake as it should not be part of our public API. Users who depend on this class should just copy the code your own code base.
8151 * [HBASE-8868](https://issues.apache.org/jira/browse/HBASE-8868) | *Minor* | **add metric to report client shortcircuit reads**
8153 Expose file system level read metrics for RegionServer.
8155 If the HBase RS runs on top of HDFS, calculate the aggregation of
8156 ReadStatistics of each HdfsFileInputStream. These metrics include:
8157 (1) total number of bytes read from HDFS.
8158 (2) total number of bytes read from local DataNode.
8159 (3) total number of bytes read locally through short-circuit read.
8160 (4) total number of bytes read locally through zero-copy read.
8162 Because HDFS ReadStatistics is calculated per input stream, it is not
8163 feasible to update the aggregated number in real time. Instead, the
8164 metrics are updated when an input stream is closed.
8169 * [HBASE-24032](https://issues.apache.org/jira/browse/HBASE-24032) | *Major* | **[RSGroup] Assign created tables to respective rsgroup automatically instead of manual operations**
8171 Admin can determine which tables go to which rsgroup by script  (setting hbase.rsgroup.table.mapping.script with local filystem path) on Master side which aims to lighten the burden of admin operations.  Note, since HBase 3+, rsgroup can be specified in TableDescriptor as well, if clients specify this, master will skip the determination from script.
8173 Here is a simple example of script:
8174 {code}
8175 # Input consists of two string, 1st is the namespace of the table, 2nd is the table name of the table
8176 #!/bin/bash
8177 namespace=$1
8178 tablename=$2
8179 if [[ $namespace == test ]]; then
8180   echo test
8181 elif [[ $tablename == \*foo\* ]]; then
8182   echo other
8183 else
8184   echo default
8186 {code}
8191 * [HBASE-23993](https://issues.apache.org/jira/browse/HBASE-23993) | *Major* | **Use loopback for zk standalone server in minizkcluster**
8193 MiniZKCluster now puts up its standalone node listening on loopback/127.0.0.1 rather than "localhost".
8198 * [HBASE-23986](https://issues.apache.org/jira/browse/HBASE-23986) | *Major* | **Bump hadoop-two.version to 2.10.0 on master and branch-2**
8200 Bumped hadoop-two.version to 2.10.0, which means we will drop the support for hadoop-2.8.x and hadoop-2.9.x.
8205 * [HBASE-23930](https://issues.apache.org/jira/browse/HBASE-23930) | *Minor* | **Shell should attempt to format \`timestamp\` attributes as ISO-8601**
8207 Change timestamp display to be ISO8601 when toString on Cell and outputting in shell....
8209 User used to see....
8210     
8211   column=table:state, timestamp=1583967620343 .....
8213 ... but now sees:
8215   column=table:state, timestamp=2020-03-11T23:00:20.343Z ....
8220 * [HBASE-22827](https://issues.apache.org/jira/browse/HBASE-22827) | *Major* | **Expose multi-region merge in shell and Admin API**
8222 merge\_region shell command can now be used to merge more than 2 regions as well. It takes a list of regions as comma separated values or as an array of regions, and not just 2 regions. The full regionnames and encoded regionnames are continued to be accepted.
8227 * [HBASE-23767](https://issues.apache.org/jira/browse/HBASE-23767) | *Major* | **Add JDK11 compilation and unit test support to Github precommit**
8229 Rebuild our Dockerfile with support for multiple JDK versions. Use multiple stages in the Jenkinsfile instead of yetus's multijdk because of YETUS-953. Run those multiple stages in parallel to speed up results.
8231 Note that multiple stages means multiple Yetus invocations means multiple comments on the PreCommit. This should become more obvious to users once we can make use of GitHub Checks API, HBASE-23902.
8236 * [HBASE-22978](https://issues.apache.org/jira/browse/HBASE-22978) | *Minor* | **Online slow response log**
8238 get\_slowlog\_responses and clear\_slowlog\_responses are used to retrieve and clear slow RPC logs from RingBuffer maintained by RegionServers.
8240 New Admin APIs:
8241 1.   List\<SlowLogRecord\> getSlowLogResponses(final Set\<ServerName\> serverNames,
8242       final SlowLogQueryFilter slowLogQueryFilter) throws IOException;
8244 2.   List\<Boolean\> clearSlowLogResponses(final Set\<ServerName\> serverNames)
8245       throws IOException;
8247 Configs:
8249 1. hbase.regionserver.slowlog.ringbuffer.size:
8250 Default size of ringbuffer to be maintained by each RegionServer in order to store online slowlog responses. This is an in-memory ring buffer of requests that were judged to be too slow in addition to the responseTooSlow logging. The in-memory representation would be complete. For more details, please look into Doc Section: Get Slow Response Log from shell
8252 Default
8255 2. hbase.regionserver.slowlog.buffer.enabled:
8256 Indicates whether RegionServers have ring buffer running for storing Online Slow logs in FIFO manner with limited entries. The size of the ring buffer is indicated by config: hbase.regionserver.slowlog.ringbuffer.size The default value is false, turn this on and get latest slowlog responses with complete data.
8258 Default
8259 false
8262 For more details, please look into "Get Slow Response Log from shell" section from HBase book.
8267 * [HBASE-23926](https://issues.apache.org/jira/browse/HBASE-23926) | *Major* | **[Flakey Tests] Down the flakies re-run ferocity; it makes for too many fails.**
8269 Down the flakey re-rerun fork count from 1.0C -- i.e. a fork per CPU -- to 0.25C. On a recent run, the machine had 16 cores. 0.25 is 4 cores. We'd hardcoded fork count at 3 previous to changes made by parent.
8274 * [HBASE-23146](https://issues.apache.org/jira/browse/HBASE-23146) | *Major* | **Support CheckAndMutate with multiple conditions**
8276 Add a checkAndMutate(row, filter) method in the AsyncTable interface and the Table interface.
8278 This method atomically checks if the row matches the specified filter. If it does, it adds the Put/Delete/RowMutations.
8280 This is a fluent style API, the code is like:
8282 For Table interface:
8283 {code}
8284 table.checkAndMutate(row, filter).thenPut(put);
8285 {code}
8287 For AsyncTable interface:
8288 {code}
8289 table.checkAndMutate(row, filter).thenPut(put)
8290     .thenAccept(succ -\> {
8291       if (succ) {
8292         System.out.println("Check and put succeeded");
8293       } else {
8294         System.out.println("Check and put failed");
8295       }
8296     });
8297 {code}
8302 * [HBASE-23874](https://issues.apache.org/jira/browse/HBASE-23874) | *Minor* | **Move Jira-attached file precommit definition from script in Jenkins config to dev-support**
8304 The Jira Precommit job (https://builds.apache.org/job/PreCommit-HBASE-Build/) will now look for a file within the source tree (dev-support/jenkins\_precommit\_jira\_yetus.sh) instead of depending on a script section embedded in the job.
8309 * [HBASE-23865](https://issues.apache.org/jira/browse/HBASE-23865) | *Major* | **Up flakey history from 5 to 10**
8311 Changed flakey list reporting to show 5 rather than 10 items. Also changed the second and first part fort counts to be 1C rather than hardcoded 3.
8316 * [HBASE-23554](https://issues.apache.org/jira/browse/HBASE-23554) | *Major* | **Encoded regionname to regionname utility**
8318     Adds shell command regioninfo:
8320       hbase(main):001:0\>  regioninfo '0e6aa5c19ae2b2627649dc7708ce27d0'
8321       {ENCODED =\> 0e6aa5c19ae2b2627649dc7708ce27d0, NAME =\> 'TestTable,,1575941375972.0e6aa5c19ae2b2627649dc7708ce27d0.', STARTKEY =\> '', ENDKEY =\> '00000000000000000000299441'}
8322       Took 0.4737 seconds
8327 * [HBASE-23350](https://issues.apache.org/jira/browse/HBASE-23350) | *Major* | **Make compaction files cacheonWrite configurable based on threshold**
8329 This JIRA adds a new configuration - \`hbase.rs.cachecompactedblocksonwrite.threshold\`. This configuration is the maximum total size (in bytes) of the compacted files below which the configuration \`hbase.rs.cachecompactedblocksonwrite\` is honoured. If the total size of the compacted fies exceeds this threshold, even when \`hbase.rs.cachecompactedblocksonwrite\` is enabled, the data blocks are not cached. Caching index and bloom blocks is not affected by this configuration (user configuration is always honoured).
8331 Default value of this configuration is Long.MAX\_VALUE. This means whatever the total size of the compacted files, it wil be cached.
8336 * [HBASE-17115](https://issues.apache.org/jira/browse/HBASE-17115) | *Major* | **HMaster/HRegion Info Server does not honour admin.acl**
8338 Implements authorization for the HBase Web UI by limiting access to certain endpoints which could be used to extract sensitive information from HBase.
8340 Access to these restricted endpoints can be limited to a group of administrators, identified either by a list of users (hbase.security.authentication.spnego.admin.users) or by a list of groups
8341 (hbase.security.authentication.spnego.admin.groups).  By default, neither of these values are set which will preserve backwards compatibility (allowing all authenticated users to access all endpoints).
8343 Further, users who have sensitive information in the HBase service configuration can set hbase.security.authentication.ui.config.protected to true which will treat the configuration endpoint as a protected, admin-only resource. By default, all authenticated users may access the configuration endpoint.
8348 * [HBASE-23647](https://issues.apache.org/jira/browse/HBASE-23647) | *Major* | **Make MasterRegistry the default registry impl**
8350 <!-- markdown -->
8351 Enables master based registry as the default registry used by clients to fetch connection metadata.
8352 Refer to the section "Master Registry" in the client documentation for more details and advantages
8353 of this implementation over the default Zookeeper based registry. 
8355 Configuration parameter that controls the registry in use: `hbase.client.registry.impl`
8357 Where to set this: HBase client configuration (hbase-site.xml)
8359 Possible values:
8360 - `org.apache.hadoop.hbase.client.ZKConnectionRegistry` (For ZK based registry implementation)
8361 - `org.apache.hadoop.hbase.client.MasterRegistry` (New, for master based registry implementation)
8363 Notes on defaults:
8365 - For v3.0.0 and later, MasterRegistry is the default registry
8366 - For all releases in 2.x line, ZK based registry is the default.
8368 This feature has been back ported to 2.3.0 and later releases. MasterRegistry can be enabled by setting the following client configuration.
8371 <property>
8372   <name>hbase.client.registry.impl</name>
8373   <value>org.apache.hadoop.hbase.client.MasterRegistry</value>
8374 </property>
8380 * [HBASE-23069](https://issues.apache.org/jira/browse/HBASE-23069) | *Critical* | **periodic dependency bump for Sep 2019**
8382 caffeine: 2.6.2 =\> 2.8.1
8383 commons-codec: 1.10 =\> 1.13
8384 commons-io: 2.5 =\> 2.6
8385 disrupter: 3.3.6 =\> 3.4.2
8386 httpcore: 4.4.6 =\> 4.4.13
8387 jackson: 2.9.10 =\> 2.10.1
8388 jackson.databind: 2.9.10.1 =\> 2.10.1
8389 jetty: 9.3.27.v20190418 =\> 9.3.28.v20191105
8390 protobuf.plugin: 0.5.0 =\> 0.6.1
8391 zookeeper: 3.4.10 =\> 3.4.14
8392 slf4j: 1.7.25 =\> 1.7.30
8393 rat: 0.12 =\> 0.13
8394 asciidoctor: 1.5.5 =\> 1.5.8
8395 asciidoctor.pdf: 1.5.0-alpha.15 =\> 1.5.0-rc.2
8396 error-prone: 2.3.3 =\> 2.3.4
8401 * [HBASE-23686](https://issues.apache.org/jira/browse/HBASE-23686) | *Major* | **Revert binary incompatible change and remove reflection**
8403 - Reverts a binary incompatible binary change for ByteRangeUtils
8404 - Usage of reflection inside CommonFSUtils removed
8409 * [HBASE-23055](https://issues.apache.org/jira/browse/HBASE-23055) | *Major* | **Alter hbase:meta**
8411 Adds being able to edit hbase:meta table schema. For example,
8413 hbase(main):006:0\> alter 'hbase:meta', {NAME =\> 'info', DATA\_BLOCK\_ENCODING =\> 'ROW\_INDEX\_V1'}
8414 Updating all regions with the new schema...
8415 All regions updated.
8416 Done.
8417 Took 1.2138 seconds
8419 You can even add columnfamilies. Howevert, you cannot delete any of the core hbase:meta column families such as 'info' and 'table'.
8424 * [HBASE-23347](https://issues.apache.org/jira/browse/HBASE-23347) | *Major* | **Pluggable RPC authentication**
8426 This change introduces an internal abstraction layer which allows for new SASL-based authentication mechanisms to be used inside HBase services. All existing SASL-based authentication mechanism were ported to the new abstraction, making no external change in runtime semantics, client API, or RPC serialization format.
8428 Developers familiar with extending HBase can implement authentication mechanism beyond simple Kerberos and DelegationTokens which authenticate HBase users against some other user database. HBase service authentication (Master to/from RegionServer) continue to operate solely over Kerberos.
8433 * [HBASE-23156](https://issues.apache.org/jira/browse/HBASE-23156) | *Major* | **start-hbase.sh failed with ClassNotFoundException when build with hadoop3**
8435 Introduce a new hbase-assembly/src/main/assembly/hadoop-three-compat.xml for build with hadoop 3.x.
8440 * [HBASE-23680](https://issues.apache.org/jira/browse/HBASE-23680) | *Major* | **RegionProcedureStore missing cleaning of hfile archive**
8442 Add a new config to hbase-default.xml
8444   \<property\>
8445     \<name\>hbase.procedure.store.region.hfilecleaner.plugins\</name\>
8446     \<value\>org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner\</value\>
8447     \<description\>A comma-separated list of BaseHFileCleanerDelegate invoked by
8448     the RegionProcedureStore HFileCleaner service. These HFiles cleaners are
8449     called in order, so put the cleaner that prunes the most files in front. To
8450     implement your own BaseHFileCleanerDelegate, just put it in HBase's classpath
8451     and add the fully qualified class name here. Always add the above
8452     default hfile cleaners in the list as they will be overwritten in
8453     hbase-site.xml.\</description\>
8454   \</property\>
8456 It will share the same TTL with other HFileCleaners. And you can also implement your own cleaner and change this property to enable it.
8461 * [HBASE-23675](https://issues.apache.org/jira/browse/HBASE-23675) | *Minor* | **Move to Apache parent POM version 22**
8463 Updated parent pom to Apache version 22.
8468 * [HBASE-23679](https://issues.apache.org/jira/browse/HBASE-23679) | *Critical* | **FileSystem instance leaks due to bulk loads with Kerberos enabled**
8470 This issues fixes an issue with Bulk Loading on installations with Kerberos enabled and more than a single RegionServer. When multiple tables are involved in hosting a table's regions which are being bulk-loaded into, all but the RegionServer hosting the table's first Region will "leak" one DistributedFileSystem object onto the heap, never freeing that memory. Eventually, with enough bulk loads, this will create a situation for RegionServers where they have no free heap space and will either spend all time in JVM GC, lose their ZK session, or crash with an OutOfMemoryError.
8472 The only mitigation for this issue is to periodically restart RegionServers. All earlier versions of HBase 2.x are subject to this issue (2.0.x, \<=2.1.8, \<=2.2.3)
8477 * [HBASE-23286](https://issues.apache.org/jira/browse/HBASE-23286) | *Major* | **Improve MTTR: Split WAL to HFile**
8479 Add a new feature to improve MTTR which have 3 steps to failover:
8480 1. Read WAL and write HFile to region’s column family’s recovered.hfiles directory.
8481 2. Open region.
8482 3. Bulkload the recovered.hfiles for every column family.
8484 Compared to DLS(distributed log split), this feature will reduce region open time significantly.
8486 Config hbase.wal.split.to.hfile to true to enable this featue.
8491 * [HBASE-23619](https://issues.apache.org/jira/browse/HBASE-23619) | *Trivial* | **Use built-in formatting for logging in hbase-zookeeper**
8493 Changed the logging in hbase-zookeeper to use built-in formatting
8498 * [HBASE-23628](https://issues.apache.org/jira/browse/HBASE-23628) | *Minor* | **Replace Apache Commons Digest Base64 with JDK8 Base64**
8500 From the PR:
8502 "Yes. The two create the same output... I just wrote a small test suite to increase my confidence on that. I generated many tens of millions of random byte patterns and compared the output of the two algorithms. They came back identical every time.
8504 "Just in case any inquiring minds would like to know, there is no longer an encoding required when generating the strings. The JDK implementation specifically specifies that strings returned are StandardCharsets.ISO\_8859\_1. This does not change anything because UTF8 and ISO\_8859 overlap for the limited character set (64 characters) the encoding uses."
8509 * [HBASE-23651](https://issues.apache.org/jira/browse/HBASE-23651) | *Major* | **Region balance throttling can be disabled**
8511 Set hbase.balancer.max.balancing to a int value which \<=0 will disable region balance throttling.
8516 * [HBASE-23588](https://issues.apache.org/jira/browse/HBASE-23588) | *Major* | **Cache index blocks and bloom blocks on write if CacheCompactedBlocksOnWrite is enabled**
8518 If cacheOnWrite is enabled during flush or compaction, index and bloom blocks(with data blocks) would be automatically cached during write.
8523 * [HBASE-23369](https://issues.apache.org/jira/browse/HBASE-23369) | *Major* | **Auto-close 'unknown' Regions reported as OPEN on RegionServers**
8525 If a RegionServer reports a Region as OPEN in disagreement with Master's status on the Region, the Master now tells the RegionServer to silently close the Region.
8530 * [HBASE-23596](https://issues.apache.org/jira/browse/HBASE-23596) | *Major* | **HBCKServerCrashProcedure can double assign**
8532 Makes it so the recently added HBCKServerCrashProcedure -- the SCP that gets invoked when an operator schedules an SCP via hbck2 scheduleRecoveries command -- now works the same as SCP EXCEPT if master knows nothing of the scheduled servername. In this latter case, HBCKSCP will do a full scan of hbase:meta looking for instances of the passed servername. If any found it will attempt cleanup of hbase:meta references by reassigning any found OPEN or OPENING and by closing any in CLOSING state.
8534 Used to fix instances of what the 'HBCK Report' page shows as 'Unknown Servers'.
8539 * [HBASE-23624](https://issues.apache.org/jira/browse/HBASE-23624) | *Major* | **Add a tool to dump the procedure info in HFile**
8541 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.HFileProcedurePrettyPrinter to run the tool.
8546 * [HBASE-23590](https://issues.apache.org/jira/browse/HBASE-23590) | *Major* | **Update maxStoreFileRefCount to maxCompactedStoreFileRefCount**
8548 RegionsRecoveryChore introduced as part of HBASE-22460 tries to reopen regions based on config: hbase.regions.recovery.store.file.ref.count.
8549 Region reopen needs to take into consideration all compacted away store files that belong to the region and not store files(non-compacted).
8551 Fixed this bug as part of this Jira. 
8552 Updated description for corresponding configs:
8554 1. hbase.master.regions.recovery.check.interval :
8556 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
8558 2. hbase.regions.recovery.store.file.ref.count :
8560 Very large number of ref count on a compacted store file indicates that it is a ref leak on that object(compacted store file). Such files can not be removed after it is invalidated via compaction. Only way to recover in such scenario is to reopen the region which can release all resources, like the refcount, leases, etc. This config represents Store files Ref Count threshold value considered for reopening regions. Any region with compacted store files ref count \> this value would be eligible for reopening by master. Here, we get the max refCount among all refCounts on all compacted away store files that belong to a particular region. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
8565 * [HBASE-23618](https://issues.apache.org/jira/browse/HBASE-23618) | *Major* | **Add a tool to dump procedure info in the WAL file**
8567 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.WALProcedurePrettyPrinter to run the tool.
8572 * [HBASE-23617](https://issues.apache.org/jira/browse/HBASE-23617) | *Major* | **Add a stress test tool for region based procedure store**
8574 Use ./hbase org.apache.hadoop.hbase.procedure2.store.region.RegionProcedureStorePerformanceEvaluation to run the tool.
8579 * [HBASE-23326](https://issues.apache.org/jira/browse/HBASE-23326) | *Critical* | **Implement a ProcedureStore which stores procedures in a HRegion**
8581 Use a region based procedure store to replace the old customized WAL based procedure store. The procedure data migration is done automatically during upgrading. After upgrading, the MasterProcWALs directory will be deleted and a new MasterProc directory will be created. And notice that a region will still write WAL so we still have WAL files and they will be moved to the oldWALs directory. The file name is mostly like a normal WAL file, and the only difference is that it is ended with "$masterproc$".
8586 * [HBASE-23320](https://issues.apache.org/jira/browse/HBASE-23320) | *Major* | **Upgrade surefire plugin to 3.0.0-M4**
8588 Bumped surefire plugin to 3.0.0-M4
8593 * [HBASE-20461](https://issues.apache.org/jira/browse/HBASE-20461) | *Major* | **Implement fsync for AsyncFSWAL**
8595 Now AsyncFSWAL also supports Durability.FSYNC\_WAL.
8600 * [HBASE-23066](https://issues.apache.org/jira/browse/HBASE-23066) | *Minor* | **Create a config that forces to cache blocks on compaction**
8602 The configuration 'hbase.rs.cacheblocksonwrite' was used to enable caching the blocks on write. But purposefully we were not caching the blocks when we do compaction (since it may be very aggressive) as the caching happens as and when the writer completes a block. 
8603 In cloud environments since they have bigger sized caches - though they try to enable 'hbase.rs.prefetchblocksonopen' (non - aggressive way of caching the blocks proactively on reader creation) it does not help them because it takes time to cache the compacted blocks. 
8604 This feature creates a new configuration  'hbase.rs.cachecompactedblocksonwrite' which when set to 'true' will enable the blocks created out of compaction. 
8605 Remember that since it is aggressive caching the user should be having enough cache space - if not it may lead to other active blocks getting evicted.
8606 From the shell this can be enabled by using the option per Column Family also by using the below format
8607 {code}
8608 create 't1', 'f1', {NUMREGIONS =\> 15, SPLITALGO =\> 'HexStringSplit', CONFIGURATION =\> {'hbase.rs.cachecompactedblocksonwrite' =\> 'true'}}
8609 {code}
8614 * [HBASE-23239](https://issues.apache.org/jira/browse/HBASE-23239) | *Major* | **Reporting on status of backing MOB files from client-facing cells**
8616 <!-- markdown -->
8618 Users of the MOB feature can now use the `mobrefs` utility to get statistics about data in the MOB system and verify the health of backing files on HDFS.
8621 HADOOP_CLASSPATH=/etc/hbase/conf:$(hbase mapredcp) yarn jar \
8622     /some/path/to/hbase-shaded-mapreduce.jar mobrefs mobrefs-report-output some_table foo
8625 See javadocs of the class `MobRefReporter` for more details.
8627 the reference guide has added some information about MOB internals and troubleshooting.
8632 * [HBASE-23549](https://issues.apache.org/jira/browse/HBASE-23549) | *Minor* | **Document steps to disable MOB for a column family**
8634 The reference guide now includes a walk through of disabling the MOB feature if needed while maintaining availability.
8639 * [HBASE-23582](https://issues.apache.org/jira/browse/HBASE-23582) | *Minor* | **Unbalanced braces in string representation of table descriptor**
8641 Fixed unbalanced braces in string representation within HBase shell
8646 * [HBASE-23293](https://issues.apache.org/jira/browse/HBASE-23293) | *Minor* | **[REPLICATION] make ship edits timeout configurable**
8648 The default rpc timeout for ReplicationSourceShipper#shipEdits is 60s, when bulkload replication enabled, timeout exception may be occurred.
8649 Now we can conf the timeout value through replication.source.shipedits.timeout, and it’s adaptive.
8654 * [HBASE-23312](https://issues.apache.org/jira/browse/HBASE-23312) | *Major* | **HBase Thrift SPNEGO configs (HBASE-19852) should be backwards compatible**
8656 The newer HBase Thrift SPNEGO configs should not be required. The hbase.thrift.spnego.keytab.file and hbase.thrift.spnego.principal configs will fall back to the hbase.thrift.keytab.file and hbase.thrift.kerberos.principal original configs. The older configs will log a deprecation warning. It is preferred to new the newer SPNEGO configurations.
8661 * [HBASE-22969](https://issues.apache.org/jira/browse/HBASE-22969) | *Minor* | **A new binary component comparator(BinaryComponentComparator) to perform comparison of arbitrary length and position**
8663 With BinaryComponentCompartor applications will be able to design diverse and powerful set of filters for rows and columns. See https://issues.apache.org/jira/browse/HBASE-22969 for example. In general, the comparator can be used with any filter taking ByteArrayComparable. As of now, following filters take ByteArrayComparable: 
8665 1. RowFilter
8666 2. ValueFilter
8667 3. QualifierFilter
8668 4. FamilyFilter
8669 5. ColumnValueFilter
8674 * [HBASE-23234](https://issues.apache.org/jira/browse/HBASE-23234) | *Major* | **Provide .editorconfig based on checkstyle configuration**
8676 Adds a .editorconfig file with configurations populated by IntelliJ, based on our checkstyle configuration. There's lots of IntelliJ-specific configs in here that I assume are not replicated to Eclipse or Netbeans users. Any devs using those tools should push whatever updates they see fit, but please start with the checkstyle configs as the origin of truth.
8681 * [HBASE-23322](https://issues.apache.org/jira/browse/HBASE-23322) | *Minor* | **[hbck2] Simplification on HBCKSCP scheduling**
8683 An hbck2 scheduleRecoveries will run a subclass of ServerCrashProcedure which asks Master what Regions were on the dead Server but it will also do a hbase:meta table scan to see if any vestiges of the old Server remain (for the case where an SCP failed mid-point leaving references in place or where Master and hbase:meta deviated in accounting).
8688 * [HBASE-23321](https://issues.apache.org/jira/browse/HBASE-23321) | *Minor* | **[hbck2] fixHoles of fixMeta doesn't update in-memory state**
8690 If holes in hbase:meta, hbck2 fixMeta now will update Master in-memory state so you do not need to restart master just so you can assign the new hole-bridging regions.
8695 * [HBASE-23282](https://issues.apache.org/jira/browse/HBASE-23282) | *Major* | **HBCKServerCrashProcedure for 'Unknown Servers'**
8697 hbck2 scheduleRecoveries will now run a SCP that also looks in hbase:meta for any references to the scheduled server -- not just consult Master in-memory state -- just in case vestiges of the server are leftover in hbase:meta
8702 * [HBASE-19450](https://issues.apache.org/jira/browse/HBASE-19450) | *Minor* | **Add log about average execution time for ScheduledChore**
8704 <!-- markdown -->
8705 HBase internal chores now log a moving average of how long execution of each chore takes at `INFO` level for the logger `org.apache.hadoop.hbase.ScheduledChore`.
8707 Such messages will happen at most once per five minutes.
8712 * [HBASE-23250](https://issues.apache.org/jira/browse/HBASE-23250) | *Minor* | **Log message about CleanerChore delegate initialization should be at INFO**
8714 CleanerChore delegate initialization is now logged at INFO level instead of DEBUG
8719 * [HBASE-23243](https://issues.apache.org/jira/browse/HBASE-23243) | *Major* | **[pv2] Filter out SUCCESS procedures; on decent-sized cluster, plethora overwhelms problems**
8721 The 'Procedures & Locks' tab in Master UI only displays problematic Procedures now (RUNNABLE, WAITING-TIMEOUT, etc.). It no longer notes procedures whose state is SUCCESS.
8726 * [HBASE-23227](https://issues.apache.org/jira/browse/HBASE-23227) | *Blocker* | **Upgrade jackson-databind to 2.9.10.1 to avoid recent CVEs**
8728 <!-- markdown -->
8730 the Apache HBase REST Proxy now uses Jackson Databind version 2.9.10.1 to address the following CVEs
8732   - CVE-2019-16942
8733   - CVE-2019-16943
8735 Users of prior releases with Jackson Databind 2.9.10 are advised to either upgrade to this release or to upgrade their local Jackson Databind jar directly.
8740 * [HBASE-23222](https://issues.apache.org/jira/browse/HBASE-23222) | *Critical* | **Better logging and mitigation for MOB compaction failures**
8742 <!-- markdown -->
8744 The MOB compaction process in the HBase Master now logs more about its activity.
8746 In the event that you run into the problems described in HBASE-22075, there is a new HFileCleanerDelegate that will stop all removal of MOB hfiles from the archive area. It can be configured by adding `org.apache.hadoop.hbase.mob.ManualMobMaintHFileCleaner` to the list configured for `hbase.master.hfilecleaner.plugins`. This new cleaner delegate will cause your archive area to grow unbounded; you will have to manually prune files which may be prohibitively complex. Consider if your use case will allow you to mitigate by disabling mob compactions instead.
8748 Caveats:
8749 * Be sure the list of cleaner delegates still includes the default cleaners you will likely need: ttl, snapshot, and hlink.
8750 * Be mindful that if you enable this cleaner delegate then there will be *no* automated process for removing these mob hfiles. You should see a single region per table in `%hbase_root%/archive` that accumulates files over time. You will have to determine which of these files are safe or not to remove.
8751 * You should list this cleaner delegate after the snapshot and hlink delegates so that you can enable sufficient logging to determine when an archived mob hfile is needed by those subsystems. When set to `TRACE` logging, the CleanerChore logger will include archive retention decision justifications.
8752 * If your use case creates a large number of uniquely named tables, this new delegate will cause memory pressure on the master.
8757 * [HBASE-15519](https://issues.apache.org/jira/browse/HBASE-15519) | *Major* | **Add per-user metrics**
8759 Adds per-user metrics for reads/writes to each RegionServer. These metrics are exported by default. hbase.regionserver.user.metrics.enabled can be used to disable the feature if desired for any reason.
8764 * [HBASE-22460](https://issues.apache.org/jira/browse/HBASE-22460) | *Minor* | **Reopen a region if store reader references may have leaked**
8766 Leaked store files can not be removed even after it is invalidated via compaction. A reasonable mitigation for a reader reference leak would be a fast reopen of the region on the same server.
8768 Configs:
8770 1. hbase.master.regions.recovery.check.interval :
8772 Regions Recovery Chore interval in milliseconds. This chore keeps running at this interval to find all regions with configurable max store file ref count and reopens them. Defaults to 20 mins
8774 2. hbase.regions.recovery.store.file.ref.count :
8776 This config represents Store files Ref Count threshold value considered for reopening regions. Any region with store files ref count \> this value would be eligible for reopening by master. Default value -1 indicates this feature is turned off. Only positive integer value should be provided to enable this feature.
8781 * [HBASE-23172](https://issues.apache.org/jira/browse/HBASE-23172) | *Minor* | **HBase Canary region success count metrics reflect column family successes, not region successes**
8783 Added a comment to make clear that read/write success counts are tallying column family success counts, not region success counts. 
8785 Additionally, the region read and write latencies previously only stored the latencies of the last column family of the region reads/writes. This has been fixed by using a map of each region to a list of read and write latency values.
8790 * [HBASE-23177](https://issues.apache.org/jira/browse/HBASE-23177) | *Major* | **If fail to open reference because FNFE, make it plain it is a Reference**
8792 Changes the message on the FNFE exception thrown when the file a Reference points to is missing; the message now includes detail on Reference as well as pointed-to file so can connect how FNFE relates to region open.
8797 * [HBASE-20626](https://issues.apache.org/jira/browse/HBASE-20626) | *Major* | **Change the value of "Requests Per Second" on WEBUI**
8799 Use 'totalRowActionRequestCount' to calculate QPS on web UI.
8804 * [HBASE-22874](https://issues.apache.org/jira/browse/HBASE-22874) | *Critical* | **Define a public interface for Canary and move existing implementation to LimitedPrivate**
8806 <!-- markdown -->
8807 Downstream users who wish to programmatically check the health of their HBase cluster may now rely on a public interface derived from the previously private implementation of the canary cli tool. The interface is named `Canary` and can be found in the user facing javadocs.
8809 Downstream users who previously relied on the invoking the canary via the Java classname (either on the command line or programmatically) will need to change how they do so because the non-public implementation has moved.
8814 * [HBASE-23035](https://issues.apache.org/jira/browse/HBASE-23035) | *Major* | **Retain region to the last RegionServer make the failover slower**
8816 Since 2.0.0,when one regionserver crashed and back online again, AssignmentManager will retain the region locations and try assign the regions to this regionserver(same host:port with the crashed one) again. But for 1.x.x, the behavior is round-robin assignment for the regions belong to the crashed regionserver. This jira change the "retain" assignment to round-robin assignment, which is same with 1.x.x version. This change will make the failover faster and improve availability.
8821 * [HBASE-23046](https://issues.apache.org/jira/browse/HBASE-23046) | *Minor* | **Remove compatibility case from truncate command**
8823 Remove backward compatibility from \`truncate\` and \`truncate\_preserve\` shell commands. This means that these commands from HBase Clients are not compatible with pre-0.99 HBase clusters.
8828 * [HBASE-23040](https://issues.apache.org/jira/browse/HBASE-23040) | *Minor* | **region mover gives NullPointerException instead of saying a host isn't in the cluster**
8830 giving the region mover "unload" command a region server name that isn't recognized by the cluster results in a "I don't know about that host" message instead of a NPE.
8832 set log level to DEBUG if you'd like the region mover to log the set of region server names it got back from the cluster.
8837 * [HBASE-21874](https://issues.apache.org/jira/browse/HBASE-21874) | *Major* | **Bucket cache on Persistent memory**
8839 Added a new IOEngine type for Bucket cache ie Persistent memory. In order to use BC over pmem configure IOEngine as 
8840 \<property\>
8841     \<name\>hbase.bucketcache.ioengine\</name\>
8842     \<value\> pmem:///path in persistent memory \</value\>
8843   \</property\>
8848 * [HBASE-22760](https://issues.apache.org/jira/browse/HBASE-22760) | *Major* | **Stop/Resume Snapshot Auto-Cleanup activity with shell command**
8850 By default, snapshot auto cleanup based on TTL would be enabled for any new cluster. At any point in time, if snapshot cleanup is supposed to be stopped due to some snapshot restore activity or any other reason, it is advisable to disable it using shell command:
8851 hbase\> snapshot\_cleanup\_switch false
8853 We can re-enable it using:
8854 hbase\> snapshot\_cleanup\_switch true
8856 We can query whether snapshot auto cleanup is enabled for cluster using:
8857 hbase\> snapshot\_cleanup\_enabled
8862 * [HBASE-22796](https://issues.apache.org/jira/browse/HBASE-22796) | *Major* | **[HBCK2] Add fix of overlaps to fixMeta hbck Service**
8864 Adds fix of overlaps to the fixMeta hbck service method. Uses the bulk-merge facility. Merges a max of 10 at a time. Set hbase.master.metafixer.max.merge.count to higher if you want to do more than 10 in the one go.
8869 * [HBASE-21745](https://issues.apache.org/jira/browse/HBASE-21745) | *Critical* | **Make HBCK2 be able to fix issues other than region assignment**
8871 This issue adds via its subtasks:
8873  \* An 'HBCK Report' page to the Master UI added by HBASE-22527+HBASE-22709+HBASE-22723+ (since 2.1.6, 2.2.1, 2.3.0). Lists consistency or anomalies found via new hbase:meta consistency checking extensions added to CatalogJanitor (holes, overlaps, bad servers) and by a new 'HBCK chore' that runs at a lesser periodicity that will note filesystem orphans and overlaps as well as the following conditions:
8874  \*\* Master thought this region opened, but no regionserver reported it. 
8875  \*\* Master thought this region opened on Server1, but regionserver reported Server2 
8876  \*\* More than one regionservers reported opened this region
8877  Both chores can be triggered from the shell to regenerate ‘new’ reports.
8878  \* Means of scheduling a ServerCrashProcedure (HBASE-21393).
8879  \* An ‘offline’ hbase:meta rebuild (HBASE-22680).
8880  \* Offline replace of hbase.version and hbase.id
8881  \* Documentation on how to use completebulkload tool to ‘adopt’ orphaned data found by new HBCK2 ‘filesystem’ check (see below) and ‘HBCK chore’ (HBASE-22859)
8882  \* A ‘holes’ and ‘overlaps’ fix that runs in the master that uses new bulk-merge facility to collapse many overlaps in the one go.
8883  \* hbase-operator-tools HBCK2 client tool got a bunch of additions:
8884  \*\* A specialized 'fix' for the case where operators ran old hbck 'offlinemeta' repair and destroyed their hbase:meta; it ties together holes in meta with orphaned data in the fs (HBASE-22567)
8885  \*\* A ‘filesystem’ command that reports on orphan data as well as bad references and hlinks with a ‘fix’ for the latter two options (based on hbck1 facility updated).
8886  \*\* Adds back the ‘replication’ fix facility from hbck1 (HBASE-22717)
8888 The compound result is that hbck2 is now in excess of hbck1 abilities. The provided functionality is disaggregated as per the hbck2 philosophy of providing 'plumbing' rather than 'porcelain' so there is work to do still adding fix-it playbooks, scripting across outages, and automation.
8893 * [HBASE-22802](https://issues.apache.org/jira/browse/HBASE-22802) | *Major* | **Avoid temp ByteBuffer allocation in FileIOEngine#read**
8895 HBASE-21879 introduces a utility class (org.apache.hadoop.hbase.io.ByteBuffAllocator) used for allocating/freeing ByteBuffers from/to NIO ByteBuffer pool, when BucketCache enabled with file or mmap engine, we will use this ByteBuffer pool to avoid temp ByteBuffer allocation a lot.
8900 * [HBASE-11062](https://issues.apache.org/jira/browse/HBASE-11062) | *Major* | **hbtop**
8902 Introduces hbtop that's a real-time monitoring tool for HBase like Unix's top command. See the ref guide for the details: https://hbase.apache.org/book.html#hbtop
8907 * [HBASE-21879](https://issues.apache.org/jira/browse/HBASE-21879) | *Major* | **Read HFile's block to ByteBuffer directly instead of to byte for reducing young gc purpose**
8909 Before this issue, we've made the read path 100% offheap when block hit the BucketCache 100%, but if the cache missed then RS need to read the block by on-heap API, which would cause high young GC pressure.
8910 This issue will read the block by offheap even if reading the block from filesystem directly, it have some requirement for hadoop version(\>=2.9.3) but can also works with older hadoop version(means still works fine but will read block onheap). We have written a careful doc about the implementation, performance and practice here: https://docs.google.com/document/d/1xSy9axGxafoH-Qc17zbD2Bd--rWjjI00xTWQZ8ZwI\_E/edit#heading=h.nch5d72p27ex, for more details please read it.
8915 * [HBASE-22618](https://issues.apache.org/jira/browse/HBASE-22618) | *Major* | **added the possibility to load custom cost functions**
8917 <!-- markdown -->
8918 Extends `StochasticLoadBalancer` to support user-provided cost function. These are loaded in addition to the default set of cost functions. Custom function implementations must extend `StochasticLoadBalancer$CostFunction`. Enable any additional functions by placing them on the master class path and configuring `hbase.master.balancer.stochastic.additionalCostFunctions` with a comma-separated list of fully-qualified class names.
8923 * [HBASE-22867](https://issues.apache.org/jira/browse/HBASE-22867) | *Critical* | **The ForkJoinPool in CleanerChore will spawn thousands of threads in our cluster with thousands table**
8925 Replace the ForkJoinPool in CleanerChore by ThreadPoolExecutor which can limit the spawn thread size and avoid  the master GC frequently.  The replacement is an internal implementation in CleanerChore,  so no config key change, the upstream users can just upgrade the hbase master without any other change.
8930 * [HBASE-22810](https://issues.apache.org/jira/browse/HBASE-22810) | *Major* | **Initialize an separate ThreadPoolExecutor for taking/restoring snapshot**
8932 Introduced a new config key for the snapshot taking/restoring operations at master side:  hbase.master.executor.snapshot.threads, its default value is 3.  means we can have 3 snapshot operations running at the same time.
8937 * [HBASE-22863](https://issues.apache.org/jira/browse/HBASE-22863) | *Major* | **Avoid Jackson versions and dependencies with known CVEs**
8939 1. Stopped exposing vulnerable Jackson1 dependencies so that downstreamers would not pull it in from HBase.
8940 2. However, since Hadoop requires some Jackson1 dependencies, put vulnerable Jackson mapper at test scope in some HBase modules and hence, HBase tarball created by hbase-assembly contains Jackson1 mapper jar in lib. Still, downsteam applications can't pull in Jackson1 from HBase.
8945 * [HBASE-22841](https://issues.apache.org/jira/browse/HBASE-22841) | *Major* | **TimeRange's factory functions do not support ranges, only \`allTime\` and \`at\`**
8947 Add serveral API in TimeRange class for avoiding using the deprecated TimeRange constructor: 
8948 \* TimeRange#from: Represents the time interval [minStamp, Long.MAX\_VALUE)
8949 \* TimeRange#until: Represents the time interval [0, maxStamp)
8950 \* TimeRange#between: Represents the time interval [minStamp, maxStamp)
8955 * [HBASE-22833](https://issues.apache.org/jira/browse/HBASE-22833) | *Minor* | **MultiRowRangeFilter should provide a method for creating a filter which is functionally equivalent to multiple prefix filters**
8957 Provide a public method in MultiRowRangeFilter class to speed the requirement of filtering with multiple row prefixes, it will expand the row prefixes as multiple rowkey ranges by MultiRowRangeFilter, it's more efficient.
8958 {code}
8959 public MultiRowRangeFilter(byte[][] rowKeyPrefixes);
8960 {code}
8965 * [HBASE-22856](https://issues.apache.org/jira/browse/HBASE-22856) | *Major* | **HBASE-Find-Flaky-Tests fails with pip error**
8967 Update the base docker image to ubuntu 18.04 for the find flaky tests jenkins job.
8972 * [HBASE-22771](https://issues.apache.org/jira/browse/HBASE-22771) | *Major* | **[HBCK2] fixMeta method and server-side support**
8974 Adds a fixMeta method to hbck Service. Fixes holes in hbase:meta. Follow-up to fix overlaps. See HBASE-22567 also.
8976 Follow-on is adding a client-side to hbase-operator-tools that can exploit this new addition (HBASE-22825)
8981 * [HBASE-22777](https://issues.apache.org/jira/browse/HBASE-22777) | *Major* | **Add a multi-region merge (for fixing overlaps, etc.)**
8983 Changes merge so you can merge more than two regions at a time.  Currently only available inside HBase. HBASE-22827, a follow-on, is about exposing the facility in the Admin API (and then via the shell).
8988 * [HBASE-15666](https://issues.apache.org/jira/browse/HBASE-15666) | *Critical* | **shaded dependencies for hbase-testing-util**
8990 New shaded artifact for testing: hbase-shaded-testing-util.
8995 * [HBASE-22776](https://issues.apache.org/jira/browse/HBASE-22776) | *Major* | **Rename config names in user scan snapshot feature**
8997 After HBASE-22776, the steps to config user scan snapshot feature is as followings:
8998 1. Check HDFS configuration
8999 2. Add master coprocessor:
9000     hbase.coprocessor.master.classes=
9001     “org.apache.hadoop.hbase.security.access.AccessController,
9002 org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController”
9003 3. Enable this feature:
9004     hbase.acl.sync.to.hdfs.enable=true
9005 4. Modify table scheme to enable this feature for a table:
9006     alter 't1', CONFIGURATION =\> {'hbase.acl.sync.to.hdfs.enable' =\> 'true'}
9011 * [HBASE-22539](https://issues.apache.org/jira/browse/HBASE-22539) | *Blocker* | **WAL corruption due to early DBBs re-use when Durability.ASYNC\_WAL is used**
9013 We found a critical bug which can lead to WAL corruption when Durability.ASYNC\_WAL is used. The reason is that we release a ByteBuffer before actually persist the content into WAL file.
9015 The problem maybe lead to several errors, for example, ArrayIndexOfOutBounds when replaying WAL. This is because that the ByteBuffer is reused by others.
9017 ERROR org.apache.hadoop.hbase.executor.EventHandler: Caught throwable while processing event RS\_LOG\_REPLAY
9018 java.lang.ArrayIndexOutOfBoundsException: 18056
9019         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1365)
9020         at org.apache.hadoop.hbase.KeyValue.getFamilyLength(KeyValue.java:1358)
9021         at org.apache.hadoop.hbase.PrivateCellUtil.matchingFamily(PrivateCellUtil.java:735)
9022         at org.apache.hadoop.hbase.CellUtil.matchingFamily(CellUtil.java:816)
9023         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEditFamily(WALEdit.java:143)
9024         at org.apache.hadoop.hbase.wal.WALEdit.isMetaEdit(WALEdit.java:148)
9025         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:297)
9026         at org.apache.hadoop.hbase.wal.WALSplitter.splitLogFile(WALSplitter.java:195)
9027         at org.apache.hadoop.hbase.regionserver.SplitLogWorker$1.exec(SplitLogWorker.java:100)
9029 And may even cause segmentation fault and crash the JVM directly. You will see a hs\_err\_pidXXX.log file and usually the problem is SIGSEGV. This is usually because that the ByteBuffer has already been returned to the OS and used for other purpose.
9031 The problem has been reported several times in the past and this time Wellington Ramos Chevreuil provided the full logs and deeply analyzed the logs so we can find the root cause. And Lijin Bin figured out that the problem may only happen when Durability.ASYNC\_WAL is used. Thanks to them.
9033 The problem only effects the 2.x releases, all users are highly recommand to upgrade to a release which has this fix in, especially that if you use Durability.ASYNC\_WAL.
9038 * [HBASE-22737](https://issues.apache.org/jira/browse/HBASE-22737) | *Major* | **Add a new admin method and shell cmd to trigger the hbck chore to run**
9040 Add a new method runHbckChore in Hbck interface and a new shell cmd hbck\_chore\_run to request HBCK chore to run at master side.
9045 * [HBASE-22741](https://issues.apache.org/jira/browse/HBASE-22741) | *Major* | **Show catalogjanitor consistency complaints in new 'HBCK Report' page**
9047 Adds a "CatalogJanitor hbase:meta Consistency Issues" section to the new 'HBCK Report' page added by HBASE-22709. This section is empty unless the most recent CatalogJanitor scan turned up problems. If so, will show table of issues found.
9052 * [HBASE-22723](https://issues.apache.org/jira/browse/HBASE-22723) | *Major* | **Have CatalogJanitor report holes and overlaps; i.e. problems it sees when doing its regular scan of hbase:meta**
9054 When CatalogJanitor runs, it now checks for holes, overlaps, empty info:regioninfo columns and bad servers. Dumps findings into log. Follow-up adds report to new 'HBCK Report' linked off the Master UI.
9056 NOTE: All features but the badserver check made it into branch-2.1 and branch-2.0 backports.
9061 * [HBASE-22714](https://issues.apache.org/jira/browse/HBASE-22714) | *Trivial* | **BuffferedMutatorParams opertationTimeOut() is misspelt**
9063 The misspelled BufferedMutatorParams.opertationTimeout method has been marked as deprecated, and will be removed in 4.0.0. Please use the BufferedMutatorParams.operationTimeout method instead.
9068 * [HBASE-22580](https://issues.apache.org/jira/browse/HBASE-22580) | *Major* | **Add a table attribute to make user scan snapshot feature configurable for table**
9070 If a table user scan snapshots of the table, please config the following table scheme attribute to make granted users' ACLs are added to hfiles:
9071 alter 't1', CONFIGURATION =\> {'hbase.user.scan.snapshot.enable' =\> 'true'}
9076 * [HBASE-22709](https://issues.apache.org/jira/browse/HBASE-22709) | *Major* | **Add a chore thread in master to do hbck checking and display results in 'HBCK Report' page**
9078 1. Add a new chore thread in master to do hbck checking
9079 2. Add a new web ui "HBCK Report" page to display checking results.
9081 This feature is enabled by default. And the hbck chore run per 60 minutes by default. You can config "hbase.master.hbck.checker.interval" to a value lesser than or equal to 0 for disabling the chore.
9083 Notice: the config "hbase.master.hbck.checker.interval" was renamed to "hbase.master.hbck.chore.interval" in HBASE-22737.
9088 * [HBASE-21773](https://issues.apache.org/jira/browse/HBASE-21773) | *Critical* | **rowcounter utility should respond to pleas for help**
9090 This adds [-h\|-help] options to rowcounter. Passing either -h or -help will print rowcounter guide as below: 
9092 $hbase rowcounter -h
9094 usage: hbase rowcounter \<tablename\> [options] [\<column1\> \<column2\>...]
9095 Options:
9096     --starttime=\<arg\>       starting time filter to start counting rows from.
9097     --endtime=\<arg\>         end time filter limit, to only count rows up to this timestamp.
9098     --range=\<arg\>           [startKey],[endKey][;[startKey],[endKey]...]]
9099     --expectedCount=\<arg\>   expected number of rows to be count.
9100 For performance, consider the following configuration properties:
9101 -Dhbase.client.scanner.caching=100
9102 -Dmapreduce.map.speculative=false
9107 * [HBASE-22578](https://issues.apache.org/jira/browse/HBASE-22578) | *Major* | **HFileCleaner should not delete empty ns/table directories used for user san snapshot feature**
9109 The HFileCleaner will clean the empty directories under archive, but if enable user scan snaphot feature, the user ACLs are set at there directories, so please config the following cleaner to make the directories with user ACLs not be cleaned:
9110 hbase.master.hfilecleaner.plugins=org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclCleaner
9115 * [HBASE-22722](https://issues.apache.org/jira/browse/HBASE-22722) | *Blocker* | **Upgrade jackson databind dependencies to 2.9.9.1**
9117 Upgrade jackson databind dependency to 2.9.9.1 due to CVEs
9119 https://nvd.nist.gov/vuln/detail/CVE-2019-12814
9121 https://nvd.nist.gov/vuln/detail/CVE-2019-12384
9126 * [HBASE-22527](https://issues.apache.org/jira/browse/HBASE-22527) | *Major* | **[hbck2] Add a master web ui to show the problematic regions**
9128 Add a new master web UI to show the potentially problematic opened regions. There are three case:
9129 1. Master thought this region opened, but no regionserver reported it.
9130 2. Master thought this region opened on Server1, but regionserver reported Server2
9131 3. More than one regionservers reported opened this region
9136 * [HBASE-22648](https://issues.apache.org/jira/browse/HBASE-22648) | *Minor* | **Snapshot TTL**
9138 Feature: Take a Snapshot With TTL for auto-cleanup
9140 Attribute: 
9141 1. TTL
9142      - Specify TTL in sec while creating snapshot. e.g. snapshot 'mytable', 'snapshot1234', {TTL =\> 86400}  (snapshot to be auto-cleaned after 24 hr)
9144 Configs:
9145 1. Default Snapshot TTL:
9146      - FOREVER by default
9147      - User specified Default TTL(sec) with config: hbase.master.snapshot.ttl
9149 2. If Snapshot cleanup is supposed to be stopped due to some snapshot restore activity, disable it with config:
9150      - hbase.master.cleaner.snapshot.disable: "true"
9151     With this config, HMaster needs restart just like any other hbase-site config.
9154 For more details, see the section "Take a Snapshot With TTL" in the HBase Reference Guide.
9159 * [HBASE-22610](https://issues.apache.org/jira/browse/HBASE-22610) | *Trivial* | **[BucketCache] Rename "hbase.offheapcache.minblocksize"**
9161 The config point "hbase.offheapcache.minblocksize" was wrong and is now deprecated. The new config point is "hbase.blockcache.minblocksize".
9166 * [HBASE-22690](https://issues.apache.org/jira/browse/HBASE-22690) | *Major* | **Deprecate / Remove OfflineMetaRepair in hbase-2+**
9168 OfflineMetaRepair is no longer supported in HBase-2+. Please refer to https://hbase.apache.org/book.html#HBCK2
9170 This tool is deprecated in 2.x and will be removed in 3.0.
9175 * [HBASE-22673](https://issues.apache.org/jira/browse/HBASE-22673) | *Major* | **Avoid to expose protobuf stuff in Hbck interface**
9177 Mark the Hbck#scheduleServerCrashProcedure(List\<HBaseProtos.ServerName\> serverNames) as deprecated. Use Hbck#scheduleServerCrashProcedures(List\<ServerName\> serverNames) instead.
9182 * [HBASE-22617](https://issues.apache.org/jira/browse/HBASE-22617) | *Blocker* | **Recovered WAL directories not getting cleaned up**
9184 In HBASE-20734 we moved the recovered.edits onto the wal file system but when constructing the directory we missed the BASE\_NAMESPACE\_DIR('data'). So when using the default config, you will find that there are lots of new directories at the same level with the 'data' directory.
9186 In this issue, we add the BASE\_NAMESPACE\_DIR back, and also try our best to clean up the wrong directories. But we can only clean up the region level directories, so if you want a clean fs layout on HDFS you still need to manually delete the empty directories at the same level with 'data'.
9188 The effect versions are 2.2.0, 2.1.[1-5], 1.4.[8-10], 1.3.[3-5].
9193 * [HBASE-21995](https://issues.apache.org/jira/browse/HBASE-21995) | *Major* | **Add a coprocessor to set HDFS ACL for hbase granted user**
9195 Add a coprocessor to set HDFS acls to make hbase granted users with READ permission have the access to scan snapshots.
9196 To use this feature, please make sure the HDFS config is set:
9197 dfs.namenode.acls.enabled=true
9198 fs.permissions.umask-mode=027
9200 and set the HBase config:
9201 hbase.coprocessor.master.classes="org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.access.SnapshotScannerHDFSAclController"
9202 hbase.user.scan.snapshot.enable=true
9207 * [HBASE-22596](https://issues.apache.org/jira/browse/HBASE-22596) | *Minor* | **[Chore] Separate the execution period between CompactionChecker and PeriodicMemStoreFlusher**
9209 hbase.regionserver.compaction.check.period is used for controlling how often the compaction checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
9211 hbase.regionserver.flush.check.period is used for controlling how ofter the flush checker runs. If unset, will use hbase.server.thread.wakefrequency as default value.
9216 * [HBASE-22588](https://issues.apache.org/jira/browse/HBASE-22588) | *Major* | **Upgrade jaxws-ri dependency to 2.3.2**
9218 <!-- markdown -->
9220 When run with JDK11 HBase now uses more recent version of the jaxws reference implementation (v2.3.2).
9225 * [HBASE-21536](https://issues.apache.org/jira/browse/HBASE-21536) | *Trivial* | **Fix completebulkload usage instructions**
9227 Added completebulkload short name for BulkLoadHFilesTool to bin/hbase.
9232 * [HBASE-22500](https://issues.apache.org/jira/browse/HBASE-22500) | *Blocker* | **Modify pom and jenkins jobs for hadoop versions**
9234 Change the default hadoop-3 version to 3.1.2. Drop the support for the releases which are effected by CVE-2018-8029, see this email https://lists.apache.org/thread.html/3d6831c3893cd27b6850aea2feff7d536888286d588e703c6ffd2e82@%3Cuser.hadoop.apache.org%3E
9239 * [HBASE-22459](https://issues.apache.org/jira/browse/HBASE-22459) | *Minor* | **Expose store reader reference count**
9241 This change exposes the aggregate count of store reader references for a given store as 'storeRefCount' in region metrics and ClusterStatus.
9246 * [HBASE-22469](https://issues.apache.org/jira/browse/HBASE-22469) | *Minor* | **replace md5 checksum in saveVersion script with sha512 for hbase version information**
9248 The HBase "source checksum" now uses SHA512 instead of MD5.
9253 * [HBASE-22148](https://issues.apache.org/jira/browse/HBASE-22148) | *Blocker* | **Provide an alternative to CellUtil.setTimestamp**
9255 <!-- markdown -->
9257 The `CellUtil.setTimestamp` method changes to be an API with audience `LimitedPrivate(COPROC)` in HBase 3.0. With that designation the API should remain stable within a given minor release line, but may change between minor releases.
9259 Previously, this method was deprecated in HBase 2.0 for removal in HBase 3.0. Deprecation messages in HBase 2.y releases have been updated to indicate the expected API audience change.
9264 * [HBASE-20782](https://issues.apache.org/jira/browse/HBASE-20782) | *Minor* | **Fix duplication of TestServletFilter.access**
9266 The access method was used to the HttpServerFunctionalTest class as a common place.
9271 * [HBASE-21991](https://issues.apache.org/jira/browse/HBASE-21991) | *Major* | **Fix MetaMetrics issues - [Race condition, Faulty remove logic], few improvements**
9273 The class LossyCounting was unintentionally marked Public but was never intended to be part of our public API. This oversight has been corrected and LossyCounting is now marked as Private and going forward may be subject to additional breaking changes or removal without notice. If you have taken a dependency on this class we recommend cloning it locally into your project before upgrading to this release.
9278 * [HBASE-22226](https://issues.apache.org/jira/browse/HBASE-22226) | *Trivial* | **Incorrect level for headings in asciidoc**
9280 Warnings for level headings are corrected in the book for the HBase Incompatibilities section.
9285 * [HBASE-20970](https://issues.apache.org/jira/browse/HBASE-20970) | *Major* | **Update hadoop check versions for hadoop3 in hbase-personality**
9287 Add hadoop 3.0.3, 3.1.1 3.1.2 in our hadoop check jobs.
9292 * [HBASE-21784](https://issues.apache.org/jira/browse/HBASE-21784) | *Major* | **Dump replication queue should show list of wal files ordered chronologically**
9294 The DumpReplicationQueues tool will now list replication queues sorted in chronological order.
9299 * [HBASE-21048](https://issues.apache.org/jira/browse/HBASE-21048) | *Major* | **Get LogLevel is not working from console in secure environment**
9301 Support get\|set LogLevel in secure(kerberized) environment.
9306 * [HBASE-22384](https://issues.apache.org/jira/browse/HBASE-22384) | *Minor* | **Formatting issues in administration section of book**
9308 Fixes a formatting issue in the administration section of the book, where listing indentation were a little bit off.
9313 * [HBASE-22377](https://issues.apache.org/jira/browse/HBASE-22377) | *Major* | **Provide API to check the existence of a namespace which does not require ADMIN permissions**
9315 This change adds the new method listNamespaces to the Admin interface, which can be used to retrieve a list of the namespaces present in the schema as an unprivileged operation. Formerly the only available method for accomplishing this was listNamespaceDescriptors, which requires GLOBAL CREATE or ADMIN permissions.
9320 * [HBASE-22399](https://issues.apache.org/jira/browse/HBASE-22399) | *Major* | **Change default hadoop-two.version to 2.8.x and remove the 2.7.x hadoop checks**
9322 Now the default hadoop-two.version has been changed to 2.8.5, and all hadoop versions before 2.8.2(exclude) will not be supported any more.
9327 * [HBASE-22392](https://issues.apache.org/jira/browse/HBASE-22392) | *Trivial* | **Remove extra/useless +**
9329 Removed extra + in HRegion, HStore and LoadIncrementalHFiles for branch-2 and HRegion and HStore for branch-1.
9334 * [HBASE-20494](https://issues.apache.org/jira/browse/HBASE-20494) | *Major* | **Upgrade com.yammer.metrics dependency**
9336 Updated metrics core from 3.2.1 to 3.2.6.
9341 * [HBASE-22358](https://issues.apache.org/jira/browse/HBASE-22358) | *Minor* | **Change rubocop configuration for method length**
9343 The rubocop definition for the maximum method length was set to 75.
9348 * [HBASE-22379](https://issues.apache.org/jira/browse/HBASE-22379) | *Minor* | **Fix Markdown for "Voting on Release Candidates" in book**
9350 Fixes the formatting of the "Voting on Release Candidates" to actually show the quote and code formatting of the RAT check.
9355 * [HBASE-20851](https://issues.apache.org/jira/browse/HBASE-20851) | *Minor* | **Change rubocop config for max line length of 100**
9357 The rubocop configuration in the hbase-shell module now allows a line length with 100 characters, instead of 80 as before. For everything before 2.1.5 this change introduces rubocop itself.
9362 * [HBASE-22301](https://issues.apache.org/jira/browse/HBASE-22301) | *Minor* | **Consider rolling the WAL if the HDFS write pipeline is slow**
9364 This change adds new conditions for rolling the WAL for when syncs on the HDFS writer pipeline are perceived to be slow. 
9366 As before the configuration parameter hbase.regionserver.wal.slowsync.ms sets the slow sync warning threshold. 
9368 If we encounter hbase.regionserver.wal.slowsync.roll.threshold number of slow syncs (default 100) within the interval defined by hbase.regionserver.wal.slowsync.roll.interval.ms (default 1 minute), we will request a WAL roll. 
9370 Or, if the time for any sync exceeds the threshold set by hbase.regionserver.wal.roll.on.sync.ms (default 10 seconds) we will request a WAL roll immediately.
9372 Operators can monitor how often these new thresholds result in a WAL roll by looking at newly added metrics to the WAL related metric group:
9373 \* slowSyncRollRequest - How many times a roll was requested due to sync too slow on the write pipeline.
9375 Additionally, as a part of this change there are also additional metrics for existing reasons for a WAL roll:
9376 \* errorRollRequest - How many times a roll was requested due to I/O or other errors.
9377 \* sizeRollRequest - How many times a roll was requested due to file size roll threshold.
9382 * [HBASE-21883](https://issues.apache.org/jira/browse/HBASE-21883) | *Minor* | **Enhancements to Major Compaction tool**
9384 MajorCompactorTTL Tool allows to compact all regions in a table that have been TTLed out. This saves space on DFS and is useful for tables which are similar to time series data. This is typically scheduled to run frequently (say via cron) to cleanup old data on an ongoing basis.
9386 RSGroupMajorCompactionTTL tool is similar to MajorCompactorTTL but runs at a region server group level. If multiple tables in an rsgroup are similar to time-series data, then it runs a single command to clean them up. As more tables are added/removed from rsgroup, it's easy to have a single command to take care of all of them.
9391 * [HBASE-22054](https://issues.apache.org/jira/browse/HBASE-22054) | *Minor* | **Space Quota: Compaction is not working for super user in case of NO\_WRITES\_COMPACTIONS**
9393 This change allows the system and superusers to initiate compactions, even when a space quota violation policy disallows compactions from happening. The original intent behind disallowing of compactions was to prevent end-user compactions from creating undue I/O load, not disallowing \*any\* compaction in the system.
9398 * [HBASE-22083](https://issues.apache.org/jira/browse/HBASE-22083) | *Minor* | **move eclipse specific configs into a profile**
9400 <!-- markdown -->
9401 Maven project integration for Eclipse has been isolated into a maven profile to ensure it only is active when in an Eclipse project.
9403 Things should continue to behave the same for Eclipse users. If something should go wrong folks should manually activate the `eclipse-specific` profile.
9408 * [HBASE-22307](https://issues.apache.org/jira/browse/HBASE-22307) | *Major* | **Deprecated Preemptive Fail Fast**
9410 Deprecated Preemptive Fail Fast related constants in HConstants, the support of this feature will be removed in 3.0.0 so use these constants will have no effect for 3.0.0+ releases. And the constants will be kept till 4.0.0.
9412 Users can use 'hbase.client.perserver.requests.threshold' to control the number of concurrent requests to the same region server. Please see the release note of HBASE-16388 for more details.
9417 * [HBASE-22292](https://issues.apache.org/jira/browse/HBASE-22292) | *Blocker* | **PreemptiveFastFailInterceptor clean repeatedFailuresMap issue**
9419 Adds new configuration hbase.client.failure.map.cleanup.interval which defaults to ten minutes.
9424 * [HBASE-19222](https://issues.apache.org/jira/browse/HBASE-19222) | *Major* | **update jruby to 9.1.17.0**
9426 <!-- markdown -->
9428 The default version of JRuby shipped with HBase has been updated to the JRuby 9.1.17.0 release.
9430 For details on changes see [the release notes for JRuby 9.1.17.0](https://www.jruby.org/2018/04/23/jruby-9-1-17-0)
9435 * [HBASE-22279](https://issues.apache.org/jira/browse/HBASE-22279) | *Major* | **Add a getRegionLocator method in Table/AsyncTable interface**
9437 Add below method in Table interface:
9439 RegionLocator getRegionLocator() throws IOException;
9441 Add below methods in AsyncTable interface:
9443 AsyncTableRegionLocator getRegionLocator();
9444 CompletableFuture\<TableDescriptor\> getDescriptor();
9449 * [HBASE-15560](https://issues.apache.org/jira/browse/HBASE-15560) | *Major* | **TinyLFU-based BlockCache**
9451 LruBlockCache uses the Segmented LRU (SLRU) policy to capture frequency and recency of the working set. It achieves concurrency by using an O(n) background thread to prioritize the entries and evict. Accessing an entry is O(1) by a hash table lookup, recording its logical access time, and setting a frequency flag. A write is performed in O(1) time by updating the hash table and triggering an async eviction thread. This provides ideal concurrency and minimizes the latencies by penalizing the thread instead of the caller. However the policy does not age the frequencies and may not be resilient to various workload patterns. 
9453 This change introduces a new L1 policy, TinyLfuBlockCache, which records the frequency in a counting sketch, ages periodically by halving the counters, and orders entries by SLRU. An entry is discarded by comparing the frequency of the new arrival to the SLRU's victim, and keeping the one with the highest frequency. This allows the operations to be performed in O(1) time and, though the use of a compact sketch, a much larger history is retained beyond the current working set. In a variety of real world traces the policy had near optimal hit rates.
9455 New configuration variable hfile.block.cache.policy sets the eviction policy for the L1 block cache. The default is "LRU" (LruBlockCache). Set to "TinyLFU" to use TinyLfuBlockCache instead.
9460 * [HBASE-22178](https://issues.apache.org/jira/browse/HBASE-22178) | *Major* | **Introduce a createTableAsync with TableDescriptor method in Admin**
9462 Introduced
9464 Future\<Void\> createTableAsync(TableDescriptor);
9469 * [HBASE-22108](https://issues.apache.org/jira/browse/HBASE-22108) | *Major* | **Avoid passing null in Admin methods**
9471 Introduced these methods:
9472 void move(byte[]);
9473 void move(byte[], ServerName);
9474 Future\<Void\> splitRegionAsync(byte[]);
9476 These methods are deprecated:
9477 void move(byte[], byte[])
9482 * [HBASE-22152](https://issues.apache.org/jira/browse/HBASE-22152) | *Major* | **Create a jenkins file for yetus to processing GitHub PR**
9484 Add a new jenkins file for running pre commit check for GitHub PR.
9489 * [HBASE-22007](https://issues.apache.org/jira/browse/HBASE-22007) | *Major* | **Add restoreSnapshot and cloneSnapshot with acl methods in AsyncAdmin**
9491 Add cloneSnapshot/restoreSnapshot with acl methods in AsyncAdmin.
9496 * [HBASE-22123](https://issues.apache.org/jira/browse/HBASE-22123) | *Minor* | **REST gateway reports Insufficient permissions exceptions as 404 Not Found**
9498 When insufficient permissions, you now get:
9500 HTTP/1.1 403 Forbidden
9502 on the HTTP side, and in the message
9504 Forbidden
9505 org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘myuser',action: get, tableName:mytable, family:cf.
9506 at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.authorizeAccess(RangerAuthorizationCoprocessor.java:547)
9507 and the rest of the ADE stack
9512 * [HBASE-22100](https://issues.apache.org/jira/browse/HBASE-22100) | *Minor* | **False positive for error prone warnings in pre commit job**
9514 Now we will sort the javac WARNING/ERROR before generating diff in pre-commit so we can get a stable output for the error prone. The downside is that we just sort the output lexicographically so the line number will also be sorted lexicographically, which is a bit strange to human.
9519 * [HBASE-22057](https://issues.apache.org/jira/browse/HBASE-22057) | *Major* | **Impose upper-bound on size of ZK ops sent in a single multi()**
9521 Exposes a new configuration property "zookeeper.multi.max.size" which dictates the maximum size of deletes that HBase will make to ZooKeeper in a single RPC. This property defaults to 1MB, which should fall beneath the default ZooKeeper limit of 2MB, controlled by "jute.maxbuffer".
9526 * [HBASE-22052](https://issues.apache.org/jira/browse/HBASE-22052) | *Major* | **pom cleaning; filter out jersey-core in hadoop2 to match hadoop3 and remove redunant version specifications**
9528 <!-- markdown -->
9529 Fixed awkward dependency issue that prevented site building.
9531 #### note specific to HBase 2.1.4
9532 HBase 2.1.4 shipped with an early version of this fix that incorrectly altered the libraries included in our binary assembly for using Apache Hadoop 2.7 (the current build default Hadoop version for 2.1.z). For folks running out of the box against a Hadoop 2.7 cluster (or folks who skip the installation step of [replacing the bundled Hadoop libraries](http://hbase.apache.org/book.html#hadoop)) this will result in a failure at Region Server startup due to a missing class definition. e.g.:
9534 2019-03-27 09:02:05,779 ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
9535 java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
9536         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
9537         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
9538         at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
9539         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
9540         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
9541         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
9542         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
9543         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
9544         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:171)
9545         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:356)
9546         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
9547         at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
9548         at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
9549         at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
9550         at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:704)
9551         at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:613)
9552         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
9553         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
9554         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
9555         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
9556         at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:3029)
9557         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:63)
9558         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
9559         at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
9560         at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
9561         at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:3047)
9562 Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
9563         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
9564         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
9565         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
9566         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
9567         ... 26 more
9571 Workaround via any _one_ of the following:
9572 * If you are running against a Hadoop cluster that is 2.8+, ensure you replace the Hadoop libaries in the default binary assembly with those for your version.
9573 * If you are running against a Hadoop cluster that is 2.8+, build the binary assembly from the source release while specifying your Hadoop version.
9574 * If you are running against a Hadoop cluster that is a supported 2.7 release, ensure the `hadoop` executable is in the `PATH` seen at Region Server startup and that you are not using the `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP` bypass.
9575 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers via the HBASE_CLASSPATH environment variable.
9576 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers by copying it into the directory `${HBASE_HOME}/lib/client-facing-thirdparty/`.
9581 * [HBASE-22065](https://issues.apache.org/jira/browse/HBASE-22065) | *Major* | **Add listTableDescriptors(List\<TableName\>) method in AsyncAdmin**
9583 Add a listTableDescriptors(List\<TableName\>) method in the AsyncAdmin interface, to align with the Admin interface.
9588 * [HBASE-22063](https://issues.apache.org/jira/browse/HBASE-22063) | *Major* | **Deprecated Admin.deleteSnapshot(byte[])**
9590 Deprecate Admin.deleteSnapshot(byte[]), please use the String version instead.
9595 * [HBASE-22040](https://issues.apache.org/jira/browse/HBASE-22040) | *Major* | **Add mergeRegionsAsync with a List of region names method in AsyncAdmin**
9597 Add a mergeRegionsAsync(byte[][], boolean) method in the AsyncAdmin interface.
9599 Instead of using assert, now we will throw IllegalArgumentException when you want to merge less than 2 regions at client side. And also, at master side, instead of using assert, now we will throw DoNotRetryIOException if you want merge more than 2 regions, since we only support merging two regions at once for now.
9604 * [HBASE-22039](https://issues.apache.org/jira/browse/HBASE-22039) | *Major* | **Should add the synchronous parameter for the XXXSwitch method in AsyncAdmin**
9606 Add drainXXX parameter for balancerSwitch/splitSwitch/mergeSwitch methods in the AsyncAdmin interface, which has the same meaning with the synchronous parameter for these methods in the Admin interface.
9611 * [HBASE-22044](https://issues.apache.org/jira/browse/HBASE-22044) | *Major* | **ByteBufferUtils should not be IA.Public API**
9613 <!-- markdown -->
9615 As of HBase 3.0, the ByteBufferUtils class is now marked as a Private API for internal project use only. Downstream users are advised that it no longer has any compatibility promises across releases.
9617 As of earlier HBase release lines the class is now marked as deprecated to call attention to this planned transition.
9622 * [HBASE-21810](https://issues.apache.org/jira/browse/HBASE-21810) | *Major* | **bulkload  support set hfile compression on client**
9624 bulkload (HFileOutputFormat2)  support config the compression on client ,you can set the job configuration "hbase.mapreduce.hfileoutputformat.compression"  override the auto-detection of the target table's compression
9629 * [HBASE-22001](https://issues.apache.org/jira/browse/HBASE-22001) | *Major* | **Polish the Admin interface**
9631 Add a cloneSnapshotAsync method with restoreAcl parameter.
9632 Deprecated restoreSnapshotAsync method as it just ignores the failsafe configuration.
9633 Make snapshotAsync method returns a Future\<Void\>.
9634 Deprecated the snapshot related methods which take a 'byte[]' as the snapshot name.
9635 Use default methods to reduce the code base for implementation classes.
9640 * [HBASE-22000](https://issues.apache.org/jira/browse/HBASE-22000) | *Major* | **Deprecated isTableAvailable with splitKeys**
9642 Deprecated AsyncTable.isTableAvailable(TableName, byte[][]).
9647 * [HBASE-21871](https://issues.apache.org/jira/browse/HBASE-21871) | *Major* | **Support to specify a peer table name in VerifyReplication tool**
9649 After HBASE-21871, we can specify a peer table name with --peerTableName in VerifyReplication tool like the following:
9650 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable 5 TestTable
9652 In addition, we can compare any 2 tables in any remote clusters with specifying both peerId and --peerTableName.
9654 For example:
9655 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable zk1,zk2,zk3:2181/hbase TestTable
9660 * [HBASE-15728](https://issues.apache.org/jira/browse/HBASE-15728) | *Major* | **Add remaining per-table region / store / flush / compaction related metrics**
9662 Adds below flush, split, and compaction metrics
9664  +  // split related metrics
9665  +  private MutableFastCounter splitRequest;
9666  +  private MutableFastCounter splitSuccess;
9667  +  private MetricHistogram splitTimeHisto;
9669  +  // flush related metrics
9670  +  private MetricHistogram flushTimeHisto;
9671  +  private MetricHistogram flushMemstoreSizeHisto;
9672  +  private MetricHistogram flushOutputSizeHisto;
9673  +  private MutableFastCounter flushedMemstoreBytes;
9674  +  private MutableFastCounter flushedOutputBytes;
9676  +  // compaction related metrics
9677  +  private MetricHistogram compactionTimeHisto;
9678  +  private MetricHistogram compactionInputFileCountHisto;
9679  +  private MetricHistogram compactionInputSizeHisto;
9680  +  private MetricHistogram compactionOutputFileCountHisto;
9681  +  private MetricHistogram compactionOutputSizeHisto;
9682  +  private MutableFastCounter compactedInputBytes;
9683  +  private MutableFastCounter compactedOutputBytes;
9685  +  private MetricHistogram majorCompactionTimeHisto;
9686  +  private MetricHistogram majorCompactionInputFileCountHisto;
9687  +  private MetricHistogram majorCompactionInputSizeHisto;
9688  +  private MetricHistogram majorCompactionOutputFileCountHisto;
9689  +  private MetricHistogram majorCompactionOutputSizeHisto;
9690  +  private MutableFastCounter majorCompactedInputBytes;
9691  +  private MutableFastCounter majorCompactedOutputBytes;
9696 * [HBASE-21481](https://issues.apache.org/jira/browse/HBASE-21481) | *Major* | **[acl] Superuser's permissions should not be granted or revoked by any non-su global admin**
9698 HBASE-21481 improves the quality of access control, by strengthening the protection of super users's privileges.
9703 * [HBASE-21082](https://issues.apache.org/jira/browse/HBASE-21082) | *Critical* | **Reimplement assign/unassign related procedure metrics**
9705 Now we have four types of RIT procedure metrics, assign, unassign, move, reopen. The meaning of assign/unassign is changed, as we will not increase the unassign metric and then the assign metric when moving a region.
9706 Also introduced two new procedure metrics, open and close, which are used to track the open/close region calls to region server. We may send open/close multiple times to finish a RIT since we may retry multiple times.
9711 * [HBASE-20724](https://issues.apache.org/jira/browse/HBASE-20724) | *Critical* | **Sometimes some compacted storefiles are still opened after region failover**
9713 Problem: This is an old problem since HBASE-2231. The compaction event marker was only writed to WAL. But after flush, the WAL may be archived, which means an useful compaction event marker be deleted, too. So the compacted store files cannot be archived when region open and replay WAL.
9715 Solution: After this jira, the compaction event tracker will be writed to HFile. When region open and load store files, read the compaction evnet tracker from HFile and archive the compacted store files which still exist.
9720 * [HBASE-21820](https://issues.apache.org/jira/browse/HBASE-21820) | *Major* | **Implement CLUSTER quota scope**
9722 HBase contains two quota scopes: MACHINE and CLUSTER. Before this patch, set quota operations did not expose scope option to client api and use MACHINE as default, CLUSTER scope can not be set and used. 
9723 Shell commands are as follows:
9724 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
9726 This issue implements CLUSTER scope in a simple way: For user, namespace, user over namespace quota, use [ClusterLimit / RSNum] as machine limit. For table and user over table quota, use [ClusterLimit / TotalTableRegionNum \* MachineTableRegionNum] as machine limit.
9727 After this patch, user can set CLUSTER scope quota, but MACHINE is still default if user ignore scope. 
9728 Shell commands are as follows:
9729 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
9730 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> MACHINE
9731 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> CLUSTER
9736 * [HBASE-21057](https://issues.apache.org/jira/browse/HBASE-21057) | *Minor* | **upgrade to latest spotbugs**
9738 Change spotbugs version to 3.1.11.
9743 * [HBASE-21505](https://issues.apache.org/jira/browse/HBASE-21505) | *Major* | **Several inconsistencies on information reported for Replication Sources by hbase shell status 'replication' command.**
9745 This modifies "status 'replication'" output, fixing inconsistencies on the reporting times and ages of last shipped edits, as well as wrong calculation of replication lags. 
9747 It also introduces additional info for each recovery queue, which was not accounted by this command before.
9749 The new output for "status 'replication'" command is explained in details below:
9750 a) Source started, target stopped, no edits arrived on source yet:
9752  SOURCE: PeerID=1
9753          Normal Queue: 1
9754            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
9756 b) Source started, target stopped, add edit on source:
9758 Normal Queue: 1
9759            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:21:00 GMT 2018, Replication Lag=2459
9761 c) Source started, target stopped, edit added on source, restart source:
9763 SOURCE: PeerID=1
9764          Normal Queue: 1
9765            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
9766          Recovered Queue: 1-hbase01.home,16020,1542784524057
9767            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:23:00 GMT 2018, Replication Lag=201495
9769 d) Source started, target stopped, add edit on source, restart source, add another edit on source:
9771 SOURCE: PeerID=1
9772          Normal Queue: 1
9773            No Ops shipped since last restart, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=6349
9774          Recovered Queue: 1-hbase01.home,16020,1542782758742
9775            No Ops shipped since last restart, SizeOfLogQueue=0, TimeStampOfLastArrivedInSource=Wed Nov 21 06:53:05 GMT 2018, Replication Lag=569394
9777 e) Source started, target stopped, add edit on source, restart source, add another edit on source, start target:
9779        SOURCE: PeerID=1
9780          Normal Queue: 1
9781            AgeOfLastShippedOp=30000, TimeStampOfLastShippedOp=Wed Nov 21 07:07:58 GMT 2018, SizeOfLogQueue=1, TimeStampOfLastArrivedInSource=Wed Nov 21 07:02:28 GMT 2018, Replication Lag=0
9783 f) Source started, target stopped, add edit on source, restart source, restart target:
9785 SOURCE: PeerID=1
9786          Normal Queue: 1
9787            No Ops shipped since last restart, SizeOfLogQueue=1, No edits for this source since it started, Replication Lag=0
9793 * [HBASE-21922](https://issues.apache.org/jira/browse/HBASE-21922) | *Major* | **BloomContext#sanityCheck may failed when use ROWPREFIX\_DELIMITED bloom filter**
9795 Remove bloom filter type ROWPREFIX\_DELIMITED. May add it back when find a better solution.
9800 * [HBASE-21783](https://issues.apache.org/jira/browse/HBASE-21783) | *Major* | **Support exceed user/table/ns throttle quota if region server has available quota**
9802 Support enable or disable exceed throttle quota. Exceed throttle quota means, user can over consume user/namespace/table quota if region server has additional available quota because other users don't consume at the same time. 
9803 Use the following shell commands to enable/disable exceed throttle quota: enable\_exceed\_throttle\_quota
9804 disable\_exceed\_throttle\_quota
9805 There are two limits when enable exceed throttle quota: 
9806 1. Must set at least one read and one write region server throttle quota; 
9807 2. All region server throttle quotas must be in seconds time unit. Because once previous requests exceed their quota and consume region server quota, quota in other time units may be refilled in a long time, this may affect later requests.
9812 * [HBASE-20587](https://issues.apache.org/jira/browse/HBASE-20587) | *Major* | **Replace Jackson with shaded thirdparty gson**
9814 Remove jackson dependencies from most hbase modules except hbase-rest, use shaded gson instead. The output json will be a bit different since jackson can use getter/setter, but gson will always use the fields.
9819 * [HBASE-21928](https://issues.apache.org/jira/browse/HBASE-21928) | *Major* | **Deprecated HConstants.META\_QOS**
9821 Mark HConstants.META\_QOS as deprecated. It is for internal use only, which is the highest priority. You should not try to set a priority greater than or equal to this value, although it is no harm but also useless.
9826 * [HBASE-17942](https://issues.apache.org/jira/browse/HBASE-17942) | *Major* | **Disable region splits and merges per table**
9828 This patch adds the ability to disable split and/or merge for a table (By default, split and merge are enabled for a table).
9833 * [HBASE-21636](https://issues.apache.org/jira/browse/HBASE-21636) | *Major* | **Enhance the shell scan command to support missing scanner specifications like ReadType, IsolationLevel etc.**
9835 Allows shell to set Scan options previously not exposed. See additions as part of the scan help by typing following hbase shell:
9837 hbase\> help 'scan'
9842 * [HBASE-21201](https://issues.apache.org/jira/browse/HBASE-21201) | *Major* | **Support to run VerifyReplication MR tool without peerid**
9844 We can specify peerQuorumAddress instead of peerId in VerifyReplication tool. So it no longer requires peerId to be setup when using this tool.
9846 For example:
9847 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication zk1,zk2,zk3:2181/hbase testTable
9852 * [HBASE-21838](https://issues.apache.org/jira/browse/HBASE-21838) | *Major* | **Create a special ReplicationEndpoint just for verifying the WAL entries are fine**
9854 Introduce a VerifyWALEntriesReplicationEndpoint which replicates nothing but only verifies if all the cells are valid.
9855 It can be used to capture bugs for writing WAL, as most times we will not read the WALs again after writing it if there are no region server crashes.
9860 * [HBASE-21764](https://issues.apache.org/jira/browse/HBASE-21764) | *Major* | **Size of in-memory compaction thread pool should be configurable**
9862 Introduced an new config key in this issue: hbase.regionserver.inmemory.compaction.pool.size. the default value would be 10.  you can configure this to set the pool size of in-memory compaction pool. Note that all memstores in one region server will share the same pool, so if you have many regions in one region server,  you need to set this larger to compact faster for better read performance.
9867 * [HBASE-21684](https://issues.apache.org/jira/browse/HBASE-21684) | *Major* | **Throw DNRIOE when connection or rpc client is closed**
9869 Make StoppedRpcClientException extend DoNotRetryIOException.
9874 * [HBASE-21739](https://issues.apache.org/jira/browse/HBASE-21739) | *Major* | **Move grant/revoke from regionserver to master**
9876 To implement user permission control in Precedure V2, move grant and revoke method from AccessController to master firstly.
9877 Mark AccessController#grant and AccessController#revoke as deprecated and please use Admin#grant and Admin#revoke instead.
9882 * [HBASE-21791](https://issues.apache.org/jira/browse/HBASE-21791) | *Blocker* | **Upgrade thrift dependency to 0.12.0**
9884 IMPORTANT: Due to security issues, all users who use hbase thrift should avoid using releases which do not have this fix.
9886 The effect releases are:
9887 2.1.x: 2.1.2 and below
9888 2.0.x: 2.0.4 and below
9889 1.x: 1.4.x and below
9891 If you are using the effect releases above, please consider upgrading to a newer release ASAP.
9896 * [HBASE-20894](https://issues.apache.org/jira/browse/HBASE-20894) | *Major* | **Move BucketCache from java serialization to protobuf**
9898 For users who have configured hbase.bucketcache.ioengine with either the file:, files:, or mmap: prefix, and configured it to be persistent via the hbase.bucketcache.persistent.path property, the serialization format of the bucket cache has changed between versions. The old state will not be read during startup, and there is currently no migration path. The impact is expected to be minimal, however, since the cache will rebuild over time as access patterns dictate.
9903 # HBASE  2.2.0 Release Notes
9905 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
9910 * [HBASE-21970](https://issues.apache.org/jira/browse/HBASE-21970) | *Major* | **Document that how to upgrade from 2.0 or 2.1 to 2.2+**
9912 See the document http://hbase.apache.org/book.html#upgrade2.2 about how to upgrade from 2.0 or 2.1 to 2.2+.
9914 HBase 2.2+ uses a new Procedure form assiging/unassigning/moving Regions. It does not process HBase 2.1 and 2.0's Unassign/Assign Procedure types. Upgrade requires that we first drain the Master Procedure Store of old style Procedures before starting the new 2.2 Master. So you need to make sure that before you kill the old version (2.0 or 2.1) Master, there is no region in transition. And once the new version (2.2+) Master is up, you can rolling upgrade RegionServers one by one. 
9916 And there is a more safer way if you are running 2.1.1+ or 2.0.3+ cluster. It need four steps to upgrade Master.
9918 1. Shutdown both active and standby Masters (Your cluster will continue to server reads and writes without interruption).
9919 2. Set the property hbase.procedure.upgrade-to-2-2 to true in hbase-site.xml for the Master, and start only one Master, still using the 2.1.1+ (or 2.0.3+) version.
9920 3. Wait until the Master quits. Confirm that there is a 'READY TO ROLLING UPGRADE' message in the Master log as the cause of the shutdown. The Procedure Store is now empty.
9921 4. Start new Masters with the new 2.2+ version.
9923 Then you can rolling upgrade RegionServers one by one. See HBASE-21075 for more details.
9928 * [HBASE-21536](https://issues.apache.org/jira/browse/HBASE-21536) | *Trivial* | **Fix completebulkload usage instructions**
9930 Added completebulkload short name for BulkLoadHFilesTool to bin/hbase.
9935 * [HBASE-22500](https://issues.apache.org/jira/browse/HBASE-22500) | *Blocker* | **Modify pom and jenkins jobs for hadoop versions**
9937 Change the default hadoop-3 version to 3.1.2. Drop the support for the releases which are effected by CVE-2018-8029, see this email https://lists.apache.org/thread.html/3d6831c3893cd27b6850aea2feff7d536888286d588e703c6ffd2e82@%3Cuser.hadoop.apache.org%3E
9942 * [HBASE-22148](https://issues.apache.org/jira/browse/HBASE-22148) | *Blocker* | **Provide an alternative to CellUtil.setTimestamp**
9944 <!-- markdown -->
9946 The `CellUtil.setTimestamp` method changes to be an API with audience `LimitedPrivate(COPROC)` in HBase 3.0. With that designation the API should remain stable within a given minor release line, but may change between minor releases.
9948 Previously, this method was deprecated in HBase 2.0 for removal in HBase 3.0. Deprecation messages in HBase 2.y releases have been updated to indicate the expected API audience change.
9953 * [HBASE-21991](https://issues.apache.org/jira/browse/HBASE-21991) | *Major* | **Fix MetaMetrics issues - [Race condition, Faulty remove logic], few improvements**
9955 The class LossyCounting was unintentionally marked Public but was never intended to be part of our public API. This oversight has been corrected and LossyCounting is now marked as Private and going forward may be subject to additional breaking changes or removal without notice. If you have taken a dependency on this class we recommend cloning it locally into your project before upgrading to this release.
9960 * [HBASE-22226](https://issues.apache.org/jira/browse/HBASE-22226) | *Trivial* | **Incorrect level for headings in asciidoc**
9962 Warnings for level headings are corrected in the book for the HBase Incompatibilities section.
9967 * [HBASE-20970](https://issues.apache.org/jira/browse/HBASE-20970) | *Major* | **Update hadoop check versions for hadoop3 in hbase-personality**
9969 Add hadoop 3.0.3, 3.1.1 3.1.2 in our hadoop check jobs.
9974 * [HBASE-21784](https://issues.apache.org/jira/browse/HBASE-21784) | *Major* | **Dump replication queue should show list of wal files ordered chronologically**
9976 The DumpReplicationQueues tool will now list replication queues sorted in chronological order.
9981 * [HBASE-22384](https://issues.apache.org/jira/browse/HBASE-22384) | *Minor* | **Formatting issues in administration section of book**
9983 Fixes a formatting issue in the administration section of the book, where listing indentation were a little bit off.
9988 * [HBASE-22399](https://issues.apache.org/jira/browse/HBASE-22399) | *Major* | **Change default hadoop-two.version to 2.8.x and remove the 2.7.x hadoop checks**
9990 Now the default hadoop-two.version has been changed to 2.8.5, and all hadoop versions before 2.8.2(exclude) will not be supported any more.
9995 * [HBASE-22392](https://issues.apache.org/jira/browse/HBASE-22392) | *Trivial* | **Remove extra/useless +**
9997 Removed extra + in HRegion, HStore and LoadIncrementalHFiles for branch-2 and HRegion and HStore for branch-1.
10002 * [HBASE-20494](https://issues.apache.org/jira/browse/HBASE-20494) | *Major* | **Upgrade com.yammer.metrics dependency**
10004 Updated metrics core from 3.2.1 to 3.2.6.
10009 * [HBASE-22358](https://issues.apache.org/jira/browse/HBASE-22358) | *Minor* | **Change rubocop configuration for method length**
10011 The rubocop definition for the maximum method length was set to 75.
10016 * [HBASE-22379](https://issues.apache.org/jira/browse/HBASE-22379) | *Minor* | **Fix Markdown for "Voting on Release Candidates" in book**
10018 Fixes the formatting of the "Voting on Release Candidates" to actually show the quote and code formatting of the RAT check.
10023 * [HBASE-20851](https://issues.apache.org/jira/browse/HBASE-20851) | *Minor* | **Change rubocop config for max line length of 100**
10025 The rubocop configuration in the hbase-shell module now allows a line length with 100 characters, instead of 80 as before. For everything before 2.1.5 this change introduces rubocop itself.
10030 * [HBASE-22054](https://issues.apache.org/jira/browse/HBASE-22054) | *Minor* | **Space Quota: Compaction is not working for super user in case of NO\_WRITES\_COMPACTIONS**
10032 This change allows the system and superusers to initiate compactions, even when a space quota violation policy disallows compactions from happening. The original intent behind disallowing of compactions was to prevent end-user compactions from creating undue I/O load, not disallowing \*any\* compaction in the system.
10037 * [HBASE-22292](https://issues.apache.org/jira/browse/HBASE-22292) | *Blocker* | **PreemptiveFastFailInterceptor clean repeatedFailuresMap issue**
10039 Adds new configuration hbase.client.failure.map.cleanup.interval which defaults to ten minutes.
10044 * [HBASE-22155](https://issues.apache.org/jira/browse/HBASE-22155) | *Major* | **Move 2.2.0 on to hbase-thirdparty-2.2.0**
10046  Updates libs used internally by hbase via hbase-thirdparty as follows:
10048  gson 2.8.1 -\\\> 2.8.5
10049  guava 22.0 -\\\> 27.1-jre
10050  pb 3.5.1 -\\\> 3.7.0
10051  netty 4.1.17 -\\\> 4.1.34
10052  commons-collections4 4.1 -\\\> 4.3
10057 * [HBASE-22178](https://issues.apache.org/jira/browse/HBASE-22178) | *Major* | **Introduce a createTableAsync with TableDescriptor method in Admin**
10059 Introduced
10061 Future\<Void\> createTableAsync(TableDescriptor);
10066 * [HBASE-22108](https://issues.apache.org/jira/browse/HBASE-22108) | *Major* | **Avoid passing null in Admin methods**
10068 Introduced these methods:
10069 void move(byte[]);
10070 void move(byte[], ServerName);
10071 Future\<Void\> splitRegionAsync(byte[]);
10073 These methods are deprecated:
10074 void move(byte[], byte[])
10079 * [HBASE-22152](https://issues.apache.org/jira/browse/HBASE-22152) | *Major* | **Create a jenkins file for yetus to processing GitHub PR**
10081 Add a new jenkins file for running pre commit check for GitHub PR.
10086 * [HBASE-22007](https://issues.apache.org/jira/browse/HBASE-22007) | *Major* | **Add restoreSnapshot and cloneSnapshot with acl methods in AsyncAdmin**
10088 Add cloneSnapshot/restoreSnapshot with acl methods in AsyncAdmin.
10093 * [HBASE-22123](https://issues.apache.org/jira/browse/HBASE-22123) | *Minor* | **REST gateway reports Insufficient permissions exceptions as 404 Not Found**
10095 When insufficient permissions, you now get:
10097 HTTP/1.1 403 Forbidden
10099 on the HTTP side, and in the message
10101 Forbidden
10102 org.apache.hadoop.hbase.security.AccessDeniedException: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user ‘myuser',action: get, tableName:mytable, family:cf.
10103 at org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor.authorizeAccess(RangerAuthorizationCoprocessor.java:547)
10104 and the rest of the ADE stack
10109 * [HBASE-22100](https://issues.apache.org/jira/browse/HBASE-22100) | *Minor* | **False positive for error prone warnings in pre commit job**
10111 Now we will sort the javac WARNING/ERROR before generating diff in pre-commit so we can get a stable output for the error prone. The downside is that we just sort the output lexicographically so the line number will also be sorted lexicographically, which is a bit strange to human.
10116 * [HBASE-22057](https://issues.apache.org/jira/browse/HBASE-22057) | *Major* | **Impose upper-bound on size of ZK ops sent in a single multi()**
10118 Exposes a new configuration property "zookeeper.multi.max.size" which dictates the maximum size of deletes that HBase will make to ZooKeeper in a single RPC. This property defaults to 1MB, which should fall beneath the default ZooKeeper limit of 2MB, controlled by "jute.maxbuffer".
10123 * [HBASE-22052](https://issues.apache.org/jira/browse/HBASE-22052) | *Major* | **pom cleaning; filter out jersey-core in hadoop2 to match hadoop3 and remove redunant version specifications**
10125 <!-- markdown -->
10126 Fixed awkward dependency issue that prevented site building.
10128 #### note specific to HBase 2.1.4
10129 HBase 2.1.4 shipped with an early version of this fix that incorrectly altered the libraries included in our binary assembly for using Apache Hadoop 2.7 (the current build default Hadoop version for 2.1.z). For folks running out of the box against a Hadoop 2.7 cluster (or folks who skip the installation step of [replacing the bundled Hadoop libraries](http://hbase.apache.org/book.html#hadoop)) this will result in a failure at Region Server startup due to a missing class definition. e.g.:
10131 2019-03-27 09:02:05,779 ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
10132 java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
10133         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:644)
10134         at org.apache.hadoop.hdfs.DFSClient.<init>(DFSClient.java:628)
10135         at org.apache.hadoop.hdfs.DistributedFileSystem.initialize(DistributedFileSystem.java:149)
10136         at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)
10137         at org.apache.hadoop.fs.FileSystem.access$200(FileSystem.java:93)
10138         at org.apache.hadoop.fs.FileSystem$Cache.getInternal(FileSystem.java:2701)
10139         at org.apache.hadoop.fs.FileSystem$Cache.get(FileSystem.java:2683)
10140         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:372)
10141         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:171)
10142         at org.apache.hadoop.fs.FileSystem.get(FileSystem.java:356)
10143         at org.apache.hadoop.fs.Path.getFileSystem(Path.java:295)
10144         at org.apache.hadoop.hbase.util.CommonFSUtils.getRootDir(CommonFSUtils.java:362)
10145         at org.apache.hadoop.hbase.util.CommonFSUtils.isValidWALRootDir(CommonFSUtils.java:411)
10146         at org.apache.hadoop.hbase.util.CommonFSUtils.getWALRootDir(CommonFSUtils.java:387)
10147         at org.apache.hadoop.hbase.regionserver.HRegionServer.initializeFileSystem(HRegionServer.java:704)
10148         at org.apache.hadoop.hbase.regionserver.HRegionServer.<init>(HRegionServer.java:613)
10149         at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
10150         at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
10151         at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
10152         at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
10153         at org.apache.hadoop.hbase.regionserver.HRegionServer.constructRegionServer(HRegionServer.java:3029)
10154         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.start(HRegionServerCommandLine.java:63)
10155         at org.apache.hadoop.hbase.regionserver.HRegionServerCommandLine.run(HRegionServerCommandLine.java:87)
10156         at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70)
10157         at org.apache.hadoop.hbase.util.ServerCommandLine.doMain(ServerCommandLine.java:149)
10158         at org.apache.hadoop.hbase.regionserver.HRegionServer.main(HRegionServer.java:3047)
10159 Caused by: java.lang.ClassNotFoundException: org.apache.htrace.SamplerBuilder
10160         at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
10161         at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
10162         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
10163         at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
10164         ... 26 more
10168 Workaround via any _one_ of the following:
10169 * If you are running against a Hadoop cluster that is 2.8+, ensure you replace the Hadoop libaries in the default binary assembly with those for your version.
10170 * If you are running against a Hadoop cluster that is 2.8+, build the binary assembly from the source release while specifying your Hadoop version.
10171 * If you are running against a Hadoop cluster that is a supported 2.7 release, ensure the `hadoop` executable is in the `PATH` seen at Region Server startup and that you are not using the `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP` bypass.
10172 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers via the HBASE_CLASSPATH environment variable.
10173 * For any supported Hadoop version, manually make the Apache HTrace artifact `htrace-core-3.1.0-incubating.jar` available to all Region Servers by copying it into the directory `${HBASE_HOME}/lib/client-facing-thirdparty/`.
10178 * [HBASE-22065](https://issues.apache.org/jira/browse/HBASE-22065) | *Major* | **Add listTableDescriptors(List\<TableName\>) method in AsyncAdmin**
10180 Add a listTableDescriptors(List\<TableName\>) method in the AsyncAdmin interface, to align with the Admin interface.
10185 * [HBASE-22040](https://issues.apache.org/jira/browse/HBASE-22040) | *Major* | **Add mergeRegionsAsync with a List of region names method in AsyncAdmin**
10187 Add a mergeRegionsAsync(byte[][], boolean) method in the AsyncAdmin interface.
10189 Instead of using assert, now we will throw IllegalArgumentException when you want to merge less than 2 regions at client side. And also, at master side, instead of using assert, now we will throw DoNotRetryIOException if you want merge more than 2 regions, since we only support merging two regions at once for now.
10194 * [HBASE-22039](https://issues.apache.org/jira/browse/HBASE-22039) | *Major* | **Should add the synchronous parameter for the XXXSwitch method in AsyncAdmin**
10196 Add drainXXX parameter for balancerSwitch/splitSwitch/mergeSwitch methods in the AsyncAdmin interface, which has the same meaning with the synchronous parameter for these methods in the Admin interface.
10201 * [HBASE-21810](https://issues.apache.org/jira/browse/HBASE-21810) | *Major* | **bulkload  support set hfile compression on client**
10203 bulkload (HFileOutputFormat2)  support config the compression on client ,you can set the job configuration "hbase.mapreduce.hfileoutputformat.compression"  override the auto-detection of the target table's compression
10208 * [HBASE-22000](https://issues.apache.org/jira/browse/HBASE-22000) | *Major* | **Deprecated isTableAvailable with splitKeys**
10210 Deprecated AsyncTable.isTableAvailable(TableName, byte[][]).
10215 * [HBASE-21871](https://issues.apache.org/jira/browse/HBASE-21871) | *Major* | **Support to specify a peer table name in VerifyReplication tool**
10217 After HBASE-21871, we can specify a peer table name with --peerTableName in VerifyReplication tool like the following:
10218 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable 5 TestTable
10220 In addition, we can compare any 2 tables in any remote clusters with specifying both peerId and --peerTableName.
10222 For example:
10223 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication --peerTableName=peerTable zk1,zk2,zk3:2181/hbase TestTable
10228 * [HBASE-15728](https://issues.apache.org/jira/browse/HBASE-15728) | *Major* | **Add remaining per-table region / store / flush / compaction related metrics**
10230 Adds below flush, split, and compaction metrics
10232  +  // split related metrics
10233  +  private MutableFastCounter splitRequest;
10234  +  private MutableFastCounter splitSuccess;
10235  +  private MetricHistogram splitTimeHisto;
10237  +  // flush related metrics
10238  +  private MetricHistogram flushTimeHisto;
10239  +  private MetricHistogram flushMemstoreSizeHisto;
10240  +  private MetricHistogram flushOutputSizeHisto;
10241  +  private MutableFastCounter flushedMemstoreBytes;
10242  +  private MutableFastCounter flushedOutputBytes;
10244  +  // compaction related metrics
10245  +  private MetricHistogram compactionTimeHisto;
10246  +  private MetricHistogram compactionInputFileCountHisto;
10247  +  private MetricHistogram compactionInputSizeHisto;
10248  +  private MetricHistogram compactionOutputFileCountHisto;
10249  +  private MetricHistogram compactionOutputSizeHisto;
10250  +  private MutableFastCounter compactedInputBytes;
10251  +  private MutableFastCounter compactedOutputBytes;
10253  +  private MetricHistogram majorCompactionTimeHisto;
10254  +  private MetricHistogram majorCompactionInputFileCountHisto;
10255  +  private MetricHistogram majorCompactionInputSizeHisto;
10256  +  private MetricHistogram majorCompactionOutputFileCountHisto;
10257  +  private MetricHistogram majorCompactionOutputSizeHisto;
10258  +  private MutableFastCounter majorCompactedInputBytes;
10259  +  private MutableFastCounter majorCompactedOutputBytes;
10264 * [HBASE-20886](https://issues.apache.org/jira/browse/HBASE-20886) | *Critical* | **[Auth] Support keytab login in hbase client**
10266 From 2.2.0, hbase supports client login via keytab. To use this feature, client should specify \`hbase.client.keytab.file\` and \`hbase.client.keytab.principal\` in hbase-site.xml, then the connection will contain the needed credentials which be renewed periodically to communicate with kerberized hbase cluster.
10271 * [HBASE-21410](https://issues.apache.org/jira/browse/HBASE-21410) | *Major* | **A helper page that help find all problematic regions and procedures**
10273 After HBASE-21410, we add a helper page to Master UI. This helper page is mainly to help HBase operator quickly found all regions and pids that are get stuck.
10274 There are 2 entries to get in this page.
10275 One is showing in the Regions in Transition section, it made "num region(s) in transition" a link that you can click and check all regions in transition and their related procedure IDs.
10276 The other one is showing in the table details section, it made the number of CLOSING or OPENING regions a link, which you can click and check regions and related procedure IDs of CLOSING or OPENING regions of a certain table.
10277 In this helper page, not only you can see all regions and related procedures, there are 2 buttons at the top which will show these regions or procedure IDs in text format. This is mainly aim to help operator to easily copy and paste all problematic procedure IDs and encoded region names to HBCK2's command line, by which we HBase operator can bypass these procedures or assign these regions.
10282 * [HBASE-21588](https://issues.apache.org/jira/browse/HBASE-21588) | *Major* | **Procedure v2 wal splitting implementation**
10284 After HBASE-21588, we introduce a new way to do WAL splitting coordination by procedure framework. This can simplify the process of WAL splitting and no need to connect zookeeper any more.
10285 During ServerCrashProcedure, it will create a SplitWALProcedure for each WAL that need to split. Then each SplitWALProcedure will spawn a SplitWALRemoteProcedure to send the request to regionserver.
10286 At the RegionServer side, whole process is handled by SplitWALCallable. It split the WAL and return the result to master.
10287 According to my test, this patch has a better performance as the number of WALs that need to split increase. And it can relieve the pressure on zookeeper.
10292 * [HBASE-20734](https://issues.apache.org/jira/browse/HBASE-20734) | *Major* | **Colocate recovered edits directory with hbase.wal.dir**
10294 Previously the recovered.edits directory was under the root directory. This JIRA moves the recovered.edits directory to be under the hbase.wal.dir if set. It also adds a check for any recovered.edits found under the root directory for backwards compatibility. This gives improvements when a faster media(like SSD) or more local FileSystem is used for the hbase.wal.dir than the root dir.
10299 * [HBASE-20401](https://issues.apache.org/jira/browse/HBASE-20401) | *Minor* | **Make \`MAX\_WAIT\` and \`waitIfNotFinished\` in CleanerContext configurable**
10301 When oldwals (and hfile) cleaner cleans stale wals (and hfiles), it will periodically check and wait the clean results from filesystem, the total wait time will be no more than a max time.
10303 The periodically wait and check configurations are hbase.oldwals.cleaner.thread.check.interval.msec (default is 500 ms) and hbase.regionserver.hfilecleaner.thread.check.interval.msec (default is 1000 ms). 
10305 Meanwhile, The max time configurations are hbase.oldwals.cleaner.thread.timeout.msec and hbase.regionserver.hfilecleaner.thread.timeout.msec, they are set to 60 seconds by default.
10307 All support dynamic configuration.
10309 e.g. in the oldwals cleaning scenario, one may consider tuning hbase.oldwals.cleaner.thread.timeout.msec and hbase.oldwals.cleaner.thread.check.interval.msec 
10311 1. While deleting a oldwal never complete (strange but possible), then delete file task needs to wait for a max of 60 seconds. Here, 60 seconds might be too long, or the opposite way is to increase more than 60 seconds in the use cases of slow file delete. 
10312 2. The check and wait of a file delete is set to default in the period of 500 milliseconds, one might want to tune this checking period to a short interval to check more frequently or to a longer interval to avoid checking too often to manage their delete file task checking period (the longer interval may be use to avoid checking too fast while using a high latency storage).
10317 * [HBASE-21481](https://issues.apache.org/jira/browse/HBASE-21481) | *Major* | **[acl] Superuser's permissions should not be granted or revoked by any non-su global admin**
10319 HBASE-21481 improves the quality of access control, by strengthening the protection of super users's privileges.
10324 * [HBASE-21082](https://issues.apache.org/jira/browse/HBASE-21082) | *Critical* | **Reimplement assign/unassign related procedure metrics**
10326 Now we have four types of RIT procedure metrics, assign, unassign, move, reopen. The meaning of assign/unassign is changed, as we will not increase the unassign metric and then the assign metric when moving a region.
10327 Also introduced two new procedure metrics, open and close, which are used to track the open/close region calls to region server. We may send open/close multiple times to finish a RIT since we may retry multiple times.
10332 * [HBASE-20724](https://issues.apache.org/jira/browse/HBASE-20724) | *Critical* | **Sometimes some compacted storefiles are still opened after region failover**
10334 Problem: This is an old problem since HBASE-2231. The compaction event marker was only writed to WAL. But after flush, the WAL may be archived, which means an useful compaction event marker be deleted, too. So the compacted store files cannot be archived when region open and replay WAL.
10336 Solution: After this jira, the compaction event tracker will be writed to HFile. When region open and load store files, read the compaction evnet tracker from HFile and archive the compacted store files which still exist.
10341 * [HBASE-21820](https://issues.apache.org/jira/browse/HBASE-21820) | *Major* | **Implement CLUSTER quota scope**
10343 HBase contains two quota scopes: MACHINE and CLUSTER. Before this patch, set quota operations did not expose scope option to client api and use MACHINE as default, CLUSTER scope can not be set and used. 
10344 Shell commands are as follows:
10345 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
10347 This issue implements CLUSTER scope in a simple way: For user, namespace, user over namespace quota, use [ClusterLimit / RSNum] as machine limit. For table and user over table quota, use [ClusterLimit / TotalTableRegionNum \* MachineTableRegionNum] as machine limit.
10348 After this patch, user can set CLUSTER scope quota, but MACHINE is still default if user ignore scope. 
10349 Shell commands are as follows:
10350 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec'
10351 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> MACHINE
10352 set\_quota, TYPE =\> THROTTLE, TABLE =\> 't1', LIMIT =\> '10req/sec', SCOPE =\> CLUSTER
10357 * [HBASE-21057](https://issues.apache.org/jira/browse/HBASE-21057) | *Minor* | **upgrade to latest spotbugs**
10359 Change spotbugs version to 3.1.11.
10364 * [HBASE-21922](https://issues.apache.org/jira/browse/HBASE-21922) | *Major* | **BloomContext#sanityCheck may failed when use ROWPREFIX\_DELIMITED bloom filter**
10366 Remove bloom filter type ROWPREFIX\_DELIMITED. May add it back when find a better solution.
10371 * [HBASE-21783](https://issues.apache.org/jira/browse/HBASE-21783) | *Major* | **Support exceed user/table/ns throttle quota if region server has available quota**
10373 Support enable or disable exceed throttle quota. Exceed throttle quota means, user can over consume user/namespace/table quota if region server has additional available quota because other users don't consume at the same time. 
10374 Use the following shell commands to enable/disable exceed throttle quota: enable\_exceed\_throttle\_quota
10375 disable\_exceed\_throttle\_quota
10376 There are two limits when enable exceed throttle quota: 
10377 1. Must set at least one read and one write region server throttle quota; 
10378 2. All region server throttle quotas must be in seconds time unit. Because once previous requests exceed their quota and consume region server quota, quota in other time units may be refilled in a long time, this may affect later requests.
10383 * [HBASE-20587](https://issues.apache.org/jira/browse/HBASE-20587) | *Major* | **Replace Jackson with shaded thirdparty gson**
10385 Remove jackson dependencies from most hbase modules except hbase-rest, use shaded gson instead. The output json will be a bit different since jackson can use getter/setter, but gson will always use the fields.
10390 * [HBASE-21928](https://issues.apache.org/jira/browse/HBASE-21928) | *Major* | **Deprecated HConstants.META\_QOS**
10392 Mark HConstants.META\_QOS as deprecated. It is for internal use only, which is the highest priority. You should not try to set a priority greater than or equal to this value, although it is no harm but also useless.
10397 * [HBASE-17942](https://issues.apache.org/jira/browse/HBASE-17942) | *Major* | **Disable region splits and merges per table**
10399 This patch adds the ability to disable split and/or merge for a table (By default, split and merge are enabled for a table).
10404 * [HBASE-21636](https://issues.apache.org/jira/browse/HBASE-21636) | *Major* | **Enhance the shell scan command to support missing scanner specifications like ReadType, IsolationLevel etc.**
10406 Allows shell to set Scan options previously not exposed. See additions as part of the scan help by typing following hbase shell:
10408 hbase\> help 'scan'
10413 * [HBASE-21201](https://issues.apache.org/jira/browse/HBASE-21201) | *Major* | **Support to run VerifyReplication MR tool without peerid**
10415 We can specify peerQuorumAddress instead of peerId in VerifyReplication tool. So it no longer requires peerId to be setup when using this tool.
10417 For example:
10418 hbase org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication zk1,zk2,zk3:2181/hbase testTable
10423 * [HBASE-21838](https://issues.apache.org/jira/browse/HBASE-21838) | *Major* | **Create a special ReplicationEndpoint just for verifying the WAL entries are fine**
10425 Introduce a VerifyWALEntriesReplicationEndpoint which replicates nothing but only verifies if all the cells are valid.
10426 It can be used to capture bugs for writing WAL, as most times we will not read the WALs again after writing it if there are no region server crashes.
10431 * [HBASE-21727](https://issues.apache.org/jira/browse/HBASE-21727) | *Minor* | **Simplify documentation around client timeout**
10433 Deprecated HBaseConfiguration#getInt(Configuration, String, String, int) method and removed it from 3.0.0 version.
10438 * [HBASE-21764](https://issues.apache.org/jira/browse/HBASE-21764) | *Major* | **Size of in-memory compaction thread pool should be configurable**
10440 Introduced an new config key in this issue: hbase.regionserver.inmemory.compaction.pool.size. the default value would be 10.  you can configure this to set the pool size of in-memory compaction pool. Note that all memstores in one region server will share the same pool, so if you have many regions in one region server,  you need to set this larger to compact faster for better read performance.
10445 * [HBASE-21684](https://issues.apache.org/jira/browse/HBASE-21684) | *Major* | **Throw DNRIOE when connection or rpc client is closed**
10447 Make StoppedRpcClientException extend DoNotRetryIOException.
10452 * [HBASE-21739](https://issues.apache.org/jira/browse/HBASE-21739) | *Major* | **Move grant/revoke from regionserver to master**
10454 To implement user permission control in Precedure V2, move grant and revoke method from AccessController to master firstly.
10455 Mark AccessController#grant and AccessController#revoke as deprecated and please use Admin#grant and Admin#revoke instead.
10460 * [HBASE-21791](https://issues.apache.org/jira/browse/HBASE-21791) | *Blocker* | **Upgrade thrift dependency to 0.12.0**
10462 IMPORTANT: Due to security issues, all users who use hbase thrift should avoid using releases which do not have this fix.
10464 The effect releases are:
10465 2.1.x: 2.1.2 and below
10466 2.0.x: 2.0.4 and below
10467 1.x: 1.4.x and below
10469 If you are using the effect releases above, please consider upgrading to a newer release ASAP.
10474 * [HBASE-21792](https://issues.apache.org/jira/browse/HBASE-21792) | *Major* | **Mark HTableMultiplexer as deprecated and remove it in 3.0.0**
10476 HTableMultiplexer exposes the implementation class, and it is incomplete, so we mark it as deprecated and remove it in 3.0.0 release.
10478 There is no direct replacement for HTableMultiplexer, please use BufferedMutator if you want to batch mutations to a table.
10483 * [HBASE-21782](https://issues.apache.org/jira/browse/HBASE-21782) | *Major* | **LoadIncrementalHFiles should not be IA.Public**
10485 Introduce a BulkLoadHFiles interface which is marked as IA.Public, for doing bulk load programmatically.
10486 Introduce a BulkLoadHFilesTool which extends BulkLoadHFiles, and is marked as IA.LimitedPrivate(TOOLS), for using from command line.
10487 The old LoadIncrementalHFiles is deprecated and will be removed in 3.0.0.
10492 * [HBASE-21762](https://issues.apache.org/jira/browse/HBASE-21762) | *Major* | **Move some methods in ClusterConnection to Connection**
10494 Move the two getHbck method from ClusterConnection to Connection, and mark the methods as IA.LimitedPrivate(HBCK), as ClusterConnection is IA.Private and should not be depended by HBCK2.
10496 Add a clearRegionLocationCache method in Connection to clear the region location cache for all the tables. As in RegionLocator, most of the methods have a 'reload' parameter, which implicitly tells user that we have a region location cache, so adding a method to clear the cache is fine.
10501 * [HBASE-21713](https://issues.apache.org/jira/browse/HBASE-21713) | *Major* | **Support set region server throttle quota**
10503 Support set region server rpc throttle quota which represents the read/write ability of region servers and throttles when region server's total requests exceeding the limit. 
10505 Use the following shell command to set RS quota:
10506 set\_quota TYPE =\> THROTTLE, REGIONSERVER =\> 'all', THROTTLE\_TYPE =\> WRITE, LIMIT =\> '20000req/sec'
10507 set\_quota TYPE =\> THROTTLE, REGIONSERVER =\> 'all', LIMIT =\> NONE
10508 "all" represents the throttle quota of all region servers and setting specified region server quota isn't supported currently.
10513 * [HBASE-21689](https://issues.apache.org/jira/browse/HBASE-21689) | *Minor* | **Make table/namespace specific current quota info available in shell(describe\_namespace & describe)**
10515 In shell commands "describe\_namespace" and "describe", which are used to see the descriptors of the namespaces and tables respectively, quotas set on that particular namespace/table will also be printed along.
10520 * [HBASE-17370](https://issues.apache.org/jira/browse/HBASE-17370) | *Major* | **Fix or provide shell scripts to drain and decommission region server**
10522 Adds shell support for the following:
10523 - List decommissioned/draining region servers
10524 - Decommission a list of region servers, optionally offload corresponding regions
10525 - Recommission a region server, optionally load a list of passed regions
10530 * [HBASE-21734](https://issues.apache.org/jira/browse/HBASE-21734) | *Major* | **Some optimization in FilterListWithOR**
10532 After HBASE-21620, the filterListWithOR has been a bit slow because we need to merge each sub-filter's RC , while before HBASE-21620, we will skip many RC merging, but the logic was wrong. So here we choose another way to optimaze the performance: removing the KeyValueUtil#toNewKeyCell. 
10533 Anoop Sam John suggested that the KeyValueUtil#toNewKeyCell can save some GC before because if we copy key part of cell into a single byte[], then the block the cell refering won't be refered by the filter list any more, the upper layer can GC the data block quickly. while after HBASE-21620, we will update the prevCellList for every encountered cell now, so the lifecycle of cell in prevCellList for FilterList will be quite shorter. so just use the cell ref for saving cpu.
10534 BTW, we removed all the arrays streams usage in filter list, because it's also quite time-consuming in our test.
10539 * [HBASE-21738](https://issues.apache.org/jira/browse/HBASE-21738) | *Critical* | **Remove all the CSLM#size operation in our memstore because it's an quite time consuming.**
10541 We found the memstore snapshotting would cost much time because of calling the time-consuming ConcurrentSkipListMap#Size, it would make the p999 latency spike happen. So in this issue, we remove all ConcurrentSkipListMap#size in memstore by counting the cellsCount in MemstoreSizeing. As the issue described, the p999 latency spike was mitigated.
10546 * [HBASE-21034](https://issues.apache.org/jira/browse/HBASE-21034) | *Major* | **Add new throttle type: read/write capacity unit**
10548 Provides a new throttle type: capacity unit. One read/write/request capacity unit represents that read/write/read+write up to 1K data. If data size is more than 1K, then consume additional capacity units.
10550 Use shell command to set capacity unit(CU):
10551 set\_quota TYPE =\> THROTTLE, THROTTLE\_TYPE =\> WRITE, USER =\> 'u1', LIMIT =\> '10CU/sec'
10553 Use the "hbase.quota.read.capacity.unit" property to set the data size of one read capacity unit in bytes, the default value is 1K. Use the "hbase.quota.write.capacity.unit" property to set the data size of one write capacity unit in bytes, the default value is 1K.
10558 * [HBASE-21595](https://issues.apache.org/jira/browse/HBASE-21595) | *Minor* | **Print thread's information and stack traces when RS is aborting forcibly**
10560 Does thread dump on stdout on abort.
10565 * [HBASE-21732](https://issues.apache.org/jira/browse/HBASE-21732) | *Critical* | **Should call toUpperCase before using Enum.valueOf in some methods for ColumnFamilyDescriptor**
10567 Now all the Enum configs in ColumnFamilyDescriptor can accept lower case config value.
10572 * [HBASE-21712](https://issues.apache.org/jira/browse/HBASE-21712) | *Minor* | **Make submit-patch.py python3 compatible**
10574 Python3 support was added to dev-support/submit-patch.py. To install newly required dependencies run \`pip install -r dev-support/python-requirements.txt\` command.
10579 * [HBASE-21657](https://issues.apache.org/jira/browse/HBASE-21657) | *Major* | **PrivateCellUtil#estimatedSerializedSizeOf has been the bottleneck in 100% scan case.**
10581 In HBASE-21657,  I simplified the path of estimatedSerialiedSize() & estimatedSerialiedSizeOfCell() by moving the general getSerializedSize()
10582 and heapSize() from ExtendedCell to Cell interface. The patch also included some other improvments:
10584 1. For 99%  of case, our cells has no tags, so let the HFileScannerImpl just return the NoTagsByteBufferKeyValue if no tags, which means we can save 
10585    lots of cpu time when sending no tags cell to rpc because can just return the length instead of getting the serialize size by caculating offset/length 
10586    of each fields(row/cf/cq..)
10587 2. Move the subclass's getSerializedSize implementation from ExtendedCell to their own class, which mean we did not need to call ExtendedCell's
10588    getSerialiedSize() firstly, then forward to subclass's getSerializedSize(withTags).
10589 3. Give a estimated result arraylist size for avoiding the frequent list extension when in a big scan, now we estimate the array size as min(scan.rows, 512).
10590    it's also help a lot.
10592 We gain almost ~40% throughput improvement in 100% scan case for branch-2 (cacheHitRatio~100%)[1], it's a good thing. While it's a incompatible change in 
10593 some case, such as if the upstream user implemented their own Cells, although it's rare but can happen, then their compile will be error.
10598 * [HBASE-21647](https://issues.apache.org/jira/browse/HBASE-21647) | *Major* | **Add status track for splitting WAL tasks**
10600 Adds task monitor that shows ServerCrashProcedure progress in UI.
10605 * [HBASE-21652](https://issues.apache.org/jira/browse/HBASE-21652) | *Major* | **Refactor ThriftServer making thrift2 server inherited from thrift1 server**
10607 Before this issue, thrift1 server and thrift2 server are totally different servers. If a new feature is added to thrift1 server, thrfit2 server have to make the same change to support it(e.g. authorization). After this issue, thrift2 server is inherited from thrift1, thrift2 server now have all the features thrift1 server has(e.g http support, which thrift2 server doesn't have before).  The way to start thrift1 or thrift2 server remain the same after this issue.
10612 * [HBASE-21661](https://issues.apache.org/jira/browse/HBASE-21661) | *Major* | **Provide Thrift2 implementation of Table/Admin**
10614 ThriftAdmin/ThriftTable are implemented based on Thrift2. With ThriftAdmin/ThriftTable, People can use thrift2 protocol just like HTable/HBaseAdmin. 
10615 Example of using ThriftConnection
10616 Configuration conf = HBaseConfiguration.create();
10617 conf.set(ClusterConnection.HBASE\_CLIENT\_CONNECTION\_IMPL,ThriftConnection.class.getName());
10618 Connection conn = ConnectionFactory.createConnection(conf);
10619 Table table = conn.getTable(tablename)
10620 It is just like a normal Connection, similar use experience with the default ConnectionImplementation
10625 * [HBASE-21618](https://issues.apache.org/jira/browse/HBASE-21618) | *Critical* | **Scan with the same startRow(inclusive=true) and stopRow(inclusive=false) returns one result**
10627 There was a bug when scan with the same startRow(inclusive=true) and stopRow(inclusive=false). The old incorrect behavior is return one result. After this fix, the new correct behavior is return nothing.
10632 * [HBASE-21159](https://issues.apache.org/jira/browse/HBASE-21159) | *Major* | **Add shell command to switch throttle on or off**
10634 Support enable or disable rpc throttle when hbase quota is enabled. If hbase quota is enabled, rpc throttle is enabled by default.  When disable rpc throttle, HBase will not throttle any request. Use the following commands to switch rpc throttle : enable\_rpc\_throttle / disable\_rpc\_throttle.
10639 * [HBASE-21659](https://issues.apache.org/jira/browse/HBASE-21659) | *Minor* | **Avoid to load duplicate coprocessors in system config and table descriptor**
10641 Add a new configuration "hbase.skip.load.duplicate.table.coprocessor". The default value is false to keep compatible with the old behavior. Config it true to skip load duplicate table coprocessor.
10646 * [HBASE-21650](https://issues.apache.org/jira/browse/HBASE-21650) | *Major* | **Add DDL operation and some other miscellaneous to thrift2**
10648 Added DDL operations and some other structure definition to thrift2. Methods added: 
10649 create/modify/addColumnFamily/deleteColumnFamily/modifyColumnFamily/enable/disable/truncate/delete table
10650 create/modify/delete namespace
10651 get(list)TableDescriptor(s)/get(list)NamespaceDescirptor(s)
10652 tableExists/isTableEnabled/isTableDisabled/isTableAvailabe
10653 And some class definitions along with those methods
10658 * [HBASE-21643](https://issues.apache.org/jira/browse/HBASE-21643) | *Major* | **Introduce two new region coprocessor method and deprecated postMutationBeforeWAL**
10660 Deprecated region coprocessor postMutationBeforeWAL and introduce two new region coprocessor postIncrementBeforeWAL and postAppendBeforeWAL instead.
10665 * [HBASE-21635](https://issues.apache.org/jira/browse/HBASE-21635) | *Major* | **Use maven enforcer to ban imports from illegal packages**
10667 Use de.skuzzle.enforcer.restrict-imports-enforcer-rule extension for maven enforcer plugin to ban illegal imports at compile time. Now if you use illegal imports, for example, import com.google.common.\*, there will be a compile error, instead of a checkstyle warning.
10672 * [HBASE-21401](https://issues.apache.org/jira/browse/HBASE-21401) | *Critical* | **Sanity check when constructing the KeyValue**
10674 Add a sanity check when constructing KeyValue from a byte[]. we use the constructor when we're reading kv from socket or HFIle or WAL(replication). the santiy check isn't designed for discovering the bits corruption in network transferring or disk IO. It is designed to detect bugs inside HBase in advance. and HBASE-21459 indicated that there's extremely small performance loss for diff kinds of keyvalue.
10679 * [HBASE-21554](https://issues.apache.org/jira/browse/HBASE-21554) | *Minor* | **Show replication endpoint classname for replication peer on master web UI**
10681 The replication UI on master will show the replication endpoint classname.
10686 * [HBASE-21549](https://issues.apache.org/jira/browse/HBASE-21549) | *Major* | **Add shell command for serial replication peer**
10688 Add a SERIAL flag for add\_peer command to identifiy whether or not the replication peer is a serial replication peer. The default serial flag is false.
10693 * [HBASE-21453](https://issues.apache.org/jira/browse/HBASE-21453) | *Major* | **Convert ReadOnlyZKClient to DEBUG instead of INFO**
10695 Log level of ReadOnlyZKClient moved to debug.
10700 * [HBASE-21283](https://issues.apache.org/jira/browse/HBASE-21283) | *Minor* | **Add new shell command 'rit' for listing regions in transition**
10702 <!-- markdown -->
10704 The HBase `shell` now includes a command to list regions currently in transition.
10707 HBase Shell
10708 Use "help" to get list of supported commands.
10709 Use "exit" to quit this interactive shell.
10710 Version 1.5.0-SNAPSHOT, r9bb6d2fa8b760f16cd046657240ebd4ad91cb6de, Mon Oct  8 21:05:50 UTC 2018
10712 hbase(main):001:0> help 'rit'
10713 List all regions in transition.
10714 Examples:
10715   hbase> rit
10717 hbase(main):002:0> create ...
10718 0 row(s) in 2.5150 seconds
10719 => Hbase::Table - IntegrationTestBigLinkedList
10721 hbase(main):003:0> rit
10722 0 row(s) in 0.0340 seconds
10724 hbase(main):004:0> unassign '56f0c38c81ae453d19906ce156a2d6a1'
10725 0 row(s) in 0.0540 seconds
10727 hbase(main):005:0> rit 
10728 IntegrationTestBigLinkedList,L\xCC\xCC\xCC\xCC\xCC\xCC\xCB,1539117183224.56f0c38c81ae453d19906ce156a2d6a1. state=PENDING_CLOSE, ts=Tue Oct 09 20:33:34 UTC 2018 (0s ago), server=null                                                                                                                                                                                   
10729 1 row(s) in 0.0170 seconds
10735 * [HBASE-21567](https://issues.apache.org/jira/browse/HBASE-21567) | *Major* | **Allow overriding configs starting up the shell**
10737 Allow passing of -Dkey=value option to shell to override hbase-\* configuration: e.g.:
10739 $ ./bin/hbase shell -Dhbase.zookeeper.quorum=ZK0.remote.cluster.example.org,ZK1.remote.cluster.example.org,ZK2.remote.cluster.example.org -Draining=false
10741 hbase(main):001:0\> @shell.hbase.configuration.get("hbase.zookeeper.quorum")
10742 =\> "ZK0.remote.cluster.example.org,ZK1.remote.cluster.example.org,ZK2.remote.cluster.example.org"
10743 hbase(main):002:0\> @shell.hbase.configuration.get("raining")
10744 =\> "false"
10749 * [HBASE-21560](https://issues.apache.org/jira/browse/HBASE-21560) | *Major* | **Return a new TableDescriptor for MasterObserver#preModifyTable to allow coprocessor modify the TableDescriptor**
10751 Incompatible change. Allow MasterObserver#preModifyTable to return a new TableDescriptor. And master will use this returned TableDescriptor to modify table.
10756 * [HBASE-21551](https://issues.apache.org/jira/browse/HBASE-21551) | *Blocker* | **Memory leak when use scan with STREAM at server side**
10758 <!-- markdown -->
10759 ### Summary
10760 HBase clusters will experience Region Server failures due to out of memory errors due to a leak given any of the following:
10762 * User initiates Scan operations set to use the STREAM reading type
10763 * User initiates Scan operations set to use the default reading type that read more than 4 * the block size of column families involved in the scan (e.g. by default 4*64KiB)
10764 * Compactions run
10766 ### Root cause
10768 When there are long running scans the Region Server process attempts to optimize access by using a different API geared towards sequential access. Due to an error in HBASE-20704 for HBase 2.0+ the Region Server fails to release related resources when those scans finish. That same optimization path is always used for the HBase internal file compaction process.
10770 ### Workaround
10772 Impact for this error can be minimized by setting the config value “hbase.storescanner.pread.max.bytes” to MAX_INT to avoid the optimization for default user scans. Clients should also be checked to ensure they do not pass the STREAM read type to the Scan API. This will have a severe impact on performance for long scans.
10774 Compactions always use this sequential optimized reading mechanism so downstream users will need to periodically restart Region Server roles after compactions have happened.
10779 * [HBASE-21550](https://issues.apache.org/jira/browse/HBASE-21550) | *Major* | **Add a new method preCreateTableRegionInfos for MasterObserver which allows CPs to modify the TableDescriptor**
10781 Add a new method preCreateTableRegionInfos for MasterObserver, which will be called before creating region infos for the given table,  before the preCreateTable method. It allows you to return a new TableDescritor to override the original one. Returns null or throws exception will stop the creation.
10786 * [HBASE-21492](https://issues.apache.org/jira/browse/HBASE-21492) | *Critical* | **CellCodec Written To WAL Before It's Verified**
10788 After HBASE-21492 the return type of WALCellCodec#getWALCellCodecClass has been changed from String to Class
10793 * [HBASE-21387](https://issues.apache.org/jira/browse/HBASE-21387) | *Major* | **Race condition surrounding in progress snapshot handling in snapshot cache leads to loss of snapshot files**
10795 To prevent race condition between in progress snapshot (performed by TakeSnapshotHandler) and HFileCleaner which results in data loss, this JIRA introduced mutual exclusion between taking snapshot and running HFileCleaner. That is, at any given moment, either some snapshot can be taken or, HFileCleaner checks hfiles which are not referenced, but not both can be running.
10800 * [HBASE-21452](https://issues.apache.org/jira/browse/HBASE-21452) | *Major* | **Illegal character in hbase counters group name**
10802 Changes group name of hbase metrics from "HBase Counters" to "HBaseCounters".
10807 * [HBASE-21443](https://issues.apache.org/jira/browse/HBASE-21443) | *Major* | **[hbase-connectors] Purge hbase-\* modules from core now they've been moved to hbase-connectors**
10809 Parent issue moved hbase-spark\* modules to hbase-connectors. This issue removes hbase-spark\* modules from hbase core repo.
10814 * [HBASE-21430](https://issues.apache.org/jira/browse/HBASE-21430) | *Major* | **[hbase-connectors] Move hbase-spark\* modules to hbase-connectors repo**
10816 hbase-spark\* modules have been cloned to https://github.com/apache/hbase-connectors All spark connector dev is to happen in that repo from here on out.
10818 Let me file a subtask to remove hbase-spark\* modules from hbase core.
10823 * [HBASE-21417](https://issues.apache.org/jira/browse/HBASE-21417) | *Critical* | **Pre commit build is broken due to surefire plugin crashes**
10825 Add -Djdk.net.URLClassPath.disableClassPathURLCheck=true when executing surefire plugin.
10830 * [HBASE-21191](https://issues.apache.org/jira/browse/HBASE-21191) | *Major* | **Add a holding-pattern if no assign for meta or namespace (Can happen if masterprocwals have been cleared).**
10832 Puts master startup into holding pattern if meta is not assigned (previous it would exit). To make progress again, operator needs to inject an assign (Caveats and instruction can be found in HBASE-21035).
10837 * [HBASE-21322](https://issues.apache.org/jira/browse/HBASE-21322) | *Critical* | **Add a scheduleServerCrashProcedure() API to HbckService**
10839 Adds scheduleServerCrashProcedure to the HbckService.
10844 * [HBASE-21325](https://issues.apache.org/jira/browse/HBASE-21325) | *Major* | **Force to terminate regionserver when abort hang in somewhere**
10846 Add two new config hbase.regionserver.abort.timeout and hbase.regionserver.abort.timeout.task. If regionserver abort timeout, it will schedule an abort timeout task to run. The default abort task is SystemExitWhenAbortTimeout, which will force to terminate region server when abort timeout. And you can config a special abort timeout task by hbase.regionserver.abort.timeout.task.
10851 * [HBASE-21215](https://issues.apache.org/jira/browse/HBASE-21215) | *Major* | **Figure how to invoke hbck2; make it easy to find**
10853 Adds to bin/hbase means of invoking hbck2. Pass the new '-j' option on the 'hbck' command with a value of the full path to the HBCK2.jar.
10855 E.g:
10857 $ ./bin/hbase hbck -j ~/checkouts/hbase-operator-tools/hbase-hbck2/target/hbase-hbck2-1.0.0-SNAPSHOT.jar  setTableState x ENABLED
10862 * [HBASE-21372](https://issues.apache.org/jira/browse/HBASE-21372) | *Major* | **Set hbase.assignment.maximum.attempts to Long.MAX**
10864 Retry assigns 'forever' (or until an intervention such as a ServerCrashProcedure).
10866 Previous retry was a maximum of ten times but on failure, handling was an indeterminate.
10871 * [HBASE-21338](https://issues.apache.org/jira/browse/HBASE-21338) | *Major* | **[balancer] If balancer is an ill-fit for cluster size, it gives little indication**
10873 The description claims the balancer not dynamically configurable but this is an error; it is http://hbase.apache.org/book.html#dyn\_config
10875 Also, if balancer is seen to be cutting out too soon, try setting "hbase.master.balancer.stochastic.runMaxSteps" to true.
10877 Adds cleaner logging around balancer start.
10882 * [HBASE-21073](https://issues.apache.org/jira/browse/HBASE-21073) | *Major* | **"Maintenance mode" master**
10884     Instead of being an ephemeral state set by hbck, maintenance mode is now
10885     an explicit toggle set by either configuration property or environment
10886     variable. In maintenance mode, master will host system tables and not
10887     assign any user-space tables to RSs. This gives operators the ability to
10888     affect repairs to meta table with fewer moving parts.
10893 * [HBASE-21335](https://issues.apache.org/jira/browse/HBASE-21335) | *Critical* | **Change the default wait time of HBCK2 tool**
10895 Changed waitTime parameter to lockWait on bypass. Changed default waitTime from 0 -- i.e. wait for ever -- to 1ms so if lock is held, we'll go past it and if override enforce bypass.
10900 * [HBASE-21291](https://issues.apache.org/jira/browse/HBASE-21291) | *Major* | **Add a test for bypassing stuck state-machine procedures**
10902 bypass will now throw an Exception if passed a lockWait \<= 0; i.e bypass will prevent an operator getting stuck on an entity lock waiting forever (lockWait == 0)
10907 * [HBASE-21320](https://issues.apache.org/jira/browse/HBASE-21320) | *Major* | **[canary] Cleanup of usage and add commentary**
10909 Cleans up usage and docs around Canary.  Does not change command-line args (though we should -- smile).
10914 * [HBASE-21278](https://issues.apache.org/jira/browse/HBASE-21278) | *Critical* | **Do not rollback successful sub procedures when rolling back a procedure**
10916 For the sub procedures which are successfully finished, do not do rollback. This is a change in rollback behavior.
10918 State changes which are done by sub procedures should be handled by parent procedures when rolling back. For example, when rolling back a MergeTableProcedure, we will schedule new procedures to bring the offline regions online instead of rolling back the original procedures which off-lined the regions (in fact these procedures can not be rolled back...).
10923 * [HBASE-21158](https://issues.apache.org/jira/browse/HBASE-21158) | *Critical* | **Empty qualifier cell should not be returned if it does not match QualifierFilter**
10925 <!-- markdown -->
10927 Scans that make use of `QualifierFilter` previously would erroneously return both columns with an empty qualifier along with those that matched. After this change that behavior has changed to only return those columns that match.
10932 * [HBASE-21098](https://issues.apache.org/jira/browse/HBASE-21098) | *Major* | **Improve Snapshot Performance with Temporary Snapshot Directory when rootDir on S3**
10934 It is recommended to place the working directory on-cluster on HDFS as doing so has shown a strong performance increase due to data locality. It is important to note that the working directory should not overlap with any existing directories as the working directory will be cleaned out during the snapshot process. Beyond that, any well-named directory on HDFS should be sufficient.
10939 * [HBASE-21185](https://issues.apache.org/jira/browse/HBASE-21185) | *Minor* | **WALPrettyPrinter: Additional useful info to be printed by wal printer tool, for debugability purposes**
10941 This adds two extra features to WALPrettyPrinter tool:
10943 1) Output for each cell combined size of cell descriptors, plus the cell value itself, in a given WAL edit. This is printed on the results as "cell total size sum:" info by default;
10945 2) An optional -g/--goto argument, that allows to seek straight to that specific WAL file position, then sequentially reading the WAL from that point towards its end;
10950 * [HBASE-21287](https://issues.apache.org/jira/browse/HBASE-21287) | *Major* | **JVMClusterUtil Master initialization wait time not configurable**
10952 Local HBase cluster (as used by unit tests) wait times on startup and initialization can be configured via \`hbase.master.start.timeout.localHBaseCluster\` and \`hbase.master.init.timeout.localHBaseCluster\`
10957 * [HBASE-21280](https://issues.apache.org/jira/browse/HBASE-21280) | *Trivial* | **Add anchors for each heading in UI**
10959 Adds anchors #tables, #tasks, etc.
10964 * [HBASE-21232](https://issues.apache.org/jira/browse/HBASE-21232) | *Major* | **Show table state in Tables view on Master home page**
10966 Add table state column to the tables panel
10971 * [HBASE-21223](https://issues.apache.org/jira/browse/HBASE-21223) | *Critical* | **[amv2] Remove abort\_procedure from shell**
10973 Removed the abort\_procedure command from shell -- dangerous -- and deprecated abortProcedure in Admin API.
10978 * [HBASE-20636](https://issues.apache.org/jira/browse/HBASE-20636) | *Major* | **Introduce two bloom filter type : ROWPREFIX\_FIXED\_LENGTH and ROWPREFIX\_DELIMITED**
10980 Add two bloom filter type : ROWPREFIX\_FIXED\_LENGTH and ROWPREFIX\_DELIMITED
10981 1. ROWPREFIX\_FIXED\_LENGTH: specify the length of the prefix
10982 2. ROWPREFIX\_DELIMITED: specify the delimiter of the prefix
10983 Need to specify parameters for these two types of bloomfilter, otherwise the table will fail to create
10984 Example:
10985 create 't1', {NAME =\> 'f1', BLOOMFILTER =\> 'ROWPREFIX\_FIXED\_LENGTH', CONFIGURATION =\> {'RowPrefixBloomFilter.prefix\_length' =\> '10'}}
10986 create 't1', {NAME =\> 'f1', BLOOMFILTER =\> 'ROWPREFIX\_DELIMITED', CONFIGURATION =\> {'RowPrefixDelimitedBloomFilter.delimiter' =\> '#'}}
10991 * [HBASE-21156](https://issues.apache.org/jira/browse/HBASE-21156) | *Critical* | **[hbck2] Queue an assign of hbase:meta and bulk assign/unassign**
10993 Adds 'raw' assigns/unassigns to the Hbck Service. Takes a list of encoded region names and bulk assigns/unassigns. Skirts Master 'state' check and does not invoke Coprocessors. For repair only.
10995 Here is what HBCK2 usage looks like now:
10997 {code}
10998 $ java -cp hbase-hbck2-1.0.0-SNAPSHOT.jar  org.apache.hbase.HBCK2
10999 usage: HBCK2 \<OPTIONS\> COMMAND [\<ARGS\>]
11001 Options:
11002  -d,--debug                      run with debug output
11003  -h,--help                       output this help message
11004     --hbase.zookeeper.peerport   peerport of target hbase ensemble
11005     --hbase.zookeeper.quorum     ensemble of target hbase
11006     --zookeeper.znode.parent     parent znode of target hbase
11008 Commands:
11009  setTableState \<TABLENAME\> \<STATE\>
11010    Possible table states: ENABLED, DISABLED, DISABLING, ENABLING
11011    To read current table state, in the hbase shell run:
11012      hbase\> get 'hbase:meta', '\<TABLENAME\>', 'table:state'
11013    A value of \\x08\\x00 == ENABLED, \\x08\\x01 == DISABLED, etc.
11014    An example making table name 'user' ENABLED:
11015      $ HBCK2 setTableState users ENABLED
11016    Returns whatever the previous table state was.
11018  assign \<ENCODED\_REGIONNAME\> ...
11019    A 'raw' assign that can be used even during Master initialization.
11020    Skirts Coprocessors. Pass one or more encoded RegionNames:
11021    e.g. 1588230740 is hard-coded encoding for hbase:meta region and
11022    de00010733901a05f5a2a3a382e27dd4 is an example of what a random
11023    user-space encoded Region name looks like. For example:
11024      $ HBCK2 assign 1588230740 de00010733901a05f5a2a3a382e27dd4
11025    Returns the pid of the created AssignProcedure or -1 if none.
11027  unassign \<ENCODED\_REGIONNAME\> ...
11028    A 'raw' unassign that can be used even during Master initialization.
11029    Skirts Coprocessors. Pass one or more encoded RegionNames:
11030    Skirts Coprocessors. Pass one or more encoded RegionNames:
11031    de00010733901a05f5a2a3a382e27dd4 is an example of what a random
11032    user-space encoded Region name looks like. For example:
11033      $ HBCK2 unassign 1588230740 de00010733901a05f5a2a3a382e27dd4
11034    Returns the pid of the created UnassignProcedure or -1 if none.
11035 {code}
11040 * [HBASE-21021](https://issues.apache.org/jira/browse/HBASE-21021) | *Major* | **Result returned by Append operation should be ordered**
11042 This change ensures Append operations are assembled into the expected order.
11047 * [HBASE-21171](https://issues.apache.org/jira/browse/HBASE-21171) | *Major* | **[amv2] Tool to parse a directory of MasterProcWALs standalone**
11049 Make it so can run the WAL parse and load system in isolation. Here is an example:
11051 {code}$ HBASE\_OPTS=" -XX:+UnlockDiagnosticVMOptions -XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:+DebugNonSafepoints" ./bin/hbase org.apache.hadoop.hbase.procedure2.store.wal.WALProcedureStore ~/big\_set\_of\_masterprocwals/
11052 {code}
11057 * [HBASE-21107](https://issues.apache.org/jira/browse/HBASE-21107) | *Minor* | **add a metrics for netty direct memory**
11059 Add a new nettyDirectMemoryUsage under server's ipc metrics to show direct memory usage for netty rpc server.
11064 * [HBASE-21153](https://issues.apache.org/jira/browse/HBASE-21153) | *Major* | **Shaded client jars should always build in relevant phase to avoid confusion**
11066 Client facing artifacts are now built whenever Maven is run through the "package" goal. Previously, the client facing artifacts would create placeholder jars that skipped repackaging HBase and third-party dependencies unless the "release" profile was active.
11068 Build times may be noticeably longer depending on your build hardware. For example, the Jenkins worker nodes maintained by ASF Infra take ~14% longer to do a full packaging build. An example portability-focused personal laptop took ~25% longer.
11073 * [HBASE-20942](https://issues.apache.org/jira/browse/HBASE-20942) | *Major* | **Improve RpcServer TRACE logging**
11075 Allows configuration of the length of RPC messages printed to the log at TRACE level via "hbase.ipc.trace.param.size" in RpcServer.
11080 * [HBASE-20649](https://issues.apache.org/jira/browse/HBASE-20649) | *Minor* | **Validate HFiles do not have PREFIX\_TREE DataBlockEncoding**
11082 <!-- markdown -->
11083 Users who have previously made use of prefix tree encoding can now check that their existing HFiles no longer contain data that uses it with an additional preupgrade check command.
11086 hbase pre-upgrade validate-hfile
11089 Please see the "HFile Content validation" section of the ref guide's coverage of the pre-upgrade validator tool for usage details.
11094 * [HBASE-20941](https://issues.apache.org/jira/browse/HBASE-20941) | *Major* | **Create and implement HbckService in master**
11096 Adds an HBCK Service and a first method to force-change-in-table-state for use by an HBCK client effecting 'repair' to a malfunctioning HBase.
11101 * [HBASE-21071](https://issues.apache.org/jira/browse/HBASE-21071) | *Major* | **HBaseTestingUtility::startMiniCluster() to use builder pattern**
11103 Cleanup all the cluster start override combos in HBaseTestingUtility by adding a StartMiniClusterOption and Builder.
11108 * [HBASE-21072](https://issues.apache.org/jira/browse/HBASE-21072) | *Major* | **Block out HBCK1 in hbase2**
11110 Fence out hbase-1.x hbck1 instances. Stop them making state changes on an hbase-2.x cluster; they could do damage. We do this by writing the hbck1 lock file into place on hbase-2.x Master start-up.
11112 To disable this new behavior, set hbase.write.hbck1.lock.file to false
11117 * [HBASE-20881](https://issues.apache.org/jira/browse/HBASE-20881) | *Major* | **Introduce a region transition procedure to handle all the state transition for a region**
11119 Introduced a new TransitRegionStateProcedure to replace the old AssignProcedure/UnassignProcedure/MoveRegionProcedure. In the old code, MRP will not be attached to RegionStateNode, so it can not be interrupted by ServerCrashProcedure, which introduces lots of tricky code to deal with races, and also causes lots of other difficulties on how to prevent scheduling redundant or even conflict procedures for a region.
11121 And now TRSP is the only one procedure which can bring region online or offline. When you want to schedule one, you need to check whether there is already one attached to the RegionStateNode, under the lock of the RegionStateNode. If not just go ahead, and if there is one, then you should do something, for example, give up and fail directly, or tell the TRSP to give up(This is what SCP does). Since the check and attach are both under the lock of RSN, it will greatly reduce the possible races, and make the code much simpler.
11126 * [HBASE-21012](https://issues.apache.org/jira/browse/HBASE-21012) | *Critical* | **Revert the change of serializing TimeRangeTracker**
11128 HFiles generated by 2.0.0, 2.0.1, 2.1.0 are not forward compatible to 1.4.6-, 1.3.2.1-, 1.2.6.1-, and other inactive releases. Why HFile lose compatability is hbase in new versions (2.0.0, 2.0.1, 2.1.0) use protobuf to serialize/deserialize TimeRangeTracker (TRT) while old versions use DataInput/DataOutput. To solve this, We have to put HBASE-21012 to 2.x and put HBASE-21013 in 1.x. For more information, please check HBASE-21008.
11133 * [HBASE-20965](https://issues.apache.org/jira/browse/HBASE-20965) | *Major* | **Separate region server report requests to new handlers**
11135 After HBASE-20965, we can use MasterFifoRpcScheduler in master to separate RegionServerReport requests to indenpedent handler. To use this feature, please set "hbase.master.rpc.scheduler.factory.class" to
11136  "org.apache.hadoop.hbase.ipc.MasterFifoRpcScheduler". Use "hbase.master.server.report.handler.count" to set RegionServerReport handlers count, the default value is half of "hbase.regionserver.handler.count" value, but at least 1, and the other handlers count in master is "hbase.regionserver.handler.count" value minus RegionServerReport handlers count, but at least 1 too.
11141 * [HBASE-20813](https://issues.apache.org/jira/browse/HBASE-20813) | *Minor* | **Remove RPC quotas when the associated table/Namespace is dropped off**
11143 In previous releases, when a Space Quota was configured on a table or namespace and that table or namespace was deleted, the Space Quota was also deleted. This change improves the implementation so that the same is also done for RPC Quotas.
11148 * [HBASE-20986](https://issues.apache.org/jira/browse/HBASE-20986) | *Major* | **Separate the config of block size when we do log splitting and write Hlog**
11150 After HBASE-20986, we can set different value to block size of WAL and recovered edits. Both of their default value is 2 \* default HDFS blocksize. And hbase.regionserver.recoverededits.blocksize is for block size of recovered edits while hbase.regionserver.hlog.blocksize is for block size of WAL.
11155 * [HBASE-20856](https://issues.apache.org/jira/browse/HBASE-20856) | *Minor* | **PITA having to set WAL provider in two places**
11157 With this change if a WAL's meta provider (hbase.wal.meta\_provider) is not explicitly set, it now defaults to whatever hbase.wal.provider is set to. Previous, the two settings operated independently, each with its own default.
11159 This change is operationally incompatible with previous HBase versions because the default WAL meta provider no longer defaults to AsyncFSWALProvider but to hbase.wal.provider.
11161 The thought is that this is more in line with an operator's expectation, that a change in hbase.wal.provider is sufficient to change how WALs are written, especially given hbase.wal.meta\_provider is an obscure configuration and that the very idea that meta regions would have their own wal provider would likely come as a surprise.
11166 * [HBASE-20538](https://issues.apache.org/jira/browse/HBASE-20538) | *Critical* | **Upgrade our hadoop versions to 2.7.7 and 3.0.3**
11168 Update hadoop-two.version to 2.7.7 and hadoop-three.version to 3.0.3 due to a JDK issue which is solved by HADOOP-15473.
11173 * [HBASE-20846](https://issues.apache.org/jira/browse/HBASE-20846) | *Major* | **Restore procedure locks when master restarts**
11175 1. Make hasLock method final, and add a locked field in Procedure to record whether we have the lock. We will set it to true in doAcquireLock and to false in doReleaseLock. The sub procedures do not need to manage it any more.
11177 2. Also added a locked field in the proto message. When storing, the field will be set according to the return value of hasLock. And when loading, there is a new field in Procedure called lockedWhenLoading. We will set it to true if the locked field in proto message is true.
11179 3. The reason why we can not set the locked field directly to true by calling doAcquireLock is that, during initialization, most procedures need to wait until master is initialized. So the solution here is that, we introduced a new method called waitInitialized in Procedure, and move the wait master initialized related code from acquireLock to this method. And we added a restoreLock method to Procedure, if lockedWhenLoading is true, we will call the acquireLock to get the lock, but do not set locked to true. And later when we call doAcquireLock and pass the waitInitialized check, we will test lockedWhenLoading, if it is true, when we just set the locked field to true and return, without actually calling the acquireLock method since we have already called it once.
11184 * [HBASE-20672](https://issues.apache.org/jira/browse/HBASE-20672) | *Minor* | **New metrics ReadRequestRate and WriteRequestRate**
11186 Exposing 2 new metrics in HBase to provide ReadRequestRate and WriteRequestRate at region server level. These metrics give the rate of request handled by the region server and are reset after every monitoring interval.
11191 * [HBASE-6028](https://issues.apache.org/jira/browse/HBASE-6028) | *Minor* | **Implement a cancel for in-progress compactions**
11193 Added a new command to the shell to switch on/off compactions called "compaction\_switch". Disabling compactions will interrupt any currently ongoing compactions. This setting will be lost on restart of the server. Added the configuration hbase.regionserver.compaction.enabled so user can enable/disable compactions via hbase-site.xml.
11198 * [HBASE-20884](https://issues.apache.org/jira/browse/HBASE-20884) | *Major* | **Replace usage of our Base64 implementation with java.util.Base64**
11200 Class org.apache.hadoop.hbase.util.Base64 has been removed in it's entirety from HBase 2+. In HBase 1, unused methods have been removed from the class and the audience was changed from  Public to Private. This class was originally intended as an internal utility class that could be used externally but thinking since changed; these classes should not have been advertised as public to end-users.
11202 This represents an incompatible change for users who relied on this implementation. An alternative implementation for affected clients is available at java.util.Base64 when using Java 8 or newer; be aware, it may encode/decode differently. For clients seeking to restore this specific implementation, it is available in the public domain for download at http://iharder.sourceforge.net/current/java/base64/
11207 * [HBASE-20357](https://issues.apache.org/jira/browse/HBASE-20357) | *Major* | **AccessControlClient API Enhancement**
11209 This enhances the AccessControlClient APIs to retrieve the permissions based on namespace, table name, family and qualifier for specific user. AccessControlClient can also validate a user whether allowed to perform specified operations on a particular table.
11210 Following APIs have been added,
11211 1) getUserPermissions(Connection connection, String tableRegex, byte[] columnFamily, byte[] columnQualifier, String userName) 
11212          Scope of retrieving permission will be same as existing.
11213 2) hasPermission(onnection connection, String tableName, byte[] columnFamily, byte[] columnQualifier, String userName, Permission.Action... actions)
11214      Scope of validating user privilege,
11215            User can perform self check without any special privilege but ADMIN privilege will be required to perform check for other users.
11216            For example, suppose there are two users "userA" & "userB" then there can be below scenarios,
11217             a. When userA want to check whether userA have privilege to perform mentioned actions
11218                  userA don't need ADMIN privilege, as it's a self query.
11219             b. When userA want to check whether userB have privilege to perform mentioned actions,
11220                  userA must have ADMIN or superuser privilege, as it's trying to query for other user.
11224 # HBASE  2.1.0 Release Notes
11226 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
11231 * [HBASE-20691](https://issues.apache.org/jira/browse/HBASE-20691) | *Blocker* | **Storage policy should allow deferring to HDFS**
11233 After HBASE-20691 we have changed the default setting of hbase.wal.storage.policy from "HOT" back to "NONE" which means we defer the policy to HDFS. This fixes the problem of release 2.0.0 that the storage policy of WAL directory will defer to HDFS and may not be "HOT" even if you explicitly set hbase.wal.storage.policy to "HOT"
11238 * [HBASE-20839](https://issues.apache.org/jira/browse/HBASE-20839) | *Blocker* | **Fallback to FSHLog if we can not instantiated AsyncFSWAL when user does not specify AsyncFSWAL explicitly**
11240 As we hack into the internal of DFSClient when implementing AsyncFSWAL to get better performance, a patch release of hadoop can make it broken.
11242 So now, if user does not specify a wal provider, then we will first try to use 'asyncfs', i.e, the AsyncFSWALProvider. If we fail due to some compatible issues, we will fallback to 'filesystem', i.e, FSHLog.
11247 * [HBASE-20193](https://issues.apache.org/jira/browse/HBASE-20193) | *Critical* | **Basic Replication Web UI - Regionserver**
11249 After HBASE-20193, we add a section to web ui to show the replication status of each wal group. There are 2 parts of this section, they both show the peerId, wal group and current replicating log of each replication source. And one is showing the information of replication log queue, i.e. size of current log, log queue size and replicating offset. The other one is showing the delay of replication, i.e. last shipped age and replication delay.
11250 If the offset shows -1 and replication delay is UNKNOWN, that means replication is not started. This may be caused by this peer is disabled or the replicationEndpoint is sleeping due to some reason.
11255 * [HBASE-19997](https://issues.apache.org/jira/browse/HBASE-19997) | *Blocker* | **[rolling upgrade] 1.x =\> 2.x**
11257 Now we have a 'basically work' solution for rolling upgrade from 1.4.x to 2.x. Please see the "Rolling Upgrade from 1.x to 2.x" section in ref guide for more details.
11262 * [HBASE-20270](https://issues.apache.org/jira/browse/HBASE-20270) | *Major* | **Turn off command help that follows all errors in shell**
11264 <!-- markdown -->
11265 The command help that followed all errors, before, is now no longer available. Erroneous command inputs would now just show error-texts followed by the shell command to try for seeing the help message. It looks like: For usage try 'help “create”’. Operators can copy-paste the command to get the help message.
11270 * [HBASE-20194](https://issues.apache.org/jira/browse/HBASE-20194) | *Critical* | **Basic Replication WebUI - Master**
11272 After HBASE-20194, we added 2 parts to master's web page.
11273 One is Peers that shows all replication peers and some of their configurations, like peer id, cluster key, state, bandwidth, and which namespace or table it will replicate.
11274 The other one is replication status of all regionservers, we added a tab to region servers division, then we can check the replication delay of all region servers for any peer. This table shows AgeOfLastShippedOp, SizeOfLogQueue and ReplicationLag for each regionserver and the table is sort by ReplicationLag in descending order. By this way we can easily find the problematic region server. If the replication delay is UNKNOWN, that means this walGroup doesn't start replicate yet and it may get disabled. ReplicationLag will update once this peer start replicate.
11279 * [HBASE-18569](https://issues.apache.org/jira/browse/HBASE-18569) | *Major* | **Add prefetch support for async region locator**
11281 Add prefetch support for async region locator. The default value is 10. Set 'hbase.client.locate.prefetch.limit' in hbase-site.xml if you want to use another value for it.
11286 * [HBASE-20642](https://issues.apache.org/jira/browse/HBASE-20642) | *Major* | **IntegrationTestDDLMasterFailover throws 'InvalidFamilyOperationException**
11288 This changes client-side nonce generation to use the same nonce for re-submissions of client RPC DDL operations.
11293 * [HBASE-20708](https://issues.apache.org/jira/browse/HBASE-20708) | *Blocker* | **Remove the usage of RecoverMetaProcedure in master startup**
11295 Introduce an InitMetaProcedure to initialize meta table for a new HBase deploy. Marked RecoverMetaProcedure deprecated and remove the usage of it in the current code base. We still need to keep it in place for compatibility. The code in RecoverMetaProcedure has been moved to ServerCrashProcedure, and SCP will always be enabled and we will rely on it to bring meta region online.
11297 For more on the issue addressed by this commit, see the design doc for overview and plan: https://docs.google.com/document/d/1\_872oHzrhJq4ck7f6zmp1J--zMhsIFvXSZyX1Mxg5MA/edit#heading=h.xy1z4alsq7uy
11302 * [HBASE-20334](https://issues.apache.org/jira/browse/HBASE-20334) | *Major* | **add a test that expressly uses both our shaded client and the one from hadoop 3**
11304 <!-- markdown -->
11306 HBase now includes a helper script that can be used to run a basic functionality test for a given HBase installation at in `dev_support`. The test can optionally be given an HBase client artifact to rely on and can optionally be given specific Hadoop client artifacts to use.
11308 For usage information see `./dev-support/hbase_nightly_pseudo-distributed-test.sh --help`.
11310 The project nightly tests now make use of this test to check running on top of Hadoop 2, Hadoop 3, and Hadoop 3 with shaded client artifacts.
11315 * [HBASE-19735](https://issues.apache.org/jira/browse/HBASE-19735) | *Major* | **Create a minimal "client" tarball installation**
11317 <!-- markdown -->
11319 The HBase convenience binary artifacts now includes a client focused tarball that a) includes more docs and b) does not include scripts or jars only needed for running HBase cluster services.
11321 The new artifact is made as a normal part of the `assembly:single` maven command.
11326 * [HBASE-20615](https://issues.apache.org/jira/browse/HBASE-20615) | *Major* | **emphasize use of shaded client jars when they're present in an install**
11328 <!-- markdown -->
11330 HBase's built in scripts now rely on the downstream facing shaded artifacts where possible. In particular interest to downstream users, the `hbase classpath` and `hbase mapredcp` commands now return the relevant shaded client artifact and only those third paty jars needed to make use of them (e.g. slf4j-api, commons-logging, htrace, etc).
11332 Downstream users should note that by default the `hbase classpath` command will treat having `hadoop` on the shell's PATH as an implicit request to include the output of the `hadoop classpath` command in the returned classpath. This long-existing behavior can be opted out of by setting the environment variable `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP` to the value "true". For example: `HBASE_DISABLE_HADOOP_CLASSPATH_LOOKUP="true" bin/hbase classpath`.
11337 * [HBASE-20333](https://issues.apache.org/jira/browse/HBASE-20333) | *Critical* | **break up shaded client into one with no Hadoop and one that's standalone**
11339 <!-- markdown -->
11341 Downstream users who need to use both HBase and Hadoop APIs should switch to relying on the new `hbase-shaded-client-byo-hadoop` artifact rather than the existing `hbase-shaded-client` artifact. The new artifact no longer includes and Hadoop classes.
11343 It should work in combination with either the output of `hadoop classpath` or the Hadoop provided client-facing shaded artifacts in Hadoop 3+.
11348 * [HBASE-20332](https://issues.apache.org/jira/browse/HBASE-20332) | *Critical* | **shaded mapreduce module shouldn't include hadoop**
11350 <!-- markdown -->
11352 The `hbase-shaded-mapreduce` artifact no longer include its own copy of Hadoop classes. Users who make use of the artifact via YARN should be able to get these classes from YARN's classpath without having to make any changes.
11357 * [HBASE-20681](https://issues.apache.org/jira/browse/HBASE-20681) | *Major* | **IntegrationTestDriver fails after HADOOP-15406 due to missing hamcrest-core**
11359 <!-- markdown -->
11361 Users of our integration tests on Hadoop 3 can now add all needed dependencies by pointing at jars included in our binary convenience artifact.
11363 Prior to this fix, downstream users on Hadoop 3 would need to get a copy of the Hamcrest v1.3 jar from elsewhere.
11368 * [HBASE-19852](https://issues.apache.org/jira/browse/HBASE-19852) | *Major* | **HBase Thrift 1 server SPNEGO Improvements**
11370 Adds two new properties for hbase-site.xml for THRIFT SPNEGO when in HTTP mode:
11371 \* hbase.thrift.spnego.keytab.file
11372 \* hbase.thrift.spnego.principal
11377 * [HBASE-20590](https://issues.apache.org/jira/browse/HBASE-20590) | *Critical* | **REST Java client is not able to negotiate with the server in the secure mode**
11379 Adds a negotiation logic between a secure java REST client and server. After this jira the Java REST client will start responding to the Negotiate challenge sent by the server. Adds RESTDemoClient which can be used to verify whether the secure Java REST client works against secure REST server or not.
11384 * [HBASE-20634](https://issues.apache.org/jira/browse/HBASE-20634) | *Critical* | **Reopen region while server crash can cause the procedure to be stuck**
11386 A second attempt at fixing HBASE-20173. Fixes unfinished keeping of server state inside AM (ONLINE=\>SPLITTING=\>OFFLINE=\>null). Concurrent unassigns look at server state to figure if they should wait on SCP to wake them up or not.
11391 * [HBASE-20579](https://issues.apache.org/jira/browse/HBASE-20579) | *Minor* | **Improve snapshot manifest copy in ExportSnapshot**
11393 This patch adds an FSUtil.copyFilesParallel() to help copy files in parallel, and it will return all the paths of directories and files traversed. Thus when we copy manifest in ExportSnapshot, we can copy reference files concurrently and use the paths it returns to help setOwner and setPermission.
11394 The size of thread pool is determined by the configuration snapshot.export.copy.references.threads, and its default value is the number of runtime available processors.
11399 * [HBASE-18116](https://issues.apache.org/jira/browse/HBASE-18116) | *Major* | **Replication source in-memory accounting should not include bulk transfer hfiles**
11401 Before this change we would incorrectly include the size of enqueued store files for bulk replication in the calculation for determining whether or not to rate limit the transfer of WAL edits. Because bulk replication uses a separate and asynchronous mechanism for file transfer this could incorrectly limit the batch sizes for WAL replication if bulk replication in progress, with negative impact on latency and throughput.
11406 * [HBASE-20592](https://issues.apache.org/jira/browse/HBASE-20592) | *Minor* | **Create a tool to verify tables do not have prefix tree encoding**
11408 PreUpgradeValidator tool with DataBlockEncoding validator was added to verify cluster is upgradable to HBase 2.
11413 * [HBASE-20501](https://issues.apache.org/jira/browse/HBASE-20501) | *Blocker* | **Change the Hadoop minimum version to 2.7.1**
11415 <!-- markdown -->
11416 HBase is no longer able to maintain compatibility with Apache Hadoop versions that are no longer receiving updates. This release raises the minimum supported version to Hadoop 2.7.1. Downstream users are strongly advised to upgrade to the latest Hadoop 2.7 maintenance release.
11418 Downstream users of earlier HBase versions are similarly advised to upgrade to Hadoop 2.7.1+. When doing so, it is especially important to follow the guidance from [the HBase Reference Guide's Hadoop section](http://hbase.apache.org/book.html#hadoop) on replacing the Hadoop artifacts bundled with HBase.
11423 * [HBASE-20601](https://issues.apache.org/jira/browse/HBASE-20601) | *Minor* | **Add multiPut support and other miscellaneous to PE**
11425 1. Add multiPut support
11426 Set --multiPut=number to enable batchput(meanwhile, --autoflush need be set to false)
11428 2. Add Connection Count support
11429 Added a new parameter connCount to PE. set --connCount=2 means all threads will share 2 connections.
11430 oneCon option and connCount option shouldn't be set at the same time.
11432 3. Add avg RT and avg TPS/QPS statstic for all threads
11434 4. Delete some redundant code
11435 Now RandomWriteTest is inherited from SequentialWrite.
11440 * [HBASE-20544](https://issues.apache.org/jira/browse/HBASE-20544) | *Blocker* | **downstream HBaseTestingUtility fails with invalid port**
11442 <!-- markdown -->
11444 HBase now relies on an internal mechanism to determine when it is running a local hbase cluster meant for external interaction vs an encapsulated test. When created via the `HBaseTestingUtility`, ports for Master and RegionServer services and UIs will be set to random ports to allow for multiple parallel uses on a single machine. Normally when running a Standalone HBase Deployment (as described in the HBase Reference Guide) the ports will be picked according to the same defaults used in a full cluster set up. If you wish to instead use the random port assignment set `hbase.localcluster.assign.random.ports` to true.
11449 * [HBASE-20004](https://issues.apache.org/jira/browse/HBASE-20004) | *Minor* | **Client is not able to execute REST queries in a secure cluster**
11451 Added 'hbase.rest.http.allow.options.method' configuration property to allow user to decide whether Rest Server HTTP should allow OPTIONS method or not. By default it is enabled in HBase 2.1.0+ versions and in other versions it is disabled.
11452 Similarly 'hbase.thrift.http.allow.options.method' is added HBase 1.5, 2.1.0 and 3.0.0 versions. It is disabled by default.
11457 * [HBASE-20327](https://issues.apache.org/jira/browse/HBASE-20327) | *Minor* | **When qualifier is not specified, append and incr operation do not work (shell)**
11459 This change will enable users to perform append and increment operation with null qualifier via hbase-shell.
11464 * [HBASE-18842](https://issues.apache.org/jira/browse/HBASE-18842) | *Minor* | **The hbase shell clone\_snaphost command returns bad error message**
11466 <!-- markdown -->
11468 When attempting to clone a snapshot but using a namespace that does not exist, the HBase shell will now correctly report the exception as caused by the passed namespace. Previously, the shell would report that the problem was an unknown namespace but it would claim the user provided table name was not found as a namespace. Both before and after this change the shell properly used the passed namespace to attempt to handle the request.
11473 * [HBASE-20406](https://issues.apache.org/jira/browse/HBASE-20406) | *Major* | **HBase Thrift HTTP - Shouldn't handle TRACE/OPTIONS methods**
11475 <!-- markdown -->
11476 When configured to do thrift-over-http, the HBase Thrift API Server no longer accepts the HTTP methods TRACE nor OPTIONS.
11481 * [HBASE-20046](https://issues.apache.org/jira/browse/HBASE-20046) | *Major* | **Reconsider the implementation for serial replication**
11483 Now in replication we can make sure the order of pushing logs is same as the order of requests from client. Set the serial flag to true for a replication peer to enable this feature.
11488 * [HBASE-20159](https://issues.apache.org/jira/browse/HBASE-20159) | *Major* | **Support using separate ZK quorums for client**
11490 After HBASE-20159 we allow client to use different ZK quorums by introducing three new properties: hbase.client.zookeeper.quorum and hbase.client.zookeeper.property.clientPort to specify client zookeeper properties (note that the combination of these two properties should be different from the server ZK quorums), and hbase.client.zookeeper.observer.mode to indicate whether the client ZK nodes are in observer mode (false by default)
11492 HConstants.DEFAULT\_ZOOKEPER\_CLIENT\_PORT has been removed in HBase 3.0 and replaced by the correctly spelled DEFAULT\_ZOOKEEPER\_CLIENT\_PORT.
11497 * [HBASE-20242](https://issues.apache.org/jira/browse/HBASE-20242) | *Major* | **The open sequence number will grow if we fail to open a region after writing the max sequence id file**
11499 Now when opening a region, we will store the current max sequence id of the region to its max sequence id file instead of the 'next sequence id'. This could avoid the sequence id bumping when we fail to open a region, and also align to the behavior when we close a region.
11504 * [HBASE-19024](https://issues.apache.org/jira/browse/HBASE-19024) | *Critical* | **Configurable default durability for synchronous WAL**
11506 The default durability setting for the synchronous WAL is Durability.SYNC\_WAL, which triggers HDFS hflush() to flush edits to the datanodes. We also support Durability.FSYNC\_WAL, which instead triggers HDFS hsync() to flush \_and\_ fsync edits. This change introduces the new configuration setting "hbase.wal.hsync", defaulting to FALSE, that if set to TRUE changes the default durability setting for the synchronous WAL to  FSYNC\_WAL.
11511 * [HBASE-19389](https://issues.apache.org/jira/browse/HBASE-19389) | *Critical* | **Limit concurrency of put with dense (hundreds) columns to prevent write handler exhausted**
11513 After HBASE-19389 we introduced a RegionServer self-protection mechanism to prevent write handler getting exhausted by high concurrency put with dense columns, mainly through two new properties: hbase.region.store.parallel.put.limit.min.column.count to decide what kind of put (with how many columns within a single column family) to limit (100 by default) and hbase.region.store.parallel.put.limit to limit the concurrency (10 by default). There's another property for advanced user and please check source and javadoc of StoreHotnessProtector for more details.
11518 * [HBASE-20148](https://issues.apache.org/jira/browse/HBASE-20148) | *Major* | **Make serial replication as a option for a peer instead of a table**
11520 A new method setSerial has been added to the interface ReplicationPeerConfigBuilder which is marked as IA.Public. This interface is not supposed to be implemented by client code, but if you do, this will be an incompatible change as you need to add this method to your implementation too.
11525 * [HBASE-19397](https://issues.apache.org/jira/browse/HBASE-19397) | *Major* | **Design  procedures for ReplicationManager to notify peer change event from master**
11527 Introduce 5 procedures to do peer modifications:
11528 AddPeerProcedure
11529 RemovePeerProcedure
11530 UpdatePeerConfigProcedure
11531 EnablePeerProcedure
11532 DisablePeerProcedure
11534 The procedures are all executed with the following stage:
11535 1. Call pre CP hook, if an exception is thrown then give up
11536 2. Check whether the operation is valid, if not then give up
11537 3. Update peer storage. Notice that if we have entered this stage, then we can not rollback any more.
11538 4. Schedule sub procedures to refresh the peer config on every RS.
11539 5. Do post cleanup if any.
11540 6. Call post CP hook. The exception thrown will be ignored since we have already done the work.
11542 The procedure will hold an exclusive lock on the peer id, so now there is no concurrent modifications on a single peer.
11544 And now it is guaranteed that once the procedure is done, the peer modification has already taken effect on all RSes.
11546 Abstracte a storage layer for replication peer/queue manangement, and refactored the upper layer to remove zk related naming/code/comment.
11548 Add pre/postExecuteProcedures CP hooks to RegionServerObserver, and add permission check for executeProcedures method which requires the caller to be system user or super user.
11550 On rolling upgrade: just do not do any replication peer modifications during the rolling upgrading. There is no pb/layout changes on the peer/queue storage on zk.
11551 # HBASE  2.0.0 Release Notes
11554 These release notes cover new developer and user-facing incompatibilities, important issues, features, and major improvements.
11559 * [HBASE-20464](https://issues.apache.org/jira/browse/HBASE-20464) | *Major* | **Disable IMC**
11561 Change the default so that on creation of new tables, In-Memory Compaction BASIC is NOT enabled.
11563 This change is in branch-2.0 only, not in branch-2.
11568 * [HBASE-20276](https://issues.apache.org/jira/browse/HBASE-20276) | *Blocker* | **[shell] Revert shell REPL change and document**
11570 <!-- markdown -->
11574 The HBase shell now behaves as it did prior to the changes that started in HBASE-15965. Namely, some shell commands return values that may be further manipulated within the shell's IRB session.
11576 The command line option `--return-values` is no longer acted on by the shell since it now always behaves as it did when passed this parameter. Passing the option results in a harmless warning about this change.
11578 Users who wish to maintain the behavior seen in the 1.4.0-1.4.2 releases of the HBase shell should refer to the section _irbrc_ in the reference guide for how to configure their IRB session to avoid echoing expression results to the console.
11583 * [HBASE-18792](https://issues.apache.org/jira/browse/HBASE-18792) | *Blocker* | **hbase-2 needs to defend against hbck operations**
11585 As of HBase version 2.0, the hbck tool is significantly changed. In general, all Read-Only options are supported and can be be used safely. Most -fix/ -repair options are NOT supported. Please see usage below for details on which options are not supported:
11588 Usage: fsck [opts] {only tables}
11589  where [opts] are:
11590    -help Display help options (this)
11591    -details Display full report of all regions.
11592    -timelag \<timeInSeconds\>  Process only regions that  have not experienced any metadata updates in the last  \<timeInSeconds\> seconds.
11593    -sleepBeforeRerun \<timeInSeconds\> Sleep this many seconds before checking if the fix worked if run with -fix
11594    -summary Print only summary of the tables and status.
11595    -metaonly Only check the state of the hbase:meta table.
11596    -sidelineDir \<hdfs://\> HDFS path to backup existing meta.
11597    -boundaries Verify that regions boundaries are the same between META and store files.
11598    -exclusive Abort if another hbck is exclusive or fixing.
11600   Datafile Repair options: (expert features, use with caution!)
11601    -checkCorruptHFiles     Check all Hfiles by opening them to make sure they are valid
11602    -sidelineCorruptHFiles  Quarantine corrupted HFiles.  implies -checkCorruptHFiles
11604  Replication options
11605    -fixReplication   Deletes replication queues for removed peers
11607   Metadata Repair options supported as of version 2.0: (expert features, use with caution!)
11608    -fixVersionFile   Try to fix missing hbase.version file in hdfs.
11609    -fixReferenceFiles  Try to offline lingering reference store files
11610    -fixHFileLinks  Try to offline lingering HFileLinks
11611    -noHdfsChecking   Don't load/check region info from HDFS. Assumes hbase:meta region info is good. Won't check/fix any HDFS issue, e.g. hole, orphan, or overlap
11612    -ignorePreCheckPermission  ignore filesystem permission pre-check
11614 NOTE: Following options are NOT supported as of HBase version 2.0+.
11616   UNSUPPORTED Metadata Repair options: (expert features, use with caution!)
11617    -fix              Try to fix region assignments.  This is for backwards compatiblity
11618    -fixAssignments   Try to fix region assignments.  Replaces the old -fix
11619    -fixMeta          Try to fix meta problems.  This assumes HDFS region info is good.
11620    -fixHdfsHoles     Try to fix region holes in hdfs.
11621    -fixHdfsOrphans   Try to fix region dirs with no .regioninfo file in hdfs
11622    -fixTableOrphans  Try to fix table dirs with no .tableinfo file in hdfs (online mode only)
11623    -fixHdfsOverlaps  Try to fix region overlaps in hdfs.
11624    -maxMerge \<n\>     When fixing region overlaps, allow at most \<n\> regions to merge. (n=5 by default)
11625    -sidelineBigOverlaps  When fixing region overlaps, allow to sideline big overlaps
11626    -maxOverlapsToSideline \<n\>  When fixing region overlaps, allow at most \<n\> regions to sideline per group. (n=2 by default)
11627    -fixSplitParents  Try to force offline split parents to be online.
11628    -removeParents    Try to offline and sideline lingering parents and keep daughter regions.
11629    -fixEmptyMetaCells  Try to fix hbase:meta entries not referencing any region (empty REGIONINFO\_QUALIFIER rows)
11631   UNSUPPORTED Metadata Repair shortcuts
11632    -repair           Shortcut for -fixAssignments -fixMeta -fixHdfsHoles -fixHdfsOrphans -fixHdfsOverlaps -fixVersionFile -sidelineBigOverlaps -fixReferenceFiles-fixHFileLinks
11633    -repairHoles      Shortcut for -fixAssignments -fixMeta -fixHdfsHoles
11638 * [HBASE-19994](https://issues.apache.org/jira/browse/HBASE-19994) | *Major* | **Create a new class for RPC throttling exception, make it retryable.**
11640 A new RpcThrottlingException deprecates ThrottlingException. The new RpcThrottlingException is a retryable Exception that clients will retry when Rpc throttling quota is exceeded. The deprecated ThrottlingException is a nonretryable Exception.
11645 * [HBASE-20224](https://issues.apache.org/jira/browse/HBASE-20224) | *Blocker* | **Web UI is broken in standalone mode**
11647 Standalone webui was broken inadvertently by HBASE-20027.
11652 * [HBASE-18784](https://issues.apache.org/jira/browse/HBASE-18784) | *Major* | **Use of filesystem that requires hflush / hsync / append / etc should query outputstream capabilities**
11654 <!-- markdown -->
11658 If HBase is run on top of Apache Hadoop libraries that support the needed APIs it will verify that underlying Filesystem implementations provide the needed durability mechanisms to safely operate. The needed APIs *should* be present in Hadoop 3 release and Hadoop 2 releases starting in the Hadoop 2.9 series. If the APIs are not available, HBase behaves as it has in previous releases (that is, it moves forward assuming such a check would pass).
11660 Where this check fails, it is unsafe to rely on HBase in a production setting. In the event of process or node failure, the HBase RegionServer process may fail to have access to all the data it previously wrote to its write ahead log, resulting in data loss. In the event of process or node failure, the HBase master process may lose all or part of the write ahead log that it relies on for cluster management operations, leaving the cluster in an inconsistent state that we aren't sure it could recover from.
11662 Notably, the LocalFileSystem implementation provided by Hadoop reports (accurately) via these new APIs that it can not provide the durability HBase needs to operate. As such, the current instructions for single-node HBase operation have been updated both with a) how to bypass this safety check and b) a strong warning about the dire consequences of doing so outside of a dev/test environment.
11667 * [HBASE-20219](https://issues.apache.org/jira/browse/HBASE-20219) | *Critical* | **An error occurs when scanning with reversed=true and loadColumnFamiliesOnDemand=true**
11669 Throws DoNotRetryIOException when you ask for a reverse scan loading adjacent column families on demand. Previous it threw IllegalStateException
11674 * [HBASE-20358](https://issues.apache.org/jira/browse/HBASE-20358) | *Minor* | **Fix bin/hbase thrift usage text**
11676 Cleanup usage message and command-line processing (no functional change).
11681 * [HBASE-20182](https://issues.apache.org/jira/browse/HBASE-20182) | *Blocker* | **Can not locate region after split and merge**
11683 Now if we hit a split parent when locating a region, we will skip to the next row and try again until the region does not contain our row. So there will be no RegionOfflineException for a split parent any more, instead, if the split children have not been onlined yet, i.e, we finally arrive at a region which does not contain our row, an IOException will be thrown.
11688 * [HBASE-20149](https://issues.apache.org/jira/browse/HBASE-20149) | *Critical* | **Purge dev javadoc from bin tarball (or make a separate tarball of javadoc)**
11690 We no longer include dev or dev test javadocs in our binary bundle. We still build them; they are just not included because they were half the size of the resultant tarball.
11692 Here is our story on javadoc as of this commit:
11694  \* apidocs - user facing main api javadocs. currently for a release line, published on website and linked from menu. included in the bin tarball
11695  \* devapidocs - hbase internal javadocs. currently for a release line, published on the website but not linked from the menu. no longer included in the bin tarball.
11696  \* testapidocs - user facing test scope api javadocs. currently for a release line, not published. included in the bin tarball.
11697  \* testdevapidocs - hbase internal test scope javadocs. currently for a release line, not published. no longer included in the bin tarball
11702 * [HBASE-18828](https://issues.apache.org/jira/browse/HBASE-18828) | *Blocker* | **[2.0] Generate CHANGES.txt**
11704 Moves us over to yetus releasedocmaker tooling generating CHANGES. CHANGES is not markdown (CHANGES.md) as opposed to CHANGES.txt. We've also added a new RELEASENOTES.md that lists JIRA release notes (courtesy of releasedocmaker).
11706 CHANGES/RELEASENOTES are current as of now. Will need a 'freshening' when we cut the RC.
11711 * [HBASE-14175](https://issues.apache.org/jira/browse/HBASE-14175) | *Critical* | **Adopt releasedocmaker for better generated release notes**
11713 We will use yetus releasedocmaker to make our changes doc from here on out. A CHANGELOG.md will replace our current CHANGES.txt. Adjacent, we'll keep up a RELEASENOTES.md doc courtesy of releasedocmaker.
11715 Over in HBASE-18828 is where we are working through steps for the RM integrating this new tooling.
11720 * [HBASE-16499](https://issues.apache.org/jira/browse/HBASE-16499) | *Critical* | **slow replication for small HBase clusters**
11722 Changed the default value for replication.source.ratio from 0.1 to 0.5. Which means now by default 50% of the total RegionServers in peer cluster(s) will participate in replication.
11727 * [HBASE-16459](https://issues.apache.org/jira/browse/HBASE-16459) | *Trivial* | **Remove unused hbase shell --format option**
11729 <!-- markdown -->
11734 The HBase `shell` command no longer recognizes the option `--format`. Previously this option only recognized the default value of 'console'. The default value is now always used.
11739 * [HBASE-20259](https://issues.apache.org/jira/browse/HBASE-20259) | *Critical* | **Doc configs for in-memory-compaction and add detail to in-memory-compaction logging**
11741 Disables in-memory compaction as default.
11743 Adds logging of in-memory compaction configuration on creation.
11745 Adds a chapter to the refguide on this new feature.
11750 * [HBASE-20282](https://issues.apache.org/jira/browse/HBASE-20282) | *Major* | **Provide short name invocations for useful tools**
11752 \`hbase regionsplitter\` is a new short invocation for \`hbase org.apache.hadoop.hbase.util.RegionSplitter\`
11757 * [HBASE-20314](https://issues.apache.org/jira/browse/HBASE-20314) | *Major* | **Precommit build for master branch fails because of surefire fork fails**
11759 Upgrade surefire plugin to 2.21.0.
11764 * [HBASE-20130](https://issues.apache.org/jira/browse/HBASE-20130) | *Critical* | **Use defaults (16020 & 16030) as base ports when the RS is bound to localhost**
11766 <!-- markdown -->
11770 When region servers bind to localhost (mostly in pseudo distributed mode), default ports (16020 & 16030) are used as base ports. This will support up to 9 instances of region servers by default with `local-regionservers.sh` script. If additional instances are needed, see the reference guide on how to deploy with a different range using the environment variables `HBASE_RS_BASE_PORT` and `HBASE_RS_INFO_BASE_PORT`.
11775 * [HBASE-20111](https://issues.apache.org/jira/browse/HBASE-20111) | *Critical* | **Able to split region explicitly even on shouldSplit return false from split policy**
11777 When a split is requested on a Region, the RegionServer hosting that Region will now consult the configured SplitPolicy for that table when determining if a split of that Region is allowed. When a split is disallowed (due to the Region not being OPEN or the SplitPolicy denying the request), the operation will \*not\* be implicitly retried as it has previously done. Users will need to guard against and explicitly retry region split requests which are denied by the system.
11782 * [HBASE-20223](https://issues.apache.org/jira/browse/HBASE-20223) | *Blocker* | **Use hbase-thirdparty 2.1.0**
11784 Moves commons-cli and commons-collections4 into the HBase thirdparty shaded jar which means that these are no longer generally available for users on the classpath.
11789 * [HBASE-19128](https://issues.apache.org/jira/browse/HBASE-19128) | *Major* | **Purge Distributed Log Replay from codebase, configurations, text; mark the feature as unsupported, broken.**
11791 Removes Distributed Log Replay feature. Disable the feature before upgrading.
11796 * [HBASE-19504](https://issues.apache.org/jira/browse/HBASE-19504) | *Major* | **Add TimeRange support into checkAndMutate**
11798 1) checkAndMutate accept a TimeRange to query the specified cell
11799 2) remove writeToWAL flag from Region#checkAndMutate since it is useless (this is a incompatible change)
11804 * [HBASE-20237](https://issues.apache.org/jira/browse/HBASE-20237) | *Critical* | **Put back getClosestRowBefore and throw UnknownProtocolException instead... for asynchbase client**
11806 Throw UnknownProtocolException if a client connects and tries to invoke the old getClosestRowOrBefore method. Pre-hbase-1.0.0 or asynchbase do this instead of using its replacement, the reverse Scan.
11808 getClosestRowOrBefore was implemented as a flag on Get. Before this patch though the flag was set, hbase2 were ignoring it. This made it look like a pre-1.0.0 client was 'working' but then it'd fail finding the appropriate Region for a client-specified row doing lookups into hbase:meta.
11813 * [HBASE-20247](https://issues.apache.org/jira/browse/HBASE-20247) | *Major* | **Set version as 2.0.0 in branch-2.0 in prep for first RC**
11815 Set version as 2.0.0 on branch-2.0.
11820 * [HBASE-20090](https://issues.apache.org/jira/browse/HBASE-20090) | *Major* | **Properly handle Preconditions check failure in MemStoreFlusher$FlushHandler.run**
11822 When there is concurrent region split, MemStoreFlusher may not find flushable region if the only candidate region left hasn't received writes (resulting in 0 data size).
11823 After this JIRA, such scenario wouldn't trigger Precondition assertion (replaced by an if statement to see whether there is any flushable region).
11824 If there is no flushable region, a DEBUG log would appear in region server log, saying "Above memory mark but there is no flushable region".
11829 * [HBASE-19552](https://issues.apache.org/jira/browse/HBASE-19552) | *Major* | **update hbase to use new thirdparty libs**
11831 hbase-thirdparty libs have moved to o.a.h.thirdparty offset. Netty shading system property is no longer necessary.
11836 * [HBASE-20119](https://issues.apache.org/jira/browse/HBASE-20119) | *Minor* | **Introduce a pojo class to carry coprocessor information in order to make TableDescriptorBuilder accept multiple cp at once**
11838 1) Make all methods in TableDescriptorBuilder be setter pattern.
11839 addCoprocessor -\> setCoprocessor
11840 addColumnFamily -\> setColumnFamily
11841 (addCoprocessor and addColumnFamily are still in branch-2 but they are marked as deprecated)
11842 2) add CoprocessorDescriptor to carry cp information
11843 3) add CoprocessorDescriptorBuilder to build CoprocessorDescriptor
11844 4) TD disallow user to set negative priority to coprocessor since parsing the negative value will cause a exception
11849 * [HBASE-17165](https://issues.apache.org/jira/browse/HBASE-17165) | *Critical* | **Add retry to LoadIncrementalHFiles tool**
11851 Adds retry to load of incremental hfiles. Pertinent key is HConstants.HBASE\_CLIENT\_RETRIES\_NUMBER. Default is HConstants.DEFAULT\_HBASE\_CLIENT\_RETRIES\_NUMBER.
11856 * [HBASE-20108](https://issues.apache.org/jira/browse/HBASE-20108) | *Critical* | **\`hbase zkcli\` falls into a non-interactive prompt after HBASE-15199**
11858 This issue fixes a runtime dependency issues where JLine is not made available on the classpath which causes the ZooKeeper CLI to appear non-interactive. JLine was being made available unintentionally via the JRuby jar file on the classpath for the HBase shell. While the JRuby jar is not always present, the fix made here was to selectively include the JLine dependency on the zkcli command's classpath.
11863 * [HBASE-8770](https://issues.apache.org/jira/browse/HBASE-8770) | *Blocker* | **deletes and puts with the same ts should be resolved according to mvcc/seqNum**
11865 This behavior is available as a new feature. See HBASE-15968 release note.
11867 This issue is just about adding to the refguide documentation on the HBASE\_15968 feature.
11872 * [HBASE-19114](https://issues.apache.org/jira/browse/HBASE-19114) | *Major* | **Split out o.a.h.h.zookeeper from hbase-server and hbase-client**
11874 Splits out most of ZooKeeper related code into a separate new module: hbase-zookeeper.
11875 Also, renames some ZooKeeper related classes to follow a common naming pattern - "ZK" prefix - as compared to many different styles earlier.
11880 * [HBASE-19437](https://issues.apache.org/jira/browse/HBASE-19437) | *Critical* | **Batch operation can't handle the null result for Append/Increment**
11882 The result from server is changed from null to Result.EMPTY\_RESULT when Append/Increment operation can't retrieve any data from server,
11887 * [HBASE-17448](https://issues.apache.org/jira/browse/HBASE-17448) | *Major* | **Export metrics from RecoverableZooKeeper**
11889 Committed to master and branch-1
11894 * [HBASE-19400](https://issues.apache.org/jira/browse/HBASE-19400) | *Major* | **Add missing security checks in MasterRpcServices**
11896 Added ACL check to following Admin functions:
11897 enableCatalogJanitor, runCatalogJanitor, cleanerChoreSwitch, runCleanerChore, execProcedure, execProcedureWithReturn, normalize, normalizerSwitch, coprocessorService.
11898 When ACL is enabled, only those with ADMIN rights will be able to invoke these operations successfully.
11903 * [HBASE-20048](https://issues.apache.org/jira/browse/HBASE-20048) | *Blocker* | **Revert serial replication feature**
11905 Revert the serial replication feature from all branches. Plan to reimplement it soon and land onto 2.1 release line.
11910 * [HBASE-19166](https://issues.apache.org/jira/browse/HBASE-19166) | *Blocker* | **AsyncProtobufLogWriter persists ProtobufLogWriter as class name for backward compatibility**
11912 For backward compatibility, AsyncProtobufLogWriter uses "ProtobufLogWriter" as writer class name and SecureAsyncProtobufLogWriter uses "SecureProtobufLogWriter" as writer class name.
11917 * [HBASE-18596](https://issues.apache.org/jira/browse/HBASE-18596) | *Blocker* | **[TEST] A hbase1 cluster should be able to replicate to a hbase2 cluster; verify**
11919 Replication between versions verified as basically working. 0.98.25-SNAPSHOT to beta-2 hbase2 and a 1.2-ish version tried.
11924 * [HBASE-20017](https://issues.apache.org/jira/browse/HBASE-20017) | *Blocker* | **BufferedMutatorImpl submit the same mutation repeatedly**
11926 This change fixes multithreading issues in the implementation of BufferedMutator. BufferedMutator should not be used with 1.4 releases prior to 1.4.2.
11931 * [HBASE-20032](https://issues.apache.org/jira/browse/HBASE-20032) | *Minor* | **Receving multiple warnings for missing reporting.plugins.plugin.version**
11933 Add (latest) version elements missing from reporting plugins in top-level pom.
11938 * [HBASE-19954](https://issues.apache.org/jira/browse/HBASE-19954) | *Major* | **Separate TestBlockReorder into individual tests to avoid ShutdownHook suppression error against hadoop3**
11940 hadoop3 minidfscluster removes all shutdown handlers when the cluster goes down which made this test that does FS-stuff fail (Fix was to break up the test so each test method ran with an unadulterated FS).
11945 * [HBASE-20014](https://issues.apache.org/jira/browse/HBASE-20014) | *Major* | **TestAdmin1 Times out**
11947 Ups the overall test timeout from 10 minutes to 13minutes. 15minutes is the surefire timeout.
11952 * [HBASE-20020](https://issues.apache.org/jira/browse/HBASE-20020) | *Critical* | **Make sure we throw DoNotRetryIOException when ConnectionImplementation is closed**
11954 Add checkClosed to core Client methods. Avoid unnecessary retry.
11959 * [HBASE-19978](https://issues.apache.org/jira/browse/HBASE-19978) | *Major* | **The keepalive logic is incomplete in ProcedureExecutor**
11961 Completes keep-alive logic and then enables it; ProcedureExecutor Workers will spin up more threads when need settling back to the core count after the burst in demand has passed. Default keep-alive is one minute. Default core-count is CPUs/4 or 16, which ever is greater. Maximum is an arbitrary core-count \* 10 (a limit that should never be hit and if it is, there is something else very wrong).
11966 * [HBASE-19950](https://issues.apache.org/jira/browse/HBASE-19950) | *Minor* | **Introduce a ColumnValueFilter**
11968 ColumnValueFilter provides a way to fetch matched cells only by providing specified column, value and a comparator, which is different from SingleValueFilter, fetching an entire row as soon as a matched cell found.
11973 * [HBASE-18294](https://issues.apache.org/jira/browse/HBASE-18294) | *Major* | **Reduce global heap pressure: flush based on heap occupancy**
11975 A region is flushed if its memory component exceeds the region flush threshold.
11976 A flush policy decides which stores to flush by comparing the size of the store to a column-family-flush threshold.
11977 If the overall size of all memstores in the machine exceeds the bounds defined by the administrator (denoted global pressure) a region is selected and flushed. 
11978 HBASE-18294 changes flush decisions to be based on heap-occupancy and not data (key-value) size, consistently across levels. This rolls back some of the changes by HBASE-16747. Specifically,
11979 (1) RSs, Regions and stores track their overall on-heap and off-heap occupancy,
11980 (2) A region is flushed when its on-heap+off-heap size exceeds the region flush threshold specified in hbase.hregion.memstore.flush.size,
11981 (3) The store to be flushed is chosen based on its on-heap+off-heap size 
11982 (4) At the RS level, a flush is triggered when the overall on-heap exceeds the on-heap limit, or when the overall off-heap size exceeds the off-heap limit (low/high water marks).
11984 Note that when the region flush size is set to XXmb a region flush may be triggered even before writing keys and values of size XX because the total heap occupancy of the region which includes additional metadata exceeded the threshold.
11989 * [HBASE-19116](https://issues.apache.org/jira/browse/HBASE-19116) | *Critical* | **Currently the tail of hfiles with CellComparator\* classname makes it so hbase1 can't open hbase2 written hfiles; fix**
11991 hbase-2.x sets KeyValue Comparators into the tail of hfiles rather than CellComparator, what it uses internally, just so hbase-1.x can continue to read hbase-2.x written hfiles.
11996 * [HBASE-19948](https://issues.apache.org/jira/browse/HBASE-19948) | *Major* | **Since HBASE-19873, HBaseClassTestRule, Small/Medium/Large has different semantic**
11998 In subtask, fixed doc and annotations to be more explicit that test timings are for the whole Test Fixture/Test Class/Test Suite NOT the test method only as we'd measuring up to this (tother subtasks untethered Categorization and test timeout such that all categories now have a ten minute timeout -- no test can run longer than ten minutes or it gets killed/timedout).
12003 * [HBASE-16060](https://issues.apache.org/jira/browse/HBASE-16060) | *Blocker* | **1.x clients cannot access table state talking to 2.0 cluster**
12005 By default, we mirror table state to zookeeper so hbase-1.x clients will work against an hbase-2 cluster (With this patch, hbase-1.x clients can do most Admin functions including table create; hbase-1.x clients can do all Table/DML against hbase-2 cluster).
12007 Flag to disable mirroring is hbase.mirror.table.state.to.zookeeper; set it to false in Configuration.
12009 Related, Master on startup will look to see if there are table state znodes left over by an hbase-1 instance. If any found, it will migrate the table state to hbase-2 setting the state into the hbase:meta table where table state is now kept. We will do this check on every Master start. Notion is that this will be overall beneficial with low impediment. To disable the migration check, set hbase.migrate.table.state.from.zookeeper to false.
12014 * [HBASE-19900](https://issues.apache.org/jira/browse/HBASE-19900) | *Critical* | **Region-level exception destroy the result of batch**
12016 This fix makes the following changes to how client handle the both of action result and region exception.
12017 1) honor the action result rather than region exception. If the action have both of true result and region exception, the action is fine as the exception is caused by other actions which are in the same region.
12018 2) honor the action exception rather than region exception. If the action have both of action exception and region exception, we deal with the action exception only. If we also handle the region exception for the same action, it will introduce the negative count of actions in progress. The AsyncRequestFuture#waitUntilDone will block forever.
12023 * [HBASE-19841](https://issues.apache.org/jira/browse/HBASE-19841) | *Major* | **Tests against hadoop3 fail with StreamLacksCapabilityException**
12025 HBaseTestingUtility now assumes that all clusters will use local storage until a MiniDFSCluster is started or assigned.
12030 * [HBASE-19528](https://issues.apache.org/jira/browse/HBASE-19528) | *Major* | **Major Compaction Tool**
12032 Tool allows you to compact a cluster with given concurrency of regionservers compacting at a given time.  If tool completes successfully everything requested for compaction will be compacted, regardless of region moves, splits and merges.
12037 * [HBASE-19919](https://issues.apache.org/jira/browse/HBASE-19919) | *Major* | **Tidying up logging**
12039 (I thought this change innocuous but I made work for a co-worker when I upped interval between log cleaner runs -- meant a smoke test failed because we were slow doing an expected cleanup).
12041 Edit of log lines removing redundancy. Shorten thread names shown in log.  Made some log TRACE instead of DEBUG.  Capitalizations.
12043 Upped log cleaner interval from every minute to every ten minutes. hbase.master.cleaner.interval
12045 Lowered default count of threads started by Procedure Executor from count of CPUs to 1/4 of count of CPUs.
12050 * [HBASE-19901](https://issues.apache.org/jira/browse/HBASE-19901) | *Major* | **Up yetus proclimit on nightlies**
12052 Pass to yetus a dockermemlimit of 20G and a proclimit of 10000. Defaults are 4G and 1G respectively.
12057 * [HBASE-19912](https://issues.apache.org/jira/browse/HBASE-19912) | *Minor* | **The flag "writeToWAL" of Region#checkAndRowMutate is useless**
12059 Remove useless 'writeToWAL' flag of Region#checkAndRowMutate & related class
12064 * [HBASE-19911](https://issues.apache.org/jira/browse/HBASE-19911) | *Major* | **Convert some tests from small to medium because they are timing out: TestNettyRpcServer, TestClientClusterStatus, TestCheckTestClasses**
12066 Changed a few tests so they are medium sized rather than small size.
12068 Also, upped the time we wait on small tests to 60seconds from 30seconds. Small tests are tests that run in 15seconds or less. What we changed was the timeout watcher. It is now more lax, more tolerant of dodgy infrastructure that might be running tests slowly.
12073 * [HBASE-19892](https://issues.apache.org/jira/browse/HBASE-19892) | *Major* | **Checking 'patch attach' and yetus 0.7.0 and move to Yetus 0.7.0**
12075 Moved our internal yetus reference from 0.6.0 to 0.7.0. Concurrently, I changed hadoopqa to run with 0.7.0 (by editing the config in jenkins).
12080 * [HBASE-19873](https://issues.apache.org/jira/browse/HBASE-19873) | *Major* | **Add a CategoryBasedTimeout ClassRule for all UTs**
12082 Along with @category -- small, medium, large -- all hbase tests must now carry a ClassRule as follows:
12084 +  @ClassRule
12085 +  public static final HBaseClassTestRule CLASS\_RULE =
12086 +      HBaseClassTestRule.forClass(TestInterfaceAudienceAnnotations.class);
12088 where the class changes by test.
12090 Currently the classrule enforces timeout for the whole test suite -- i.e. if a SmallTest Category then all the tests in the TestSuite must complete inside 60seconds, the timeout we set on SmallTest Category test suite -- but is meant to be a repository for general, runtime, hbase test facility.
12095 * [HBASE-19770](https://issues.apache.org/jira/browse/HBASE-19770) | *Critical* | **Add '--return-values' option to Shell to print return values of commands in interactive mode**
12097 Introduces a new option to the HBase shell: -r, --return-values. When the shell is in "interactive" mode (default), the return value of shell commands are not returned to the user as they dirty the console output. For those who desire this functionality, the "--return-values" option restores the old functionality of the commands passing their return value to the user.
12102 * [HBASE-15321](https://issues.apache.org/jira/browse/HBASE-15321) | *Major* | **Ability to open a HRegion from hdfs snapshot.**
12104 HRegion.openReadOnlyFileSystemHRegion() provides the ability to open HRegion from a read-only hdfs snapshot.  Because hdfs snapshots are read-only, no cleanup happens when using this API.
12109 * [HBASE-17513](https://issues.apache.org/jira/browse/HBASE-17513) | *Critical* | **Thrift Server 1 uses different QOP settings than RPC and Thrift Server 2 and can easily be misconfigured so there is no encryption when the operator expects it.**
12111 This change fixes an issue where users could have unintentionally configured the HBase Thrift1 server to run without wire-encryption, when they believed they had configured the Thrift1 server to do so.
12116 * [HBASE-19828](https://issues.apache.org/jira/browse/HBASE-19828) | *Major* | **Flakey TestRegionsOnMasterOptions.testRegionsOnAllServers**
12118 Disables TestRegionsOnMasterOptions because Regions on Master does not work reliably; see HBASE-19831.
12123 * [HBASE-18963](https://issues.apache.org/jira/browse/HBASE-18963) | *Major* | **Remove MultiRowMutationProcessor and implement mutateRows... methods using batchMutate()**
12125 Modified HRegion.mutateRow() APIs to use batchMutate() instead of processRowsWithLocks() with MultiRowMutationProcessor. MultiRowMutationProcessor is removed to have single write path that uses batchMutate().
12130 * [HBASE-19163](https://issues.apache.org/jira/browse/HBASE-19163) | *Major* | **"Maximum lock count exceeded" from region server's batch processing**
12132 When there are many mutations against the same row in a batch, as each mutation will acquire a shared row lock, it will exceed the maximum shared lock count the java ReadWritelock supports (64k). Along with other optimization, the batch is divided into multiple possible minibatches. A new config is added to limit the maximum number of mutations in the minibatch.
12134    \<property\>
12135     \<name\>hbase.regionserver.minibatch.size\</name\>
12136     \<value\>20000\</value\>
12137    \</property\>
12138 The default value is 20000.
12143 * [HBASE-19739](https://issues.apache.org/jira/browse/HBASE-19739) | *Minor* | **Include thrift IDL files in HBase binary distribution**
12145 Thrift IDLs are now shipped, bundled up in the respective hbase-\*thrift.jars (look for files ending in .thrift).
12150 * [HBASE-11409](https://issues.apache.org/jira/browse/HBASE-11409) | *Major* | **Add more flexibility for input directory structure to LoadIncrementalHFiles**
12152 Allows for users to bulk load entire tables from hdfs by specifying the parameter -loadTable.  This allows you to pass in a table level directory and have all regions column families bulk loaded, if you do not specify the -loadTable parameter LoadIncrementalHFiles will work as before. Note: you must have a pre-created table to run with -loadTable it will not create one for you.
12157 * [HBASE-19769](https://issues.apache.org/jira/browse/HBASE-19769) | *Critical* | **IllegalAccessError on package-private Hadoop metrics2 classes in MapReduce jobs**
12159 Client-side ZooKeeper metrics which were added to 2.0.0 alpha/beta releases cause issues when launching MapReduce jobs via {{yarn jar}} on the command line. This stems from ClassLoader separation issues that YARN implements. It was chosen that the easiest solution was to remove these ZooKeeper metrics entirely.
12164 * [HBASE-19783](https://issues.apache.org/jira/browse/HBASE-19783) | *Minor* | **Change replication peer cluster key/endpoint from a not-null value to null is not allowed**
12166 To reduce the confusing behavior, now when you call updatePeerConfig with empty ClusterKey or ReplicationEndpointImpl, but the value of field of the to-be-updated ReplicationPeerConfig is not null, we will throw exception instead of ignoring them.
12171 * [HBASE-19483](https://issues.apache.org/jira/browse/HBASE-19483) | *Major* | **Add proper privilege check for rsgroup commands**
12173 This JIRA aims at refactoring AccessController, using ACL as core library in CPs.
12174 1. Stripping out a public class AccessChecker from AccessController, using ACL as core library in CPs. AccessChecker don't have any dependency on anything CP related. Create it's instance from other CPS.
12175 2. Change the default value of hbase.security.authorization to false.
12176 3. Don't use CP hooks to check access in RSGroup. Use the access checker instance directly in functions of RSGroupAdminServiceImpl.
12181 * [HBASE-19358](https://issues.apache.org/jira/browse/HBASE-19358) | *Major* | **Improve the stability of splitting log when do fail over**
12183 After HBASE-19358 we introduced a new property hbase.split.writer.creation.bounded to limit the opening writers for each WALSplitter. If set to true, we won't open any writer for recovered.edits until the entries accumulated in memory reaching hbase.regionserver.hlog.splitlog.buffersize (which defaults at 128M) and will write and close the file in one go instead of keeping the writer open. It's false by default and we recommend to set it to true if your cluster has a high region load (like more than 300 regions per RS), especially when you observed obvious NN/HDFS slow down during hbase (single RS or cluster) failover.
12188 * [HBASE-19651](https://issues.apache.org/jira/browse/HBASE-19651) | *Minor* | **Remove LimitInputStream**
12190 HBase had copied from guava the file LmiitedInputStream. This commit removes the copied file in favor of (our internal, shaded) guava's ByteStreams.limit. Guava 14.0's LIS noted: "Use ByteStreams.limit(java.io.InputStream, long) instead. This class is scheduled to be removed in Guava release 15.0."
12195 * [HBASE-19691](https://issues.apache.org/jira/browse/HBASE-19691) | *Critical* | **Do not require ADMIN permission for obtaining ClusterStatus**
12197 This change reverts an unintentional requirement for global ADMIN permission to obtain cluster status from the active HMaster.
12202 * [HBASE-19486](https://issues.apache.org/jira/browse/HBASE-19486) | *Major* | ** Periodically ensure records are not buffered too long by BufferedMutator**
12204 The BufferedMutator now supports two settings that are used to ensure records do not stay too long in the buffer of a BufferedMutator. For periodically flushing the BufferedMutator there is now a "Timeout": "How old may the oldest record in the buffer be before we force a flush" and a "TimerTick": How often do we check if the timeout has been exceeded. Using these settings you can make the BufferedMutator automatically flush the write buffer if after the specified number of milliseconds no flush has occurred.
12206 This is mainly useful in streaming scenarios (i.e. writing data into HBase using Apache Flink/Beam/Storm) where it is common (especially in a test/development situation) to see small unpredictable bursts of data that need to be written into HBase. When using the BufferedMutator till now the effect was that records would remain in the write buffer until the buffer was full or an explicit flush was triggered. In practice this would mean that the 'last few records' of a burst would remain in the write buffer until the next burst arrives filling the buffer to capacity and thus triggering a flush.
12211 * [HBASE-19670](https://issues.apache.org/jira/browse/HBASE-19670) | *Major* | **Workaround: Purge User API building from branch-2 so can make a beta-1**
12213 Disable filtering of User API based off yetus annotation done in doclet. See parent issue for build failure currently being worked on but not done in time for a beta-1.
12218 * [HBASE-19282](https://issues.apache.org/jira/browse/HBASE-19282) | *Major* | **CellChunkMap Benchmarking and User Interface**
12220 When MSLAB is in use (that is the default config) , we will always use the CellChunkMap indexing variant for in memory flushed Immutable segments. When MSLAB is turned off, we will use CellAraryMap. These can not be changed with any configs.  The in memory flush threshold been made to be default to 10% of region flush size. This can be turned using 'hbase.memstore.inmemoryflush.threshold.factor'.
12225 * [HBASE-19628](https://issues.apache.org/jira/browse/HBASE-19628) | *Major* | **ByteBufferCell should extend ExtendedCell**
12227 ByteBufferCell → ByteBufferExtendedCell
12228 MapReduceCell → MapReduceExtendedCell
12229 ByteBufferChunkCell → ByteBufferChunkKeyValue
12230 NoTagByteBufferChunkCell → NoTagByteBufferChunkKeyValue
12231 KeyOnlyByteBufferCell → KeyOnlyByteBufferExtendedCell
12232 TagRewriteByteBufferCell → TagRewriteByteBufferExtendedCell
12233 ValueAndTagRewriteByteBufferCell → ValueAndTagRewriteByteBufferExtendedCell
12234 EmptyByteBufferCell → EmptyByteBufferExtendedCell
12235 FirstOnRowByteBufferCell → FirstOnRowByteBufferExtendedCell
12236 LastOnRowByteBufferCell → LastOnRowByteBufferExtendedCell
12237 FirstOnRowColByteBufferCell → FirstOnRowColByteBufferExtendedCell
12238 FirstOnRowColTSByteBufferCell → FirstOnRowColTSByteBufferExtendedCell
12239 LastOnRowColByteBufferCell → LastOnRowColByteBufferCell
12240 OffheapDecodedCell → OffheapDecodedExtendedCell
12245 * [HBASE-19576](https://issues.apache.org/jira/browse/HBASE-19576) | *Major* | **Introduce builder for ReplicationPeerConfig and make it immutable**
12247 Add a ReplicationPeerConfigBuilder to create ReplicationPeerConfig and make ReplicationPeerConfig immutable. Meanwhile, deprecated set\* methods in ReplicationPeerConfig.
12252 * [HBASE-10092](https://issues.apache.org/jira/browse/HBASE-10092) | *Critical* | **Move to slf4j**
12254 We now have slf4j as our front-end. Be careful adding logging from here on out; make sure it slf4j.
12256 From here on out, as us devs go, we need to convert log messages from being 'guarded' -- i.e. surrounded by if (LOG.isDebugEnabled...) -- to instead being parameterized log messages. e.g. the latter rather than the former in the below:
12258 logger.debug("The new entry is "+entry+".");
12259 logger.debug("The new entry is {}.", entry);
12261 See [1] for background on perf benefits.
12263 Note, FATAL log level is not present in slf4j. It is noted as a Marker but won't show in logs as a LEVEL.
12265 1.  https://www.slf4j.org/faq.html#logging\_performance
12270 * [HBASE-19148](https://issues.apache.org/jira/browse/HBASE-19148) | *Blocker* | **Reevaluate default values of configurations**
12272 Removed unused hbase.fs.tmp.dir from hbase-default.xml.
12274 Upped hbase.master.fileSplitTimeout from 30s to 10minutes (suggested by production experience)
12276 Added note that handler-count should be ~CPU count.
12278 hbase.regionserver.logroll.multiplier has been changed from 0.95 to 0.5 AND the default block size has been doubled.
12280 A few of the core configs are now dumped to the log on startup.
12285 * [HBASE-19492](https://issues.apache.org/jira/browse/HBASE-19492) | *Major* | **Add EXCLUDE\_NAMESPACE and EXCLUDE\_TABLECFS support to replication peer config**
12287 Add two new field:  EXCLUDE\_NAMESPACE and EXCLUDE\_TABLECFS to replication peer config.
12289 If replicate\_all flag is true, it means all user tables will be replicated to peer cluster. Then allow config exclude namespaces or exclude table-cfs which can't be replicated to  peer cluster.
12291 If replicate\_all flag is false, it means all user tables can't be replicated to peer cluster. Then allow to config namespaces or table-cfs which will be replicated to peer cluster.
12296 * [HBASE-19494](https://issues.apache.org/jira/browse/HBASE-19494) | *Major* | **Create simple WALKey filter that can be plugged in on the Replication Sink**
12298 Adds means of adding very basic filter on the sink side of replication. We already have a means of installing filter source-side, which is better place to filter edits before they are shipped over the network, but this facility is needed by hbase-indexer.
12300 Set hbase.replication.sink.walentrysinkfilter with a no-param Constructor implementation. See test in patch for example.
12305 * [HBASE-19112](https://issues.apache.org/jira/browse/HBASE-19112) | *Blocker* | **Suspect methods on Cell to be deprecated**
12307 Adds method Cell#getType which returns enum describing Cell Type.
12309 Deprecates the following Cell methods:
12311  getTypeByte
12312  getSequenceId
12313  getTagsArray
12314  getTagsOffset
12315  getTagsLength
12317 CPs trying to build cells should use RawCellBuilderFactory that supports  building cells with tags.
12322 * [HBASE-14790](https://issues.apache.org/jira/browse/HBASE-14790) | *Major* | **Implement a new DFSOutputStream for logging WAL only**
12324 Implement a FanOutOneBlockAsyncDFSOutput for writing WAL only, the WAL provider which uses this class is AsyncFSWALProvider.
12326 It is based on netty, and will write to 3 DNs at the same time concurrently(fan-out) so generally it will lead to a lower latency. And it is also fail-fast, the stream will become unwritable immediately after there are any read/write errors, no pipeline recovery. You need to call recoverLease to force close the output for this case. And it only supports to write a file with a single block. For WAL this is a good behavior as we can always open a new file when the old one is broken. The performance analysis in HBASE-16890 shows that it has a better performance.
12328 Behavior changes:
12329 1. As now we write to 3 DNs concurrently, according to the visibility guarantee of HDFS, the data will be available immediately when arriving at DN since all the DNs will be considered as the last one in pipeline. This means replication may read uncommitted data and replicate it to the remote cluster and cause data inconsistency. HBASE-14004 is used to solve the problem.
12330 2. There will be no sync failure. When the output is broken, we will open a new file and write all the unacked wal entries to the new file. This means that we may have duplicated entries in wal files. HBASE-14949 is used to solve this problem.
12335 * [HBASE-15536](https://issues.apache.org/jira/browse/HBASE-15536) | *Critical* | **Make AsyncFSWAL as our default WAL**
12337 Now the default WALProvider is AsyncFSWALProvider, i.e. 'asyncfs'.
12338 If you want to change back to use FSHLog, please add this in hbase-site.xml
12339 {code}
12340 \<property\>
12341 \<name\>hbase.wal.provider\</name\>
12342 \<value\>filesystem\</value\>
12343 \</property\>
12344 {code}
12345 If you want to use FSHLog with multiwal, please add this in hbase-site.xml
12346 {code}
12347 \<property\>
12348 \<name\>hbase.wal.regiongrouping.delegate.provider\</name\>
12349 \<value\>filesystem\</value\>
12350 \</property\>
12351 {code}
12353 This patch also sets hbase.wal.async.use-shared-event-loop to false so WAL has its own netty event group.
12358 * [HBASE-19462](https://issues.apache.org/jira/browse/HBASE-19462) | *Major* | **Deprecate all addImmutable methods in Put**
12360 Deprecates Put#addImmutable as of release 2.0.0, this will be removed in HBase 3.0.0. Use {@link #add(Cell)} and {@link org.apache.hadoop.hbase.CellBuilder} instead
12365 * [HBASE-19213](https://issues.apache.org/jira/browse/HBASE-19213) | *Minor* | **Align check and mutate operations in Table and AsyncTable**
12367 In Table interface deprecate checkAndPut, checkAndDelete and checkAndMutate methods.
12368 Similarly to AsyncTable a new method was added to replace the deprecated ones: CheckAndMutateBuilder checkAndMutate(byte[] row, byte[] family) with CheckAndMutateBuilder interface which can be used to construct the checkAnd\*() operations.
12373 * [HBASE-19134](https://issues.apache.org/jira/browse/HBASE-19134) | *Major* | **Make WALKey an Interface; expose Read-Only version to CPs**
12375 Made WALKey an Interface and added a WALKeyImpl implementation. WALKey comes through to Coprocessors. WALKey is read-only.
12380 * [HBASE-18169](https://issues.apache.org/jira/browse/HBASE-18169) | *Blocker* | **Coprocessor fix and cleanup before 2.0.0 release**
12382 Refactor of Coprocessor API for hbase2. Purged methods that exposed too much of our internals. Other hooks were recast so they no longer took or returned internal classes; instead we pass Interfaces or read-only versions of implementations.
12384 Here is some overview doc on changes in hbase2 for Coprocessors including detail on why the change was made:
12385 https://github.com/apache/hbase/blob/branch-2.0/dev-support/design-docs/Coprocessor\_Design\_Improvements-Use\_composition\_instead\_of\_inheritance-HBASE-17732.adoc
12390 * [HBASE-19301](https://issues.apache.org/jira/browse/HBASE-19301) | *Major* | **Provide way for CPs to create short circuited connection with custom configurations**
12392 Provided a way for the CP users to create a short circuitable connection with custom configs.
12394 createConnection(Configuration) is added to MasterCoprocessorEnvironment, RegionServerCoprocessorEnvironment and RegionCoprocessorEnvironment.
12396 The getConnection() method already available in these Env interfaces returns the cluster connection used by the server (which the server also uses) where as this new method will create a new connection on request. The difference from connection created using ConnectionFactory APIs is that this connection can short circuit the calls to same server avoiding the RPC paths. The connection will NOT be cached/maintained by server. That should be done the CPs.
12398 Be careful creating Connections out of a Coprocessor. See the javadoc on these createConnection and getConnection.
12403 * [HBASE-19357](https://issues.apache.org/jira/browse/HBASE-19357) | *Major* | **Bucket cache no longer L2 for LRU cache**
12405 Removed cacheDataInL1 option for HCD
12406 BucketCache is no longer the L2 for LRU on heap cache. When BC is used, data blocks will be strictly on BC only where as index/bloom blocks are on LRU L1 cache.
12407 Config 'hbase.bucketcache.combinedcache.enabled' is removed. There is no way set combined mode = false. Means make BC as victim handler for LRU cache.
12408 This will be one more noticeable change when one uses BucketCache in File mode.  Then the system table's data block(Including the META table)  will be cached in Bucket Cache files only. Plain scan from META files alone test reveal that the throughput of file mode BC is almost half only.  But for META entries we have RegionLocation cache at client side connections. So this would not be a big concern in a real cluster usage. Will check more on this and probably fix even when we do tiered BucketCache.
12413 * [HBASE-19430](https://issues.apache.org/jira/browse/HBASE-19430) | *Major* | **Remove the SettableTimestamp and SettableSequenceId**
12415 All the cells which are used in server side are of ExtendedCell now.
12420 * [HBASE-19295](https://issues.apache.org/jira/browse/HBASE-19295) | *Major* | **The Configuration returned by CPEnv should be read-only.**
12422 CoprocessorEnvironment#getConfiguration returns a READ-ONLY Configuration. Attempts at altering the returned Configuration -- whether setting or adding resources -- will result in an IllegalStateException warning of the Read-only condition of the returned Configuration.
12427 * [HBASE-19410](https://issues.apache.org/jira/browse/HBASE-19410) | *Major* | **Move zookeeper related UTs to hbase-zookeeper and mark them as ZKTests**
12429 There is a new HBaseZKTestingUtility which can only start a mini zookeeper cluster. And we will publish sources for test-jar for all modules.
12434 * [HBASE-19323](https://issues.apache.org/jira/browse/HBASE-19323) | *Major* | **Make netty engine default in hbase2**
12436 NettyRpcServer is now our default RPC server replacing SimpleRpcServer.
12441 * [HBASE-19426](https://issues.apache.org/jira/browse/HBASE-19426) | *Major* | **Move has() and setTimestamp() to Mutation**
12443 Moves #has and #setTimestamp back up to Mutation from the subclass Put so available to other Mutation implementations.
12448 * [HBASE-19384](https://issues.apache.org/jira/browse/HBASE-19384) | *Critical* | **Results returned by preAppend hook in a coprocessor are replaced with null from other coprocessor even on bypass**
12450 When a coprocessor sets 'bypass', we will skip calling subsequent Coprocessors that may be stacked-up on the method invocation; e.g. if a prePut has three coprocessors hooked up, if the first coprocessor decides to set 'bypass', we will not call the two subsequent coprocessors (this is similar to the 'complete' functionality that was in hbase1, removed in hbase2).
12455 * [HBASE-19408](https://issues.apache.org/jira/browse/HBASE-19408) | *Trivial* | **Remove WALActionsListener.Base**
12457 1) remove the WALActionsListener.Base
12458 2) provide default method implementation to WALActionsListener
12459 The person who want to receive the notification of WAL events should implements the WALActionsListener rather than WALActionsListener.Base.
12464 * [HBASE-19339](https://issues.apache.org/jira/browse/HBASE-19339) | *Critical* | **Eager policy results in the negative size of memstore**
12466 Enable TestAcidGuaranteesWithEagerPolicy and TestAcidGuaranteesWithAdaptivePolicy
12471 * [HBASE-19336](https://issues.apache.org/jira/browse/HBASE-19336) | *Major* | **Improve rsgroup to allow assign all tables within a specified namespace by only writing namespace**
12473 Add two new shell cmd.
12474 move\_namespaces\_rsgroup is used to reassign tables of specified namespaces from one RegionServer group to another.
12475 move\_servers\_namespaces\_rsgroup is used to reassign regionServers and tables of specified namespaces from one group to another.
12480 * [HBASE-19285](https://issues.apache.org/jira/browse/HBASE-19285) | *Critical* | **Add per-table latency histograms**
12482 Per-RegionServer table latency histograms have been returned to HBase (after being removed due to impacting performance). These metrics are exposed via a new JMX bean "TableLatencies" with the typical naming conventions: namespace, table, and histogram component.
12487 * [HBASE-19359](https://issues.apache.org/jira/browse/HBASE-19359) | *Major* | **Revisit the default config of hbase client retries number**
12489 The default value of hbase.client.retries.number was 35. It is now 10.
12490 And for server side, the default hbase.client.serverside.retries.multiplier was 10. So the server side retries number was 35 \* 10 = 350. It is now 3.
12495 * [HBASE-18090](https://issues.apache.org/jira/browse/HBASE-18090) | *Major* | **Improve TableSnapshotInputFormat to allow more multiple mappers per region**
12497 In this task, we make it possible to run multiple mappers per region in the table snapshot. The following code is primary table snapshot mapper initializatio: 
12499 TableMapReduceUtil.initTableSnapshotMapperJob(
12500           snapshotName,                     // The name of the snapshot (of a table) to read from
12501           scan,                                      // Scan instance to control CF and attribute selection
12502           mapper,                                 // mapper
12503           outputKeyClass,                   // mapper output key 
12504           outputValueClass,                // mapper output value
12505           job,                                       // The current job to adjust
12506           true,                                     // upload HBase jars and jars for any of the configured job classes via the distributed cache (tmpjars)
12507           restoreDir,                           // a temporary directory to copy the snapshot files into
12510 The job only run one map task per region in the table snapshot. With this feature, client can specify the desired num of mappers when init table snapshot mapper job:
12512 TableMapReduceUtil.initTableSnapshotMapperJob(
12513           snapshotName,                     // The name of the snapshot (of a table) to read from
12514           scan,                                      // Scan instance to control CF and attribute selection
12515           mapper,                                 // mapper
12516           outputKeyClass,                   // mapper output key 
12517           outputValueClass,                // mapper output value
12518           job,                                       // The current job to adjust
12519           true,                                     // upload HBase jars and jars for any of the configured job classes via the distributed cache (tmpjars)
12520           restoreDir,                           // a temporary directory to copy the snapshot files into
12521           splitAlgorithm,                     // splitAlgo algorithm to split, current split algorithms  support RegionSplitter.UniformSplit() and RegionSplitter.HexStringSplit()
12522           n                                         // how many input splits to generate per one region
12528 * [HBASE-19035](https://issues.apache.org/jira/browse/HBASE-19035) | *Major* | **Miss metrics when coprocessor use region scanner to read data**
12530 1. Move read requests count to region level. Because RegionScanner is exposed to CP.
12531 2. Update write requests count in processRowsWithLocks.
12532 3. Remove requestRowActionCount in RSRpcServices. This metric can be computed by region's readRequestsCount and writeRequestsCount.
12537 * [HBASE-19318](https://issues.apache.org/jira/browse/HBASE-19318) | *Critical* | **MasterRpcServices#getSecurityCapabilities explicitly checks for the HBase AccessController implementation**
12539 Fixes an issue with loading customer coprocessor endpoint implementations inside of the HBase Master which breaks Apache Ranger.
12544 * [HBASE-19092](https://issues.apache.org/jira/browse/HBASE-19092) | *Critical* | **Make Tag IA.LimitedPrivate and expose for CPs**
12546 This JIRA aims at exposing Tags for Coprocessor usage.
12547 Tag interface is now exposed to Coprocessors and CPs can make use of this interface to create their own Tags.
12548 RawCell is a new interface that is a subtype of Cell and that is exposed to CPs. RawCell has the following APIs
12550 List\<Tag\> getTags()
12551 Optional\<Tag\> getTag(byte type)
12552 byte[] cloneTags()
12554 The above APIs helps to read tags from the Cell. 
12556 CellUtil#createCell(Cell cell, List\<Tag\> tags)
12557 CellUtil#createCell(Cell cell, byte[] tags)
12558 CellUtil#createCell(Cell cell, byte[] value, byte[] tags)
12559 are deprecated.
12560 If CPs want to create a cell with Tags they can use the RegionCoprocessorEnvironment#getCellBuilder() that returns an ExtendedCellBuilder.
12561 Using ExtendedCellBuilder the CP can create Cells with Tags. Other helper methods to work on Tags are available as static APIs in Tag interface.
12566 * [HBASE-19266](https://issues.apache.org/jira/browse/HBASE-19266) | *Minor* | **TestAcidGuarantees should cover adaptive in-memory compaction**
12568 separate the TestAcidGuarantees by the policy:
12569 1) NONE -\> TestAcidGuaranteesWithNoInMemCompaction
12570 2) BASIC -\> TestAcidGuaranteesWithBasicPolicy
12571 3) EAGER -\> TestAcidGuaranteesWithEagerPolicy
12572 4) ADAPTIVE -\> TestAcidGuaranteesWithAdaptivePolicy
12574 TestAcidGuaranteesWithEagerPolicy and TestAcidGuaranteesWithAdaptivePolicy are disabled by default as the eager policy may cause the negative size of memstore.
12579 * [HBASE-16868](https://issues.apache.org/jira/browse/HBASE-16868) | *Critical* | **Add a replicate\_all flag to avoid misuse the namespaces and table-cfs config of replication peer**
12581 Add a replicate\_all flag to replication peer config. The default value is true, which means all user tables (REPLICATION\_SCOPE != 0 ) will be replicated to peer cluster.
12583 How to config a peer from replicate all to only replicate special namespace/tablecfs?
12584 Step1. Add a new peer with no namespace/tablecfs config, the replicate\_all flag will be true automatically.
12585 Step2. User want only replicate some namespaces or tables, so set replicate\_all flag to false first.
12586 Step3. Add special namespaces or table-cfs config to the replication peer.
12588 How to config a peer from replicate special namespace/tablecfs to replicate all?
12589 Step1. Add a new peer with special namespace/tablecfs config, the replicate\_all flag will be false automatically.
12590 Step2. User want replicate all user tables, so remove the special namespace/tablecfs config first.
12591 Step3. Set replicate\_all flag to true.
12593 How to config replicate nothing?
12594 Set replicate\_all flag to false and no namespace/tablecfs config, then all tables cannot be replicated to peer cluster.
12599 * [HBASE-19122](https://issues.apache.org/jira/browse/HBASE-19122) | *Critical* | **preCompact and preFlush can bypass by returning null scanner; shut it down**
12601 Remove the ability to 'bypass' preFlush and preCompact by returning a null Scanner. Bypass is disallowed on these methods in hbase2.
12606 * [HBASE-19200](https://issues.apache.org/jira/browse/HBASE-19200) | *Major* | **make hbase-client only depend on ZKAsyncRegistry and ZNodePaths**
12608 ConnectionImplementation now uses asynchronous connections to zookeeper via ZKAsyncRegistry to get cluster id, master address, meta region location, etc.
12609 Since ZKAsyncRegistry uses curator framework, this change purges a lot of zookeeper dependencies in hbase-client.
12610 Now hbase-client only depends on only ZKAsyncRegistry, ZNodePaths and the newly introduced ZKMetadata.
12615 * [HBASE-19311](https://issues.apache.org/jira/browse/HBASE-19311) | *Major* | **Promote TestAcidGuarantees to LargeTests and start mini cluster once to make it faster**
12617 Introduce a AcidGuaranteesTestTool and expose as tool instead of TestAcidGuarantees. Now TestAcidGuarantees is just a UT.
12622 * [HBASE-19293](https://issues.apache.org/jira/browse/HBASE-19293) | *Major* | **Support adding a new replication peer in disabled state**
12624 Add a boolean parameter which means the new replication peer's state is enabled or disabled for Admin/AsyncAdmin's addReplicationPeer method. Meanwhile, you can use shell cmd to add a enabled/disabled replication peer. The STATE parameter is optional and the default state is enabled.
12626 hbase\> add\_peer '1', CLUSTER\_KEY =\> "server1.cie.com:2181:/hbase", STATE =\> "ENABLED"
12627 hbase\> add\_peer '1', CLUSTER\_KEY =\> "server1.cie.com:2181:/hbase", STATE =\> "DISABLED"
12632 * [HBASE-19123](https://issues.apache.org/jira/browse/HBASE-19123) | *Major* | **Purge 'complete' support from Coprocesor Observers**
12634 This issue removes the 'complete' facility that was in ObserverContext. It is no longer possible for a Coprocessor to cut the chain-of-invocation and insist its response prevails.
12639 * [HBASE-18911](https://issues.apache.org/jira/browse/HBASE-18911) | *Major* | **Unify Admin and AsyncAdmin's methods name**
12641 Deprecated 4 methods for Admin interface.
12642 Deprecated compactRegionServer(ServerName, boolean). Use compactRegionServer(ServerName) and majorCompactcompactRegionServer(ServerName) instead.
12643 Deprecated getRegionLoad(ServerName) method. Use getRegionLoads(ServerName) instead.
12644 Deprecated getRegionLoad(ServerName, TableName) method. Use getRegionLoads(ServerName, TableName) instead.
12645 Deprecated getQuotaRetriever(QuotaFilter) instead. Use  getQuota(QuotaFilter) instead.
12647 Add 7 methods for Admin interface.
12648 ServerName getMaster();
12649 Collection\<ServerName\> getBackupMasters();
12650 Collection\<ServerName\> getRegionServers();
12651 boolean splitSwitch(boolean enabled, boolean synchronous);
12652 boolean mergeSwitch(boolean enabled, boolean synchronous);
12653 boolean isSplitEnabled();
12654 boolean isMergeEnabled();
12659 * [HBASE-18703](https://issues.apache.org/jira/browse/HBASE-18703) | *Critical* | **Inconsistent behavior for preBatchMutate in doMiniBatchMutate and processRowsWithLocks**
12661 Two write paths Region.batchMutate() and Region.mutateRows() are unified and inconsistencies are resolved.
12666 * [HBASE-18964](https://issues.apache.org/jira/browse/HBASE-18964) | *Major* | **Deprecate RowProcessor and processRowsWithLocks() APIs that take RowProcessor as an argument**
12668 RowProcessor and Region#processRowsWithLocks() methods that take RowProcessor as an argument are deprecated. Use Coprocessors if you want to customize handling.
12673 * [HBASE-19251](https://issues.apache.org/jira/browse/HBASE-19251) | *Major* | **Merge RawAsyncTable and AsyncTable**
12675 Merge the RawAsyncTable and AsyncTable interfaces. Use generic to reflection the difference between the observer style scan API. For the implementation which does not have a user specified thread pool, the observer is AdvancedScanResultConsumer. For the implementation which needs a user specified thread pool, the observer is ScanResultConsumer.
12680 * [HBASE-19262](https://issues.apache.org/jira/browse/HBASE-19262) | *Major* | **Revisit checkstyle rules**
12682 Change the import order rule that now we should put the shaded import at bottom. Ignore the VisibilityModifier warnings for test code.
12687 * [HBASE-19187](https://issues.apache.org/jira/browse/HBASE-19187) | *Minor* | **Remove option to create on heap bucket cache**
12689 Removing the on heap Bucket cache feature.
12690 The config "hbase.bucketcache.ioengine" no longer support the 'heap' value. 
12691 Its supported values now are 'offheap',  'file:\<path\>', 'files:\<path\>'  and 'mmap:\<path\>'
12696 * [HBASE-12350](https://issues.apache.org/jira/browse/HBASE-12350) | *Minor* | **Backport error-prone build support to branch-1 and branch-2**
12698 This change introduces compile time support for running the error-prone suite of static analyses. Enable with -PerrorProne on the Maven command line. Requires JDK 8 or higher. (Don't enable if building with JDK 7.)
12703 * [HBASE-14350](https://issues.apache.org/jira/browse/HBASE-14350) | *Blocker* | **Procedure V2 Phase 2: Assignment Manager**
12705 (Incomplete)
12707 = Incompatbiles
12709 == Coprocessor Incompatibilities
12711 Split/Merge have moved to the Master; it runs them now. Means hooks around Split/Merge are now noops. To intercept Split/Merge phases, CPs need to intercept on MasterObserver.
12716 * [HBASE-19189](https://issues.apache.org/jira/browse/HBASE-19189) | *Major* | **Ad-hoc test job for running a subset of tests lots of times**
12718 <!-- markdown -->
12721 Folks can now test out tests on an arbitrary release branch. Head over to [builds.a.o job "HBase-adhoc-run-tests"](https://builds.apache.org/view/H-L/view/HBase/job/HBase-adhoc-run-tests/), then pick "Build with parameters".
12722 Tests are specified as just names e.g. TestLogRollingNoCluster. can also be a glob. e.g. TestHFile*
12727 * [HBASE-19220](https://issues.apache.org/jira/browse/HBASE-19220) | *Major* | **Async tests time out talking to zk; 'clusterid came back null'**
12729 Changed retries from 3 to 30 for zk initial connect for registry.
12734 * [HBASE-19002](https://issues.apache.org/jira/browse/HBASE-19002) | *Minor* | **Introduce more examples to show how to intercept normal region operations**
12736 With the change in Coprocessor APIs, the hbase-examples module has been updated to provide additional examples that show how to write Coprocessors against the new API.
12741 * [HBASE-18961](https://issues.apache.org/jira/browse/HBASE-18961) | *Major* | **doMiniBatchMutate() is big, split it into smaller methods**
12743 HRegion.batchMutate()/ doMiniBatchMutate() is refactored with aim to unify batchMutate() and mutateRows() code paths later. batchMutate() currently handles 2 types of batches: MutationBatchOperations and ReplayBatchOperations. Common base class BatchOperations is augmented with common methods which are overridden in derived classes as needed. doMiniBatchMutate() is implemented using common methods in base class BatchOperations.
12748 * [HBASE-19103](https://issues.apache.org/jira/browse/HBASE-19103) | *Minor* | **Add BigDecimalComparator for filter**
12750 If BigDecimal is stored as value, and you need to add a matched comparator to the value filter when scanning, a BigDecimalComparator can be used.
12755 * [HBASE-19111](https://issues.apache.org/jira/browse/HBASE-19111) | *Critical* | **Add missing CellUtil#isPut(Cell) methods**
12757 A new public API method was added to CellUtil "isPut(Cell)" for clients to use to determine if the Cell is for a Put operation.
12759 Additionally, other CellUtil API calls which expose Cell-implementation were marked as deprecated and will be removed in a future version.
12764 * [HBASE-19160](https://issues.apache.org/jira/browse/HBASE-19160) | *Critical* | **Re-expose CellComparator**
12766 CellComparator is now InterfaceAudience.Public
12771 * [HBASE-19131](https://issues.apache.org/jira/browse/HBASE-19131) | *Major* | **Add the ClusterStatus hook and cleanup other hooks which can be replaced by ClusterStatus hook**
12773 1) Add preGetClusterStatus() and postGetClusterStatus() hooks
12774 2) add preGetClusterStatus() to access control check - an admin action
12779 * [HBASE-19095](https://issues.apache.org/jira/browse/HBASE-19095) | *Major* | **Add CP hooks in RegionObserver for in memory compaction**
12781 Add 4 methods in RegionObserver:
12782 preMemStoreCompaction
12783 preMemStoreCompactionCompactScannerOpen
12784 preMemStoreCompactionCompact
12785 postMemStoreCompaction
12786 preMemStoreCompaction and postMemStoreCompaction will always be called for all in memory compactions. Under eager mode, preMemStoreCompactionCompactScannerOpen will be called before opening store scanner to allow you changing the max versions and TTL, and preMemStoreCompactionCompact will be called after the creation to let you do wrapping.
12791 * [HBASE-19152](https://issues.apache.org/jira/browse/HBASE-19152) | *Trivial* | **Update refguide 'how to build an RC' and the make\_rc.sh script**
12793 The make\_rc.sh script can run an hbase2 build now generating tarballs and pushing up to maven repository. TODO: Sign and checksum, check tarball, push to apache dist.....
12798 * [HBASE-19179](https://issues.apache.org/jira/browse/HBASE-19179) | *Critical* | **Remove hbase-prefix-tree**
12800 Purged the hbase-prefix-tree module and all references from the code base.
12802 prefix-tree data block encoding was a super cool experimental feature that saw some usage initially but has since languished. If interested in carrying this sweet facility forward, write the dev list and we'll restore this module.
12807 * [HBASE-19176](https://issues.apache.org/jira/browse/HBASE-19176) | *Major* | **Remove hbase-native-client from branch-2**
12809 Removed the hbase-native-client module from branch-2 (it is still in Master). It is not complete. Look for a finished C++ client in the near future. Will restore native client to branch-2 at that point.
12814 * [HBASE-19144](https://issues.apache.org/jira/browse/HBASE-19144) | *Major* | **[RSgroups] Retry assignments in FAILED\_OPEN state when servers (re)join the cluster**
12816 When regionserver placement groups (RSGroups) is active, as servers join the cluster the Master will attempt to reassign regions in FAILED\_OPEN state.
12821 * [HBASE-18770](https://issues.apache.org/jira/browse/HBASE-18770) | *Critical* | **Remove bypass method in ObserverContext and implement the 'bypass' logic case by case**
12823 Removes blanket bypass mechanism (Observer#bypass). Instead, a curated subset of methods are bypassable.
12825     Changes Coprocessor ObserverContext 'bypass' semantic. We flip the
12826     default so bypass is NOT supported on Observer invocations; only a
12827     couple of preXXX methods in RegionObserver allow it: e.g.  preGet
12828     and prePut but not preFlush, etc. Everywhere else, we throw
12829     a Exception if a Coprocessor Observer tries to invoke bypass. Master
12830     Observers can no longer stop or change move, split, assign, create table, etc.
12831     preBatchMutate can no longer be bypassed (bypass the finer-grained
12832     prePut, preDelete, etc. instead)
12834     Ditto on complete, the mechanism that allowed a Coprocessor
12835     rule that all subsequent Coprocessors are skipped in an
12836     invocation chain; now, complete is only available to
12837     bypassable methods (and Coprocessors will get an exception if
12838     they try to 'complete' when it is not allowed).
12840     See javadoc for whether a Coprocessor Observer method supports
12841     'bypass'. If no mention, 'bypass' is NOT supported.
12843 The below methods have been marked deprecated in hbase2. We would have liked to have removed them because they use IA.Private parameters but they are in use by CoreCoprocessors or are critical to downstreamers and we have no alternatives to provide currently.
12845 @Deprecated public boolean prePrepareTimeStampForDeleteVersion(final Mutation mutation, final Cell kv, final byte[] byteNow, final Get get) throws IOException {
12846               
12847 @Deprecated public boolean preWALRestore(final RegionInfo info, final WALKey logKey, final WALEdit logEdit) throws IOException {
12849 @Deprecated public void postWALRestore(final RegionInfo info, final WALKey logKey, final WALEdit logEdit) throws IOException {
12850        
12851 @Deprecated public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException 
12853 Metrics are updated now even if the Coprocessor does a bypass; e.g. The put count is updated even if a Coprocessor bypasses the core put operation (We do it this way so no need for Coprocessors to have access to our core metrics system).
12858 * [HBASE-19033](https://issues.apache.org/jira/browse/HBASE-19033) | *Blocker* | **Allow CP users to change versions and TTL before opening StoreScanner**
12860 Add back the three methods without a return value:
12861 preFlushScannerOpen
12862 preCompactScannerOpen
12863 preStoreScannerOpen
12865 Introduce a ScanOptions interface to let CP users change the max versions and TTL of a ScanInfo. It will be passed as a parameter in the three methods above.
12867 Inntroduce a new example WriteHeavyIncrementObserver which convert increment to put and do aggregating when get. It uses the above three methods.
12872 * [HBASE-19110](https://issues.apache.org/jira/browse/HBASE-19110) | *Minor* | **Add default for Server#isStopping & #getFileSystem**
12874 Made defaults for Server#isStopping and Server#getFileSystem. Should have done this when I added them (lesson learned, was actually mentioned in a review).
12879 * [HBASE-19047](https://issues.apache.org/jira/browse/HBASE-19047) | *Critical* | **CP exposed Scanner types should not extend Shipper**
12881 RegionObserver#preScannerOpen signature changed
12882 RegionScanner preScannerOpen( ObserverContext\<RegionCoprocessorEnvironment\> c, Scan scan,  RegionScanner s)   -\>   void preScannerOpen( ObserverContext\<RegionCoprocessorEnvironment\> c, Scan scan)  
12883 The pre hook can no longer return a RegionScanner instance.
12888 * [HBASE-18995](https://issues.apache.org/jira/browse/HBASE-18995) | *Critical* | **Move methods that are for internal usage from CellUtil to Private util class**
12890 Split CellUtil into public CellUtil and PrivateCellUtil for Internal use only.
12895 * [HBASE-18906](https://issues.apache.org/jira/browse/HBASE-18906) | *Critical* | **Provide Region#waitForFlushes API**
12897 Provided an API in Region (Exposed to CPs)
12898 boolean waitForFlushes(long timeout)
12899 This call will make the current thread to be waiting for all flushes in this region to be finished.  (Upto the time out time being specified). The boolean return value specify whether the flushes are really over or the time out being elapsed. Return false when timeout elapsed but flushes are not over or  true when flushes are over
12904 * [HBASE-18905](https://issues.apache.org/jira/browse/HBASE-18905) | *Major* | **Allow CPs to request flush on Region and know the completion of the requested flush**
12906 Add a FlushLifeCycleTracker which is similiar to CompactionLifeCycleTracker for tracking flush.
12907 Add a requestFlush method in Region interface to let CP users request flush on a region. The operation is asynchronous, you need to use the FlushLifeCycleTracker to track the flush.
12908 The difference with CompactionLifeCycleTracker is that, flush is per region so we do not use Store as a parameter of the methods. And also, notExecuted means the whole flush has not been executed, and afterExecution means the whole flush has been finished, so we do not have a separated completed method. A flush will be ended either by notExecuted or afterExecution.
12913 * [HBASE-19048](https://issues.apache.org/jira/browse/HBASE-19048) | *Major* | **Cleanup MasterObserver hooks which takes IA private params**
12915 Purged InterfaceAudience.Private parameters from methods in MasterObserver.
12917 preAbortProcedure no longer takes a ProcedureExecutor.
12919 postGetProcedures no longer takes a list of Procedures.
12921 postGetLocks no longer takes a list of locks.
12923 preRequestLock and postRequestLock no longer take lock type.
12925 preLockHeartbeat and postLockHeartbeat no longer takes a lock procedure.
12927 The implication is that that the Coprocessors that depended on these params have had to coarsen so for example, the AccessController can not do access per Procedure or Lock but rather, makes a judgement on the general access (You'll need to be ADMIN to see list of procedures and locks).
12932 * [HBASE-18994](https://issues.apache.org/jira/browse/HBASE-18994) | *Major* | **Decide if META/System tables should use Compacting Memstore or Default Memstore**
12934 Added a new config 'hbase.systemtables.compacting.memstore.type"  for the system tables. By default all the system tables will have 'NONE' as the type and so it will be using the default memstore by default.
12935 {code}
12936  \<property\>
12937     \<name\>hbase.systemtables.compacting.memstore.type\</name\>
12938     \<value\>NONE\</value\>
12939   \</property\>
12940 {code}
12945 * [HBASE-19029](https://issues.apache.org/jira/browse/HBASE-19029) | *Critical* | **Align RPC timout methods in Table and AsyncTableBase**
12947 Deprecate the following methods in Table:
12948 - int getRpcTimeout()
12949 - int getReadRpcTimeout()
12950 - int getWriteRpcTimeout()
12951 - int getOperationTimeout()
12953 Add the following methods to Table:
12954 - long getRpcTimeout(TimeUnit)
12955 - long getReadRpcTimeout(TimeUnit)
12956 - long getWriteRpcTimeout(TimeUnit)
12957 - long getOperationTimeout(TimeUnit)
12959 Add missing deprecation tag for long getRpcTimeout(TimeUnit unit) in AsyncTableBase
12964 * [HBASE-18410](https://issues.apache.org/jira/browse/HBASE-18410) | *Major* | **FilterList  Improvement.**
12966 In this task, we fixed all existing bugs in FilterList, and did the code refactor which ensured interface compatibility .  
12968 The primary bug  fixes are : 
12969 1. For sub-filter in FilterList with MUST\_PASS\_ONE, if previous filterKeyValue() of sub-filter returns NEXT\_COL, we cannot make sure that the next cell will be the first cell in next column, because FilterList choose the minimal forward step among sub-filters, and it may return a SKIP. so here we add an extra check to ensure that the next cell will match preivous return code for sub-filters. 
12970 2. Previous logic about transforming cell of FilterList is incorrect, we should set the previous transform result (rather than the given cell in question) as the initial vaule of transform cell before call filterKeyValue() of FilterList.
12971 3. Handle the ReturnCodes which the previous code did not handle. 
12973 About code refactor, we divided the FilterList into two separated sub-classes: FilterListWithOR and FilterListWithAND,  The FilterListWithOR has been optimised to choose the next minimal step to seek cell rather than SKIP cell one by one, and the FilterListWithAND  has been optimised to choose the next maximal key to seek among sub-filters in filter list. All in all, The code in FilterList is clean and easier to follow now.
12975 Note that ReturnCode NEXT\_ROW has been redefined as skipping to next row in current family,   not to next row in all family. it’s more reasonable, because ReturnCode is a concept in store level, not in region level.
12977 Another bug that needs attention is: filterAllRemaining() in FilterList with MUST\_PASS\_ONE  will now return false if the filter list is empty whereas earlier it used to return true for Operator.MUST\_PASS\_ONE.  it's more reasonable now.
12982 * [HBASE-19077](https://issues.apache.org/jira/browse/HBASE-19077) | *Critical* | **Have Region\*CoprocessorEnvironment provide an ImmutableOnlineRegions**
12984 Adds getOnlineRegions to the RegionCoprocessorEnvironment (Context) and ditto to RegionServerCoprocessorEnvironment. Allows Coprocessor get list of Regions online on the currently hosting RegionServer.
12989 * [HBASE-19021](https://issues.apache.org/jira/browse/HBASE-19021) | *Critical* | **Restore a few important missing logics for balancer in 2.0**
12991 Re-enabled 'hbase.master.loadbalance.bytable', default 'false'.
12992 Draining servers are removed from consideration by blancer.balanceCluster() call.
12997 * [HBASE-19049](https://issues.apache.org/jira/browse/HBASE-19049) | *Major* | **Update kerby to 1.0.1 GA release**
12999 HBase now relies on Kerby version 1.0.1 for its test environment. No downstream facing change is expected.
13004 * [HBASE-16290](https://issues.apache.org/jira/browse/HBASE-16290) | *Major* | **Dump summary of callQueue content; can help debugging**
13006 Patch to print summary of call queues by size and count. This is displayed on the debug dump page of region server UI
13011 * [HBASE-18846](https://issues.apache.org/jira/browse/HBASE-18846) | *Major* | **Accommodate the hbase-indexer/lily/SEP consumer deploy-type**
13013 Makes it so hbase-indexer/lily can move off dependence on internal APIs and instead move to public APIs.
13015 Adds being able to disable near-all HRegionServer services. This along with an existing plugin mechanism which allows configuring the RegionServer to host an alternate Connection implementation, makes it so we can put up a cluster of hollowed-out HRegionServers purposed to pose as a Replication Sink for a source HBase Cluster (Users do not need to figure our RPC, our PB encodings, build a distributed service, etc.). In the alternate supplied Connection implementation, hbase-indexer would install its own code to catch the Replication.
13017 Below and attached are sample hbase-server.xml files and alternate Connection implementations. To start up an HRegionServer as a sink, first make sure there is a ZooKeeper ensemble we can talk to. If none, just start one:
13018 {code}
13019 ./bin/hbase-daemon.sh start zookeeper
13020 {code}
13022 To start up a single RegionServer, put in place the below sample hbase-site.xml and a derviative of the below IndexerConnection on the CLASSPATH, and then start the RegionServer:
13023 {code}
13024 ./bin/hbase-daemon.sh  start  org.apache.hadoop.hbase.regionserver.HRegionServer
13025 {code}
13026 Stdout and Stderr will go into files under configured logs directory. Browse to localhost:16030 to find webui (unless disabled).
13028 DETAILS
13030 This patch adds configuration to disable RegionServer internal Services, Managers, Caches, etc., starting up.
13032 By default a RegionServer starts up an Admin and Client Service. To disable either or both, use the below booleans:
13033 {code}
13034 hbase.regionserver.admin.service
13035 hbase.regionserver.client.service
13036 {code}
13038 Both default true.
13040 To make a HRegionServer startup and stay up without expecting to communicate with a master, set the below boolean to false:
13042 {code}
13043 hbase.masterless
13044 {code]
13045 Default is false.
13047 h3. Sample hbase-site.xml that disables internal HRegionServer Services
13048 Below is an example hbase-site.xml that turns off most Services and that then installs an alternate Connection implementation, one that is nulled out in all regards except in being able to return a "Table" that can catch a Replication Stream in its {code}batch(List\<? extends Row\> actions, Object[] results){code} method. i.e. what the hbase-indexer wants. I also add the example alternate Connection implementation below (both of these files are also attached to this issue). Expects there to be an up and running zookeeper ensemble.
13050 {code}
13051 \<configuration\>
13052   \<!-- This file is an example for hbase-indexer. It shuts down
13053        facility in the regionserver and interjects a special
13054        Connection implementation which is how hbase-indexer will
13055        receive the replication stream from source hbase cluster.
13056        See the class referenced in the config.
13058        Most of the config in here is booleans set to off and
13059        setting values to zero so services doon't start. Some of
13060        the flags are new via this patch.
13061 --\>
13062   \<!--Need this for the RegionServer to come up standalone--\>
13063   \<property\>
13064     \<name\>hbase.cluster.distributed\</name\>
13065     \<value\>true\</value\>
13066   \</property\>
13068   \<!--This is what you implement, a Connection that returns a Table that
13069        overrides the batch call. It is at this point you do your indexer inserts.
13070     --\>
13071   \<property\>
13072     \<name\>hbase.client.connection.impl\</name\>
13073     \<value\>org.apache.hadoop.hbase.client.IndexerConnection\</value\>
13074     \<description\>A customs connection implementation just so we can interject our
13075       own Table class, one that has an override for the batch call which receives
13076       the replication stream edits; i.e. it is called by the replication sink
13077       #replicateEntries method.\</description\>
13078   \</property\>
13080   \<!--Set hbase.regionserver.info.port to -1 for no webui--\>
13082   \<!--Below are configs to shut down unused services in hregionserver--\>
13083   \<property\>
13084     \<name\>hbase.regionserver.admin.service\</name\>
13085     \<value\>false\</value\>
13086     \<description\>Do NOT stand up an Admin Service Interface on RPC\</description\>
13087   \</property\>
13088   \<property\>
13089     \<name\>hbase.regionserver.client.service\</name\>
13090     \<value\>false\</value\>
13091     \<description\>Do NOT stand up a client-facing Service on RPC\</description\>
13092   \</property\>
13093   \<property\>
13094     \<name\>hbase.wal.provider\</name\>
13095     \<value\>org.apache.hadoop.hbase.wal.DisabledWALProvider\</value\>
13096     \<description\>Set WAL service to be the null WAL\</description\>
13097   \</property\>
13098   \<property\>
13099     \<name\>hbase.regionserver.workers\</name\>
13100     \<value\>false\</value\>
13101     \<description\>Turn off all background workers, log splitters, executors, etc.\</description\>
13102   \</property\>
13103   \<property\>
13104     \<name\>hfile.block.cache.size\</name\>
13105     \<value\>0.0001\</value\>
13106     \<description\>Turn off block cache completely\</description\>
13107   \</property\>
13108   \<property\>
13109     \<name\>hbase.mob.file.cache.size\</name\>
13110     \<value\>0\</value\>
13111     \<description\>Disable MOB cache.\</description\>
13112   \</property\>
13113   \<property\>
13114     \<name\>hbase.masterless\</name\>
13115     \<value\>true\</value\>
13116     \<description\>Do not expect Master in cluster.\</description\>
13117   \</property\>
13118   \<property\>
13119     \<name\>hbase.regionserver.metahandler.count\</name\>
13120     \<value\>1\</value\>
13121     \<description\>How many priority handlers to run; we probably need none.
13122     Default is 20 which is too much on a server like this.\</description\>
13123   \</property\>
13124   \<property\>
13125     \<name\>hbase.regionserver.replication.handler.count\</name\>
13126     \<value\>1\</value\>
13127     \<description\>How many replication handlers to run; we probably need none.
13128     Default is 3 which is too much on a server like this.\</description\>
13129   \</property\>
13130   \<property\>
13131     \<name\>hbase.regionserver.handler.count\</name\>
13132     \<value\>10\</value\>
13133     \<description\>How many default handlers to run; tie to # of CPUs.
13134     Default is 30 which is too much on a server like this.\</description\>
13135   \</property\>
13136   \<property\>
13137     \<name\>hbase.ipc.server.read.threadpool.size\</name\>
13138     \<value\>3\</value\>
13139     \<description\>How many Listener request reaaders to run; tie to a portion # of CPUs (1/4?).
13140     Default is 10 which is too much on a server like this.\</description\>
13141   \</property\>
13142 \</configuration\>
13143 {code}
13145 h2. Sample Connection Implementation
13146 Has call-out for where an hbase-indexer would insert its capture code.
13147 {code}
13148 package org.apache.hadoop.hbase.client;
13150 import com.google.protobuf.Descriptors;
13151 import com.google.protobuf.Message;
13152 import com.google.protobuf.Service;
13153 import com.google.protobuf.ServiceException;
13154 import org.apache.hadoop.conf.Configuration;
13155 import org.apache.hadoop.hbase.CompareOperator;
13156 import org.apache.hadoop.hbase.HTableDescriptor;
13157 import org.apache.hadoop.hbase.TableName;
13158 import org.apache.hadoop.hbase.client.coprocessor.Batch;
13159 import org.apache.hadoop.hbase.filter.CompareFilter;
13160 import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;
13161 import org.apache.hadoop.hbase.security.User;
13163 import java.io.IOException;
13164 import java.util.List;
13165 import java.util.Map;
13166 import java.util.concurrent.ExecutorService;
13169 /\*\*
13170  \* Sample class for hbase-indexer.
13171  \* DO NOT COMMIT TO HBASE CODEBASE!!!
13172  \* Overrides Connection just so we can return a Table that has the
13173  \* method that the replication sink calls, i.e. Table#batch.
13174  \* It is at this point that the hbase-indexer catches the replication
13175  \* stream so it can insert into the lucene index.
13176  \*/
13177 public class IndexerConnection implements Connection {
13178   private final Configuration conf;
13179   private final User user;
13180   private final ExecutorService pool;
13181   private volatile boolean closed = false;
13183   public IndexerConnection(Configuration conf, ExecutorService pool, User user) throws IOException {
13184     this.conf = conf;
13185     this.user = user;
13186     this.pool = pool;
13187   }
13189   @Override
13190   public void abort(String why, Throwable e) {}
13192   @Override
13193   public boolean isAborted() {
13194     return false;
13195   }
13197   @Override
13198   public Configuration getConfiguration() {
13199     return this.conf;
13200   }
13202   @Override
13203   public BufferedMutator getBufferedMutator(TableName tableName) throws IOException {
13204     return null;
13205   }
13207   @Override
13208   public BufferedMutator getBufferedMutator(BufferedMutatorParams params) throws IOException {
13209     return null;
13210   }
13212   @Override
13213   public RegionLocator getRegionLocator(TableName tableName) throws IOException {
13214     return null;
13215   }
13217   @Override
13218   public Admin getAdmin() throws IOException {
13219     return null;
13220   }
13222   @Override
13223   public void close() throws IOException {
13224     if (!this.closed) this.closed = true;
13225   }
13227   @Override
13228   public boolean isClosed() {
13229     return this.closed;
13230   }
13232   @Override
13233   public TableBuilder getTableBuilder(final TableName tn, ExecutorService pool) {
13234     if (isClosed()) {
13235       throw new RuntimeException("IndexerConnection is closed.");
13236     }
13237     final Configuration passedInConfiguration = getConfiguration();
13238     return new TableBuilder() {
13239       @Override
13240       public TableBuilder setOperationTimeout(int timeout) {
13241         return null;
13242       }
13244       @Override
13245       public TableBuilder setRpcTimeout(int timeout) {
13246         return null;
13247       }
13249       @Override
13250       public TableBuilder setReadRpcTimeout(int timeout) {
13251         return null;
13252       }
13254       @Override
13255       public TableBuilder setWriteRpcTimeout(int timeout) {
13256         return null;
13257       }
13259       @Override
13260       public Table build() {
13261         return new Table() {
13262           private final Configuration conf = passedInConfiguration;
13263           private final TableName tableName = tn;
13265           @Override
13266           public TableName getName() {
13267             return this.tableName;
13268           }
13270           @Override
13271           public Configuration getConfiguration() {
13272             return this.conf;
13273           }
13275           @Override
13276           public void batch(List\<? extends Row\> actions, Object[] results)
13277           throws IOException, InterruptedException {
13278             // Implementation goes here.
13279           }
13281           @Override
13282           public HTableDescriptor getTableDescriptor() throws IOException {
13283             return null;
13284           }
13286           @Override
13287           public TableDescriptor getDescriptor() throws IOException {
13288             return null;
13289           }
13291           @Override
13292           public boolean exists(Get get) throws IOException {
13293             return false;
13294           }
13296           @Override
13297           public boolean[] existsAll(List\<Get\> gets) throws IOException {
13298             return new boolean[0];
13299           }
13301           @Override
13302           public \<R\> void batchCallback(List\<? extends Row\> actions, Object[] results, Batch.Callback\<R\> callback) throws IOException, InterruptedException {
13304           }
13306           @Override
13307           public Result get(Get get) throws IOException {
13308             return null;
13309           }
13311           @Override
13312           public Result[] get(List\<Get\> gets) throws IOException {
13313             return new Result[0];
13314           }
13316           @Override
13317           public ResultScanner getScanner(Scan scan) throws IOException {
13318             return null;
13319           }
13321           @Override
13322           public ResultScanner getScanner(byte[] family) throws IOException {
13323             return null;
13324           }
13326           @Override
13327           public ResultScanner getScanner(byte[] family, byte[] qualifier) throws IOException {
13328             return null;
13329           }
13331           @Override
13332           public void put(Put put) throws IOException {
13334           }
13336           @Override
13337           public void put(List\<Put\> puts) throws IOException {
13339           }
13341           @Override
13342           public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put) throws IOException {
13343             return false;
13344           }
13346           @Override
13347           public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[] value, Put put) throws IOException {
13348             return false;
13349           }
13351           @Override
13352           public boolean checkAndPut(byte[] row, byte[] family, byte[] qualifier, CompareOperator op, byte[] value, Put put) throws IOException {
13353             return false;
13354           }
13356           @Override
13357           public void delete(Delete delete) throws IOException {
13359           }
13361           @Override
13362           public void delete(List\<Delete\> deletes) throws IOException {
13364           }
13366           @Override
13367           public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier, byte[] value, Delete delete) throws IOException {
13368             return false;
13369           }
13371           @Override
13372           public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[] value, Delete delete) throws IOException {
13373             return false;
13374           }
13376           @Override
13377           public boolean checkAndDelete(byte[] row, byte[] family, byte[] qualifier, CompareOperator op, byte[] value, Delete delete) throws IOException {
13378             return false;
13379           }
13381           @Override
13382           public void mutateRow(RowMutations rm) throws IOException {
13384           }
13386           @Override
13387           public Result append(Append append) throws IOException {
13388             return null;
13389           }
13391           @Override
13392           public Result increment(Increment increment) throws IOException {
13393             return null;
13394           }
13396           @Override
13397           public long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, long amount) throws IOException {
13398             return 0;
13399           }
13401           @Override
13402           public long incrementColumnValue(byte[] row, byte[] family, byte[] qualifier, long amount, Durability durability) throws IOException {
13403             return 0;
13404           }
13406           @Override
13407           public void close() throws IOException {
13409           }
13411           @Override
13412           public CoprocessorRpcChannel coprocessorService(byte[] row) {
13413             return null;
13414           }
13416           @Override
13417           public \<T extends Service, R\> Map\<byte[], R\> coprocessorService(Class\<T\> service, byte[] startKey, byte[] endKey, Batch.Call\<T, R\> callable) throws ServiceException, Throwable {
13418             return null;
13419           }
13421           @Override
13422           public \<T extends Service, R\> void coprocessorService(Class\<T\> service, byte[] startKey, byte[] endKey, Batch.Call\<T, R\> callable, Batch.Callback\<R\> callback) throws ServiceException, Throwable {
13424           }
13426           @Override
13427           public \<R extends Message\> Map\<byte[], R\> batchCoprocessorService(Descriptors.MethodDescriptor methodDescriptor, Message request, byte[] startKey, byte[] endKey, R responsePrototype) throws ServiceException, Throwable {
13428             return null;
13429           }
13431           @Override
13432           public \<R extends Message\> void batchCoprocessorService(Descriptors.MethodDescriptor methodDescriptor, Message request, byte[] startKey, byte[] endKey, R responsePrototype, Batch.Callback\<R\> callback) throws ServiceException, Throwable {
13434           }
13436           @Override
13437           public boolean checkAndMutate(byte[] row, byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[] value, RowMutations mutation) throws IOException {
13438             return false;
13439           }
13441           @Override
13442           public boolean checkAndMutate(byte[] row, byte[] family, byte[] qualifier, CompareOperator op, byte[] value, RowMutations mutation) throws IOException {
13443             return false;
13444           }
13446           @Override
13447           public void setOperationTimeout(int operationTimeout) {
13449           }
13451           @Override
13452           public int getOperationTimeout() {
13453             return 0;
13454           }
13456           @Override
13457           public int getRpcTimeout() {
13458             return 0;
13459           }
13461           @Override
13462           public void setRpcTimeout(int rpcTimeout) {
13464           }
13466           @Override
13467           public int getReadRpcTimeout() {
13468             return 0;
13469           }
13471           @Override
13472           public void setReadRpcTimeout(int readRpcTimeout) {
13474           }
13476           @Override
13477           public int getWriteRpcTimeout() {
13478             return 0;
13479           }
13481           @Override
13482           public void setWriteRpcTimeout(int writeRpcTimeout) {
13484           }
13485         };
13486       }
13487     };
13488   }
13490 {code}
13495 * [HBASE-18873](https://issues.apache.org/jira/browse/HBASE-18873) | *Critical* | **Hide protobufs in GlobalQuotaSettings**
13497 GlobalQuotaSettings was introduced to avoid protocol-specific Java classes from leaking into API which is users may leverage. This class has a number of methods which return plain-Java-objects instead of these protocol-specific classes in an effort to better provide stability in the future.
13502 * [HBASE-18893](https://issues.apache.org/jira/browse/HBASE-18893) | *Major* | **Remove Add/Modify/DeleteColumnFamilyProcedure in favor of using ModifyTableProcedure**
13504 The RPC calls for Add/Modify/DeleteColumn have been removed and are now backed by ModifyTable functionality. The corresponding permissions in AccessController have been removed as well.
13506 The shell already bypassed these RPCs and used ModifyTable directly, and thus would not be getting these permission checks, this change brings the rest of the RPC inline with that.
13508 Coprocessor hooks for pre/post Add/Modify/DeleteColumn have likewise been removed. Coprocessors needing to take special actions on schema change should instead process ModifyTable events (which they should have been doing already, but it was easy for developers to miss this nuance).
13513 * [HBASE-16338](https://issues.apache.org/jira/browse/HBASE-16338) | *Major* | **update jackson to 2.y**
13515 HBase has upgraded from Jackson 1 to Jackson 2. JSON output should not have changed and this should not be user facing, but server classpaths should be adjusted accordingly.
13520 * [HBASE-19051](https://issues.apache.org/jira/browse/HBASE-19051) | *Minor* | **Add new split algorithm for num string**
13522 Add new split algorithm DecimalStringSplit,row are decimal-encoded long values in the range "00000000" =\> "99999999" .
13523 create 't1','f', { NUMREGIONS =\> 10 , SPLITALGO =\> 'DecimalStringSplit' }
13524 The split point will be 10000000,20000000,...,90000000
13529 * [HBASE-19067](https://issues.apache.org/jira/browse/HBASE-19067) | *Major* | **Do not expose getHDFSBlockDistribution in StoreFile**
13531 Removed CP exposed StoreFile#getHDFSBlockDistribution
13536 * [HBASE-18989](https://issues.apache.org/jira/browse/HBASE-18989) | *Major* | **Polish the compaction related CP hooks**
13538 Add two new methods in CompactionLifeCycleTracker.
13539 The notExecuted method will be called if the selectCompaction failed or space quota limitation reached.
13540 The completed method will be called after all the requested compactions are finished. The compaction scheduling is pre Store so if you request compaction on a region it may lead to multiple compactions.
13541 Remove the User parameter in Region.requestCompaction methods as it is useless for CP users.
13542 Add a boolean parameter to indicate whether you want to do a major compaction. And so that the triggerMajorCompaction method is removed.
13543 Remove the getCompactionProgress method in Store interface.
13544 Add a UT to confirm that CompactionLifeCycleTracker works correctly, and it also shows how to use CompactionLifeCycleTracker to wait for the completion of a compaction.
13549 * [HBASE-19046](https://issues.apache.org/jira/browse/HBASE-19046) | *Major* | **RegionObserver#postCompactSelection  Avoid passing shaded ImmutableList param**
13551 RegionObserver#postCompactSelection signature is changed.
13552 Arg type org.apache.hadoop.hbase.shaded.com.google.common.collect.ImmutableList is replaced with java.util.List
13557 * [HBASE-19043](https://issues.apache.org/jira/browse/HBASE-19043) | *Major* | **Purge TableWrapper and CoprocessorHConnnection**
13559 Removes getTable from the CoprocessorEnvrionment Interface and from the BaseEnvironment implementation. Also removes TableWrapper and CoprocessorHConnection, two classes that were used by BaseEnvironment to keep a tag on Tables created by Coprocessors that BaseEnvironment might close them out on #shutdown.
13561 Long after these classes and methods were added, in HBase 1.0.0, we moved to a mode where management of Tables was shifted from HBase to the Client; the Client is to manage lifecycle. Table also became a (relatively) lightweight construct so folks are used to getting a Table instance, using it, and then immediately closing it when done.
13563 Coprocessors should do the same in hbase2.0.0.
13565 CoprocessorHConnection short-circuited RPC. This feature has since been integrated into Server Connections; when they create a Connection, they get one that will short-circuit if the request is to a localhost so no need of CoprocessorHConnection any more.
13567 Coprocessors get the Server Connection when they ask for a Connection from their \*CoprocessorEnvironment.
13572 * [HBASE-19014](https://issues.apache.org/jira/browse/HBASE-19014) | *Major* | **surefire fails; When writing xml report stdout/stderr ... No such file or directory**
13574 Running tests with a wildcard selector, i.e.{{-Dtest=org.apache.hadoop.hbase.server.\*}} no longer works.
13579 * [HBASE-10367](https://issues.apache.org/jira/browse/HBASE-10367) | *Major* | **RegionServer graceful stop / decommissioning**
13581 Added three top level Admin APIs to help decommissioning and graceful stop of region servers.
13583   /\*\*
13584    \* Mark region server(s) as decommissioned to prevent additional regions from getting
13585    \* assigned to them. Optionally unload the regions on the servers. If there are multiple servers
13586    \* to be decommissioned, decommissioning them at the same time can prevent wasteful region
13587    \* movements. Region unloading is asynchronous.
13588    \* @param servers The list of servers to decommission.
13589    \* @param offload True to offload the regions from the decommissioned servers
13590    \*/
13591   void decommissionRegionServers(List\<ServerName\> servers, boolean offload) throws IOException;
13593   /\*\*
13594    \* List region servers marked as decommissioned, which can not be assigned regions.
13595    \* @return List of decommissioned region servers.
13596    \*/
13597   List\<ServerName\> listDecommissionedRegionServers() throws IOException;
13599   /\*\*
13600    \* Remove decommission marker from a region server to allow regions assignments.
13601    \* Load regions onto the server if a list of regions is given. Region loading is
13602    \* asynchronous.
13603    \* @param server The server to recommission.
13604    \* @param encodedRegionNames Regions to load onto the server.
13605    \*/
13606   void recommissionRegionServer(ServerName server, List\<byte[]\> encodedRegionNames)  throws IOException;
13611 * [HBASE-19042](https://issues.apache.org/jira/browse/HBASE-19042) | *Blocker* | **Oracle Java 8u144 downloader broken in precommit check**
13613 Precommit switched from Oracle JDK 8 to OpenJDK-8.
13618 * [HBASE-18945](https://issues.apache.org/jira/browse/HBASE-18945) | *Major* | **Make a IA.LimitedPrivate interface for CellComparator**
13620 CellCompartor has been added as an interface with IA.LimitedPrivate. It has the following methods
13621 #int compare(Cell leftCell, Cell rightCell);
13622 #int compareRows(Cell leftCell, Cell rightCell)
13623 #int compareRows(Cell cell, byte[] bytes, int offset, int length)
13624 #int compareWithoutRow(Cell leftCell, Cell rightCell)
13625 #int compareFamilies(Cell leftCell, Cell rightCell
13626 #int compareQualifiers(Cell leftCell, Cell rightCell)
13627 #int compareTimestamps(Cell leftCell, Cell rightCell)
13628 #int compareTimestamps(long leftCellts, long rightCellts)
13630 This is exposed to CPs and CPs can make use of the above methods to do comparisons on the cells.
13631 For internal usage we have CellComparatorImpl and it has static references to COMPARATOR and META\_CELL\_COMPARATOR.
13632 So when a region or store is initialized we should use one of the above comparator. For META table we need the META\_CELL\_COMPARATOR and all other table's  regions/stores will use the COMPARTOR.
13633 While writing the comparator name in FixedFileTrailer of the Hfile we have now ensured that this rename of CellComparator.COMPARATOR/CellComparator.META\_CELL\_COMPARATOR to CellComparatorImpl.COMPARATOR/CellComparatorImpl.META\_CELL\_COMPARATOR is handled.
13635 CellUtils is an util method that provides lot of APIs that helps to do compare, matching functionalities between two cells, or with a cell and a corrpesponding byte[] etc. Some of the APIs are internally used which will be cleaned up in a follow on JIRA HBASE-18995.
13640 * [HBASE-19001](https://issues.apache.org/jira/browse/HBASE-19001) | *Major* | **Remove the hooks in RegionObserver which are designed to construct a StoreScanner which is marked as IA.Private**
13642 These methods are removed:
13643 KeyValueScanner preStoreScannerOpen(ObserverContext\<RegionCoprocessorEnvironment\> c,
13644       Store store, Scan scan, NavigableSet\<byte[]\> targetCols, KeyValueScanner s, long readPt)
13645       throws IOException;
13646 InternalScanner preFlushScannerOpen(ObserverContext\<RegionCoprocessorEnvironment\> c,
13647       Store store, List\<KeyValueScanner\> scanners, InternalScanner s, long readPoint)
13648       throws IOException;
13649 InternalScanner preCompactScannerOpen(ObserverContext\<RegionCoprocessorEnvironment\> c,
13650       Store store, List\<? extends KeyValueScanner\> scanners, ScanType scanType, long earliestPutTs,
13651       InternalScanner s, CompactionLifeCycleTracker tracker, CompactionRequest request,
13652       long readPoint) throws IOException;
13654 For flush and compaction, CP users are expected to wrap the InternalScanner in preFlush/preCompact. And for normal region operation, just use preGetOp/preScannerOpen to modify the Get/Scan object.
13656 This method in Region interface is also removed as we do not need to use read point in CP hooks anymore:
13657 long getReadPoint(IsolationLevel isolationLevel);
13662 * [HBASE-18350](https://issues.apache.org/jira/browse/HBASE-18350) | *Blocker* | **RSGroups are broken under AMv2**
13664 Moves RSGroup on to AMv2. Reenables disabled RSGroups tests.
13669 * [HBASE-18960](https://issues.apache.org/jira/browse/HBASE-18960) | *Major* | **A few bug fixes and minor improvements around batchMutate()**
13671 All operations for which further processing is skipped by preBatchMutate coprocessor hook are treated as SUCCESS instead of FAILED.
13676 * [HBASE-14247](https://issues.apache.org/jira/browse/HBASE-14247) | *Critical* | **Separate the old WALs into different regionserver directories**
13678 Add a new config hbase.separate.oldlogdir.by.regionserver. The default value is false. If this config is true, the old wal dir will be separated by regionservers. This will change the oldWALs layout. The oldWALs is used by replication. So if a cluster didn't use replication, it can be rolling upgrade (upgrade this config from false to true) directly. If a cluster use replication, the oldWALs will be not found when layout changed. So the cluster need rolling upgrade twice. Firstly, only rolling cluster to use new version code. Secondly rolling the config from false to true. Because the cluster already rolling to new version code, so it can find the oldWALs in the new dir layout.
13683 * [HBASE-18954](https://issues.apache.org/jira/browse/HBASE-18954) | *Major* | **Make \*CoprocessorHost classes private**
13685 - Make CoprocessorHost and its implementations InterfaceAudience.Private
13686 - Configurations from "CoprocessorHost" have been moved to new "CoprocessorConfigurations" class.
13691 * [HBASE-15410](https://issues.apache.org/jira/browse/HBASE-15410) | *Major* | **Utilize the max seek value when all Filters in MUST\_PASS\_ALL FilterList return SEEK\_NEXT\_USING\_HINT**
13693 This optimization, targeting SEEK\_NEXT\_USING\_HINT return values, utilizes the max seek value and is transparent to Filters.
13698 * [HBASE-18747](https://issues.apache.org/jira/browse/HBASE-18747) | *Critical* | **Introduce new example and helper classes to tell CP users how to do filtering on scanners**
13700 Modify ZooKeeperScanPolicyObserver in hbase-examples to show how to do filtering in the CP hooks of flush and compaction in hbase-2.0.
13705 * [HBASE-18108](https://issues.apache.org/jira/browse/HBASE-18108) | *Blocker* | **Procedure WALs are archived but not cleaned; fix**
13707 The archived Procedure WALs are moved to \<hbase\_root\>/oldWALs/masterProcedureWALs
13708 directory. TimeToLiveProcedureWALCleaner class was added which regularly cleans the Procedure WAL files from there.
13710 The TimeToLiveProcedureWALCleaner is added to hbase.master.logcleaner.plugins configuration value.
13712 A new config parameter is added: hbase.master.procedurewalcleaner.ttl, which specifies how long a Procedure WAL should stay in the archive directory.
13717 * [HBASE-18183](https://issues.apache.org/jira/browse/HBASE-18183) | *Major* | **Region interface cleanup for CP expose**
13719 Below methods are removed from CP exposed Region interface
13720 getOpenSeqNum
13721 getOldestSeqIdOfStore
13722 isLoadingCfsOnDemandDefault
13723 getReadpoint
13724 updateReadRequestsCount
13725 updateWriteRequestsCount
13726 getRegionServicesForStores
13727 getMetrics
13728 getHDFSBlocksDistribution
13729 releaseRowLocks
13730 batchReplay
13731 get(Get get, boolean withCoprocessor, long nonceGroup, long nonce)
13732 bulkLoadHFiles
13733 execService
13734 registerService
13735 checkFamilies
13736 checkTimestamps
13737 prepareDelete
13738 prepareDeleteTimestamps
13739 updateCellTimestamps
13740 flush
13741 compact
13742 waitForFlushesAndCompactions
13743 waitForFlushes
13745 Change signature of below methods by dropping params 'nonceGroup', 'nonce'
13746 append(Append append, long nonceGroup, long nonce)
13747 batchMutate(Mutation[] mutations, long nonceGroup, long nonce)
13748 increment(Increment increment, long nonceGroup, long nonce)
13753 * [HBASE-18949](https://issues.apache.org/jira/browse/HBASE-18949) | *Major* | **Remove the CompactionRequest parameter in preCompactSelection**
13755 Remove the CompactionRequest parameter in preCompactSelection as we do not have a CompactionRequest at that time.
13760 * [HBASE-18909](https://issues.apache.org/jira/browse/HBASE-18909) | *Major* | **Deprecate Admin's methods which used String regex**
13762 Pushed to master and branch-2. Thanks all for reviewing.
13767 * [HBASE-18931](https://issues.apache.org/jira/browse/HBASE-18931) | *Major* | **Make ObserverContext an interface and remove private/testing methods**
13769 Changes ObserverContext from a class to an interface and hides away constructor, testing functions and other internal-only functions in the implementation class.
13774 * [HBASE-18878](https://issues.apache.org/jira/browse/HBASE-18878) | *Major* | **Use Optional\<T\> return types when T can be null**
13776 **WARNING: No release note provided for this change.**
13781 * [HBASE-18649](https://issues.apache.org/jira/browse/HBASE-18649) | *Major* | **Deprecate KV Usage in MR to move to Cells in 3.0**
13783 All the mappers and reducers output type will be now of MapReduceCell type. No more KeyValue type. How ever in branch-2 for compatibility we have allowed the older interfaces/classes that work with KeyValue to stay in the code base but they have been marked as deprecated. 
13784 The following interfaces/classes have been deprecated in branch-2
13785 Import#KeyValueWritableComparablePartitioner
13786 Import#KeyValueWritableComparator
13787 Import#KeyValueWritableComparable
13788 Import#KeyValueReducer
13789 Import#KeyValueSortImporter
13790 Import#KeyValueImporter
13791 KeyValueSortReducer
13792 KeyValueSerialization
13793 WALPlayer#WALKeyValueMapper
13795 So any existing MR jobs that is using the above public interfaces/classes will continue to work in branch-2 and the expected output value type of those mappers and reducers can continue to be KeyValue type.
13797 In branch-3 the mappers and reducers output will only expect MapReduceCell as the type and will no longer work with KeyValue type.
13798 The new public classes/interfaces added for branch-3 and in branch-2 are
13799 CellSerialization
13800 CellSortReducer
13801 Import#CellWritableComparablePartitioner
13802 Import#CellWritableComparable
13803 Import#CellWritableComparator
13804 Import#CellReducer
13805 Import#CellSortImporter
13806 Import#CellImporter
13807 WALPlayer#WALCellMapper
13812 * [HBASE-18897](https://issues.apache.org/jira/browse/HBASE-18897) | *Major* | **Substitute MemStore for Memstore**
13814 The changes of IA.Public/IA.LimitedPrivate classes are shown below:
13815 HTableDescriptor class
13816 \* boolean hasRegionMemstoreReplication()
13817 + boolean hasRegionMemStoreReplication()
13818 \* HTableDescriptor setRegionMemstoreReplication(boolean) 
13819 + HTableDescriptor setRegionMemStoreReplication(boolean) 
13821 RegionLoadStats class
13822 \* int getMemstoreLoad()
13823 + int getMemStoreLoad()
13825 ServerLoad class
13826 \* int getMemstoreSizeInMB()
13827 + int getMemStoreSizeMB()
13829 Region class
13830 - long getMemstoreSize()
13831 + long getMemStoreSize()
13833 Store class
13834 - MemstoreSize getMemStoreSize()
13835 + MemStoreSize getMemStoreSize()
13836 - MemstoreSize getFlushableSize()
13837 + MemStoreSize getFlushableSize()
13838 - MemstoreSize getSnapshotSize()
13839 + MemStoreSize getSnapshotSize()
13841 StoreFile class
13842 - long getMaxMemstoreTS()
13843 + long getMaxMemStoreTS()
13848 * [HBASE-18010](https://issues.apache.org/jira/browse/HBASE-18010) | *Major* | **Connect CellChunkMap to be used for flattening in CompactingMemStore**
13850 The CellChunkMap is very dense index for Memstore ImmutableSegment and the only one that can be taken off-heap. However, CellChunkMap works on-heap as well. The coding of the entire flow of working with CellChunkMap is not yet finished, thus CellChunkMap is disabled for usage so far. The continuation is done under HBASE-18232.
13855 * [HBASE-18883](https://issues.apache.org/jira/browse/HBASE-18883) | *Major* | **Upgrade to Curator 4.0**
13857 Curator version has been updated from 2.x to 4.0 (running in ZK 3.4 compatibility mode).
13859 Users who experience classpath issues due to version conflicts are recommended to use either the hbase-shaded-client or hbase-shaded-mapreduce artifacts.
13864 * [HBASE-13844](https://issues.apache.org/jira/browse/HBASE-13844) | *Minor* | **Move static helper methods from KeyValue into CellUtils**
13866 Move KeyValue.parseColumn() to CellUtil
13871 * [HBASE-18839](https://issues.apache.org/jira/browse/HBASE-18839) | *Major* | **Apply RegionInfo to code base**
13873 The incompatible changes of IA.Public/LimitedPrivate classes are shown below.
13874 + new method
13875 - removed method
13876 \* deprecated method
13877 -------------------------------------
13878 HRegionLocation class
13879 + RegionInfo getRegion()
13880 \* HRegionInfo getRegionInfo()
13882 AsyncAdmin class
13883 + CompletableFuture\<List\<RegionInfo\>\> getOnlineRegions(ServerName serverName);
13884 - CompletableFuture\<List\<HRegionInfo\>\> getOnlineRegions(ServerName serverName);
13885 + CompletableFuture\<List\<RegionInfo\>\> getTableRegions(TableName tableName);
13886 - CompletableFuture\<List\<HRegionInfo\>\> getTableRegions(TableName tableName);
13888 HBaseTestingUtility class
13889 - Table createTable(HTableDescriptor htd, byte[][] families, Configuration c)
13890 - Table createTable(HTableDescriptor htd, byte[][] families, byte[][] splitKeys, Configuration c)
13891 - Table createTable(HTableDescriptor htd, byte[][] splitRows)
13892 - void modifyTableSync(Admin admin, HTableDescriptor desc)
13893 - HRegion createLocalHRegion(HTableDescriptor desc, byte [] startKey, byte [] endKey)
13894 - HRegion createLocalHRegion(HRegionInfo info, HTableDescriptor desc)
13895 - HRegion createLocalHRegion(HRegionInfo info, TableDescriptor desc) 
13896 + HRegion createLocalHRegion(RegionInfo info, TableDescriptor desc) 
13897 - HRegion createLocalHRegion(HRegionInfo info, HTableDescriptor desc, WAL wal)
13898 - HRegion createLocalHRegion(HRegionInfo info, TableDescriptor desc, WAL wal)
13899 + HRegion createLocalHRegion(RegionInfo info, TableDescriptor desc, WAL wal)
13900 - List\<HRegionInfo\> createMultiRegionsInMeta(final Configuration conf,final TableDescriptor htd, byte [][] startKeys)
13901 + List\<HRegionInfo\> createMultiRegionsInMeta(final Configuration conf,final TableDescriptor htd, byte [][] startKeys)
13902 - WAL createWal(final Configuration conf, final Path rootDir, final HRegionInfo hri)
13903 + WAL createWal(final Configuration conf, final Path rootDir, final RegionInfo hri)
13904 - HRegion createRegionAndWAL(final HRegionInfo info, final Path rootDir,final Configuration conf, final HTableDescriptor htd)
13905 - HRegion createRegionAndWAL(final HRegionInfo info, final Path rootDir, final Configuration conf, final TableDescriptor htd)
13906 + HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir, final Configuration conf, final TableDescriptor htd)
13907 - HRegion createRegionAndWAL(final HRegionInfo info, final Path rootDir, final Configuration conf, final HTableDescriptor htd, boolean initialize)
13908 + HRegion createRegionAndWAL(final RegionInfo info, final Path rootDir, final Configuration conf, final HTableDescriptor htd, boolean initialize)
13909 - boolean assignRegion(final HRegionInfo regionInfo)
13910 + boolean assignRegion(final RegionInfo regionInfo)
13911 - void moveRegionAndWait(HRegionInfo destRegion, ServerName destServer)
13912 + void moveRegionAndWait(RegionInfo destRegion, ServerName destServer)
13913 - int createPreSplitLoadTestTable(Configuration conf, HTableDescriptor desc, HColumnDescriptor hcd)
13914 - int createPreSplitLoadTestTable(Configuration conf, HTableDescriptor desc, HColumnDescriptor hcd, int numRegionsPerServer)
13915 - int createPreSplitLoadTestTable(Configuration conf, HTableDescriptor desc, HColumnDescriptor[] hcds, int numRegionsPerServer)
13916 - HRegion createTestRegion(String tableName, HColumnDescriptor cd)
13918 WALEdit class
13919 - WALEdit createFlushWALEdit(HRegionInfo hri, FlushDescriptor f)
13920 + WALEdit createFlushWALEdit(RegionInfo hri, FlushDescriptor f)
13921 - WALEdit createRegionEventWALEdit(HRegionInfo hri,RegionEventDescriptor regionEventDesc)
13922 + WALEdit createRegionEventWALEdit(RegionInfo hri,RegionEventDescriptor regionEventDesc)
13923 - WALEdit createCompaction(final HRegionInfo hri, final CompactionDescriptor c)
13924 + WALEdit createCompaction(final RegionInfo hri, final CompactionDescriptor c)
13925 - byte[] getRowForRegion(HRegionInfo hri)
13926 + byte[] getRowForRegion(RegionInfo hri)
13927 - WALEdit createBulkLoadEvent(HRegionInfo hri, WALProtos.BulkLoadDescriptor bulkLoadDescriptor)
13928 + - WALEdit createBulkLoadEvent(RegionInfo hri, WALProtos.BulkLoadDescriptor bulkLoadDescriptor)
13930 RegionScanner class
13931 - HRegionInfo getRegionInfo();
13932 + RegionInfo getRegionInfo();
13934 RegionPlan class
13935 - RegionPlan(final HRegionInfo hri, ServerName source, ServerName dest)
13936 + RegionPlan(final RegionInfo hri, ServerName source, ServerName dest)
13938 Region class
13939 - HRegionInfo getRegionInfo();
13940 + RegionInfo getRegionInfo();
13942 TableSnapshotInputFormat.TableSnapshotRegionSplit class
13943 \* HRegionInfo getRegionInfo()
13944 + RegionInfo getRegion()
13946 RawAsyncTable.CoprocessorCallback class
13947 - void onRegionComplete(HRegionInfo region, R resp)
13948 + void onRegionComplete(RegionInfo region, R resp)
13949 - void onRegionError(RegionInfo region, Throwable error);
13950 + void onRegionError(HRegionInfo region, Throwable error);
13955 * [HBASE-18826](https://issues.apache.org/jira/browse/HBASE-18826) | *Major* | **Use HStore instead of Store in our own code base and remove unnecessary methods in Store interface**
13957 **WARNING: No release note provided for this change.**
13962 * [HBASE-17732](https://issues.apache.org/jira/browse/HBASE-17732) | *Critical* | **Coprocessor Design Improvements**
13964 We are moving from Inheritence
13965 - Observer \*is\* Coprocessor
13966 - FooService \*is\* CoprocessorService
13967 To Composition
13968 - Coprocessor \*has\* Observer
13969 - Coprocessor \*has\* Service
13970 ------------------------------------------------------
13971 Summary
13972 ------------------------------------------------------
13973 - Adds four new interfaces - MasterCoprocessor, RegionCoprocessor, RegionServierCoprocessor,
13974   WALCoprocessor
13975 - These new \*Coprocessor interfaces have a get\*Observer() function for each observer type
13976   supported by them.
13977 - Added Coprocessor#getService() to base interface. All extending \*Coprocessor interfaces will
13978   get it from the base interface.
13979 - Added BulkLoadObserver hooks to RegionCoprocessorHost instad of SecureBulkLoadManager doing its
13980   own trickery.
13981 - CoprocessorHost#find\*() fuctions: Too many testing hooks digging into CP internals.
13982   Deleted if can, else marked @VisibleForTesting.
13983 ------------------------------------------------------
13984 Backward Compatibility
13985 ------------------------------------------------------
13986 - Old coprocessors implementing \*Observer won't get loaded (no backward compatibility guarantees).
13987 - Third party coprocessors only implementing Coprocessor will not get loaded (just like Observers).
13988 - Old coprocessors implementing CoprocessorService (for master/region host)
13989   /SingletonCoprocessorService (for RegionServer host) will continue to work with 2.0.
13990 - Added test to ensure backward compatibility of CoprocessorService/SingletonCoprocessorService
13991 - Note that if a coprocessor implements both observer and service in same class, its service
13992   component will continue to work but it's observer component won't work.
13997 * [HBASE-18298](https://issues.apache.org/jira/browse/HBASE-18298) | *Critical* | **RegionServerServices Interface cleanup for CP expose**
13999 We used to pass the RegionServerServices (RSS) which gave Coprocesosrs (CP) all sort of access to internal Server machinery. We now only allows the CP a subset of the RSS in the form of the CPRSS Interface. Particulars:
14001 Removed method getRegionServerServices from CP exposed RegionCoprocessorEnvironment and RegionServerCoprocessorEnvironment and replaced with getCoprocessorRegionServerServices. This returns a new interface CoprocessorRegionServerServices which is only a subset of RegionServerServices. With that below methods are no longer exposed for CPs
14002 WAL getWAL(HRegionInfo regionInfo)
14003 List\<WAL\> getWALs() 
14004 FlushRequester getFlushRequester()
14005 RegionServerAccounting getRegionServerAccounting()
14006 RegionServerRpcQuotaManager getRegionServerRpcQuotaManager()
14007 SecureBulkLoadManager getSecureBulkLoadManager()
14008 RegionServerSpaceQuotaManager getRegionServerSpaceQuotaManager()
14009 void postOpenDeployTasks(final PostOpenDeployContext context)
14010 void postOpenDeployTasks(final Region r)
14011 boolean reportRegionStateTransition(final RegionStateTransitionContext context)
14012 boolean reportRegionStateTransition(TransitionCode code, long openSeqNum, HRegionInfo... hris)
14013 boolean reportRegionStateTransition(TransitionCode code, HRegionInfo... hris)
14014 RpcServerInterface getRpcServer()
14015 ConcurrentMap\<byte[], Boolean\> getRegionsInTransitionInRS()
14016 Leases getLeases()
14017 ExecutorService getExecutorService()
14018 Map\<String, Region\> getRecoveringRegions()
14019 public ServerNonceManager getNonceManager()
14020 boolean registerService(Service service)
14021 HeapMemoryManager getHeapMemoryManager()
14022 double getCompactionPressure()
14023 ThroughputController getFlushThroughputController()
14024 double getFlushPressure()
14025 MetricsRegionServer getMetrics()
14026 EntityLock regionLock(List\<HRegionInfo\> regionInfos, String description, Abortable abort)
14027 void unassign(byte[] regionName)
14028 Configuration getConfiguration()
14029 ZooKeeperWatcher getZooKeeper()
14030 ClusterConnection getClusterConnection()
14031 MetaTableLocator getMetaTableLocator()
14032 CoordinatedStateManager getCoordinatedStateManager()
14033 ChoreService getChoreService()
14034 void stop(String why)
14035 void abort(String why, Throwable e)
14036 boolean isAborted()
14037 void updateRegionFavoredNodesMapping(String encodedRegionName, List\<ServerName\> favoredNodes)
14038 InetSocketAddress[] getFavoredNodesForRegion(String encodedRegionName)
14039 void addToOnlineRegions(Region region)
14040 boolean removeFromOnlineRegions(final Region r, ServerName destination)
14042 Also 3 methods name have been changed
14043 List\<Region\> getOnlineRegions(TableName tableName) -\> List\<Region\> getRegions(TableName tableName) 
14044 List\<Region\> getOnlineRegions() -\> List\<Region\> getRegions() 
14045 Region getFromOnlineRegions(final String encodedRegionName) -\> Region getRegion(final String encodedRegionName)
14050 * [HBASE-16769](https://issues.apache.org/jira/browse/HBASE-16769) | *Blocker* | **Deprecate/remove PB references from MasterObserver and RegionServerObserver**
14052 Signature of below methods in MasterObserver changed and instead of org.apache.hadoop.hbase.shaded.protobuf.generated.SnapshotDescription param, we will be passing org.apache.hadoop.hbase.client.SnapshotDescription
14053 preListSnapshot
14054 postListSnapshot
14055 preSnapshot
14056 postSnapshot
14057 preCloneSnapshot
14058 postCloneSnapshot
14059 preRestoreSnapshot
14060 postRestoreSnapshot
14061 preDeleteSnapshot
14062 postDeleteSnapshot
14064 Also changed signature of RegionServerObserver#preReplicateLogEntries and preReplicateLogEntries by removing params List\<org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos.WALEntry\>, org.apache.hadoop.hbase.CellScanner
14069 * [HBASE-18859](https://issues.apache.org/jira/browse/HBASE-18859) | *Major* | **Purge PB from BulkLoadObserver**
14071 No longer pass the protobuf request to prePrepareBulkLoad and preCleanupBulkLoad in BulkLoadObserver as part of our effort to purge protobuf from our Coprocessor API Interface (if you need to read the Table and RegionInfo, pull it from the passed in RegionCoprocessorEnvironment ObserverContext).
14076 * [HBASE-18731](https://issues.apache.org/jira/browse/HBASE-18731) | *Major* | **[compat 1-2] Mark protected methods of QuotaSettings that touch Protobuf internals as IA.Private**
14078 The following methods in QuotaSettings were annotated InterfaceAudience.Private; they are for internal use only in hbase-2.0.0
14080 buildSetQuotaRequestProto(final QuotaSettings settings)
14081 setupSetQuotaRequest(SetQuotaRequest.Builder builder)
14083 Note that there were versions of these methods in HBase 1.y that used classes in the {{org.apache.hadoop.hbase.protobuf.generated}} package. That package no longer exists as a part of our cleanup of protobufs from our public facing API and the related methods have been removed.
14088 * [HBASE-18825](https://issues.apache.org/jira/browse/HBASE-18825) | *Major* | **Use HStoreFile instead of StoreFile in our own code base and remove unnecessary methods in StoreFile interface**
14090 Cleanup the StoreFile interface.
14092 The metadata keys are moved to HStoreFile.
14094 These methods are removed:
14095 CacheConfig getCacheConf();
14096 byte[] getMetadataValue(byte[] key);
14097 boolean isCompactedAway();
14098 boolean isReferencedInReads();
14099 void initReader() throws IOException;
14100 StoreFileScanner getPreadScanner(boolean cacheBlocks, long readPt, long scannerOrder, boolean canOptimizeForNonNullColumn);
14101 StoreFileScanner getStreamScanner(boolean canUseDropBehind, boolean cacheBlocks, boolean isCompaction, long readPt, long scannerOrder, boolean canOptimizeForNonNullColumn) throws IOException;
14102 StoreFileReader getReader();
14103 void closeReader(boolean evictOnClose) throws IOException;
14104 void markCompactedAway();
14105 void deleteReader() throws IOException;
14107 Notice that these methods are still available in HStoreFile. 
14109 And the return value of getFirstKey and getLastKey are changed from Cell to Optional\<Cell\> to better indicate that they may not be available.
14114 * [HBASE-18786](https://issues.apache.org/jira/browse/HBASE-18786) | *Major* | **FileNotFoundException should not be silently handled for primary region replicas**
14116 FileNotFoundException opening a StoreFile in a primary replica now causes a RegionServer to crash out where before it would be ignored (or optionally handled via close/reopen).
14121 * [HBASE-10504](https://issues.apache.org/jira/browse/HBASE-10504) | *Blocker* | **Define Replication Interface**
14123 Adds a new plugin point ReplicationEndpoint. ReplicationSource, internal to hbase, tails the WAL and calls registered ReplicationEndpoints. ReplicationEndpoint implementations are responsible for actually shipping the edits to the other (hbase or non-hbase) cluster. ReplicationEndpoint can be defined per peer. Default inter-cluster replication works without any changes (lily etc should still work). ReplicationEndpoints have various facility including means for filtering out WAL edits source-side before they can be shipped to remote peers.
14128 * [HBASE-18142](https://issues.apache.org/jira/browse/HBASE-18142) | *Major* | **Deletion of a cell deletes the previous versions too**
14130 Now, delete.rb won't delete all versions of the specified column. It only delete the specified version (if user assigns a timestamp) or the latest version (default behavior)
14135 * [HBASE-18446](https://issues.apache.org/jira/browse/HBASE-18446) | *Critical* | **Mark StoreFileScanner/StoreFileReader as IA.LimitedPrivate(Phoenix)**
14137 Mark StoreFileScanner and StoreFileReader as IA.LimitPrivate(Phoenix).
14138 Deprecated the preStoreFileReaderOpen and postStoreFileReaderOpen method in RegionObserver to indicate that these methods are only supposed to be used by Phoenix.
14143 * [HBASE-18798](https://issues.apache.org/jira/browse/HBASE-18798) | *Major* | **Remove the unused methods in RegionServerObserver**
14145 Remove the following APIs from RegionServerObserver:
14146 # preRollBackMerge
14147 # postRollBackMerge
14148 # preMergeCommit
14149 # postMergeCommit
14150 # postMerge
14151 # preMerge
14156 * [HBASE-18831](https://issues.apache.org/jira/browse/HBASE-18831) | *Major* | **Add explicit dependency on javax.el**
14158 Specify an explicit version for javax.el. Without it we rely on repository cached metadata of which a prevalent version seems to list all versions between b01 and b08 but finishes with a b08-jbossorg which is in the jboss repo, a repo most of us do not list in our poms.
14163 * [HBASE-17980](https://issues.apache.org/jira/browse/HBASE-17980) | *Major* | **Any HRegionInfo we give out should be immutable**
14165 Provide alternate user-facing API that takes a RegionInfo Interface instead of a HRegionInfo; the old HRegionInfo methods have been deprecated in 2.0.0 and will be removed in 3.0.0.
14170 * [HBASE-14004](https://issues.apache.org/jira/browse/HBASE-14004) | *Critical* | **[Replication] Inconsistency between Memstore and WAL may result in data in remote cluster that is not in the origin**
14172 Now when replicating a wal file which is still opened for write, we will get its committed length from the WAL instance in the same RS to prevent replicating uncommit WALEdit.
14174 This is very important if you use AsyncFSWAL, as we use fan-out in AsyncFSWAL. The data written to DN will be visible immediately as all DNs think it is the end of a pipeline, although the client has not received an ack, and also NN may truncate the file if the client crashes at the same time.
14179 * [HBASE-18819](https://issues.apache.org/jira/browse/HBASE-18819) | *Major* | **Set version number to 2.0.0-alpha3 from 2.0.0-alpha3-SNAPSHOT**
14181 Set version on branch-2 to be 2.0.0-alpha3 as part of RC making.
14186 * [HBASE-18683](https://issues.apache.org/jira/browse/HBASE-18683) | *Major* | **Upgrade hbase to commons-math 3**
14188 Moved on to commons-math3. Removed commons-math2.
14193 * [HBASE-18453](https://issues.apache.org/jira/browse/HBASE-18453) | *Major* | **CompactionRequest should not be exposed to user directly**
14195 Introduce a CompactionLifeCycleTracker to let the CP users know when the compaction starts and ends. CompactionRequest is marked as IA.Private and should be used in CP implementation any more.
14200 * [HBASE-18794](https://issues.apache.org/jira/browse/HBASE-18794) | *Major* | **Remove deprecated methods in MasterObserver**
14202 The removed APIs are shown below.
14203 # preCreateTableHandler
14204 # postCreateTableHandler
14205 # preDeleteTableHandler
14206 # postDeleteTableHandler
14207 # preTruncateTableHandler
14208 # postTruncateTableHandler
14209 # preModifyTableHandler
14210 # postModifyTableHandler
14211 # preAddColumn
14212 # postAddColumn
14213 # preAddColumnHandler
14214 # postAddColumnHandler
14215 # preModifyColumn
14216 # postModifyColumn
14217 # preModifyColumnHandler
14218 # postModifyColumnHandler
14219 # preDeleteColumn
14220 # postDeleteColumn
14221 # preDeleteColumnHandler
14222 # postDeleteColumnHandler
14223 # preEnableTableHandler
14224 # postEnableTableHandler
14225 # preDisableTableHandler
14226 # postDisableTableHandler
14227 # preDispatchMerge
14228 # postDispatchMerge
14233 * [HBASE-14998](https://issues.apache.org/jira/browse/HBASE-14998) | *Blocker* | **Unify synchronous and asynchronous methods in Admin and cleanup**
14235  \* Deprecates getAlterStatus. Everywhere else we talk of 'modify' rather
14236        'alter' and should use Future returned from async instead.
14237  \* isTableAvailable(TableName, byte [][]) has been deprecated to be
14238        removed; use the overrie instead. This is a weird method.
14239  \* Changed listTableDescriptor to getDescriptor.
14240  \* Renamed other like methods to have same pattern (deprecating the old):
14241         balancer =\> balance
14242         setBalancerRunning =\> balancerSwitch
14243         setNormalizerRunning =\> normalizerSwitch
14244         enableCatalogJanitor =\> catalogJanitorSwitch
14245         setCleanerChoreRunning =\> cleanerChoreSwitch
14246         setSplitOrMergeEnabled =\> splitOrMergeEnabledSwitch
14248  \* Renamed (with deprecation of old) runCatalogScan =\> runCatalogJanitor.
14249  \* Reviewed generated javadoc and made some edits; purged reference to
14250        hbase issues from our API, fixed param names, etc.
14251  \* Made all the enable services methods have same pattern.
14252  \* Renamed takeSnapshotAsync as snapshotAsync (with deprecation of old)
14253  \* Renamed execProcedureWithRet as execProcedureWithReturn (with
14254        deprecation)
14259 * [HBASE-18723](https://issues.apache.org/jira/browse/HBASE-18723) | *Major* | **[pom cleanup] Do a pass with dependency:analyze; remove unused and explicity list the dependencies we exploit**
14261 Purged a bunch of dependencies included but unused. Added reference to dependencies we do use but did not list (transitively included). Purged all but junit from parent pom dependency set and did explicit include in modules instead; not all modules need mockito, etc. Still work to do: grey area around hadoop and its transitive includes need cleanup still to make the  dependency:analyze runs clean. Also figure how to purge junit from parent dependency list.
14266 * [HBASE-17823](https://issues.apache.org/jira/browse/HBASE-17823) | *Major* | **Migrate to Apache Yetus Audience Annotations**
14268 HBase now uses stability and audience annotations sourced from Apache Yetus, instead of the custom annotations that were previously in place.
14273 * [HBASE-18793](https://issues.apache.org/jira/browse/HBASE-18793) | *Major* | **Remove deprecated methods in RegionObserver**
14275 These deprecated methods are removed from RegionObserver:
14276 InternalScanner preFlushScannerOpen(ObserverContext, Store, List, InternalScanner) throws IOException;
14277 void preCompactSelection(ObserverContext, Store, List) throws IOException;
14278 void postCompactSelection(ObserverContext, Store, ImmutableList);
14279 InternalScanner preCompact(ObserverContext, Store, InternalScanner, ScanType) throws IOException;
14280 InternalScanner preCompactScannerOpen(ObserverContext, Store, List, ScanType, long, InternalScanner, CompactionRequest) throws IOException;
14281 InternalScanner preCompactScannerOpen( ObserverContext, Store store, List, ScanType, long, InternalScanner) throws IOException;
14282 void preSplit(ObserverContext) throws IOException;
14283 void preSplit(ObserverContext, byte[]) throws IOException;
14284 void postSplit(ObserverContext, Region, Region) throws IOException;
14285 void preSplitBeforePONR(ObserverContext, byte[], List) throws IOException;
14286 void preSplitAfterPONR(ObserverContext) throws IOException;
14287 void preRollBackSplit(ObserverContext) throws IOException;
14288 void postRollBackSplit(ObserverContext) throws IOException;
14289 void postCompleteSplit(ObserverContext) throws IOException;
14290 long preIncrementColumnValue(ObserverContext, byte[], byte[], byte[], long, boolean) throws IOException;
14291 long postIncrementColumnValue(ObserverContextc, byte[], byte[], byte[], long, boolean, long) throws IOException;
14292 KeyValueScanner preStoreScannerOpen(ObserverContext, Store, Scan, NavigableSet, KeyValueScanner) throws IOException;
14293 boolean postScannerFilterRow(ObserverContext, InternalScanner, byte[], int, short, boolean) throws IOException;
14294 boolean postBulkLoadHFile(ObserverContext, List, boolean) throws IOException;
14296 And this method is also removed since we never call it in our code base:
14297 InternalScanner preFlushScannerOpen(ObserverContext, Store, KeyValueScanner, InternalScanner, long) throws IOException;
14299 The deprecated annotation is removed for these two methods as they are still being used:
14300 void preFlush(ObserverContext) throws IOException;
14301 void postFlush(ObserverContextc) throws IOException;
14306 * [HBASE-18733](https://issues.apache.org/jira/browse/HBASE-18733) | *Major* | **[compat 1-2] Hide WALKey**
14308 WALKey, @InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.REPLICATION), changed a bunch for 2.0.0. See below. We figured it ok hiding it since it should be internals anyway -- only we should be making them.
14313 * [HBASE-13271](https://issues.apache.org/jira/browse/HBASE-13271) | *Critical* | **Table#puts(List\<Put\>) operation is indeterminate; needs fixing**
14315 Adds more spec on how Get, Delete, and Put work and how they differ to help the user.
14320 * [HBASE-16479](https://issues.apache.org/jira/browse/HBASE-16479) | *Major* | **Move WALEdit from hbase.regionserver.wal package to hbase.wal package**
14322 Incompatible move of WALEdit class from regionserver.wal to wal. Effects @InterfaceAudience.LimitedPrivate({ HBaseInterfaceAudience.REPLICATION,
14323     HBaseInterfaceAudience.COPROC })
14330 * [HBASE-10240](https://issues.apache.org/jira/browse/HBASE-10240) | *Critical* | **Remove 0.94-\>0.96 migration code**
14332 Purge 0.94=\>0.96 deprecated, migration code. This means that if you are on 0.94 and wish to go to hbase 2.0, you must first migrate to a version of hbase that is \>= 0.96.
14337 * [HBASE-18783](https://issues.apache.org/jira/browse/HBASE-18783) | *Minor* | **Declare the builder of ClusterStatus as IA.Private, and remove the Writables from ClusterStatus**
14339 **WARNING: No release note provided for this change.**
14344 * [HBASE-18106](https://issues.apache.org/jira/browse/HBASE-18106) | *Critical* | **Redo ProcedureInfo and LockInfo**
14346 Admin.listProcedures and Admin.listLocks were renamed to getProcedures and getLocks (listProcedures was added to hbase 1.2). This change was done in an incompatible way -- we just yanked listProcedures (Because Admin Interface is not compatible with hbase1).
14348     Main changes:
14349     - ProcedureInfo and LockInfo were removed, we use JSON instead of them
14350     - Procedure and LockedResource are their server side equivalent
14351     - Procedure protobuf state\_data became obsolate, it is only kept for
14352       reading previously written WAL
14353     - Procedure protobuf contains a state\_message field, which stores the internal
14354       state messages (Any type instead of bytes)
14355     - Procedure.serializeStateData and deserializeStateData were changed slightly
14356     - Procedures internal states are available on client side
14357     - Procedures are displayed on web UI and in shell in the following jruby format:
14358       { ID =\> '1', PARENT\_ID = '-1', PARAMETERS =\> [ ..extra state information.. ] }
14363 * [HBASE-18621](https://issues.apache.org/jira/browse/HBASE-18621) | *Major* | **Refactor ClusterOptions before applying to code base**
14365 Provide a new way to get desired ClusterStatus with a set of ClusterStatus.Option, such that the response back to client can be limited.
14366 Note that, the constructor way to new a ClusterStatus will be no longer support after 2.0.0,  and use ClusterStatus.Builder instead.
14371 * [HBASE-18780](https://issues.apache.org/jira/browse/HBASE-18780) | *Minor* | **Remove HLogPrettyPrinter and hlog command**
14373 **WARNING: No release note provided for this change.**
14378 * [HBASE-14997](https://issues.apache.org/jira/browse/HBASE-14997) | *Critical* | **Move compareOp and Comparators out of filter to client package**
14380 Deprecate checkAnd\* APIs that take the filter CompareOp. Added new overrides that take a generic CompareOperator instead. CompareOperator will be used by checkAnd\* in Table API and by filters going forward.
14382 Other nice improvements suggested by this issue have been moved out to HBASE-18774.
14387 * [HBASE-17972](https://issues.apache.org/jira/browse/HBASE-17972) | *Minor* | **Remove mergePool from CompactSplitThread**
14389 After this jira, mergePool will be permanently removed from CompactSplitThread.
14394 * [HBASE-18704](https://issues.apache.org/jira/browse/HBASE-18704) | *Major* | **Upgrade hbase to commons-collections 4**
14396 **WARNING: No release note provided for this change.**
14401 * [HBASE-18697](https://issues.apache.org/jira/browse/HBASE-18697) | *Major* | **Need a shaded hbase-mapreduce module**
14403 Replaces hbase-shaded-server-\<version\>.jar with hbase-shaded-mapreduce-\<version\>.jar.
14408 * [HBASE-15607](https://issues.apache.org/jira/browse/HBASE-15607) | *Blocker* | **Remove PB references from Admin for 2.0**
14410 All the references to Protos in Admin.java have been removed and replaced with respective POJO classes. 
14411 The references to Protos that were removed are
14412 AdminProtos.GetRegionInfoResponse,
14413 HBaseProtos.SnapshotDescription, HBaseProtos.SnapshotDescription.Type,
14414  MasterProtos.SnapshotResponse.
14415 CompactionType, CompactionState and MasterSwitchType Enums have been moved out of Admin.java to standalone Enums.
14420 * [HBASE-18674](https://issues.apache.org/jira/browse/HBASE-18674) | *Major* | **upgrade hbase to commons-lang3**
14422 Move to commons-lang3 from common-lang (check it out!... Nice lib...Some nice utility)
14427 * [HBASE-18736](https://issues.apache.org/jira/browse/HBASE-18736) | *Major* | **Cleanup the HTD/HCD for Admin**
14429 Changed the passed arguments from HTD/HCD to TD/CFD for Admin.
14434 * [HBASE-18699](https://issues.apache.org/jira/browse/HBASE-18699) | *Major* | **Copy LoadIncrementalHFiles to another package and mark the old one as deprecated**
14436 Introduce a new o.a.h.h.tool.LoadIncrementalHFiles. The old o.a.h.h.mapreduce.LoadIncrementalHFiles is deprecated and will be removed in 3.0.0.
14441 * [HBASE-18739](https://issues.apache.org/jira/browse/HBASE-18739) | *Major* | **Make all TimeRange Constructors InterfaceAudience Private.**
14443 All constructors have already been deprecated. This change makes them InterfaceAudience Private.
14448 * [HBASE-18675](https://issues.apache.org/jira/browse/HBASE-18675) | *Minor* | **Making {max,min}SessionTimeout configurable for MiniZooKeeperCluster**
14450 <!-- markdown -->
14453 Standalone clusters and minicluster instances can now configure the session timeout for our embedded ZooKeeper quorum using `hbase.zookeeper.property.minSessionTimeout` and `hbase.zookeeper.property.maxSessionTimeout`.
14458 * [HBASE-15806](https://issues.apache.org/jira/browse/HBASE-15806) | *Critical* | **An endpoint-based export tool**
14460 org.apache.hadoop.hbase.coprocessor.Export
14461 Instructs HBase to dump the contents of table to HDFS in a sequence file
14462 + replaces MR by endpoint (see org.apache.hadoop.hbase.mapreduce.Export)
14463 + no large data to be transfered between hbase server and client
14464 + same command line as org.apache.hadoop.hbase.mapreduce.Export
14465 - user needs to alter table for deploying ExportEndpoint
14466 - user needs to adjust the endpoint timeout for dumping large data
14467 - user needs to get the EXECUTE permission
14472 * [HBASE-18577](https://issues.apache.org/jira/browse/HBASE-18577) | *Critical* | **shaded client includes several non-relocated third party dependencies**
14474 <!-- markdown -->
14477 The HBase shaded artifacts (hbase-shaded-client and hbase-shaded-server) no longer contain several non-relocated third party dependency classes that were mistakenly included. Downstream users who relied on these classes being present will need to add a runtime dependency onto an appropriate third party artifact.
14479 Previously, we erroneously packaged several third party libs without relocating them. In some cases these libraries have now been relocated; in some cases they are no longer included at all.
14481 Includes:
14483 * jaxb
14484 * jetty
14485 * jersey
14486 * codahale metrics (HBase 1.4+ only)
14487 * commons-crypto
14488 * jets3t
14489 * junit
14490 * curator (HBase 1.4+)
14491 * netty 3 (HBase 1.1)
14492 * mokito-junit4 (HBase 1.1)
14494 There is now testing to ensure that the shaded artifacts only contain expected relocated content. It can be run via `mvn -Dtest=noUnitTests -pl hbase-shaded/hbase-shaded-check-invariants -am -Prelease verify`.
14496 For version 2.0+ this patch removes hadoop-mapreduce-client-core from the set of dependencies included for the hbase-client and hbase-shaded-client artifacts.
14498 For 2.0+, the slf4j-log4j12 dependency is now optional for both shaded artifacts.
14503 * [HBASE-14745](https://issues.apache.org/jira/browse/HBASE-14745) | *Blocker* | **Shade the last few dependencies in hbase-shaded-client**
14505 Previously some dependencies in hbase-shaded-client were still leaking into the un-shaded namespace. This should now be fixed.
14507 Additionally the rat checking on generated intermediate files from shading should be skipped.
14512 * [HBASE-18665](https://issues.apache.org/jira/browse/HBASE-18665) | *Critical* | **ReversedScannerCallable invokes getRegionLocations incorrectly**
14514 Performing reverse scan on tables used the meta cache incorrectly and fetched data from meta table every time. This fix solves this issue and which results in performance improvement for reverse scans.
14519 * [HBASE-3935](https://issues.apache.org/jira/browse/HBASE-3935) | *Major* | **HServerLoad.storefileIndexSizeMB should be changed to storefileIndexSizeKB**
14521 This patch removed the storefile\_index\_size\_MB in protobuf. It will cause the value of storefile\_index\_size\_MB is zero if user still use hbase-client 1.x.
14526 * [HBASE-18640](https://issues.apache.org/jira/browse/HBASE-18640) | *Major* | **Move mapreduce out of hbase-server into separate hbase-mapreduce module**
14528 - Moves all org.apache.hadoop.hbase.mapreduce.\* (except LoadIncrementalHFiles) and org.apache.hadoop.hbase.mapred.\* classes from hbase-server module to new hbase-mapreduce module.
14529 - Also moves following tools from hbase-server module to hbase-mapreduce module: CompactionTool, ExportSnapshot, PerformanceEvaluation, LoadTestTool
14530 - Very minor breakages in  LoadTestTool(LimitedPrivate HBaseInterfaceAudience.TOOLS)
14535 * [HBASE-18519](https://issues.apache.org/jira/browse/HBASE-18519) | *Major* | **Use builder pattern to create cell**
14537 Introduce the CellBuilder helper.
14538 1) Using CellBuilderFactory to get CellBuilder for creating cell with row, 
14539     column, qualifier, type, and value.
14540 2) For internal use, the ExtendedCellBuilder, which is created by ExtendedCellBuilderFactory, is able to build cell with extra fields - sequence id and tags -
14545 * [HBASE-18448](https://issues.apache.org/jira/browse/HBASE-18448) | *Minor* | **EndPoint example  for refreshing HFiles for stores**
14547 Adds a new RefreshHFiles Coprocessor Endpoint example. Includes client and serverside-endpoint that iterates region Stores to call #refreshStoreFiles.
14552 * [HBASE-18658](https://issues.apache.org/jira/browse/HBASE-18658) | *Major* | **Purge hokey hbase Service implementation; use (internal) Guava Service instead**
14554 Removed hbase Service class. It was not fully-formed. Now Guava is relocated, use its Service instead internally; it has nice implementation facility too in AbstractService.
14559 * [HBASE-15982](https://issues.apache.org/jira/browse/HBASE-15982) | *Blocker* | **Interface ReplicationEndpoint extends Guava's Service**
14561     Breaking change to our ReplicationEndpoint and BaseReplicationEndpoint.
14563     ReplicationEndpoint implemented Guava 0.12 Service. An abstract
14564     subclass, BaseReplicationEndpoint, provided default implementations
14565     and facility, among other things, by extending Guava's
14566     AbstractService class.
14568     Both of these HBase classes were marked LimitedPrivate for
14569     REPLICATION so these classes were semi-public and made it so
14570     Guava 0.12 was part of our API.
14572     Having Guava in our API was a mistake. It anchors us and the
14573     implementation of the Interface to Guava 0.12. This is untenable
14574     given Guava changes and that the Service Interface in particular
14575     has had extensive revamp and improvement done. We can't hold to
14576     the Guava Interface. It changed. We can't stay on Guava 0.12;
14577     implementors and others on our CLASSPATH won't abide being stuck
14578     on an old Guava.
14580     So we make breaking changes. The unhitching of our Interface
14581     from Guava could only be done in a breaking manner. It undoes the
14582     LimitedPrivate on BaseReplicationEndpoint while keeping it for the RE
14583     Interface. It means consumers will have to copy/paste the
14584     AbstractService-based BRE into their own codebase also supplying their
14585     own Guava; HBase no longer 'supplies' this (our Guava usage has
14586     been internalized, relocated).
14588     This patch then adds into RE the basic methods RE needs of the old
14589     Guava Service rather than return a Service to start/stop only to go
14590     back to the RE instance to do actual work. A few method names had to
14591     be changed so could make implementations with Guava Service internally
14592     and not have RE method names and types clash). Semantics remained the
14593     same otherwise. For example startAsync and stopAsync in Guava are start
14594     and stop in RE.
14599 * [HBASE-18347](https://issues.apache.org/jira/browse/HBASE-18347) | *Major* | **Implement a BufferedMutator for async client**
14601 Introduce an AsyncBufferedMutator for batching requests to HBase for a single table.
14603 Use AsyncConnection.getBufferedMutator method to get an AsyncBufferedMutator instance.
14608 * [HBASE-18546](https://issues.apache.org/jira/browse/HBASE-18546) | *Critical* | **Always overwrite the TS for Append/Increment unless no existing cells are found**
14610 If there is no existing cell in submitting Append/Increment, the custom ts won't be overridden. By contrast, the cell's ts will always be overridden by server.
14615 * [HBASE-18224](https://issues.apache.org/jira/browse/HBASE-18224) | *Critical* | **Upgrade jetty**
14617 Moved from Jetty 9.3.x to 9.4.x.
14619 Jetty returns more correct HTTP code when Header is too long, 431 instead of 413, and it requires more threads to start up (made default 16 instead of 10).
14624 * [HBASE-17442](https://issues.apache.org/jira/browse/HBASE-17442) | *Critical* | **Move most of the replication related classes from hbase-client to hbase-replication package**
14626 Move replication implementation's classes from hbase-client to hbase-replication package.
14631 * [HBASE-18653](https://issues.apache.org/jira/browse/HBASE-18653) | *Major* | **Undo hbase2 check against \< hadoop2.6.x; i.e. implement agreed drop of hadoop 2.4 and 2.5 support in hbase2**
14633 Change the yetus profile for branch-2 so it no longer runs hadoop 2.4.x and 2.5.x build checks.
14638 * [HBASE-18630](https://issues.apache.org/jira/browse/HBASE-18630) | *Major* | **Prune dependencies; as is branch-2 has duplicates**
14640 Removed doubled instances of javax.inject and commons-beanutils where the versions were close.
14642 Other instances of 'double' includes have different groupids so wary pruning especially when transitive includes (hadoop or jetty et al.)
14647 * [HBASE-18631](https://issues.apache.org/jira/browse/HBASE-18631) | *Minor* | **Allow configuration of ChaosMonkey properties via hbase-site**
14649 This change invalidates the need for a separate Java properties file to configure the ChaosMonkey included with HBase. These properties can be provided directly in hbase-site.xml. If configuration in provided in both locations, the Java properties file takes precendence.
14654 * [HBASE-18489](https://issues.apache.org/jira/browse/HBASE-18489) | *Major* | **Expose scan cursor in RawScanResultConsumer**
14656 Add a 'cursor' method which returns an 'Optional\<Cursor\>' in 'RawScanResultConsumer.ScanController'. You can use this method to obtain the scan cursor if available.
14661 * [HBASE-18511](https://issues.apache.org/jira/browse/HBASE-18511) | *Blocker* | **Default no regions on master**
14663 Changes the configuration hbase.balancer.tablesOnMaster from list of table names that the can carry (with 'none' meaning no tables on the master) to instead be a boolean that is set to true if master carries tables/regions and false if it does not. If true, the master acts like any regionserver.
14665 If false, then the master carries no tables. This is the default for hbase-2.0.0.
14667 Another boolean configuration, hbase.balancer.tablesOnMaster.systemTablesOnly, when set to true, enables hbase.balancer.tablesOnMaster and makes it so the master hosts system tables exclusively (the long-time deploy mode of master branch and branch-2 up until this commit).
14669 UPDATE: This is broke. See HBASE-19785.
14670 UPDATE2: Master carrying Regions does not work reliably, see HBASE-19828.
14672 See HBASE-19831, the issue to fix regions on Master
14674 The change of hbase.balancer.tablesOnMaster from String list to boolean and
14675 the addition of a simple boolean to enable system-tables on Master was done
14676 to constrain what operators might ask for via this master configuration.
14677 Stipulating what tables are bound to the Master server verges into
14678 regionserver grouping territory, a more robust means of specifying table
14679 and server combinations. Operators should use this latter if they want
14680 layouts more exotic than those supplied by the provided booleans.
14685 * [HBASE-18553](https://issues.apache.org/jira/browse/HBASE-18553) | *Major* | **Expose scan cursor for asynchronous scanner**
14687 The ResultScanner which is gotten from an AsyncTable will also return cursor results if Scan.isNeedCursorResult is true.
14692 * [HBASE-18598](https://issues.apache.org/jira/browse/HBASE-18598) | *Minor* | **AsyncNonMetaRegionLocator use FIFO algorithm to get a candidate locate request**
14694 Introduce FIFO algorithm to get a candidate locate request for AsyncNonMetaRegionLocator.
14699 * [HBASE-18533](https://issues.apache.org/jira/browse/HBASE-18533) | *Major* | **Expose BucketCache values to be configured**
14701 This patch exposes configuration for Bucketcache. These configs are very similar to those for the LRU cache, but are described below:
14703 "hbase.bucketcache.single.factor"; /\*\* Single access bucket size \*/
14704 "hbase.bucketcache.multi.factor"; /\*\* Multiple access bucket size \*/
14705 "hbase.bucketcache.memory.factor"; /\*\* In-memory bucket size \*/
14706 "hbase.bucketcache.extrafreefactor"; /\*\* Free this floating point factor of extra blocks when evicting. For example free the number of blocks requested \* (1 + extraFreeFactor) \*/
14707 "hbase.bucketcache.acceptfactor"; /\*\* Acceptable size of cache (no evictions if size \< acceptable) \*/
14708 "hbase.bucketcache.minfactor"; /\*\* Minimum threshold of cache (when evicting, evict until size \< min) \*/
14713 * [HBASE-18528](https://issues.apache.org/jira/browse/HBASE-18528) | *Critical* | **DON'T allow user to modify the passed table/column descriptor**
14715 **WARNING: No release note provided for this change.**
14720 * [HBASE-18271](https://issues.apache.org/jira/browse/HBASE-18271) | *Blocker* | **Shade netty**
14722 Depend on hbase-thirdparty for our netty instead of directly relying on netty-all. netty is relocated in hbase-thirdparty from io.netty to org.apache.hadoop.hbase.shaded.io.netty. One kink is that netty bundles an .so. Its files also are relocated. So netty can find the .so content, need to specify on command-line a system property telling netty about the shading. 
14724 The .so trick is from
14725              https://stackoverflow.com/questions/33825743/rename-files-inside-a-jar-using-some-maven-plugin
14727 In essence we need the below defined whenever we run tests or deploy:
14729 -Dorg.apache.hadoop.hbase.shaded.io.netty.packagePrefix=org.apache.hadoop.hbase.shaded.
14731 (The trailing '.' is required)
14733 See toward the end of this issue for how to pass config: https://github.com/netty/netty/issues/6665
14735 The system property has been added to bin/hbase. If starting hbase with other than bin/hbase, add this system property (at least on linux).
14737 For devs, going forward, do not reference io.netty. Reference org.apache.hadoop.hbase.io.netty instead. Here is sample:
14739 {code}
14740 -import io.netty.channel.Channel;
14741 -import io.netty.channel.EventLoop;
14742 +import org.apache.hadoop.hbase.shaded.io.netty.channel.Channel;
14743 +import org.apache.hadoop.hbase.shaded.io.netty.channel.EventLoop;
14744 {code}
14749 * [HBASE-15511](https://issues.apache.org/jira/browse/HBASE-15511) | *Major* | **ClusterStatus should be able to return responses by scope**
14751 Provide a new way to get desired ClusterStatus with a set of ClusterStatus.Option, such that the response back to client can be limited.
14752 Note that, the constructor way to new a ClusterStatus will be no longer support after 2.0.0,  and use ClusterStatus.Builder instead.
14757 * [HBASE-18551](https://issues.apache.org/jira/browse/HBASE-18551) | *Major* | **[AMv2] UnassignProcedure and crashed regionservers**
14759 Unassign will not proceed if it is unable to talk to the remote server. Now it will expire the server it is unable to communicate with and then wait until it is signaled by ServerCrashProcedure that the server's logs have been split. Only then will judge the unassign successful. 
14761 We do this because a subsequent assign lacking the crashed server context might open a region w/o first splitting logs.
14766 * [HBASE-18469](https://issues.apache.org/jira/browse/HBASE-18469) | *Critical* | **Correct  RegionServer metric of  totalRequestCount**
14768 In HBASE-18469 we introduced a new RegionServer metrics in name of "totalRowActionRequestCount" which counts in all row actions and equals to the sum of "readRequestCount" and "writeRequestCount". Meantime, we have changed "totalRequestCount" to count only once for multi request, while previously we will count in action number of the request. As a result, existing monitoring system on totalRequestCount will still work but see a smaller value, and we strongly recommend to change to use the new metrics to monitor server load.
14773 * [HBASE-18500](https://issues.apache.org/jira/browse/HBASE-18500) | *Major* | **Performance issue: Don't use BufferedMutator for HTable's put method**
14775 Remove the deprecated method get/setWriteBufferSize from Table and remove writeBufferSize from TableBuilder. Remove the BufferedMutatorImpl from HTable.
14780 * [HBASE-18387](https://issues.apache.org/jira/browse/HBASE-18387) | *Minor* | **[Thrift] Make principal configurable in DemoClient.java**
14782 This change allows the demonstration Thrift client to customize the server principal used by the Thrift server for instances secured with Kerberos.
14787 * [HBASE-17125](https://issues.apache.org/jira/browse/HBASE-17125) | *Critical* | **Inconsistent result when use filter to read data**
14789 Marked Scan and Get's setMaxVersions() and setMaxVersions(int) as deprecated. They are easy to misunderstand with column family's max versions, so use readAllVersions() and readVersions(int) instead.
14794 * [HBASE-18492](https://issues.apache.org/jira/browse/HBASE-18492) | *Major* | **[AMv2] Embed code for selecting highest versioned region server for system table regions in AssignmentManager.processAssignQueue()**
14796 Favors new servers over older versions when assigning system table regions (more to follow in this area; i.e. changes in the AM itself).
14801 * [HBASE-18517](https://issues.apache.org/jira/browse/HBASE-18517) | *Major* | **limit max log message width in log4j**
14803 Sets a log length max of 1000 characters.
14808 * [HBASE-18502](https://issues.apache.org/jira/browse/HBASE-18502) | *Critical* | **Change MasterObserver to use TableDescriptor and ColumnFamilyDescriptor**
14810 The methods which change to use TableDescriptor/ColumnFamilyDescriptor are shown below.
14811 + preCreateTable( ObserverContext,TableDescriptor, HRegionInfo[])
14812 + postCreateTable(ObserverContext ,TableDescriptor, HRegionInfo[])
14813 + preCreateTableAction(ObserverContext, TableDescriptor,HRegionInfo[])
14814 + postCompletedCreateTableAction(ObserverContext,TableDescriptor,HRegionInfo[])
14815 + preModifyTable(ObserverContext,TableName, TableDescriptor)
14816 + postModifyTable(ObserverContext,TableName, TableDescriptor)
14817 + preModifyTableAction( ObserverContext,TableName,TableDescriptor)
14818 + postCompletedModifyTableAction( ObserverContext,TableName,TableDescriptor)
14819 + preAddColumnFamily(ObserverContext,TableName, ColumnFamilyDescriptor)
14820 + postAddColumnFamily(ObserverContext,TableName, ColumnFamilyDescriptor)
14821 + preAddColumnFamilyAction(ObserverContext,TableName,ColumnFamilyDescriptor)
14822 + postCompletedAddColumnFamilyAction(ObserverContext,TableName, ColumnFamilyDescriptor)
14823 + preModifyColumnFamily(ObserverContext,TableName, ColumnFamilyDescriptor)
14824 + preModifyColumnFamilyAction(ObserverContext\<MasterCoprocessorEnvironment,TableName,ColumnFamilyDescriptor)
14825 + postCompletedModifyColumnFamilyAction(ObserverContext\<MasterCoprocessorEnvironment\>,TableName,ColumnFamilyDescriptor)
14826 + preCloneSnapshot(ObserverContext\<MasterCoprocessorEnvironment\>,SnapshotDescription,TableDescriptor)
14827 + postCloneSnapshot(ObserverContext\<MasterCoprocessorEnvironment\>,SnapshotDescription,TableDescripto)
14828 + preRestoreSnapshot(ObserverContext\<MasterCoprocessorEnvironment,SnapshotDescription,TableDescriptor)
14829 + postRestoreSnapshot(ObserverContext\<MasterCoprocessorEnvironment,SnapshotDescription,TableDescriptor)
14830 + preGetTableDescriptors(ObserverContext\<MasterCoprocessorEnvironment\>,List\<TableName\>, List\<TableDescriptor\>,String) 
14831 + postGetTableDescriptors(ObserverContext\<MasterCoprocessorEnvironment\>,List\<TableName\>, List\<TableDescriptor\>,String)
14832 + preGetTableNames(ObserverContext\<MasterCoprocessorEnvironment\>,List\<TableDescriptor\>, String)
14833 + postGetTableNames(ObserverContext\<MasterCoprocessorEnvironment\>,List\<TableDescriptor\>, String)
14838 * [HBASE-18520](https://issues.apache.org/jira/browse/HBASE-18520) | *Minor* | **Add jmx value to determine true Master Start time**
14840 This JIRA adds a JMX value to track when the Master has finished initializing.
14841 The jmx config is 'masterFinishedInitializationTime' and details the time in millis that the Master is fully usable and ready to serve requests.
14846 * [HBASE-17056](https://issues.apache.org/jira/browse/HBASE-17056) | *Critical* | **Remove checked in PB generated files**
14848 Purge all checked in generated protobuf files (30MB). Generate protobuf files inline with the build. Remove checked-in and patched protobuf. Get it from new hbase-thirdparty instead.
14850 Side-effect: Our protobuf went from 3.1.0 to 3.3.1.
14852 Build does not take noticeably longer (still about 2.5 minutes to do a mvn clean install -DskipTests).
14854 IDEs will probably require a mvn build first else they'll complain about missing (generated) files.
14859 * [HBASE-18374](https://issues.apache.org/jira/browse/HBASE-18374) | *Major* | **RegionServer Metrics improvements**
14861 This change adds the latency metrics checkAndPut, checkAndDelete, putBatch and deleteBatch . Also the previous regionserver "mutate" latency metrics are renamed to "put" metrics. Batch metrics capture the latency of the entire batch containing put/delete whereas put/delete metrics capture latency per operation. Note this change will break existing monitoring based on regionserver "mutate" latency metric.
14866 * [HBASE-18023](https://issues.apache.org/jira/browse/HBASE-18023) | *Minor* | **Log multi-\* requests for more than threshold number of rows**
14868 HBASE-18023 introduces a warning message in the RegionServer log when an RPC is received from a client that has more than 5000 "actions" (where an "action" is a collection of mutations for a specific row) in a single RPC. Misbehaving clients who send large RPCs to RegionServers can be malicious, causing temporary pauses via garbage collection or denial of service via crashes. The threshold of 5000 actions per RPC is defined by the property "hbase.rpc.rows.warning.threshold" in hbase-site.xml.
14873 * [HBASE-15968](https://issues.apache.org/jira/browse/HBASE-15968) | *Major* | **New behavior of versions considering mvcc and ts rather than ts only**
14875 This issue resolved two long-term issues in HBase:
14876 Puts may be masked by a delete before them.
14877 Major compactions change query results.
14879 This issue offer a new behavior to fix this issue with a little performance reduction. Set NEW\_VERSION\_BEHAVIOR to true to enable this feature in CF level. See HBASE-15968 for details.
14880 Note if you enable this feature, the order of Mutations matters. But replication will disorder the entries by default. So you have to enable serial replication if you have slave clusters. See HBASE-9465 for details.
14885 * [HBASE-18107](https://issues.apache.org/jira/browse/HBASE-18107) | *Major* | **[AMv2] Remove DispatchMergingRegionsRequest & DispatchMergingRegions**
14887 Removes merge region code added into branch-2 but that was not needed after all. Branch-2 replaced dispatchMergingRegions with MergeTableRegionsProcedure.
14889 Removed:
14891 # dispatchMergingRegions from Connection (was superceded long ago in branch-1).
14892 # mergeRegions from RsRpcServices (was not used).
14897 * [HBASE-15816](https://issues.apache.org/jira/browse/HBASE-15816) | *Major* | **Provide client with ability to set priority on Operations**
14899 Added setPriority(int priority) API to Put, Delete, Increment, Append, Get and Scan pojos.  So for all these ops, the user can provide a custom priority level.
14904 * [HBASE-18430](https://issues.apache.org/jira/browse/HBASE-18430) | *Major* | **Typo in "contributing to documentation" page**
14906 Pushed to {{master}}. Thanks, Coral! Congratulations on your first Apache HBase commit!
14911 * [HBASE-17908](https://issues.apache.org/jira/browse/HBASE-17908) | *Critical* | **Upgrade guava**
14913 Use relocated guava 22.0 gotten from the new hbase-thirdparty ancillary project.
14915 Incompatible change. ReplicationEndpoint and subclasses extend guava Service which changed pretty radically between 12.0 and 22.0. Change is kosher because implementations are marked audience private. Still, this will likely cause grief for the likes of the downstream lily indexer.
14920 * [HBASE-16993](https://issues.apache.org/jira/browse/HBASE-16993) | *Major* | **BucketCache throw java.io.IOException: Invalid HFile block magic when configuring hbase.bucketcache.bucket.sizes**
14922 Any value for hbase.bucketcache.bucket.sizes  configuration to be multiple of 256.  If that is not the case, instantiation of L2 Bucket cache itself will fail throwing IllegalArgumentException.
14927 * [HBASE-16090](https://issues.apache.org/jira/browse/HBASE-16090) | *Major* | **ResultScanner is not closed in SyncTable#finishRemainingHashRanges()**
14929 pushed to 1.3 and 1.2. SyncTable was introduced in 1.2, so skipping 1.1.
14934 * [HBASE-18332](https://issues.apache.org/jira/browse/HBASE-18332) | *Minor* | **Upgrade asciidoctor-maven-plugin**
14936 Committed to master and branch-2. Thanks!
14941 * [HBASE-18161](https://issues.apache.org/jira/browse/HBASE-18161) | *Minor* | **Incremental Load support for Multiple-Table HFileOutputFormat**
14943 In order to use this feature, a user must 

14944 1. Register their tables when configuring their job
14945 
2. Create a composite key of the tablename and original rowkey to send as the mapper output key. 
14947 

To register their tables (and configure their job for incremental load into multiple tables), a user must call the static MultiHFileOutputFormat.configureIncrementalLoad function to register the HBase tables that will be ingested into. 


14949 To create the composite key, a helper function MultiHFileOutputFormat2.createCompositeKey should be called with the destination tablename and rowkey as arguments, and the result should be output as the mapper key. 
14951 
Before this JIRA, for HFileOutputFormat2 a configuration for the storage policy was set per Column Family. This was set manually by the user. In this JIRA, this is unchanged when using HFileOutputFormat2. However, when specifically using MultiHFileOutputFormat2, the user now has to manually set the prefix by creating a composite of the table name and the column family. The user can create the new composite value by calling MultiHFileOutputFormat2.createCompositeKey with the tablename and column family as arguments.
14953 Changes added through this JIRA are backwards compatible with existing HFileOutputFormat2 apis and functionality.
14955 The configuration parameter "hbase.mapreduce.hfileoutputformat.table.name" is now a REQUIRED parameter though it is normally set automatically when configureIncrementalLoad method is called within HFileOutputFormat2
14960 * [HBASE-18229](https://issues.apache.org/jira/browse/HBASE-18229) | *Critical* | **create new Async Split API to embrace AM v2**
14962 A new splitRegionAsync() API is added in client. The existing splitRegion()  and split() API will call the new API so client does not have to change its code. 
14964 Move HBaseAdmin.splitXXX() logic to master, client splitXXX() API now go to master directly instead of going to RegionServer first.  
14966 Also added splitSync() API
14971 * [HBASE-18339](https://issues.apache.org/jira/browse/HBASE-18339) | *Major* | **Update test-patch to use hadoop 3.0.0-alpha4**
14973 HBase now defaults to Apache Hadoop 3.0.0-alpha4 when the Hadoop 3 profile is active.
14978 * [HBASE-18267](https://issues.apache.org/jira/browse/HBASE-18267) | *Major* | **The result from the postAppend is ignored**
14980 **WARNING: No release note provided for this change.**
14985 * [HBASE-18307](https://issues.apache.org/jira/browse/HBASE-18307) | *Major* | **Share the same EventLoopGroup for NettyRpcServer, NettyRpcClient and AsyncFSWALProvider at RS side**
14987 There are two configuration name changes as the event loop configs will not only effect rpc server but be shared by different components in the same RS instance.
14989 'hbase.rpc.server.nativetransport' -\> 'hbase.netty.nativetransport'
14991 'hbase.netty.rpc.server.worker.count' -\> 'hbase.netty.worker.count'
14996 * [HBASE-18241](https://issues.apache.org/jira/browse/HBASE-18241) | *Critical* | **Change client.Table, client.Admin, Region, Store, and HBaseTestingUtility to not use HTableDescriptor or HColumnDescriptor**
14998 - : removed API
14999 + : new API
15000 \* : deprecated API
15001 ---------------------------
15002 Region class
15003 - HTableDescriptor getTableDesc()
15004 +TableDescriptor getTableDescriptor()
15006 Store class
15007 - HColumnDescriptor getFamily()
15008 + ColumnFamilyDescriptor getColumnFamilyDescriptor()
15010 Table class
15011 \* HTableDescriptor getTableDescriptor()
15012 + TableDescriptor getDescriptor()\|
15014 \*Admin class\*
15015 \* HTableDescriptor getTableDescriptor(TableName)
15016 + List\<TableDescriptor\> listTableDescriptor(TableName)\|
15017 \* HTableDescriptor[] getTableDescriptors(List\<String\>)
15018 \* HTableDescriptor[] getTableDescriptorsByTableName(List\<TableName\>)
15019 + List\<TableDescriptor\> listTableDescriptors(List\<TableName\>)
15020 \* HTableDescriptor[] listTables()
15021 + List\<TableDescriptor\> listTableDescriptors()
15022 \* HTableDescriptor[] listTables(Pattern)
15023 + List\<TableDescriptor\> listTableDescriptors(Pattern)
15024 \* HTableDescriptor[] listTables(String)
15025 + List\<TableDescriptor\> listTableDescriptors(String)
15026 \* HTableDescriptor[] listTables(Pattern, boolean)
15027 + List\<TableDescriptor\> listTableDescriptors(Pattern, boolean)
15028 \* HTableDescriptor[] listTables(String, boolean)
15029 + List\<TableDescriptor\> listTableDescriptors(String, boolean)
15030 \* HTableDescriptor[] deleteTables(String)
15031 \* HTableDescriptor[] deleteTables(Pattern)
15032 \* HTableDescriptor[] enableTables(String)
15033 \* HTableDescriptor[] enableTables(Pattern)
15034 \* HTableDescriptor[] disableTables(String)
15035 \* HTableDescriptor[] disableTables(Pattern)
15036 \* void modifyTable(TableName, HTableDescriptor)
15037 + void modifyTable(TableDescriptor)
15038 \* void modifyTableAsync(TableName, HTableDescriptor)
15039 + void modifyTableAsync(TableDescriptor)
15040 \* HTableDescriptor[] listTableDescriptorsByNamespace(String)
15041 + List\<TableDescriptor\> listTableDescriptorsByNamespace(byte[])
15042 \* void createTable(HTableDescriptor)
15043 + void createTable(TableDescriptor)
15044 \* void createTable(HTableDescriptor, byte[], byte[], int)
15045 + void createTable({color:red}TableDescriptor, byte[], byte[], int)
15046 \* void createTable(HTableDescriptor, byte[][])
15047 + void createTable(TableDescriptor, byte[][])
15048 \* Future\<Void\> createTableAsync(HTableDescriptor, byte[][])
15049 + Future\<Void\> createTableAsync(TableDescriptor, byte[][])
15051 \*HBaseTestingUtility class\*
15052 \* Table createTable(HTableDescriptor, byte[][], Configuration)
15053 + Table createTable(TableDescriptor, byte[][], Configuration)
15054 \* Table createTable(HTableDescriptor, byte[][], byte[][], Configuration)
15055 + Table createTable(TableDescriptor, byte[][], byte[][], Configuration)
15056 \* public Table createTable(HTableDescriptor, byte[][])
15057 + public Table createTable(TableDescriptor, byte[][])
15058 \* void modifyTableSync(Admin, HTableDescriptor)
15059 + void modifyTableSync(Admin, TableDescriptor)
15060 \* HRegion createLocalHRegion(HTableDescriptor, byte [], byte [])
15061 + HRegion createLocalHRegion(TableDescriptor, byte [], byte [])
15062 \* HRegion createLocalHRegion(HRegionInf, HTableDescriptor)
15063 + HRegion createLocalHRegion(HRegionInf, TableDescriptor)
15064 \* HRegion createLocalHRegion(HRegionInfo, HTableDescriptor, WAL)
15065 + HRegion createLocalHRegion(HRegionInfo, TableDescriptor, WAL)
15066 \* List createMultiRegionsInMeta(final Configuration, HTableDescriptor, byte [][])
15067 + List createMultiRegionsInMeta(final Configuration, TableDescriptor, byte [][])
15068 \* HRegion createRegionAndWAL(HRegionInfo, Path, Configuration, HTableDescriptor)
15069 + HRegion createRegionAndWAL(HRegionInfo, Path, Configuration, TableDescriptor)
15070 \* HRegion createRegionAndWAL(HRegionInfo, Pat, Configuration, HTableDescriptor, boolean)
15071 + HRegion createRegionAndWAL(HRegionInfo, Pat, Configuration, TableDescriptor, boolean)
15072 \* int createPreSplitLoadTestTable(Configuration,HTableDescriptor, HColumnDescriptor)
15073 + int createPreSplitLoadTestTable(Configuration,TableDescriptor, ColumnFamilyDescriptor)
15074 \* int createPreSplitLoadTestTable(Configuration, HTableDescriptor, HColumnDescriptor, int)
15075 + int createPreSplitLoadTestTable(Configuration, TableDescriptor, ColumnFamilyDescriptor, int)
15076 \* int createPreSplitLoadTestTable(Configuration, HTableDescriptor, HColumnDescriptor[], int)
15077 + int createPreSplitLoadTestTable(Configuration, TableDescriptor, ColumnFamilyDescriptor[], int)
15078 \* int createPreSplitLoadTestTable(Configuration,HTableDescriptor, HColumnDescriptor[],SplitAlgorithm, int)
15079 + int createPreSplitLoadTestTable(Configuration,TableDescriptor, ColumnFamilyDescriptor[],SplitAlgorithm, int)
15080 \* HRegion createTestRegion(String, HColumnDescriptor)
15081 + HRegion createTestRegion(String, ColumnFamilyDescriptor)
15086 * [HBASE-18083](https://issues.apache.org/jira/browse/HBASE-18083) | *Major* | **Make large/small file clean thread number configurable in HFileCleaner**
15088 After HBASE-18083 we could configure HFileCleaner to use multiple threads for large/small (archived) hfile cleaning with hbase.regionserver.hfilecleaner.large.thread.count and hbase.regionserver.hfilecleaner.small.thread.count, both default to 1. These properties support online configuration change.
15093 * [HBASE-17931](https://issues.apache.org/jira/browse/HBASE-17931) | *Blocker* | **Assign system tables to servers with highest version**
15095 We usually keep compatibility between old client and new server so we can do rolling upgrade, HBase cluster first, then HBase client. But we don't guarantee new client can access old server.
15096 In an HBase cluster, we have system tables and region servers will access these tables so for servers they are also an HBase client. So if the system tables are in region servers with lower version we may get trouble because region servers with higher version may can not access them.
15097 After this patch, we will move all system regions to region servers with highest version. So when we do a rolling upgrade across two major or minor versions, we should ALWAYS UPGRADE MASTER FIRST and then upgrade region servers. The new master will handle system tables correctly.
15102 * [HBASE-6581](https://issues.apache.org/jira/browse/HBASE-6581) | *Major* | **Build with hadoop.profile=3.0**
15104 Make us build against hadoop trunk (3.0)
15109 * [HBASE-16120](https://issues.apache.org/jira/browse/HBASE-16120) | *Minor* | **Add shell test for truncate\_preserve**
15111 Add unit tests for truncate\_preserve
15116 * [HBASE-18240](https://issues.apache.org/jira/browse/HBASE-18240) | *Major* | **Add hbase-thirdparty, a project with hbase utility including an hbase-shaded-thirdparty module with guava, netty, etc.**
15118 Adds a new project, hbase-thirdparty, at https://git-wip-us.apache.org/repos/asf/hbase-thirdparty used by core hbase. GroupID org.apache.hbase.thirdparty. Version 1.0.0. 
15120 This project packages relocated third-party libraries used by Apache HBase such as protobuf, guava, and netty among others. HBase core depends on it.
15122 It has threre submodules, one to patch and then relocate (shade) protobuf, and one to do messy .so renaming (netty). The remainder module relocates a bundle of other (unpatched) libs used by hbase. This latter set includes protobuf-util, netty-all, gson, and guava.
15124 All shading is done using the same relocation offset of org.apache.hadoop.hbase.shaded; we add this prefix to the relocated thirdparty library class names.
15126 See the pom.xml in hbase-thirdparty for the explicit version of each third-party lib included (of note, we update out internal protobuf from 3.1.0 to 3.3.1).
15131 * [HBASE-15943](https://issues.apache.org/jira/browse/HBASE-15943) | *Major* | **Add page displaying JVM process metrics**
15133 Adds new "Process Metrics' tab along the top which leads to new page that dumps mbean -- mostly jvm -- metrics
15138 * [HBASE-14902](https://issues.apache.org/jira/browse/HBASE-14902) | *Major* | **Revert some of the stringency recently introduced by checkstyle tightening**
15140 Changes the checkstyle so that on a continuation line for javadoc, instead of default four spaces, instead now it is two spaces. Also one line statements as in if (true) x =1; now pass checkstyle.
15145 * [HBASE-17110](https://issues.apache.org/jira/browse/HBASE-17110) | *Major* | **Improve SimpleLoadBalancer to always take server-level balance into account**
15147 After HBASE-17110 the bytable strategy for SimpleLoadBalancer will also take server level balance into account
15152 * [HBASE-17928](https://issues.apache.org/jira/browse/HBASE-17928) | *Major* | **Shell tool to clear compaction queues**
15154 Adds clear\_compaction\_queues to the hbase shell.
15155 {code}
15156   Clear compaction queues on a regionserver.
15157   The queue\_name contains short and long. 
15158   short is shortCompactions's queue,long is longCompactions's queue.
15159   
15160   Examples:
15161   hbase\> clear\_compaction\_queues 'host187.example.com,60020'
15162   hbase\> clear\_compaction\_queues 'host187.example.com,60020','long'
15163   hbase\> clear\_compaction\_queues 'host187.example.com,60020', ['long','short']
15164 {code}
15169 * [HBASE-18164](https://issues.apache.org/jira/browse/HBASE-18164) | *Critical* | **Much faster locality cost function and candidate generator**
15171 New locality cost function and candidate generator that use caching and incremental computation to allow the stochastic load balancer to consider ~20x more cluster configurations for big clusters.
15176 * [HBASE-18226](https://issues.apache.org/jira/browse/HBASE-18226) | *Major* | **Disable reverse DNS lookup at HMaster and use the hostname provided by RegionServer**
15178 The following config is added by this JIRA:
15180 hbase.regionserver.hostname.disable.master.reversedns
15182 This config is for experts: don't set its value unless you really know what you are doing.
15183 When set to true, regionserver will use the current node hostname for the servername and HMaster will skip reverse DNS lookup and use the hostname sent by regionserver instead. Note that this config and hbase.regionserver.hostname are mutually exclusive. See https://issues.apache.org/jira/browse/HBASE-18226 for more details.
15185 Caution: please make sure rolling upgrade succeeds before turning on this feature.
15190 * [HBASE-16242](https://issues.apache.org/jira/browse/HBASE-16242) | *Major* | **Upgrade Avro to 1.7.7**
15192 Apache HBase now specifies that version 1.7.7 of the Apache Avro library should be pulled in by maven and included in the convenience binary tarball.
15197 * [HBASE-18213](https://issues.apache.org/jira/browse/HBASE-18213) | *Major* | **Add documentation about the new async client**
15199 Add documentation for async client in section '66. Client' in ref guide.
15204 * [HBASE-17008](https://issues.apache.org/jira/browse/HBASE-17008) | *Critical* | **Examples to make AsyncClient go down easy**
15206 Add two examples for async client. AsyncClientExample is a simple example to show you how to use AsyncTable. HttpProxyExample is an example for advance user to show you how to use RawAsyncTable to write a fully asynchronous HTTP proxy server. There is no extra thread pool, all operations are executed inside netty's event loop.
15211 * [HBASE-18200](https://issues.apache.org/jira/browse/HBASE-18200) | *Major* | **Set hadoop check versions for branch-2 and branch-2.x in pre commit**
15213 Allow setting different hadoop check versions for branch-2 and branch-2.x when running pre commit check.
15218 * [HBASE-18187](https://issues.apache.org/jira/browse/HBASE-18187) | *Major* | **Release hbase-2.0.0-alpha1**
15220 Pushed the release. For detail: http://apache-hbase.679495.n3.nabble.com/ANNOUNCE-Apache-HBase-2-0-0-alpha-1-is-now-available-for-download-td4088484.html
15225 * [HBASE-18137](https://issues.apache.org/jira/browse/HBASE-18137) | *Critical* | **Replication gets stuck for empty WALs**
15227 0-length WAL files can potentially cause the replication queue to get stuck.  A new config "replication.source.eof.autorecovery" has been added: if set to true (default is false), the 0-length WAL file will be skipped after 1) the max number of retries has been hit, and 2) there are more WAL files in the queue.  The risk of enabling this is that there is a chance the 0-length WAL file actually has some data (e.g. block went missing and will come back once a datanode is recovered).
15232 * [HBASE-18192](https://issues.apache.org/jira/browse/HBASE-18192) | *Blocker* | **Replication drops recovered queues on region server shutdown**
15234 If a region server that is processing recovered queue for another previously dead region server is gracefully shut down, it can drop the recovered queue under certain conditions. Running without this fix on a 1.2+ release means possibility of continuing data loss in replication, irrespective of which WALProvider is used.
15235 If a single WAL group (or DefaultWALProvider) is used, running without this fix will always cause dataloss in replication whenever a region server processing recovered queues is gracefully shutdown.
15240 * [HBASE-18109](https://issues.apache.org/jira/browse/HBASE-18109) | *Critical* | **Assign system tables first (priority)**
15242 Adds a sort of procedures before submission so system tables are queued first (which will help ensure they go out first). This should be good enough along w/ existing scheduling mechanisms to ensure system/meta are assigned first (See reasoning below). Open new issue if insufficient.
15247 * [HBASE-18008](https://issues.apache.org/jira/browse/HBASE-18008) | *Major* | **Any HColumnDescriptor we give out should be immutable**
15249 1) The HColumnDescriptor got from Admin, AsyncAdmin, and Table is immutable. 
15250 2) HColumnDescriptor have been marked as "Deprecated" and user should substituted  
15251      ColumnFamilyDescriptor for HColumnDescriptor.
15252 3) ColumnFamilyDescriptor is constructed through ColumnFamilyDescriptorBuilder and it contains all of the read-only methods from HColumnDescriptor
15253 4) The value to which the IS\_MOB/MOB\_THRESHOLD is mapped is stored as String rather than Boolean/Long. The MOB is an new feature to 2.0 so this change should be acceptable
15258 * [HBASE-18149](https://issues.apache.org/jira/browse/HBASE-18149) | *Major* | **The setting rules for table-scope attributes and family-scope attributes should keep consistent**
15260 If the table-scope attributes value is false, you need not to enclose 'false' in single quotation.Both COMPACTION\_ENABLED =\> false and COMPACTION\_ENABLED =\> 'false' will take effect
15265 * [HBASE-17849](https://issues.apache.org/jira/browse/HBASE-17849) | *Major* | **PE tool random read is not totally random**
15267 When randomRead and randomSeekScan is used with PE tool, now we allow using both --size and --rows. The --size specifies the total size of the data (the range) on which the reads should be performed and --rows specifies the number of rows to be read by each client with in that range.
15272 * [HBASE-15576](https://issues.apache.org/jira/browse/HBASE-15576) | *Major* | **Scanning cursor to prevent blocking long time on ResultScanner.next()**
15274 If you don't like scanning being blocked too long because of heartbeat and partial result, you can use Scan#setNeedCursorResult(true) to get a special result within scanning timeout setting time which will tell you where row the server is scanning. See its javadoc for more details.
15279 * [HBASE-16549](https://issues.apache.org/jira/browse/HBASE-16549) | *Major* | **Procedure v2 - Add new AM metrics**
15281 Following AMv2 procedures are modified to override onSubmit(), onFinish() hooks provided by HBASE-17888 to do
15282 metrics calculations when procedures are submitted and finshed:
15283 \* AssignProcedure
15284 \* UnassignProcedure
15285 \* MergeTableRegionProcedure
15286 \* SplitTableRegionProcedure
15287 \* ServerCrashProcedure
15289 Following metrics is collected for each of the above procedure during lifetime of a process:
15290 \* Total number of requests submitted for a type of procedure
15291 \* Histogram of runtime in milliseconds for successfully completed procedures
15292 \* Total number of failed procedures
15294 As we are moving away from Hadoop's metric2, hbase-metrics-api module is used for newly added metrics.
15299 * [HBASE-9393](https://issues.apache.org/jira/browse/HBASE-9393) | *Critical* | **Hbase does not closing a closed socket resulting in many CLOSE\_WAIT**
15301 To handle this issue client need to have Hadoop client 2.6.4 or 2.7.0+ Hadoop version as CanUnBuffer interface which was added as part of HDFS-7694 is available in only those versions.
15306 * [HBASE-18038](https://issues.apache.org/jira/browse/HBASE-18038) | *Critical* | **Rename StoreFile to HStoreFile and add a StoreFile interface for CP**
15308 StoreFile is now changed to an interface. This is an incompatible change. The coprocessors which implement RegionObserver may need to modify their code.
15313 * [HBASE-16196](https://issues.apache.org/jira/browse/HBASE-16196) | *Critical* | **Update jruby to a newer version.**
15315 The bundled JRuby 1.6.8 has been updated to version 9.1.9.0. The represents a change from Ruby 1.8 to Ruby 2.3.3, which introduces non-compatible language changes for user scripts.
15317 This JRuby version update required an update to joni-2.1.11 and jcodings-1.0.18, used for regular expression matching, as well as several transitive dependency updates that should not be user-visible.
15322 * [HBASE-14614](https://issues.apache.org/jira/browse/HBASE-14614) | *Major* | **Procedure v2: Core Assignment Manager**
15324 Replaces the AssignmentManager with a new procedurev2-based AssignmentManager
15326 h1. AMv2
15327 Puts AssignmentManager up on top of the ProcedureV2 state machine with persistence engine. Each assignment atom is now a Procedure implementation; e.g. an AssignProcedure and an UnassignProcedure. Molecules of aggregated Procedures are used to do more involved assignment steps: e.g. the move region procedure is made of an Unassign followed by an Assign subprocedure.
15329 AMv2 is 1500 lines. Old AM was near 4000. Functionality has been moved out to Procedures. In-memory states of regions and servers has been cleaned up stored in new RegionStates implementation. RegionStateStore takes care of publishing final region state out to the hbase:meta table.
15331 New RemoteProcedureDispatcher/RSProcedureDispatcher runs the Procedure-based assignments ‘remotely’. Knows about ‘servers’. Does aggregation of assignments by time on a time/count basis so can send procedures in batches rather than one per RPC. Procedure status comes back on the back of the RegionServer heartbeat reporting online regions. The response is passed to the AMv2 to ‘process’. It will check against the in-memory state. If there is a mismatch, it fences out the RegionServer on the assumption that something went wrong on the RS side.Timeouts trigger retries. The Procedure machine ensures only one operation at a time on any one region/table using locking and smarts about what is serial and what can be run concurrently.
15333 New accounting of RegionServer version will be used running rolling restarts.
15335 ‘States’ -- OPENING, CLOSING, etc. -- are now in-memory in-the-master only serialized out to the ProcedureV2 WAL. They are no longer persisted to ZooKeeper.
15337 h2. Assign Detail
15338 The Assign starts by pushing the "assign" operation to the AssignmentManager and then will go into a “waiting" state. The AM will batch the "assign" requests and ask the Balancer where to put the region (the various policies will be respected: retain, round-robin, random). Once the AM and the balancer have found a place for the region, the procedure will be resumed and an "open region" request will be placed in the Remote Dispatcher queue, and the procedure once again will go into a "waiting state".  The Remote Dispatcher will batch the various requests for that server and they will be sent to the RS for execution. The RS will complete the open operation by calling master.reportRegionStateTransition(). The AM will intercept the transition report, and notify the procedure. The procedure will finish the assignment by publishing to new state on hbase:meta or it will retry the assignment.
15340 h3. Unassign Detail
15341  The Unassign starts by placing a "close region" request in the Remote Dispatcher queue, and the procedure will then go into a "waiting state". The Remote Dispatcher will batch the various requests for that server and they will be sent to the RS for execution. The RS will complete the open operation by calling master.reportRegionStateTransition(). The AM will intercept the transition report, and notify the procedure. The procedure will finish the unassign by publishing its new state on meta or it will retry the unassign.
15343 h1. New Configs
15344  \* "hbase.procedure.remote.dispatcher.threadpool.size" defaults 128
15345  \* "hbase.procedure.remote.dispatcher.delay.msec" default 150ms
15346  \* "hbase.procedure.remote.dispatcher.max.queue.size" with default 32
15347  \* "hbase.regionserver.rpc.startup.waittime" with default 60 seconds.
15348 h1. TODO
15349 As of this writing.
15351 Put up a model diagram.
15353  \* Handle region migration
15354  \* Handle meta assignment first
15355  \* Handle sys table assignment first (e.g. acl, namespace)
15356  \* Handle table priorities
15357  \* Do we report same AM metrics as we used too? We do it all in here now.
15359 INCOMPATIBLE
15360 A known incompatible is that because splits and merges are now run from the master, Coprocessors that used to watch for merge/split from a RegionObserver now no longer work; to watch split/merges, you need to have an observer on the Master instead.
15365 * [HBASE-3462](https://issues.apache.org/jira/browse/HBASE-3462) | *Major* | **Fix table.jsp in regards to splitting a region/table with an optional splitkey**
15367 UI pages for splitting/merging now operate by taking a row key prefix from the user rather than a full region name.
15372 * [HBASE-18129](https://issues.apache.org/jira/browse/HBASE-18129) | *Major* | **truncate\_preserve fails when the truncate method doesn't exists on the master**
15374 The command truncate\_preserve will be fine when the truncate method doesn't exist on the master
15379 * [HBASE-18122](https://issues.apache.org/jira/browse/HBASE-18122) | *Major* | **Scanner id should include ServerName of region server**
15381 The scanner id is not from 1 anymore.
15382 The first 32 bits are MurmurHash32 of ServerName string "host,port,ts". The ServerName contains both host, port, and start timestamp so it can prevent collision. The lowest 32bit is generated by atomic int.
15387 * [HBASE-17997](https://issues.apache.org/jira/browse/HBASE-17997) | *Major* | **In dev environment, add jruby-complete jar to classpath only when jruby is needed**
15389 When JRUBY\_HOME is specified, if the command is "hbase shell" or "hbase org.jruby.Main", CLASSPATH and HBASE\_OPTS will be updated according to JRUBY\_HOME specified
15390 \* Jar under JRUBY\_HOME is added to CLASSPATH
15391 \* The following will be added into HBASE\_OPTS
15393 -Djruby.home=$JRUBY\_HOME -Djruby.lib=$JRUBY\_HOME/lib
15396 That is, as long as JRUBY\_HOME is specified, JRUBY\_HOME specified will take precedence.
15397 \* In dev env, the jar recorded in cached\_classpath\_jruby.txt will be ignored
15398 \* In non dev env, jruby-complete jar packaged with HBase will be ignored
15403 * [HBASE-15616](https://issues.apache.org/jira/browse/HBASE-15616) | *Major* | **Allow null qualifier for all table operations**
15405 After this issue, all table operations will support null qualifier, such as put/get/scan/increment/append/checkAndMutate/checkAndPut/checkAndDelete.
15410 * [HBASE-18035](https://issues.apache.org/jira/browse/HBASE-18035) | *Critical* | **Meta replica does not give any primaryOperationTimeout to primary meta region**
15412 When a client is configured to use meta replica, it sends scan request to all meta replicas almost at the same time. Since meta replica contains stale data, if result from one of replica comes back first, the client may get wrong region locations. To fix this, "hbase.client.meta.replica.scan.timeout" is introduced, a client will always send to primary meta region first, wait the configured timeout for reply. If no result is received, it will send request to replica meta regions. The unit for "hbase.client.meta.replica.scan.timeout"  is microsecond, the default value is 1000000 (1 second).
15417 * [HBASE-11013](https://issues.apache.org/jira/browse/HBASE-11013) | *Major* | **Clone Snapshots on Secure Cluster Should provide option to apply Retained User Permissions**
15419 While creating a snapshot, it will save permissions of the original table into .snapshotinfo file(Backward compatibility) , which is in the snapshot root directory.  For clone\_snapshot/restore\_snapshot command, we provide an additional option( RESTORE\_ACL) to decide whether we will grant permissons of the origin table to the newly created table.
15424 * [HBASE-18018](https://issues.apache.org/jira/browse/HBASE-18018) | *Major* | **Support abort for all procedures by default**
15426 The default behavior for abort() method of StateMachineProcedure class is changed to support aborting all procedures irrespective of if procedure supports rollback or not.
15431 * [HBASE-16851](https://issues.apache.org/jira/browse/HBASE-16851) | *Major* | **User-facing documentation for the In-Memory Compaction feature**
15433 Two blog posts on Apache HBase blog: user manual and programmer manual. 
15434 Ref. guide draft published: https://docs.google.com/document/d/1Xi1jh\_30NKnjE3wSR-XF5JQixtyT6H\_CdFTaVi78LKw/edit
15439 * [HBASE-17343](https://issues.apache.org/jira/browse/HBASE-17343) | *Blocker* | **Make Compacting Memstore default in 2.0 with BASIC as the default type**
15441  This JIRA changes the default MemStore to be CompactingMemStore instead of DefaultMemStore. In-memory compaction of CompactingMemStore demonstrated sizable improvement in HBase’s write amplification and read/write performance.
15443 CompactingMemStore achieves these gains through smart use of RAM. The algorithm periodically re-organizes the in-memory data in efficient data structures and reduces redundancies. The  HBase server’s memory footprint therefore periodically expands and contracts. The outcome is longer lifetime of data in memory, less I/O, and overall faster performance. More details about the algorithm and its use appear in the Apache HBase Blog: https://blogs.apache.org/hbase/
15445 How To Use:
15446 The in-memory compaction level can be configured both globally and per column family. The supported levels are none (DefaultMemStore), basic, and eager. 
15448 By default, all tables apply basic in-memory compaction. This global configuration can be overridden in hbase-site.xml, as follows: 
15450 \<property\>
15451  \<name\>hbase.hregion.compacting.memstore.type\</name\>
15452  \<value\>\<none\|basic\|eager\>\</value\>
15453  \</property\>
15455 The level can also be configured in the HBase shell per column family, as follows:  
15457 create ‘\<tablename\>’, 
15458 {NAME =\> ‘\<cfname\>’, IN\_MEMORY\_COMPACTION =\> ‘\<NONE\|BASIC\|EAGER\>’}
15463 * [HBASE-17786](https://issues.apache.org/jira/browse/HBASE-17786) | *Major* | **Create LoadBalancer perf-tests (test balancer algorithm decoupled from workload)**
15465 $ bin/hbase org.apache.hadoop.hbase.master.balancer.LoadBalancerPerformanceEvaluation -help
15466 usage: hbase org.apache.hadoop.hbase.master.balancer.LoadBalancerPerformanceEvaluation \<options\>
15467 Options:
15468  -regions \<arg\>         Number of regions to consider by load balancer. Default: 1000000
15469  -servers \<arg\>         Number of servers to consider by load balancer. Default: 1000
15470  -load\_balancer \<arg\>   Type of Load Balancer to use. Default:
15471                         org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer
15476 * [HBASE-17887](https://issues.apache.org/jira/browse/HBASE-17887) | *Blocker* | **Row-level consistency is broken for read**
15478 Now we pass on list of memstoreScanners to the StoreScanner along with the new files to ensure that the StoreScanner sees the latest memstore after flush.
15483 * [HBASE-15296](https://issues.apache.org/jira/browse/HBASE-15296) | *Major* | **Break out writer and reader from StoreFile**
15485 \<!-- mardown --\>
15486 Refactor that breaks out StoreFile Reader and Writer inner classes as StoreFileReader and StoreFileWriter.
15488 NOTE! Changes RegionObserver Coprocessor Interface so incompatible change (Discussed on dev list in thread "[Note breaking change on RegionObserver in hbase-2.0.0](https://s.apache.org/hbase-dev-note-about-HBASE-15296)"
15493 * [HBASE-15199](https://issues.apache.org/jira/browse/HBASE-15199) | *Critical* | **Move jruby jar so only on hbase-shell module classpath; currently globally available**
15495 The JRuby jar is no longer automatically included in classpaths for HBase server processes nor clients. It is still included in the classpath for the HBase shell and for invocations of org.jruby.Main, which should cover HBase provided support scripts.
15500 * [HBASE-18009](https://issues.apache.org/jira/browse/HBASE-18009) | *Major* | **Move RpcServer.Call to a separated file**
15502 The return value of CallRunner.getCall is changed so this is an incompatible change as CallRunner is declared as IA.LimitedPrivate. CallRunner is declared as IS.Evolving so we do not break the rule. And we still keep the getCall method to reduce the impact to user code.
15507 * [HBASE-14925](https://issues.apache.org/jira/browse/HBASE-14925) | *Major* | **Develop HBase shell command/tool to list table's region info through command line**
15509 Added a shell command 'list\_regions' for displaying the table's region info through command line.
15511         List all regions for a particular table as an array and also filter them by server name (optional) as prefix
15512         and maximum locality (optional). By default, it will return all the regions for the table with any locality.
15513         The command displays server name, region name, start key, end key, size of the region in MB, number of requests
15514         and the locality. The information can be projected out via an array as third parameter. By default all these information
15515         is displayed. Possible array values are SERVER\_NAME, REGION\_NAME, START\_KEY, END\_KEY, SIZE, REQ and LOCALITY. Values
15516         are not case sensitive. If you don't want to filter by server name, pass an empty hash / string as shown below.
15518         Examples:
15519         hbase\> list\_regions 'table\_name'
15520         hbase\> list\_regions 'table\_name', 'server\_name'
15521         hbase\> list\_regions 'table\_name', {SERVER\_NAME =\> 'server\_name', LOCALITY\_THRESHOLD =\> 0.8}
15522         hbase\> list\_regions 'table\_name', {SERVER\_NAME =\> 'server\_name', LOCALITY\_THRESHOLD =\> 0.8}, ['SERVER\_NAME']
15523         hbase\> list\_regions 'table\_name', {}, ['SERVER\_NAME', 'start\_key']
15524         hbase\> list\_regions 'table\_name', '', ['SERVER\_NAME', 'start\_key']
15529 * [HBASE-17471](https://issues.apache.org/jira/browse/HBASE-17471) | *Critical* | **Region Seqid will be out of order in WAL if using mvccPreAssign**
15531 MVCCPreAssign is added by HBASE-16698, but pre-assign mvcc is only used in put/delete path. Other write paths like increment/append still assign mvcc in ringbuffer's consumer thread. If put and increment are used parallel. Then seqid in WAL may not increase monotonically. Disorder in wals will lead to data loss.This patch bring all mvcc/seqid event in wal.append, and synchronize wal append and mvcc acquirement. No disorder in wal will happen. Performance test shows no regression with this patch.
15536 * [HBASE-16466](https://issues.apache.org/jira/browse/HBASE-16466) | *Major* | **HBase snapshots support in VerifyReplication tool to reduce load on live HBase cluster with large tables**
15538 Support for snapshots in VerifyReplication tool i.e. verifyrep can compare source table snapshot against peer table snapshot which reduces load on RS by reading data from HDFS directly using Snapshot scanners. 
15539 Instead of comparing against live tables whose state changes due to writes and compactions its better to compare HBase  snapshots which are immutable in nature.
15544 * [HBASE-17263](https://issues.apache.org/jira/browse/HBASE-17263) | *Major* | **  Netty based rpc server impl**
15546 A new RPC server based on Netty4 which can improve random read (get) performance. By default, it is off. To use this feature, please set “hbase.rpc.server.impl" to “org.apache.hadoop.hbase.ipc.NettyRpcServer”.
15548 In one deploy, doubled the throughput and lowered the latency significantly: see https://www.slideshare.net/HBaseCon/lift-the-ceiling-of-hbase-throughputs?qid=597ee2fa-8125-4faa-bb3b-2bf1ba9ccafb&v=&b=&from\_search=6
15553 * [HBASE-17957](https://issues.apache.org/jira/browse/HBASE-17957) | *Minor* | ** Custom metrics of replicate endpoints don't prepend "source." to global metrics**
15555 Global custom metrics names follow the "source.metricsName" format.
15560 * [HBASE-17757](https://issues.apache.org/jira/browse/HBASE-17757) | *Major* | **Unify blocksize after encoding to decrease memory fragment**
15562 Blocksize is set in columnfamily's atrributes. It is used to control block sizes when generating blocks. But, it doesn't take encoding into count. If you set encoding to blocks, after encoding, the block size varies. Since blocks will be cached in memory after encoding (default), it will cause memory fragment if using blockcache, or decrease the pool efficiency if using bucketCache. This issue introduced a new config named 'hbase.writer.unified.encoded.blocksize.ratio'. The default value of this config is 1, meaning doing nothing. If this value is set to a smaller value like 0.5, and the blocksize is set to 64KB(default value of blocksize). It will unify the blocksize after encoding to 64KB \* 0.5 = 32KB. Unified blocksize will releaf the memory problems mentioned above.
15567 * [HBASE-14286](https://issues.apache.org/jira/browse/HBASE-14286) | *Trivial* | **Correct typo in argument name for WALSplitter.writeRegionSequenceIdFile**
15569 HBASE-14286 Correct typo in argument name for WALSplitter.writeRegionSequenceIdFile
15574 * [HBASE-17817](https://issues.apache.org/jira/browse/HBASE-17817) | *Major* | **Make Regionservers log which tables it removed coprocessors from when aborting**
15576 Add table name to exception logging when a coprocessor is removed from a table by the region server
15581 * [HBASE-17877](https://issues.apache.org/jira/browse/HBASE-17877) | *Major* | **Improve HBase's byte[] comparator**
15583 updated the lexicographic byte array comparator to use a slightly more optimized version similar to the one available in the guava library that compares only the first index where left[index] != right[index]. The comparator also returns the diff directly instead of mapping it to -1, 0, +1 range as was being done in the earlier version. We have seen significant performance gains, calculated in terms of throughput (ops/ms) with these changes ranging from approx 20% for smaller byte arrays upto 200 bytes and almost 100% for large byte array sizes that are in few KB's. We benchmarked with upto 16KB arrays and the general trend indicates that the performance improvement increases as the size of the byte array increases.
15588 * [HBASE-9899](https://issues.apache.org/jira/browse/HBASE-9899) | *Major* | **for idempotent operation dups, return the result instead of throwing conflict exception**
15590 Non-idempotent operations (increment/append/checkAndPut/...) may throw OperationConflictException even though the increment/append succeeded. For example (client rpc retries number set to 3):
15592 1. first increment rpc request success
15593 2. client timeout and send second rpc request, but nonce is same and save in server. The server found that it has already succeed, so return a OperationConflictException to make sure that increment operation only be applied once in server.
15595 This patch will solve this problem by read the previous result when receive a duplicate rpc request.
15596 1. Store the mvcc to OperationContext. When first rpc request succeed, store the mvcc for this operation nonce.
15597 2. When there are duplicate rpc request, convert to read result by the mvcc.
15602 * [HBASE-15583](https://issues.apache.org/jira/browse/HBASE-15583) | *Minor* | **Any HTableDescriptor we give out should be immutable**
15604 # The HTD got from Admin, AsyncAdmin, and Table is immutable.
15605 # DEFERRED\_LOG\_FLUSH is removed.
15606 # cleanup the deprecated construction of HTD
15611 * [HBASE-17956](https://issues.apache.org/jira/browse/HBASE-17956) | *Major* | **Raw scan should ignore TTL**
15613 Now raw scan can also read expired cells.
15618 * [HBASE-15143](https://issues.apache.org/jira/browse/HBASE-15143) | *Minor* | **Procedure v2 - Web UI displaying queues**
15620 Adds a new Admin#listLocks, a panel on the procedures page to list procedure locks, and a list\_locks command to the shell. Use it to see current state of procedure locking in Master process.
15625 * [HBASE-17514](https://issues.apache.org/jira/browse/HBASE-17514) | *Minor* | **Warn when Thrift Server 1 is configured for proxy users but not the HTTP transport**
15627 If users of the Thrift 1 Server enable proxy user support without enabling the prerequisite HTTP transport, we now log a WARN message about the mismatch.
15632 * [HBASE-17914](https://issues.apache.org/jira/browse/HBASE-17914) | *Major* | **Create a new reader instead of cloning a new StoreFile when compaction**
15634 StoreFile.createReader method is gone. Call initReader and then getReader instead.
15639 * [HBASE-16477](https://issues.apache.org/jira/browse/HBASE-16477) | *Major* | **Remove Writable interface and related code from WALEdit/WALKey**
15641 Removes the Writables, and related code from WALEdit class. HBase-2.0 will not be able to read WAL files written with 0.94.x and before.
15646 * [HBASE-17858](https://issues.apache.org/jira/browse/HBASE-17858) | *Major* | **Update refguide about the IS annotation if necessary**
15648 Updated refguide to tell users that IS annotation is only valid for IA.LimitedPrivate classes.
15653 * [HBASE-17857](https://issues.apache.org/jira/browse/HBASE-17857) | *Major* | **Remove IS annotations from IA.Public classes**
15655 Now we do not have InterfaceStability annotations for IA,Public API. The stability of these classes will follow the rule of 'Semantic Versioning'.
15660 * [HBASE-17215](https://issues.apache.org/jira/browse/HBASE-17215) | *Major* | **Separate small/large file delete threads in HFileCleaner to accelerate archived hfile cleanup speed**
15662 After HBASE-17215 we change to use two threads for (archived) hfile cleaning. The size throttling for large/small files could be set through "hbase.regionserver.thread.hfilecleaner.throttle" and default to 67108864 (64M). It supports online configuration change, just find the active master address through zookeeper dump and use it in update\_config command, e.g. update\_config 'hbasem1.et2.tbsite.net,60100,1488038696741'
15667 * [HBASE-16780](https://issues.apache.org/jira/browse/HBASE-16780) | *Critical* | **Since move to protobuf3.1, Cells are limited to 64MB where previous they had no limit**
15669 Upgrade internal pb to 3.2 from 3.1. 3.2 has fix for 64MB limit.
15674 * [HBASE-17287](https://issues.apache.org/jira/browse/HBASE-17287) | *Blocker* | **Master becomes a zombie if filesystem object closes**
15676 If filesystem is not available during log split, abort master server.
15681 * [HBASE-17765](https://issues.apache.org/jira/browse/HBASE-17765) | *Major* | **Reviving the merge possibility in the CompactingMemStore**
15683 Reviving the merge of the compacting pipeline: making the limit on the number of the segments in the pipeline configurable and adding the merge test.
15685 In order to customize the pipeline size limit change the value of the "hbase.hregion.compacting.pipeline.segments.limit" in the hbase-site.xml
15687 Value 1 means to merge the segments on any flush-in-memory. Value higher than 16 means no merge.
15692 * [HBASE-13395](https://issues.apache.org/jira/browse/HBASE-13395) | *Major* | **Remove HTableInterface**
15694 HTableInterface was deprecated in 0.21.0 and is removed in 2.0.0. Use org.apache.hadoop.hbase.client.Table instead.
15699 * [HBASE-17595](https://issues.apache.org/jira/browse/HBASE-17595) | *Critical* | **Add partial result support for small/limited scan**
15701 Now small scan and limited scan could also return partial results.
15706 * [HBASE-16014](https://issues.apache.org/jira/browse/HBASE-16014) | *Major* | **Get and Put constructor argument lists are divergent**
15708 Add 2 constructors fot API Get
15709 1. Get(byte[], int, int) 
15710 2. Get(ByteBuffer)
15715 * [HBASE-17584](https://issues.apache.org/jira/browse/HBASE-17584) | *Major* | **Expose ScanMetrics with ResultScanner rather than Scan**
15717 Now you can use ResultScanner.getScanMetrics to get the scan metrics at any time during the scan operation. The old Scan.getScanMetrics is deprecated and still work, but if you use ResultScanner.getScanMetrics to get the scan metrics and reset it, then the metrics published to the Scan instaince will be messed up.
15722 * [HBASE-17802](https://issues.apache.org/jira/browse/HBASE-17802) | *Major* | **Add note that minor versions can add methods to Interfaces**
15724 Update our semver section to include a note on our allowing ourselves the right to add methods to an Interface over a minor version as agreed to up on the dev list:  "If a Client implements an HBase Interface, a recompile MAY be required upgrading to a newer minor version (See release notes for warning about incompatible changes). All effort will be made to provide a default implementation so this case should not arise."
15729 * [HBASE-17426](https://issues.apache.org/jira/browse/HBASE-17426) | *Major* | **Inconsistent environment variable names for enabling JMX**
15731 In bin/hbase-config.sh,
15732 if value for HBASE\_JMX\_BASE is empty, keep current behavior.
15733 if HBASE\_JMX\_OPTS is not empty, keep current behavior.
15734 otherwise use the value of HBASE\_JMX\_BASE
15739 * [HBASE-17740](https://issues.apache.org/jira/browse/HBASE-17740) | *Critical* | **Correct the semantic of batch and partial for async client**
15741 Now async client has the same semantic with sync client for batch and partial.
15743 Now setBatch doesn't mean setAllowPartialResult(true)
15744 If user setBatch(5) and rpc returns 3+5+5+5+3 cells, we should return 5+5+5+5+1 to user.
15747 Also a minor API change:
15748 Result#createCompleteResult(List\<Result\>) is changed to Result#createCompleteResult(Iterable\<Result\>).
15753 * [HBASE-17746](https://issues.apache.org/jira/browse/HBASE-17746) | *Major* | **TestSimpleRpcScheduler.testCoDelScheduling is broken**
15755 The executor for CoDel is changed to FastPathBalancedQueueRpcExecutor
15760 * [HBASE-17712](https://issues.apache.org/jira/browse/HBASE-17712) | *Major* | **Remove/Simplify the logic of RegionScannerImpl.handleFileNotFound**
15762 Add a config named 'hbase.hregion.unassign.for.fnfe'. It is used to control whether to reopen a region when hitting FileNotFoundException. The default value is true.
15767 * [HBASE-15941](https://issues.apache.org/jira/browse/HBASE-15941) | *Major* | **HBCK repair should not unsplit healthy splitted region**
15769 A new option -removeParents is now available that will remove an old parent when two valid daughters for that parent exist and -fixHdfsOverlaps is used. If there is an issue trying to remove the parent from META or sidelining the parent from HDFS we will fallback to do a regular merge. For now this option only works when the overlap group consists only of 3 regions (a parent, daughter A and daughter B)
15774 * [HBASE-17737](https://issues.apache.org/jira/browse/HBASE-17737) | *Major* | **Thrift2 proxy should support scan timeRange per column family**
15776 Thrift2 proxy supports scan timeRange per column family
15781 * [HBASE-17718](https://issues.apache.org/jira/browse/HBASE-17718) | *Major* | **Difference between RS's servername and its ephemeral node cause SSH stop working**
15783 Fix our accidentally registering a RegionServer's ephermal znode BEFORE we checked in with the master.
15788 * [HBASE-17717](https://issues.apache.org/jira/browse/HBASE-17717) | *Critical* | **Incorrect ZK ACL set for HBase superuser**
15790 In previous versions of HBase, the system intended to set a ZooKeeper ACL on all "sensitive" ZNodes for the user specified in the hbase.superuser configuration property. Unfortunately, the ACL was malformed which resulted in the hbase.superuser being unable to access the sensitive ZNodes that HBase creates. This JIRA issue fixes this bug. HBase will automatically correct the ACLs on start so users do not need to manually correct the ACLs.
15795 * [HBASE-17716](https://issues.apache.org/jira/browse/HBASE-17716) | *Minor* | **Formalize Scan Metric names**
15797 HBASE-17716 breaks compatibility of ServerSideScanMetrics by changing public field names, and the issue is fixed through HBASE-17886
15802 * [HBASE-15484](https://issues.apache.org/jira/browse/HBASE-15484) | *Blocker* | **Correct the semantic of batch and partial**
15804 Now setBatch doesn't mean setAllowPartialResult(true)
15805 If user setBatch(5) and rpc returns 3+5+5+5+3 cells, we should return 5+5+5+5+1 to user.
15806 Scan#setBatch is helpful in paging queries, if you just want to prevent OOM at client, use setAllowPartialResults(true) is better.
15807 We deprecated isPartial and use mayHaveMoreCellsInRow. If it returns false, current Result must be the last one of this row.
15812 * [HBASE-17312](https://issues.apache.org/jira/browse/HBASE-17312) | *Major* | **[JDK8] Use default method for Observer Coprocessors**
15814 Deletes BaseMasterAndRegionObserver, BaseMasterObserver, BaseRegionObserver, BaseRegionServerObserver and BaseWALObserver.
15815 Their corresponding interface classes now use JDK8's 'default' keyword to provide empty/no-op implementations so that:
15816 1. Derived class don't break when more coprocessor hooks are added in future.
15817 2. Derived classes don't have to redundantly override functions they don't care about with empty implementations.
15819 Earlier, BaseXXXObserver classes provided these exact two benefits, but with 'default' keyword in JDK8, they are not needed anymore.
15821 To fix the breakages because of this change, simply change "Foo extends BaseXXXObserver" to "Foo implements XXXObserver".
15826 * [HBASE-17647](https://issues.apache.org/jira/browse/HBASE-17647) | *Major* | **OffheapKeyValue#heapSize() implementation is wrong**
15828 **WARNING: No release note provided for this change.**
15833 * [HBASE-13718](https://issues.apache.org/jira/browse/HBASE-13718) | *Minor* | **Add a pretty printed table description to the table detail page of HBase's master**
15835 <!-- markdown -->
15838 The table information page in the Master UI now includes a schema section that describes the column families defined for that table as well as any column family specific properties that are set.
15843 * [HBASE-17472](https://issues.apache.org/jira/browse/HBASE-17472) | *Major* | **Correct the semantic of  permission grant**
15845 Before this patch, later granted permissions will override previous granted permissions, and previous granted permissions LOST. this issue re-define grant semantic: for master branch, later granted permissions will merge with previous granted permissions.  for branch-1.4, grant keep override behavior for compatibility purpose, and a grant with mergeExistingPermission flag provided.
15850 * [HBASE-17583](https://issues.apache.org/jira/browse/HBASE-17583) | *Major* | **Add inclusive/exclusive support for startRow and endRow of scan for sync client**
15852 Now you can include/exlude the startRow and stopRow for a scan. And the new methods to specify startRow and stopRow are withStartRow and withStopRow. The old methods to specify startRow and Row(include constructors) are marked as deprecated as in the old time if startRow and stopRow are equal then we will consider it as a get scan and include the stopRow implicitly. This is strange after we can set inclusiveness explicitly so we add new methods and depredate the old methods. The deprecated methods will be removed in the future.
15857 * [HBASE-9702](https://issues.apache.org/jira/browse/HBASE-9702) | *Major* | **Change unittests that use "table" or "testtable" to use method names.**
15859 Changes all tests to use the TestName JUnit Rule everywhere rather than hardcode table/region/store names.
15864 * [HBASE-17280](https://issues.apache.org/jira/browse/HBASE-17280) | *Minor* | **Add mechanism to control hbase cleaner behavior**
15866 The HBase cleaner chore process cleans up old WAL files and archived HFiles. Cleaner operation can affect query performance when running heavy workloads, so disable the cleaner during peak hours. The cleaner has the following HBase shell commands:
15868 - cleaner\_chore\_enabled: Queries whether cleaner chore is enabled/ disabled. 
15869 - cleaner\_chore\_run: Manually runs the cleaner to remove files.
15870 - cleaner\_chore\_switch: enables or disables the cleaner and returns the previous state of the cleaner. For example, cleaner-switch true enables the cleaner.
15872 Following APIs are added in Admin:
15873 - setCleanerChoreRunning(boolean on): Enable/Disable the cleaner chore
15874 - runCleanerChore(): Ask for cleaner chore to run
15875 - isCleanerChoreEnabled(): Query whether cleaner chore is enabled/ disabled.
15880 * [HBASE-17599](https://issues.apache.org/jira/browse/HBASE-17599) | *Major* | **Use mayHaveMoreCellsInRow instead of isPartial**
15882 The word 'isPartial' is ambiguous so we introduce a new method 'mayHaveMoreCellsInRow' to replace it. And the old meaning of 'isPartial' is not the same with 'mayHaveMoreCellsInRow' as for batched scan, if the number of returned cells equals to the batch, isPartial will be false. After this change the meaning of 'isPartial' will be same with 'mayHaveMoreCellsInRow'. This is an incompatible change but it is not likely to break a lot of things as for batched scan the old 'isPartial' is just a redundant information, i.e, if the number of returned cells reaches the batch limit. You have already know the number of returned cells and the value of batch.
15887 * [HBASE-17437](https://issues.apache.org/jira/browse/HBASE-17437) | *Major* | **Support specifying a WAL directory outside of the root directory**
15889 This patch adds support for specifying a WAL directory outside of the HBase root directory.
15891 Multiple configuration variables were added to accomplish this:
15892 hbase.wal.dir: used to configure where the root WAL directory is located. Could be on a different FileSystem than the root directory. WAL directory can not be set to a subdirectory of the root directory. The default value of this is the root directory if unset.
15894 hbase.rootdir.perms: Configures FileSystem permissions to set on the root directory. This is '700' by default.
15896 hbase.wal.dir.perms: Configures FileSystem permissions to set on the WAL directory FileSystem. This is '700' by default.
15901 * [HBASE-17350](https://issues.apache.org/jira/browse/HBASE-17350) | *Critical* | **Fixup of regionserver group-based assignment**
15903 A few bug fixes and tweaks to the fsgroup feature.
15905 Renamed shell command move\_rsgroup\_servers as move\_servers\_rsgroup
15906 Renamed shell comand move\_rsgroup\_tables as move\_tables\_rsgroup
15908 Made the 'default' group more 'dynamic'; i.e. dead servers no longer show in the 'default' group.
15913 * [HBASE-17578](https://issues.apache.org/jira/browse/HBASE-17578) | *Major* | **Thrift per-method metrics should still update in the case of exceptions**
15915 In prior versions, the HBase Thrift handlers failed to increment per-method metrics when an exception was encountered.  These metrics will now always be incremented, whether an exception is encountered or not.  This change also adds exception-type metrics, similar to those exposed in regionservers, for individual exceptions which are received by the Thrift handlers.
15920 * [HBASE-17508](https://issues.apache.org/jira/browse/HBASE-17508) | *Major* | **Unify the implementation of small scan and regular scan for sync client**
15922 Now the scan.setSmall method is deprecated. Consider using scan.setLimit and scan.setReadType in the future. And we will open scanner lazily when you call scanner.next. This is an incompatible change which delays the table existence check and permission check.
15927 * [HBASE-16981](https://issues.apache.org/jira/browse/HBASE-16981) | *Major* | **Expand Mob Compaction Partition policy from daily to weekly, monthly**
15929 Mob compaction partition policy can be set by
15930 hbase\> create 't1', {NAME =\> 'f1', IS\_MOB =\> true, MOB\_THRESHOLD =\> 1000000, MOB\_COMPACT\_PARTITION\_POLICY =\> 'weekly'}
15932 or 
15934 hbase\> alter 't1', {NAME =\> 'f1', IS\_MOB =\> true, MOB\_THRESHOLD =\> 1000000, MOB\_COMPACT\_PARTITION\_POLICY =\> 'monthly'}
15936 Available MOB\_COMPACT\_PARTITION\_POLICY options are "daily", "weekly" and "monthly", the default is "daily".
15938 When it is "weekly" policy, the mob compaction will try to compact files within one calendar week into one for a specific partition, similar for "daily" and "monthly".
15940 With "weekly" policy, one mob file normally is compacted twice during its lifetime (that is first on daily basis and then all such daily based compacted files belonging to a week at the weekly interval), for one region, there normally are 52 files for one year. With "Monthly" policy, one mob file normally is compacted 3 times during its lifetime (First daily and then weekly followed by monthly at end of every month) and normally there are 12 files for one year.
15945 * [HBASE-17197](https://issues.apache.org/jira/browse/HBASE-17197) | *Major* | **hfile does not work in 2.0**
15947 The -f argument is no longer required specifying target file; just pass the file as an argument.
15952 * [HBASE-16812](https://issues.apache.org/jira/browse/HBASE-16812) | *Minor* | **Clean up the locks in MOB**
15954 In MOB-enabled column family, the lock in the major compaction is removed. All the delete markers are retained in the major compaction, and a MOB reference tag is appended to each of the retained delete markers.
15959 * [HBASE-12894](https://issues.apache.org/jira/browse/HBASE-12894) | *Critical* | **Upgrade Jetty to 9.2.6**
15961 Upgrades Jetty to 9.x from 6.x (Jetty9 is in different namespace from Jetty6). Also updated Jersey to 2.x and Servlet to 3.x.
15966 * [HBASE-17566](https://issues.apache.org/jira/browse/HBASE-17566) | *Major* | **Jetty upgrade fixes**
15968 Fix inability at finding static content post push of parent issue moving us to jetty9.
15973 * [HBASE-9774](https://issues.apache.org/jira/browse/HBASE-9774) | *Major* | **HBase native metrics and metric collection for coprocessors**
15975 This issue adds two new modules, hbase-metrics and hbase-metrics-api which define and implement the "new" metric system used internally within HBase. These two modules (and some other code in hbase-hadoop2-compat) module are referred as "HBase metrics framework" which is HBase-specific and independent of any other metrics library (including Hadoop metrics2 and dropwizards metrics). 
15977 HBase Metrics API (hbase-metrics-api) contains the interface that HBase exposes internally and to third party code (including coprocessors). It is a thin
15978 abstraction over the actual implementation for backwards compatibility guarantees. The metrics API in this hbase-metrics-api module is inspired by the Dropwizard metrics 3.1 API, however, the API is completely independent. 
15980 hbase-metrics module contains implementation of the "HBase Metrics API", including MetricRegistry, Counter, Histogram, etc. These are highly concurrent implementations of the Metric interfaces. Metrics in HBase are grouped into different sets (like WAL, RPC, RegionServer, etc). Each group of metrics should be tracked via a MetricRegistry specific to that group. 
15982 Historically, HBase has been using Hadoop's Metrics2 framework [3] for collecting and reporting the metrics internally. However, due to the difficultly of dealing with the Metrics2 framework, HBase is moving away from Hadoop's metrics implementation to its custom implementation. The move will happen incrementally, and during the time, both Hadoop Metrics2-based metrics and hbase-metrics module based classes will be in the source code. All new implementations for metrics SHOULD use the new API and framework.
15984 This jira also introduces the metrics API to coprocessor implementations. Coprocessor writes can export custom metrics using the API and have those collected via metrics2 sinks, as well as exported via JMX in regionserver metrics. 
15986 More documentation available at: hbase-metrics-api/README.txt
15991 * [HBASE-17491](https://issues.apache.org/jira/browse/HBASE-17491) | *Major* | **Remove all setters from HTable interface and introduce a TableBuilder to build Table instance**
15993 After HBASE-17491 all setter methods in HTable are marked as deprecated, moved into TableBuilder, and will be removed later.
15998 * [HBASE-17067](https://issues.apache.org/jira/browse/HBASE-17067) | *Major* | **Procedure v2 - remove tryAcquire\*Lock and use wait/wake to make framework event based**
16000 Make the framework more 'lively'; undo 'suspend' notion in Procedure, rely on eventing mechanism instead. Lets us remove no longer needed synchronizations. Framework can now do more ops per second.
16005 * [HBASE-16698](https://issues.apache.org/jira/browse/HBASE-16698) | *Major* | **Performance issue: handlers stuck waiting for CountDownLatch inside WALKey#getWriteEntry under high writing workload**
16007 Assign sequenceid to an edit before we go on the ringbuffer; undoes contention on WALKey latch. Adds a new config "hbase.hregion.mvcc.preassign" which defaults to true: i.e. this speedup is enabled.
16009 User could set this per-table level, like:
16010 create 'table',{NAME=\>'f1',CONFIGURATION=\>{'hbase.hregion.mvcc.preassign'=\>'false'}}
16015 * [HBASE-17488](https://issues.apache.org/jira/browse/HBASE-17488) | *Trivial* | **WALEdit should be lazily instantiated**
16017 prevent creating unused objects in the WALEdit's construction.
16018 +If the cp#preBatchMutate returns true, the WALEdit is useless. So we should create the WALEdit after step 2.
16019 +The cells came from cp should be counted because they are added into the WALEdit . The use case is the local index of phoenix
16020 +If the mutation contains the SKIP\_WAL property, its cells aren't added into the WALEdit. So these cells shouldn't be counted.
16025 * [HBASE-16831](https://issues.apache.org/jira/browse/HBASE-16831) | *Minor* | **Procedure V2 - Remove org.apache.hadoop.hbase.zookeeper.lock**
16027 Purges code that did zk-hosted locks for table ops (we do procedure-based locks now)
16032 * [HBASE-16867](https://issues.apache.org/jira/browse/HBASE-16867) | *Major* | **Procedure V2 - Check ACLs for remote HBaseLock**
16034 Add checking ACL when taking locks.
16039 * [HBASE-16786](https://issues.apache.org/jira/browse/HBASE-16786) | *Major* | **Procedure V2 - Move ZK-lock's uses to Procedure framework locks (LockProcedure)**
16041 Move locking to be procedure (Pv2) rather than zookeeper based. All locking moved over to new infrastructure including MOBing locking.
16046 * [HBASE-17470](https://issues.apache.org/jira/browse/HBASE-17470) | *Major* | **Remove merge region code from region server**
16048 In 1.x branches, Admin.mergeRegions calls MASTER via dispatchMergingRegions RPC; when executing dispatchMergingRegions RPC, MASTER calls RS via MergeRegions to complete the merge in RS-side.  
16050 With HBASE-16119, the merge logic moves to master-side.  This JIRA cleans up unused RPCs (dispatchMergingRegions and MergeRegions) , removes dangerous tools such as Merge and HMerge, and deletes unused RegionServer-side merge region logic in 2.0 release.
16055 * [HBASE-16744](https://issues.apache.org/jira/browse/HBASE-16744) | *Major* | **Procedure V2 - Lock procedures to allow clients to acquire locks on tables/namespaces/regions**
16057  Lock for HBase Entity either a Table, a Namespace, or Regions.
16059 These are remote locks which live on master, and need periodic heartbeats to keep them alive. (Once we request the lock, internally an heartbeat thread will be started). If master doesn't receive the heartbeat in time, it'll release the lock and make it available to other users.
16061 Use {@link LockServiceClient} to build instances. Then call {@link #requestLock()}. {@link #requestLock} will contact master to queue the lock and start the heartbeat thread which will check lock's status periodically and once the lock is acquired, it will send the heartbeats to the master.
16063 Use {@link #await} or {@link #await(long, TimeUnit)} to wait for the lock to be acquired. Always call {@link #unlock()} irrespective of whether lock was acquired or not. If the lock was acquired, it'll be released. If it was not acquired, it is possible that master grants the lock in future and the heartbeat thread keeps it alive forever by sending heartbeats. Calling {@link #unlock()} will stop the heartbeat thread and cancel the lock queued on master.
16065 There are 4 ways in which these remote locks may be released/can be lost:
16066   \* Call {@link #unlock}.
16067   \* Lock times out on master: Can happen because of network issues, GC pauses, etc. Worker thread will call the given abortable as soon as it detects such a situation. Fail to contact master: If worker thread can not contact mater and thus fails to send heartbeat before the timeout expires, it assumes that lock is lost and calls the
16068  \*     abortable.
16069 Worker thread is interrupted.
16071 Use example:
16073  EntityLock lock = lockServiceClient.\*Lock(...., "exampled lock", abortable);
16074   lock.requestLock();
16075   ....
16076    ....can do other initializations here since lock is 'asynchronous'...
16077  ....
16078  if (lock.await(timeout)) {
16079     ....logic requiring mutual exclusion
16080   }
16081    lock.unlock();
16086 * [HBASE-14061](https://issues.apache.org/jira/browse/HBASE-14061) | *Major* | **Support CF-level Storage Policy**
16088 After HBASE-14061 we support to set storage policy for HFile through "hbase.hstore.block.storage.policy" configuration, and we support CF-level setting to override the settings from configuration file. Currently supported storage policies include ALL\_SSD/ONE\_SSD/HOT/WARM/COLD, refer to http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html for more details
16090 For example, to create a table with two families: "cf1" with "ALL\_SSD" storage policy and "cf2" with "ONE\_SSD", we could use below command in hbase shell:
16091 create 'table',{NAME=\>'f1',STORAGE\_POLICY=\>'ALL\_SSD'},{NAME=\>'f2',STORAGE\_POLICY=\>'ONE\_SSD'}
16093 We could also set the configuration in table attribute like all other configurations:
16094 create 'table',{NAME=\>'f1',CONFIGURATION=\>{'hbase.hstore.block.storage.policy'=\>'ONE\_SSD'}}
16099 * [HBASE-17337](https://issues.apache.org/jira/browse/HBASE-17337) | *Major* | **list replication peers request should be routed through master**
16101 List replication peers request will be roughed through master.
16106 * [HBASE-15172](https://issues.apache.org/jira/browse/HBASE-15172) | *Major* | **Support setting storage policy in bulkload**
16108 After HBASE-15172/HBASE-19016 we could set storage policy through "hbase.hstore.block.storage.policy" property for bulkload, or "hbase.hstore.block.storage.policy.\<family\_name\>" for a specified family. Supported storage policy includes: ALL\_SSD, ONE\_SSD, HOT, WARM, COLD, etc.
16113 * [HBASE-17336](https://issues.apache.org/jira/browse/HBASE-17336) | *Major* | **get/update replication peer config requests should be routed through master**
16115 Get/update replication peer config requests will be routed through master.
16120 * [HBASE-17320](https://issues.apache.org/jira/browse/HBASE-17320) | *Major* | **Add inclusive/exclusive support for startRow and endRow of scan**
16122 Now you can specific the inclusive of startRow and stopRow for a scan using the new methods withStartRow(byte[] startRow, boolean inclusive) and withStopRow(byte[] stopRow, boolean inclusive). The old setStartRow and setStopRow methods, and the constructors are marked as deprecated because of an strange behavior that we will include the stopRow implicitly if startRow equals to stopRow. This is used to support get scan in the old time. Use withStartRow and withStopRow instead.
16124 For developers, the ConnectionUtils.createClosestRowBefore is also marked as deprecated as the row returned by this method is only very very close to the current row, not closest. Avoid using this method in the future.
16129 * [HBASE-17314](https://issues.apache.org/jira/browse/HBASE-17314) | *Major* | **Limit total buffered size for all replication sources**
16131 Add a conf "replication.total.buffer.quota" to limit total size of buffered entries in all replication peers. It will prevent server getting OOM if there are many peers. Default value is 256MB.
16136 * [HBASE-17174](https://issues.apache.org/jira/browse/HBASE-17174) | *Minor* | **Refactor the AsyncProcess, BufferedMutatorImpl, and HTable**
16138 + cleanup some unused code
16139 + allow being able to share pool between BufferedMutatorImpl
16140 + setting "hbase.client.request.controller.impl" to the name of the alternate RequestController (traffic control) implementation class in Configuration
16141 + The default RequestController implementation is SimpleRequestController
16142 + setting "hbase.client.log.detail.period.ms" to call logger on a period when waiting for tasks to complete
16147 * [HBASE-17335](https://issues.apache.org/jira/browse/HBASE-17335) | *Major* | **enable/disable replication peer requests should be routed through master**
16149 Enable/Disable replication peer requests will be routed through master.
16154 * [HBASE-5401](https://issues.apache.org/jira/browse/HBASE-5401) | *Major* | **PerformanceEvaluation generates 10x the number of expected mappers**
16156 Changes how many tasks PE runs when clients are mapreduce. Now tasks == client count. Previous we hardcoded ten tasks per client instance.
16161 * [HBASE-11392](https://issues.apache.org/jira/browse/HBASE-11392) | *Critical* | **add/remove peer requests should be routed through master**
16163 Add/Remove replication peer requests will be routed through master. And make ReplicationAdmin as Deprecated.
16168 * [HBASE-15924](https://issues.apache.org/jira/browse/HBASE-15924) | *Major* | **Enhance hbase services autorestart capability to hbase-daemon.sh**
16170 Now one can start hbase services with enabled "autostart/autorestart" feature in controlled fashion with the help of "--autostart-window-size" to define the window period and the "--autostart-window-retry-limit" to define the number of times the hbase services have to be restarted upon being killed/terminated abnormally within the provided window perioid.
16172 The following cases are supported with "autostart/autorestart":
16174 a) --autostart-window-size=0 and --autostart-window-retry-limit=0, indicates infinite window size and no retry limit
16175 b) not providing the args, will default to a)
16176 c) --autostart-window-size=0 and --autostart-window-retry-limit=\<positive value\> indicates the autostart process to bail out if the retry limit exceeds irrespective of window period
16177 d) --autostart-window-size=\<x\> and --autostart-window-retry-limit=\<y\> indicates the autostart process to bail out if the retry limit "y" is exceeded for the last window period "x".
16182 * [HBASE-17331](https://issues.apache.org/jira/browse/HBASE-17331) | *Minor* | **Avoid busy waiting in ThrottledInputStream**
16184 For each read(), old ThrottledInputStream sleeps/wakes/checks for many times for controlling the throughput. After this patch, ThrottledInputStream sleeps/wakes/checks only once. So we can reduce CPU usage.
16189 * [HBASE-17296](https://issues.apache.org/jira/browse/HBASE-17296) | *Major* | **Provide per peer throttling for replication**
16191 Provide per peer throttling for replication. Add the bandwidth upper limit to ReplicationPeerConfig and a new shell cmd set\_peer\_bandwidth to update the bandwidth in need.
16196 * [HBASE-17277](https://issues.apache.org/jira/browse/HBASE-17277) | *Major* | **Allow alternate BufferedMutator implementation**
16198 Specify the name of an alternate BufferedMutator implementation by either:
16200  \* Setting "hbase.client.bufferedmutator.classname" to the name of the alternate implementation class in Configuration
16201  \* Or, by setting BufferedMutatorParams#implementationClassName and passing the amended BufferedMutatorParams when calling Connection#getBufferedMutator.
16206 * [HBASE-17294](https://issues.apache.org/jira/browse/HBASE-17294) | *Major* | **External Configuration for Memory Compaction**
16208 This patch provides a single external knob to control memstore compaction. It also inmemory compaction with BASIC policy as our default (AFTERWORD: inmemory compaction as default was undone in HBASE-17333 because of test failures; will be reenabled in later, dedicated issue)
16210 Possible memstore compaction policies are:
16211 (1) None - no memory compaction, when size threshold is exceeded data is flushed to disk
16212 (2) Basic policy applies optimizations which modify the index to a more compacted representation. This is beneficial in all access patterns. The smaller the cells are the greater the benefit of this policy. This is the default policy.
16213 (3) Eager - in addition to compacting the index representation as the basic policy, eager policy eliminates duplication while the data is still in memory (much like the on-disk compaction does after the data is flushed to disk). This policy is most useful for applications with high data churn or small working sets.
16215 Memory compaction policeman be set at the column family level at table creation time:
16216 {code}
16217 create ‘\<tablename\>’,
16218    {NAME =\> ‘\<cfname\>’, 
16219     IN\_MEMORY\_COMPACTION =\> ‘\<NONE\|BASIC\|EAGER\>’}
16220 {code}
16221 or as a property at the global configuration level by setting the property in hbase-site.xml, with BASIC being the default value:
16222 {code}
16223 \<property\>
16224         \<name\>hbase.hregion.compacting.memstore.type\</name\>
16225         \<value\>\<NONE\|BASIC\|EAGER\>\</value\>
16226 \</property\>
16227 {code}
16228 The values used in this property can change as memstore compaction policies evolve over time.
16233 * [HBASE-16336](https://issues.apache.org/jira/browse/HBASE-16336) | *Major* | **Removing peers seems to be leaving spare queues**
16235 Add a ReplicationZKNodeCleaner periodically check and delete the useless replication queue zk node belong to the peer which is not exist.
16240 * [HBASE-17272](https://issues.apache.org/jira/browse/HBASE-17272) | *Major* | **Doc how to run Standalone HBase over an HDFS instance; all daemons in one JVM but persisting to an HDFS instance**
16242 Adds section at http://hbase.apache.org/book.html#standalone.over.hdfs on how to make standalone persist to an hdfs instance (where standalone is all daemons in the one jvm).
16247 * [HBASE-16700](https://issues.apache.org/jira/browse/HBASE-16700) | *Minor* | **Allow for coprocessor whitelisting**
16249 Provides ability to restrict table coprocessors based on HDFS path whitelist. (Particularly useful for allowing Phoenix coprocessors but not arbitrary user created coprocessors.)
16254 * [HBASE-17221](https://issues.apache.org/jira/browse/HBASE-17221) | *Major* | **Abstract out an interface for RpcServer.Call**
16256 Provide an interface RpcCall on the server side. 
16257 RpcServer.Call now is marked as @InterfaceAudience.Private, and implements the interface RpcCall,
16262 * [HBASE-16119](https://issues.apache.org/jira/browse/HBASE-16119) | *Major* | **Procedure v2 - Reimplement merge**
16264 The merge region logic is controlled by master in 2.0.0 (in 1.x, the core merge region logic is in the region server side).  The coprocessors related to merge region in RS-side would be no-op in 2.0.0 and later release.  Therefore, this is an incompatible change.  Users needs to move the CP logic to new master CP and registers them.
16266 A new mergeRegionsAsync() API is added in client.  The existing mergeRegions() API will call the new API so client does not have to change its code.
16271 * [HBASE-17112](https://issues.apache.org/jira/browse/HBASE-17112) | *Major* | **Prevent setting timestamp of delta operations the same as previous value's**
16273 Before this issue, two concurrent Increments/Appends done in same millisecond or RS's clock going back will result in two results have same TS, which is not friendly to versioning and will get wrong result in slave cluster if the replication is disordered.
16274 After this issue, the result of Increment/Append will always have an incremental TS. There is no any inconsistent in replication for these operations. But there is a rare case that if there is a Delete in same millisecond, the later result can not be masked by this Delete. This can be fixed after we have new semantics that previous Delete will never mask later Put even its timestamp is higher.
16279 * [HBASE-17181](https://issues.apache.org/jira/browse/HBASE-17181) | *Minor* | **Let HBase thrift2 support TThreadedSelectorServer**
16281 Add TThreadedSelectorServer support for HBase Thrift2
16286 * [HBASE-17178](https://issues.apache.org/jira/browse/HBASE-17178) | *Major* | **Add region balance throttling**
16288 Add region balance throttling. Master execute every region balance plan per balance interval, which is equals to divide max balancing time by the size of region balance plan. And Introduce a new config hbase.master.balancer.maxRitPercent to protect availability. If config this to 0.01, then the max percent of regions in transition is 1% when balancing. Then the cluster's availability is at least 99% when balancing.
16293 * [HBASE-15786](https://issues.apache.org/jira/browse/HBASE-15786) | *Major* | **Create DBB backed MSLAB pool**
16295 Added a new config hbase.regionserver.offheap.global.memstore.size using which one can specify the global off heap limit that all memstores can use.  When this config is in MSLAB should be turned ON and we will use the entire size for the MSLAB pool. It will make off heap chunks and pool then. It will behave as if we are working with off heap memstores.  When this config is having a valid value and MSLAB is turned OFF, the system will just ignore the offheap size and continue to use global max heap space % for memstores and work with on heap memstores.
16300 * [HBASE-17132](https://issues.apache.org/jira/browse/HBASE-17132) | *Major* | **Cleanup deprecated code for WAL**
16302 Remove HLogKey and related classes and methods. Remove SequenceFile based log reader and writer. WALObserver and RegionObserver are changed so this is an incompatible change.
16307 * [HBASE-16169](https://issues.apache.org/jira/browse/HBASE-16169) | *Major* | **Make RegionSizeCalculator scalable**
16309 Added couple of API's to Admin.java:
16311 Returns region load map of all regions hosted on a region server
16312 Map\<byte[], RegionLoad\> getRegionLoad(ServerName sn) throws IOException;
16314 Returns region load map of all regions of a table hosted on a region server
16315 Map\<byte[], RegionLoad\> getRegionLoad(ServerName sn, TableName tableName) throws IOException
16317 Added an API to region server:
16319 public GetRegionLoadResponse getRegionLoad(RpcController controller,
16320     GetRegionLoadRequest request) throws ServiceException;
16322 Primary intention is to use this API for RegionSizeCalculator and not rely on Master for ClusterStatus. On large clusters, ClusterStatus() can take a long time. IfMaster is down/busy, then some of the jobs timeout/fail. Other possible uses:
16323 1. If there is a lighter version of GetClusterStatus API (i.e without the ServerLoad for each RS), then custom maintenance tools can be better. In current world ClusterStatus is heavy. With the new APIs, each API's payload is smaller and distributed. So custom tools can call getRegionLoad() when needed, it will be more accurate. This helps with large clusters. For tools that don't need RegionLoad, the lighter version of API is fine enough.
16324 2. Another use case is a tool like RSTop - since we can see selective metrics at RegionLevel (possibly even deltas between each RPC to the server).
16329 * [HBASE-15788](https://issues.apache.org/jira/browse/HBASE-15788) | *Major* | **Use Offheap ByteBuffers from BufferPool to read RPC requests.**
16331 Using the ByteBuffers from ByteBufferPool to read the request bytes at server.  When the size of the request is smaller than 1/6th size of a BB in the pool, we will not use that but read into an on demand created, proper sized on heap ByteBuffer.
16336 * [HBASE-17046](https://issues.apache.org/jira/browse/HBASE-17046) | *Major* | **Add 1.1 doc to hbase.apache.org**
16338 Adds a 1.1. item to our 'Documentation and API' tab. Gives access to 1.1 APIs, XRef, etc.
16343 * [HBASE-16962](https://issues.apache.org/jira/browse/HBASE-16962) | *Major* | **Add readPoint to preCompactScannerOpen() and preFlushScannerOpen() API**
16345 The following RegionObserver methods are deprecated
16347 InternalScanner preFlushScannerOpen(final ObserverContext\<RegionCoprocessorEnvironment\> c,
16348     final Store store, final KeyValueScanner memstoreScanner, final InternalScanner s)
16349     throws IOException;
16351 InternalScanner preCompactScannerOpen(final ObserverContext\<RegionCoprocessorEnvironment\> c,
16352     final Store store, List\<? extends KeyValueScanner\> scanners, final ScanType scanType,
16353     final long earliestPutTs, final InternalScanner s, CompactionRequest request)
16355 Instead, use the following methods:
16357 InternalScanner preFlushScannerOpen(final ObserverContext\<RegionCoprocessorEnvironment\> c,
16358     final Store store, final KeyValueScanner memstoreScanner, final InternalScanner s,
16359     final long readPoint) throws IOException;
16361 InternalScanner preCompactScannerOpen(final ObserverContext\<RegionCoprocessorEnvironment\> c,
16362     final Store store, List\<? extends KeyValueScanner\> scanners, final ScanType scanType,
16363     final long earliestPutTs, final InternalScanner s, final CompactionRequest request,
16364     final long readPoint) throws IOException
16369 * [HBASE-17017](https://issues.apache.org/jira/browse/HBASE-17017) | *Major* | **Remove the current per-region latency histogram metrics**
16371 Removes per-region level (get size, get time, scan size and scan time histogram) metrics that was exposed before. Per-region histogram metrics with 1000+ regions causes millions of objects to be allocated on heap. The patch introduces getCount and scanCount as counters rather than histograms. Other per-region level metrics are kept as they are.
16376 * [HBASE-16955](https://issues.apache.org/jira/browse/HBASE-16955) | *Major* | **Fixup precommit protoc check to do new distributed protos and pb 3.1.0 build**
16378 Test that environment no longer has to have protoc (2.5 and 3.1) available. Needed small adjustment in yetus protoc build but otherwise all works.
16383 * [HBASE-17050](https://issues.apache.org/jira/browse/HBASE-17050) | *Minor* | **Upgrade Apache CLI version from 1.2 to 1.3.1**
16385 Upgrade Apache CLI version from 1.2 to 1.3.1.
16387 These are few good/important changes included in this update:
16388 - HelpFormatter now prints command-line options in the same order as they
16389   have been added. Fixes CLI-212.
16390 - Standard help text now shows mandatory arguments also for the first
16391   option. Fixes CLI-186.
16392 - A new parser is available: DefaultParser. It combines the features of the
16393   GnuParser and the PosixParser. It also provides additional features like
16394   partial matching for the long options, and long options without separator
16395   (i.e like the JVM memory settings: -Xmx512m). This new parser deprecates
16396   the previous ones. Fixes CLI-161,CLI-167,CLI-181.
16398 For full list of changes:
16399   https://commons.apache.org/proper/commons-cli/changes-report.html#a1.3
16404 * [HBASE-15513](https://issues.apache.org/jira/browse/HBASE-15513) | *Major* | **hbase.hregion.memstore.chunkpool.maxsize is 0.0 by default**
16406 MSLAB chunk pool is on by default in hbase-2.0.0.
16411 * [HBASE-16972](https://issues.apache.org/jira/browse/HBASE-16972) | *Major* | **Log more details for Scan#next request when responseTooSlow**
16413 **WARNING: No release note provided for this change.**
16418 * [HBASE-17014](https://issues.apache.org/jira/browse/HBASE-17014) | *Minor* | **Add clearly marked starting and shutdown log messages for all services.**
16420 Delimit START, STOP, and ABORT messages with '\*\*\*\*\*' so denote.
16425 * [HBASE-16765](https://issues.apache.org/jira/browse/HBASE-16765) | *Critical* | **New SteppingRegionSplitPolicy, avoid too aggressive spread of regions for small tables.**
16427 Introduces a new split policy: SteppingSplitPolicy
16428 This will use a simple step function to split a region at (by default) 2  xflushSize when no other region of the same table is seen on the region server, or max-file-size when one or more other regions of the same table is seen.
16430 In HBase 2.0 this is going to be the default. In previous versions it can be configured.
16435 * [HBASE-16608](https://issues.apache.org/jira/browse/HBASE-16608) | *Major* | **Introducing the ability to merge ImmutableSegments without copy-compaction or SQM usage**
16437 The index-compation and data-compaction variants of CompactingMemStore are introduced. In both types the active (mutable) segment is periodically flushed-in-memory and is added as immutable segment in the compaction pipeline. The CompactingMemStore of index-compaction type is merging all immutable segments of the compacting pipeline into one. The merging of N segments is explained below. The CompactingMemStore of data-compaction type is compacting all immutable segments of the compacting pipeline into one. After the merge/compaction the old segments in the compacting pipeline are replaced with one new.
16439 Before explaining the process of merging N old segments into new one, note that segment structure includes ordered index that allows traversing the cells data efficiently. The merge is copying the ordered indexes of the old segments into one ordered index of new segment. No data is copied, no cells are filtered. Alternatively, in the process of compacting N old segments into new one, both data and index are copied. The old cells are filtered, meaning upon compaction unused versions of the cells are not copied so the new segment has less data then all old ones.
16441 This issue introduces only the merging ability and simplifies the user intervention for switching between types. The previous CompactingMemStore structure was added by HBASE-16420 and HBASE-16421. The future refinements of the policy or merging/compacting will come in HBASE-16417.
16443 In order to create a table with CompactingMemStore as a MemStore one should use:
16444 create ‘\<tablename\>’, {NAME =\> ‘\<cfname\>’, IN\_MEMORY\_COMPACTION =\> true}
16445 IN\_MEMORY\_COMPACTION default is false, so table created as following will have the known DefaultMemStore as a MemStore.
16446 create ‘\<tablename\>’, {NAME =\> ‘\<cfname\>’}
16448 The default type of CompactingMemStore is index-compaction. In order to change it to data-compaction one should add to the hbase-site.xml
16449 \<property\>
16450     \<name\>hbase.hregion.compacting.memstore.type\</name\>
16451     \<value\>data-compaction\</value\>
16452   \</property\>
16454 in addition to creating the table as following
16455 create ‘\<tablename\>’, {NAME =\> ‘\<cfname\>’, IN\_MEMORY\_COMPACTION =\> true}
16460 * [HBASE-16747](https://issues.apache.org/jira/browse/HBASE-16747) | *Major* | **Track memstore data size and heap overhead separately**
16462 Marking it as incompatible change as there is a change in behavior for region flush decision. The default flush size of 128 MB per region was tracked against both actual data bytes size + overhead of these cells in memstore memory (Overhead because of Cell java objects and CSLM entry).  As part of this jira we will keep track of cell data size only in region level.  So 128 MB flush size means, 128 MB of cell data bytes (key+ value+..)
16464 Globally we will track cell data size and heap overhead separately and will consider both for forced flushes. We will not allow over consume of heap memory by all memstore. This is as old case. Only tracking way is changed.
16469 * [HBASE-16974](https://issues.apache.org/jira/browse/HBASE-16974) | *Minor* | **Update os-maven-plugin to 1.4.1.final+ for building shade file on RHEL/CentOS**
16471 Upgrade os-maven-plugin mvn extension which figures the os we are running on from 1.4 to 1.5.
16476 * [HBASE-16952](https://issues.apache.org/jira/browse/HBASE-16952) | *Major* | **Replace hadoop-maven-plugins with protobuf-maven-plugin for building protos**
16478 Simplifies .proto manipulations. One step only now -- no need to keep pom.xml listing up to date with the protobuf protos directory content -- and no need to preinstall protoc; mvn does it all for you now.
16483 * [HBASE-14551](https://issues.apache.org/jira/browse/HBASE-14551) | *Minor* | **Procedure v2 - Reimplement split**
16485 Moved the Split Region logic to Master and most of split region coprocessor is in master now.  Need to change dependency such as Phoenix.
16490 * [HBASE-15789](https://issues.apache.org/jira/browse/HBASE-15789) | *Major* | **PB related changes to work with offheap**
16492 This issue adds a patch to our checked in internal, shaded protobuf, but it also adds a general means of apply patches to our version of protobuf. Patches found in the new src/main/patches directory are all applied as the last task when you run a build with the -Pcompile-protobuf profile under the hbase-protocol-shaded module. This commit also includes our first patch to protobuf; it adds ByteInput to mimic pb3.1's ByteOutput (src/main/patches/HBASE-15789\_V2.patch attached here).
16497 * [HBASE-16930](https://issues.apache.org/jira/browse/HBASE-16930) | *Major* | **AssignmentManager#checkWals() function can recur infinitely**
16499 Fixed potential infinite recursion in AssignmentManager.checkWals().
16504 * [HBASE-16463](https://issues.apache.org/jira/browse/HBASE-16463) | *Major* | **Improve transparent table/CF encryption with Commons Crypto**
16506 Improve transparent table/CF encryption with Commons Crypto. The change introduces a new optional CryptoCipherProvider (CommonsCryptoAES) for transparent table/CF encryption. And the encryption performance would be accelerated by hardware in modern CPU (AES-NI). This feature could be enabled by updating the configuration "hbase.crypto.cipherprovider" to "org.apache.hadoop.hbase.io.crypto.CryptoCipherProvider" in hbase-site.xml. For detailed information about transparent table/CF encryption including configuration examples see the Security section of the HBase manual.
16511 * [HBASE-16414](https://issues.apache.org/jira/browse/HBASE-16414) | *Major* | **Improve performance for RPC encryption with Apache Common Crypto**
16513 With the security RPC and encryption enabled, introduce Apache Commons Crypto to do the encryption/decryption which supports both supports both JCE Cipher and OpenSSL Cipher. Adds new configs "hbase.rpc.crypto.encryption.aes.enabled" which defaults to false, and "hbase.rpc.crypto.encryption.aes.cipher.class" which defaults to "org.apache.commons.crypto.cipher.JceCipher" to support JCE Cipher, it also can be set as "org.apache.hadoop.crypto.OpensslCipher" to support Openssl Cipher.
16518 * [HBASE-16721](https://issues.apache.org/jira/browse/HBASE-16721) | *Critical* | **Concurrency issue in WAL unflushed seqId tracking**
16520 Fixed a bug in sequenceId tracking for the WALs that caused WAL files to accumulate without being deleted due to a rare race condition.
16525 * [HBASE-16834](https://issues.apache.org/jira/browse/HBASE-16834) | *Major* | **Add AsyncConnection support for ConnectionFactory**
16527 Add createAsyncConnection method to ConnectionFactory for creating AsyncConnection. The default implementation is org.apache.hadoop.hbase.client.AsyncConnectionImpl. You can use 'hbase.client.async.connection.impl' to plug in your own AsyncConnection implementation.
16532 * [HBASE-16729](https://issues.apache.org/jira/browse/HBASE-16729) | *Trivial* | **Define the behavior of (default) empty FilterList**
16534 Empty filter list will behave as when there is no filter added. This change is a behavioral change for those who rely on Empty filter list.
16539 * [HBASE-16799](https://issues.apache.org/jira/browse/HBASE-16799) | *Major* | **CP exposed Store should not expose unwanted APIs**
16541 Below APIs from CP exposed Store interface are removed
16542 upsert(Iterable\<Cell\> cells, long readpoint)
16543 add(Cell cell)
16544 add(Iterable\<Cell\> cells)
16545 replayCompactionMarker(CompactionDescriptor compaction, boolean pickCompactionFiles,  boolean removeFiles)
16546 assertBulkLoadHFileOk(Path srcPath)
16547 bulkLoadHFile(String srcPathStr, long sequenceId)
16548 bulkLoadHFile(StoreFileInfo fileInfo)
16553 * [HBASE-15921](https://issues.apache.org/jira/browse/HBASE-15921) | *Major* | **Add first AsyncTable impl and create TableImpl based on it**
16555 Add AsyncConnection, AsyncTable and AsyncTableRegionLocator. Now the AsyncTable only support get, put and delete. And the implementation of AsyncTableRegionLocator is synchronous actually.
16560 * [HBASE-16664](https://issues.apache.org/jira/browse/HBASE-16664) | *Major* | **Timeout logic in AsyncProcess is broken**
16562 This issue fix three bugs:
16563 1.  rpcTimeout configuration not work for one rpc call in AP
16564 2.  operationTimeout configuration not work for multi-request (batch, put) in AP 
16565 3.  setRpcTimeout and setOperationTimeout in HTable is not worked for AP and BufferedMutator.
16570 * [HBASE-16661](https://issues.apache.org/jira/browse/HBASE-16661) | *Minor* | **Add last major compaction age to per-region metrics**
16572 This adds a new per-region metric named "lastMajorCompactionAge" for tracking time since the last major compaction ran on a given region.  If a major compaction has never run, the age will be equal to the current timestamp.
16577 * [HBASE-16117](https://issues.apache.org/jira/browse/HBASE-16117) | *Major* | **Fix Connection leak in mapred.TableOutputFormat**
16579 (This change will be irrelevant after HBASE-16774 lands).
16580 There is a subtle change with error handling when a connection is not able to connect to ZK.  Attempts to create a connection when ZK is not up will now fail immediately instead of silently creating and then failing on a subsequent HBaseAdmin call.
16585 * [HBASE-15984](https://issues.apache.org/jira/browse/HBASE-15984) | *Critical* | **Given failure to parse a given WAL that was closed cleanly, replay the WAL.**
16587 In some particular deployments, the Replication code believes it has
16588 reached EOF for a WAL prior to successfully parsing all bytes known to
16589 exist in a cleanly closed file.
16591 If an EOF is detected due to parsing or other errors while there are still unparsed bytes before the end-of-file trailer, we now reset the WAL to the very beginning and attempt a clean read-through. Because we will retry these failures indefinitely, two additional changes are made to help with diagnostics:
16593 \* On each retry attempt, a log message like the below will be emitted at the WARN level:
16594     
16595       Processing end of WAL file '{}'. At position {}, which is too far away
16596       from reported file length {}. Restarting WAL reading (see HBASE-15983
16597       for details).
16599 \*  additional metrics measure the use of this recovery mechanism. they are described in the reference guide.
16604 * [HBASE-16753](https://issues.apache.org/jira/browse/HBASE-16753) | *Minor* | **There is a mismatch between suggested Java version in hbase-env.sh**
16606 Updates the comments and default values in a few scripts and docs to reflect our Java 1.8+ requirement.
16611 * [HBASE-16567](https://issues.apache.org/jira/browse/HBASE-16567) | *Critical* | **Upgrade to protobuf-3.1.x**
16613 Core is now up on protobuf 3.1.0 (Coprocessor Endpoints and REST are still on protobuf 2.5.0).
16618 * [HBASE-15638](https://issues.apache.org/jira/browse/HBASE-15638) | *Critical* | **Shade protobuf**
16620 Shade/relocate and include the protobuf we use internally. See protobuf chapter in the refguide for more on how we protobuf in hbase-.2.0.0 and going forward.
16622 See https://docs.google.com/document/d/1H4NgLXQ9Y9KejwobddCqaVMEDCGbyDcXtdF5iAfDIEk/edit# for how we arrived at this approach.
16624 See http://mail-archives.apache.org/mod\_mbox/hbase-dev/201610.mbox/%3C07850EDD-7230-431B-9AB0-C5C91B105EEC%40gmail.com%3E for discussion around merging this change and of how we might revert if an alternative to this awkward patch presents itself; e.g. an hadoop with CLASSPATH isolation (and means of dealing with Sparks use of protobuf 2.5.0, etc.)
16629 * [HBASE-16264](https://issues.apache.org/jira/browse/HBASE-16264) | *Critical* | **Figure how to deal with endpoints and shaded pb**
16631 Shade/relocate the protobuf hbase uses internally. All core now refers to new module added in this patch, hbase-protocol-shaded. Coprocessor Endpoints carry-on with references to the original hbase-protocol module. See new chapter in book on protobufs on how-to going forward.
16636 * [HBASE-16672](https://issues.apache.org/jira/browse/HBASE-16672) | *Major* | **Add option for bulk load to always copy hfile(s) instead of renaming**
16638 This issue adds a config, always.copy.files, to LoadIncrementalHFiles.
16639 When set to true, source hfiles would be copied. Meaning source hfiles would be kept after bulk load is done.
16640 Default value is false.
16645 * [HBASE-16660](https://issues.apache.org/jira/browse/HBASE-16660) | *Critical* | **ArrayIndexOutOfBounds during the majorCompactionCheck in DateTieredCompaction**
16647 "Please do not use DateTieredCompaction with Major Compaction unless you have a version with this. Otherwise your cluster will not compact any store files and you can end up running out of file descriptors." @churro morales
16652 * [HBASE-16257](https://issues.apache.org/jira/browse/HBASE-16257) | *Blocker* | **Move staging dir to be under hbase root dir**
16654 The HBase property 'hbase.bulkload.staging.dir' is deprecated and is ignored from HBase 2.0.  It will defaults to hbase.rootdir/staging automatically with the correct permissions.
16659 * [HBASE-16650](https://issues.apache.org/jira/browse/HBASE-16650) | *Major* | **Wrong usage of BlockCache eviction stat for heap memory tuning**
16661 Changed tracking of evictedBlocks count NOT to include evictions of blocks for a removed HFile. HFiles gets removed after compaction
16666 * [HBASE-16294](https://issues.apache.org/jira/browse/HBASE-16294) | *Minor* | **hbck reporting "No HDFS region dir found" for replicas**
16668 Fixed warning error message displayed for region directory not found for non-default/ non-primary replicas in hbck
16673 * [HBASE-16540](https://issues.apache.org/jira/browse/HBASE-16540) | *Major* | **Scan should do additional validation on start and stop row**
16675 Scan#setStartRow() and Scan#setStopRow() now validate the argument passed for each row key.  If the length of the byte[] passed exceeds Short.MAX\_VALUE, an IllegalArgumentException will be thrown.
16680 * [HBASE-7612](https://issues.apache.org/jira/browse/HBASE-7612) | *Trivial* | **[JDK8] Replace use of high-scale-lib counters with intrinsic facilities**
16682 org.apache.hadoop.hbase.util.Counter is deprecated now and will be removed in 3.0. Use LongAdder instead.
16687 * [HBASE-16447](https://issues.apache.org/jira/browse/HBASE-16447) | *Critical* | **Replication by namespaces config in peer**
16689 Support replication by namespaces config in peer.
16690 1. Set a namespace in peer config means that all tables in this namespace will be replicated.
16691 2. If the namespaces config is null, then the table-cfs config decide which table's edit can be replicated. If the table-cfs config is null, then the namespaces config decide which table's edit can be replicated.
16692 3. If you already have set a namespace in the peer config, then you can't set any table of this namespace to the peer config. If you already have set a table in the peer config, then you can't set this table's namespace to the peer config.
16697 * [HBASE-16598](https://issues.apache.org/jira/browse/HBASE-16598) | *Major* | **Enable zookeeper useMulti always and clean up in HBase code**
16699 Deprecate the configuration property 'hbase.zookeeper.useMulti'.
16700 useMulti will always be enabled. ZooKeeper 3.4.x and newer is required.
16702 Internal:
16704 The ZKUtil#multiOrSequential(ZooKeeperWatcher zkw, List\<ZKUtilOp\> ops, boolean runSequentialOnMultiFailure) will not check 'hbase.zookeeper.useMulti' anymore, and will always use multi.
16705 It can still fall back to sequential operations if:
16707 RunSequentialOnMultiFailure is true
16708 On calling multi, we get a ZooKeeper exception that can be handled by a sequential call.
16713 * [HBASE-16388](https://issues.apache.org/jira/browse/HBASE-16388) | *Major* | **Prevent client threads being blocked by only one slow region server**
16715 Add a new configuration, hbase.client.perserver.requests.threshold, to limit the max number of concurrent request to one region server. If the user still create new request after reaching the limit, client will throw ServerTooBusyException and do not send the request to the server. This is a client side feature and can prevent client's threads being blocked by one slow region server resulting in the availability of client is much lower than the availability of region servers.
16717 For completeness, here extract on new config from hbase-default.xml:
16719 Property: hbase.client.perserver.requests.threshold
16720 Default: 2147483647
16721 Description: The max number of concurrent pending requests for one server in all client threads (process level). Exceeding requests will be thrown ServerTooBusyException immediately to prevent user's threads being occupied and blocked by only one slow region server. If you use a fix number of threads to access HBase in a synchronous way, set this to a suitable value which is  related to the number of threads will help you. See https://issues.apache.org/jira/browse/HBASE-16388 for details.
16726 * [HBASE-15297](https://issues.apache.org/jira/browse/HBASE-15297) | *Minor* | **error message is wrong when a wrong namspace is specified in grant in hbase shell**
16728 The security admin instance available within the HBase shell now returns "false" from the namespace\_exists? method for non-existent namespaces rather than raising a wrapped NamespaceNotFoundException.
16730 As a side effect, when the "grant" and "revoke" commands in the HBase shell are invoked with a non-existent namespace the resulting error message now properly refers to said namespace rather than to the user.
16735 * [HBASE-16086](https://issues.apache.org/jira/browse/HBASE-16086) | *Major* | **TableCfWALEntryFilter and ScopeWALEntryFilter should not redundantly iterate over cells.**
16737 push to branch-1.3+
16742 * [HBASE-16340](https://issues.apache.org/jira/browse/HBASE-16340) | *Critical* | **ensure no Xerces jars included**
16744 HBase no longer includes Xerces implementation jars that were previously included via transitive dependencies. Downstream users relying on HBase for these artifacts will need to update their dependencies.
16749 * [HBASE-16213](https://issues.apache.org/jira/browse/HBASE-16213) | *Major* | **A new HFileBlock structure for fast random get**
16751 HBASE-16213 introduced a new DataBlockEncoding in name of ROW\_INDEX\_V1, which could improve random read (get) performance especially when the average record size (key-value size per row) is small. To use this feature, please set DATA\_BLOCK\_ENCODING to ROW\_INDEX\_V1 for CF of newly created table, or change existing CF with below command:
16752 alter 'table\_name',{NAME =\> 'cf', DATA\_BLOCK\_ENCODING =\> 'ROW\_INDEX\_V1'}.
16754 Please note that if we turn this DBE on, HFile block will be bigger than NONE encoding because it adds some meta infos for binary search:
16755 /\*\*
16756  \* Store cells following every row's start offset, so we can binary search to a row's cells.
16757  \*
16758  \* Format:
16759  \* flat cells
16760  \* integer: number of rows
16761  \* integer: row0's offset
16762  \* integer: row1's offset
16763  \* ....
16764  \* integer: dataSize
16765  \*
16768 Seek in row when random reading is one of the main consumers of CPU. This helps. See slide #7 here https://www.slideshare.net/HBaseCon/lift-the-ceiling-of-hbase-throughputs?qid=597ee2fa-8125-4faa-bb3b-2bf1ba9ccafb&v=&b=&from\_search=6
16773 * [HBASE-16409](https://issues.apache.org/jira/browse/HBASE-16409) | *Minor* | **Row key for bad row should be properly delimited in VerifyReplication**
16775 --delimiter= option is added to verifyrep.
16776 The delimiter would wrap bad rows in log output.
16781 * [HBASE-14921](https://issues.apache.org/jira/browse/HBASE-14921) | *Major* | **Inmemory Compaction Optimizations; Segment Structure**
16783 A long, working issue that discussed Segment formats introducing CellArrayMap (delivered as the patch attached to this issue) and CellChunkMap (to be delivered later in HBASE-16421 but see patch v02 for an embryonic form named CellBlockSerialized); when to copy Segment data (and when not too); and then what to include at flush time (the suffix Segment or all Segments). Designs that evolved as discussion went on are attached. Outstanding issues turned up here, not including a CellChunkMap implementation, are listed below but are to be addressed in follow-ons (See HBASE-16417):
16785 1. The flattening without compaction is causing many small segments in pipeline, and they are not flushed all together.
16786 2. The issue of compaction prediction cost.
16791 * [HBASE-16450](https://issues.apache.org/jira/browse/HBASE-16450) | *Major* | **Shell tool to dump replication queues**
16793 New tool to dump existing replication peers, configurations and queues when using HBase Replication. The tool provides two flags:
16795  --distributed  This flag will poll each RS for information about the replication queues being processed on this RS.
16796 By default this is not enabled and the information about the replication queues and configuration will be obtained from ZooKeeper.
16797  --hdfs   When --distributed is used, this flag will attempt to calculate the total size of the WAL files used by the replication queues. Since its possible that multiple peers can be configured this value can be overestimated.
16802 * [HBASE-16422](https://issues.apache.org/jira/browse/HBASE-16422) | *Major* | **Tighten our guarantees on compatibility across patch versions**
16804 Adds below change to our compat guarantees:
16806 {code}
16807 -\* Example: A user using a newly deprecated api does not need to modify application code with hbase api calls until the next major version.
16808  10 +\* New APIs introduced in a patch version will only be added in a source compatible way footnote:[See 'Source Compatibility' https://blogs.oracle.com/darcy/entry/kinds\_of\_compatibility]: i.e.     code that implements public APIs will continue to compile.
16809 {code}
16814 * [HBASE-7621](https://issues.apache.org/jira/browse/HBASE-7621) | *Major* | **REST client (RemoteHTable) doesn't support binary row keys**
16816 RemoteHTable now supports binary row keys with any character or byte by properly encoding request URLs. This is a both a behavioral change from earlier versions and an important fix for protocol correctness.
16821 * [HBASE-12721](https://issues.apache.org/jira/browse/HBASE-12721) | *Major* | **Create Docker container cluster infrastructure to enable better testing**
16823 Downstream users wishing to test HBase in a "distributed" fashion (multiple "nodes" running as separate containers on the same host) can now do so in an automated fashion while leveraging Docker for process isolation via the clusterdock project.
16825 For details see the README.md in the dev-support/apache\_hbase\_topology folder.
16830 * [HBASE-16267](https://issues.apache.org/jira/browse/HBASE-16267) | *Critical* | **Remove commons-httpclient dependency from hbase-rest module**
16832 This issue upgrades httpclient to 4.5.2 and httpcore to 4.4.4 which are the versions used by hadoop-2.
16833 This is to handle the following CVE's.
16835 https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-5262 : http/conn/ssl/SSLConnectionSocketFactory.java in Apache HttpComponents HttpClient before 4.3.6 ignores the http.socket.timeout configuration setting during an SSL handshake, which allows remote attackers to cause a denial of service (HTTPS call hang) via unspecified vectors.
16837 https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-6153
16838 https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2012-5783
16839 Apache Commons HttpClient 3.x, as used in Amazon Flexible Payments Service (FPS) merchant Java SDK and other products, does not verify that the server hostname matches a domain name in the subject's Common Name (CN) or subjectAltName field of the X.509 certificate, which allows man-in-the-middle attackers to spoof SSL servers via an arbitrary valid certificate.
16841 Downstream users who are exposed to commons-httpclient via the HBase classpath will have to similarly update their dependency.
16846 * [HBASE-16308](https://issues.apache.org/jira/browse/HBASE-16308) | *Major* | **Contain protobuf references**
16848 Undo protobuf references through the codebase so protobuf references are contained rather than spread about the codebase. For example, moved protobuff-ing up into the various Callables rather than repeat on each method invocation cleaning up boilerplate around rpc calls. Having a few protobuf reference locations only simplifies the parent issue shading project.
16853 * [HBASE-16321](https://issues.apache.org/jira/browse/HBASE-16321) | *Blocker* | **Ensure findbugs jsr305 jar isn't present**
16855 HBase now ensures the jsr305 implementation from the findbugs project is not included in its binary artifacts or the compile / runtime dependencies of its user facing modules. Downstream users that rely on this jar will need to update their dependencies.
16860 * [HBASE-8386](https://issues.apache.org/jira/browse/HBASE-8386) | *Major* | **deprecate TableMapReduce.addDependencyJars(Configuration, class\<?\> ...)**
16862 The MapReduce helper function \`TableMapReduce.addDependencyJars(Configuration, class\<?\> ...)\` has been deprecated since it is easy to use incorrectly. Most users should rely on addDependencyJars(Job) instead.
16867 * [HBASE-16287](https://issues.apache.org/jira/browse/HBASE-16287) | *Major* | **LruBlockCache size should not exceed acceptableSize too many**
16869 In order to avoid blockcache size exceed acceptable size too much, we add one configuration "hbase.lru.blockcache.hard.capacity.limit.factor" to decide whether the block could be put into LruBlockCache or not.  This factor defaults to 1.2
16870 If blockcache size \>= factor\*acceptableSize, we will reject the block into cache.
16875 * [HBASE-16355](https://issues.apache.org/jira/browse/HBASE-16355) | *Major* | **hbase-client dependency on hbase-common test-jar should be test scope**
16877 The HBase client artifact previously incorrectly included the hbase-common test jar as a runtime dependency. With this change, that dependency has been moved to test scope. Downstream users are not expected to be impacted, unless they relied on the transitive dependency for these HBase internal test classes.
16882 * [HBASE-16317](https://issues.apache.org/jira/browse/HBASE-16317) | *Blocker* | **revert all ESAPI changes**
16884 This issue reverts fixes designed to prevent malicious content from rendering in HBase's UIs. Specifically, these changes shipped in 1.1.4+ and 1.2.0+. They were removed due to licensing issues discovered in the dependencies they introduced. Their implementation and those dependencies have been removed from HBase! Removal of these dependencies is against the strict definition of our version compatibility guidelines. However, inclusion of non-Apache approved licenses cannot be tolerated. Implementation of these fixes using an Apache-appropriate means is tracked in HBASE-16328.
16889 * [HBASE-16288](https://issues.apache.org/jira/browse/HBASE-16288) | *Critical* | **HFile intermediate block level indexes might recurse forever creating multi TB files**
16891 A new hfile configuration "hfile.index.block.min.entries" which defaults to 16 determines how many entries the hfile index block can have at least. The configuration which determines how large the index block can be at max (hfile.index.block.max.size) is ignored as long as we have fewer than hfile.index.block.min.entries entries. This ensures that multi-level index does not build up with too many levels.
16896 * [HBASE-16186](https://issues.apache.org/jira/browse/HBASE-16186) | *Major* | **Fix AssignmentManager MBean name**
16898 The AssignmentManager MBean was named AssignmentManger (note misspelling). This patch fixed the misspelling.
16903 * [HBASE-16289](https://issues.apache.org/jira/browse/HBASE-16289) | *Critical* | **AsyncProcess stuck messages need to print region/server**
16905 Adds logging of region and server. Helpful debugging. Logging now looks like this:
16906 {code}
16907 2016-06-23 17:07:18,759 INFO  [Thread-1] client.AsyncProcess$AsyncRequestFutureImpl(1601): #1, waiting for 1  actions to finish on table: DUMMY\_TABLE
16908 2016-06-23 17:07:18,759 INFO  [Thread-1] client.AsyncProcess(1720): Left over 1 task(s) are processed on server(s): [s1:1,1,1]
16909 2016-06-23 17:07:18,759 INFO  [Thread-1] client.AsyncProcess(1728): Regions against which left over task(s) are processed: [DUMMY\_TABLE,DUMMY\_BYTES\_1,1.3fd12ea80b4df621fb15497ba75f7368.,DUMMY\_TABLE,DUMMY\_BYTES\_2,2.924207e242e313d2e5491c625e0a296e.]
16910 {code}
16915 * [HBASE-14743](https://issues.apache.org/jira/browse/HBASE-14743) | *Minor* | **Add metrics around HeapMemoryManager**
16917 A memory metrics reveals situations happened in both MemStores and BlockCache in RegionServer. Through this metrics, users/operators can know 
16918 1). Current size of MemStores and BlockCache in bytes.
16919 2). Occurrence for Memstore minor and major flush. (named unblocked flush and blocked flush respectively, shown in histogram)
16920 3). Dynamic changes in size between MemStores and BlockCache. (with Increase/Decrease as prefix, shown in histogram). And a counter for no changes, named DoNothingCounter.
16921 4). Occurrence for memory usage alarm (used more than 95% by default) in RegionServer. (named AboveHeapOccupancyLowWatermarkCounter)
16926 * [HBASE-13701](https://issues.apache.org/jira/browse/HBASE-13701) | *Major* | **Consolidate SecureBulkLoadEndpoint into HBase core as default for bulk load**
16928 SecureBulkLoadEndpoint  has been integrated into HBase core as default bulk load mechanism. It is no longer needed to install it as a coprocessor endpoint.
16929 The new server is backward compatible, accommodating non-secure old client and secure old client requesting SecureBulkLoadEndpoint service.
16930 SecureBulkLoadEndpoint is deprecated. The backward compatibility support may be removed in future releases.
16935 * [HBASE-16244](https://issues.apache.org/jira/browse/HBASE-16244) | *Major* | **LocalHBaseCluster start timeout should be configurable**
16937 When LocalHBaseCluster is started from the command line the Master would give up after 30 seconds due to a hardcoded timeout meant for unit tests. This change allows the timeout to be configured via hbase-site as well as sets it to 5 minutes when LocalHBaseCluster is started from the command line.
16942 * [HBASE-16052](https://issues.apache.org/jira/browse/HBASE-16052) | *Major* | **Improve HBaseFsck Scalability**
16944 HBASE-16052 improves the performance and scalability of HBaseFsck, especially for large clusters with a small number of large tables.  
16946 Searching for lingering reference files is now a multi-threaded operation.  Loading HDFS region directory information is now multi-threaded at the region-level instead of the table-level to maximize concurrency.  A performance bug in HBaseFsck that resulted in redundant I/O and RPCs was fixed by introducing a FileStatusFilter that filters FileStatus objects directly.
16951 * [HBASE-16144](https://issues.apache.org/jira/browse/HBASE-16144) | *Major* | **Replication queue's lock will live forever if RS acquiring the lock has died prematurely**
16953 If zk based replication queue is used and useMulti is false, we will schedule a chore to clean up the orphan replication queue lock on zk.
16958 * [HBASE-3727](https://issues.apache.org/jira/browse/HBASE-3727) | *Minor* | **MultiHFileOutputFormat**
16960 MultiHFileOutputFormat support output of HFiles from multiple tables. It will output directories and hfiles as follow, 
16961      --table1
16962        --family1
16963        --family2
16964          --Hfiles
16965      --table2
16966        --family3
16967          --hfiles
16968        --family4
16970 family directory and its hfiles match the output of HFileOutputFormat2
16975 * [HBASE-16231](https://issues.apache.org/jira/browse/HBASE-16231) | *Major* | **Integration tests should support client keytab login for secure clusters**
16977 Prior to this change, the integration test clients (IntegrationTest\*) relied on the Kerberos credential cache for authentication against secured clusters.  This could lead to the tests failing due to authentication failures when the tickets in the credential cache expired.  With this change, the integration test clients will make use of the configuration properties for "hbase.client.keytab.file" and "hbase.client.kerberos.principal", when available.  This will perform a login from the configured keytab file and automatically refresh the credentials in the background for the process lifetime.
16982 * [HBASE-13823](https://issues.apache.org/jira/browse/HBASE-13823) | *Major* | **Procedure V2: unnecessaery operations on AssignmentManager#recoverTableInDisablingState() and recoverTableInEnablingState()**
16984 For cluster upgraded from 1.0.x or older releases, master startup would not continue the in-progress enable/disable table process.  If orphaned znode with ENABLING/DISABLING state exists in the cluster, run hbck or manually fix the issue.  
16986 For new cluster or cluster upgraded from 1.1.x and newer release, there is no issue to worry about.
16991 * [HBASE-16095](https://issues.apache.org/jira/browse/HBASE-16095) | *Major* | **Add priority to TableDescriptor and priority region open thread pool**
16993 Adds a PRIORITY property to the HTableDescriptor. PRIORITY should be in the same range as the RpcScheduler defines it (HConstants.XXX\_QOS). 
16995 Table priorities are only used for region opening for now. There can be other uses later (like RpcScheduling). 
16997 Regions of high priority tables (priority \>= than HIGH\_QOS) are opened from a different thread pool than the regular region open thread pool. However, table priorities are not used as a global order for region assigning or opening.
17002 * [HBASE-16081](https://issues.apache.org/jira/browse/HBASE-16081) | *Blocker* | **Replication remove\_peer gets stuck and blocks WAL rolling**
17004 When a replication endpoint is sent a shutdown request by the replication source in situations like removing a peer, we now try to gracefully shut it down by draining the items already sent for replication to the peer cluster. If the drain does not complete in the specified time (hbase.rpc.timeout \* replication.source.maxterminationmultiplier), the regionserver is aborted to avoid blocking the WAL roll.
17009 * [HBASE-16087](https://issues.apache.org/jira/browse/HBASE-16087) | *Major* | **Replication shouldn't start on a master if if only hosts system tables**
17011 Masters will no longer start any replication threads if they are hosting only system tables. 
17013 In order to change this add something to the config for tables on master that doesn't start with "hbase:" ( Replicating system tables is something that's currently unsupported and can open up security holes, so do this at your own peril)
17018 * [HBASE-14548](https://issues.apache.org/jira/browse/HBASE-14548) | *Major* | **Expand how table coprocessor jar and dependency path can be specified**
17020 Allow a directory containing the jars or some wildcards to be specified, such as: hdfs://namenode:port/user/hadoop-user/ 
17022 hdfs://namenode:port/user/hadoop-user/\*.jar
17024 Please note that if a directory is specified, all jar files(.jar) directly in the directory are added, but it does not search files in the subtree rooted in the directory.
17025 Do not contain any wildcard if you would like to specify a directory.
17030 * [HBASE-15925](https://issues.apache.org/jira/browse/HBASE-15925) | *Blocker* | **compat-module maven variable not evaluated**
17032 Downstream users of HBase dependencies that do not properly activate Maven profiles should now see a correct transitive dependency on the default hadoop-compatibility-module.
17037 * [HBASE-16140](https://issues.apache.org/jira/browse/HBASE-16140) | *Major* | **bump owasp.esapi from 2.1.0 to 2.1.0.1**
17039 The dependency owasp.esapi had a compatible change from 2.1.0 to 2.1.0.1. As a result, the transitive dependency commons-fileupload had a change from 1.2 to 1.3.1, which has some minor class changes that impact binary compatibility. Interested users should check the release notes of commons-fileupload to see if any of the incompatible changes impact them.
17041 http://commons.apache.org/proper/commons-fileupload/changes-report.html
17046 * [HBASE-16147](https://issues.apache.org/jira/browse/HBASE-16147) | *Major* | **Shell command for getting compaction state**
17048 compaction\_state shell command would return compaction state in String form:
17049 NONE, MINOR, MAJOR, MAJOR\_AND\_MINOR
17054 * [HBASE-14878](https://issues.apache.org/jira/browse/HBASE-14878) | *Major* | **maven archetype: client application with shaded jars**
17056 Adds new hbase-shaded-client archetype; also corrects an omission found in hbase-archetypes/README.md in the section headed "How to add a new archetype".
17061 * [HBASE-14877](https://issues.apache.org/jira/browse/HBASE-14877) | *Major* | **maven archetype: client application**
17063 This patch introduces a new infrastructure for creation and maintenance of Maven archetypes in the context of the hbase project, and it also introduces the first archetype, which end-users may utilize to generate a simple hbase-client dependent project.
17065 NOTE that this patch should introduce two new WARNINGs ("Using platform encoding ... to copy filtered resources") into the hbase install process. These warnings are hard-wired into the maven-archetype-plugin:create-from-project goal. See hbase/hbase-archetypes/README.md, footnote [6] for details.
17067 After applying the patch, see hbase/hbase-archetypes/README.md for details regarding the new archetype infrastructure introduced by this patch. (The README text is also conveniently positioned at the top of the patch itself.) 
17069 Here is the opening paragraph of the README.md file: 
17070 ================= 
17071 The hbase-archetypes subproject of hbase provides an infrastructure for creation and maintenance of Maven archetypes pertinent to HBase. Upon deployment to the archetype catalog of the central Maven repository, these archetypes may be used by end-user developers to autogenerate completely configured Maven projects (including fully-functioning sample code) through invocation of the archetype:generate goal of the maven-archetype-plugin. 
17072 ======== 
17073 The README.md file also contains several paragraphs under the heading, "Notes for contributors and committers to the HBase project", which explains the layout of 'hbase-archetypes', and how archetypes are created and installed into the local Maven repository, ready for deployment to the central Maven repository. It also outlines how new archetypes may be developed and added to the collection in the future.
17078 * [HBASE-15977](https://issues.apache.org/jira/browse/HBASE-15977) | *Major* | **Failed variable substitution on home page**
17080 Done. Thanks, Dima, Andrew!
17085 * [HBASE-5291](https://issues.apache.org/jira/browse/HBASE-5291) | *Major* | **Add Kerberos HTTP SPNEGO authentication support to HBase web consoles**
17087 HBase Web UIs can be secured from general public access using SPNEGO to require a valid Kerberos ticket.
17089 Setting 'hbase.security.authentication.ui' to 'kerberos' in hbase-site.xml is a global switch to have all Web UIs allow only authenticated clients via Kerberos. 'hbase.security.authentication.spnego.kerberos.principal' and 'hbase.security.authentication.spnego.kerberos.keytab' are two other required properties in hbase-site.xml, the Kerberos principal and keytab to use for the server to use to log in. The primary in the Kerberos principal must be 'HTTP' as required by the SPNEGO mechanism, e.g. 'HTTP/host.domain.com@DOMAIN.COM'.
17094 * [HBASE-15950](https://issues.apache.org/jira/browse/HBASE-15950) | *Major* | **Fix memstore size estimates to be more tighter**
17096 The estimates of heap usage by the memstore objects (KeyValue, object and array header sizes, etc) have been made more accurate for heap sizes up to 32G (using CompressedOops), resulting in them dropping by 10-50% in practice. This also results in less number of flushes and compactions due to "fatter" flushes. YMMV. As a result, the actual heap usage of the memstore before being flushed may increase by up to 100%. If configured memory limits for the region server had been tuned based on observed usage, this change could result in worse GC behavior or even OutOfMemory errors. Set the environment property (not hbase-site.xml) "hbase.memorylayout.use.unsafe" to false to disable.
17101 * [HBASE-16023](https://issues.apache.org/jira/browse/HBASE-16023) | *Major* | **Fastpath for the FIFO rpcscheduler**
17103 Adds a 'fastpath' when using the default FIFO rpc scheduler ('fifo'). Does direct handoff from Reader thread to Handler if there is one ready and willing. Will shine best when high random read workload (YCSB workloadc for instance)
17108 * [HBASE-15971](https://issues.apache.org/jira/browse/HBASE-15971) | *Critical* | **Regression: Random Read/WorkloadC slower in 1.x than 0.98**
17110 Change the default rpc scheduler from 'deadline' to 'fifo' instead so it is the same as in branch 0.98. 'deadline' was of questionable benefit but with a high cost scheduling. To re-enable 'deadline', set hbase.ipc.server.callqueue.type to 'deadline' in your hbase-site.xml.
17115 * [HBASE-15525](https://issues.apache.org/jira/browse/HBASE-15525) | *Critical* | **OutOfMemory could occur when using BoundedByteBufferPool during RPC bursts**
17117 Added a new ByteBufferPool which pools N ByteBuffers. By default it makes off heap ByteBuffers when getBuffer() is called. The size of each buffer defaults to 64KB. This can be configured using 'hbase.ipc.server.reservoir.initial.buffer.size'.   The max number of buffers which can be pooled defaults to twice the number of handler threads in RS. This can be configured with key 'hbase.ipc.server.reservoir.initial.max'.  While responding to read requests and client support Codec, we will create CellBlocks and directly return it as PB payload. For making this block, we will use N ByteBuffers from pool as per the total size of the response cells. The default size of 64 KB for the buffer is inline with the number of bytes written to RPC layer in one short.(That is also 64KB).  When at point of time, the calle not able to get a free buffer from the pool (it returns null then), it will make on heap Buffer of same size (as that of Buffers in pool) and use that to create cell block.
17122 * [HBASE-15994](https://issues.apache.org/jira/browse/HBASE-15994) | *Major* | **Allow selection of RpcSchedulers**
17124 Adds a FifoRpcSchedulerFactory so you can try the FifoRpcScheduler by setting  "hbase.region.server.rpc.scheduler.factory.class"
17129 * [HBASE-15989](https://issues.apache.org/jira/browse/HBASE-15989) | *Major* | **Remove hbase.online.schema.update.enable**
17131 Removes the "hbase.online.schema.update.enable" property. 
17132 from now, every operation that alter the schema (e.g. modifyTable, addFamily, removeFamily, ...) will use the online schema update. there is no need to disable/enable the table.
17137 * [HBASE-15981](https://issues.apache.org/jira/browse/HBASE-15981) | *Minor* | **Stripe and Date-tiered compactions inaccurately suggest disabling table in docs**
17139 Removes reference to disabling table in docs for stripe and date-tiered compactions
17144 * [HBASE-15931](https://issues.apache.org/jira/browse/HBASE-15931) | *Critical* | **Add log for long-running tasks in AsyncProcess**
17146 After HBASE-15931, we will log more details for long-running tasks in AsyncProcess#waitForMaximumCurrentTasks every 10 seconds, including:
17147 1. Table name will be included in the tasks status log
17148 2. On which regionserver(s) the tasks are runnning will be logged when less than hbase.client.threshold.log.details tasks left, by default 10.
17149 3. Against which regions the tasks are running will be logged when less than 2 tasks left.
17154 * [HBASE-15907](https://issues.apache.org/jira/browse/HBASE-15907) | *Major* | **Missing documentation of create table split options**
17156 documentation changes only - added section to Shell tricks and cross reference from region splitting section
17161 * [HBASE-15915](https://issues.apache.org/jira/browse/HBASE-15915) | *Major* | **Set timeouts on hanging tests**
17163 Use @ClassRule to set timeout on test case level (instead of @Rule which sets timeout for the test methods). CategoryBasedTimeout.forClass(..) determines the timeout value based on category annotation (small/medium/large) on the test case.
17168 * [HBASE-15875](https://issues.apache.org/jira/browse/HBASE-15875) | *Major* | **Remove HTable references and HTableInterface**
17170 **WARNING: No release note provided for this change.**
17175 * [HBASE-15610](https://issues.apache.org/jira/browse/HBASE-15610) | *Blocker* | **Remove deprecated HConnection for 2.0 thus removing all PB references for 2.0**
17177 **WARNING: No release note provided for this change.**
17182 * [HBASE-15890](https://issues.apache.org/jira/browse/HBASE-15890) | *Major* | **Allow thrift to set/unset "cacheBlocks" for Scans**
17184 Adds cacheBlocks to Scan
17189 * [HBASE-15876](https://issues.apache.org/jira/browse/HBASE-15876) | *Blocker* | **Remove doBulkLoad(Path hfofDir, final HTable table) though it has not been through a full deprecation cycle**
17191 Removes a doBulkLoad method though it has not been through a full deprecation cycle (but it is 'damaged' because it has a parameter that has been properly deprecated). Use the alternative {code}public void doBulkLoad(Path hfofDir, final Admin admin, Table table, RegionLocator regionLocator){code}
17193 See http://mail-archives.apache.org/mod\_mbox/hbase-dev/201605.mbox/%3CCAMUu0w-ZiLoLBLO3D76=n3AjUr=VMtTUeYA28weLHYeq8+e3bQ@mail.gmail.com%3E for NOTICE on this 'premature' removal.
17198 * [HBASE-15228](https://issues.apache.org/jira/browse/HBASE-15228) | *Major* | **Add the methods to RegionObserver to trigger start/complete restoring WALs**
17200 Added two hooks around WAL restore. 
17201 preReplayWALs(final ObserverContext\<? extends RegionCoprocessorEnvironment\> ctx,  HRegionInfo info, Path edits)
17203 postReplayWALs(final ObserverContext\<? extends RegionCoprocessorEnvironment\> ctx,  HRegionInfo info, Path edits) 
17205 Will be called at start and end of restore of a WAL file. 
17206 The other hook around WAL restore (preWALRestore ) will be called before restore of every entry within the WAL file.
17211 * [HBASE-15856](https://issues.apache.org/jira/browse/HBASE-15856) | *Critical* | **Cached Connection instances can wind up with addresses never resolved**
17213 During periods where DNS resolution was not available or not working correctly, we could previously cache unresolved hostnames forever, in some cases preventing further connections to these hosts even when DNS service was restored.  With this change, unresolved hostnames will no longer be cached, and will instead throw an UnknownHostException during connection setup.
17218 * [HBASE-15593](https://issues.apache.org/jira/browse/HBASE-15593) | *Major* | **Time limit of scanning should be offered by client**
17220 Add a new configuration: hbase.ipc.min.client.request.timeout
17221 Minimum allowable timeout (in milliseconds) in rpc request's header. This configuration exists to prevent the rpc service regarding this request as timeout immediately.
17226 * [HBASE-15784](https://issues.apache.org/jira/browse/HBASE-15784) | *Major* | **Misuse core/maxPoolSize of LinkedBlockingQueue in ThreadPoolExecutor**
17228 The core pool size and max pool size of ThreadPoolExecutor should be the same when LinkedBlockingQueue is used. Thus the configurations hbase.hconnection.threads.max, hbase.hconnection.meta.lookup.threads.max, hbase.region.replica.replication.threads.max and hbase.multihconnection.threads.max are used as the number of the core threads, and the related configurations \*.thread.core are not used any more.
17233 * [HBASE-15651](https://issues.apache.org/jira/browse/HBASE-15651) | *Major* | **Add report-flakies.py to use jenkins api to get failing tests**
17235 To find recent set of flakies, run the script added by this patch. Run it to get usage information passing -h:
17237 {code}
17238 $ ./dev-support/report-flakies.py -h
17239 {code}
17241 If you get the below:
17243 {code}
17244 $ python ./dev-support/report-flakies.py
17245 Traceback (most recent call last):
17246   File "./dev-support/report-flakies.py", line 25, in \<module\>
17247     import requests
17248 ImportError: No module named requests
17249 {code}
17251 ... install the requests module:
17253 {code}
17254 $ sudo pip install requests
17255 {code}
17260 * [HBASE-15780](https://issues.apache.org/jira/browse/HBASE-15780) | *Critical* | **Expose AuthUtil as IA.Public**
17262 Downstream users with long lived applications that need to communicate with secure HBase instances can now rely on the AuthUtil class to handle authenticating via keytab.
17264 For more information, see the javadoc for the org.apache.hadoop.hbase.AuthUtil class.
17269 * [HBASE-15811](https://issues.apache.org/jira/browse/HBASE-15811) | *Blocker* | **Batch Get after batch Put does not fetch all Cells**
17271 We were not waiting on all executors in a batch to complete which meant a read-your-own-writes could sometimes fail -- especially if client is loaded; i.e. putting to multiple machines in a cluster. The test for no-more-executors was damaged by the 0.99/0.98.4 fix "HBASE-11403 Fix race conditions around Object#notify"
17276 * [HBASE-15801](https://issues.apache.org/jira/browse/HBASE-15801) | *Major* | **Upgrade checkstyle for all branches**
17278 All active branches now use maven-checkstyle-plugin 2.17 and checkstyle 6.18.
17283 * [HBASE-15236](https://issues.apache.org/jira/browse/HBASE-15236) | *Major* | **Inconsistent cell reads over multiple bulk-loaded HFiles**
17285 This jira fixes that following bug:
17286 During bulkloading, if there are multiple hfiles corresponding to same region, and if they have same timestamps (which may have been set using importtsv.timestamp) and duplicate keys across them, then get and scan may return values coming from different hfiles.
17291 * [HBASE-15740](https://issues.apache.org/jira/browse/HBASE-15740) | *Major* | **Replication source.shippedKBs metric is undercounting because it is in KB**
17293 Removed Replication source.shippedKBs metric in favor of source.shippedBytes
17298 * [HBASE-15773](https://issues.apache.org/jira/browse/HBASE-15773) | *Major* | **CellCounter improvements**
17300 The CellCounter map reduce job now supports additional configuration options on the Scan instance it creates, using the org.apache.hadoop.hbase.mapreduce.TableInputFormat defined property names.  For a full list of the options, run ./hbase org.apache.hadoop.hbase.mapreduce.CellCounter with no arguments.
17302 CellCounter also no longer creates job counters for per-rowkey and per-rowkey/qualifier cell counts.  For most tables, these counters would cause the job to fail due to mapreduce job counter limits.
17307 * [HBASE-15759](https://issues.apache.org/jira/browse/HBASE-15759) | *Minor* | **RegionObserver.preStoreScannerOpen() doesn't have acces to current readpoint**
17309 The following RegionObserver method is deprecated and would no longer be called in hbase 2.0:
17311   public KeyValueScanner preStoreScannerOpen(final ObserverContext\<RegionCoprocessorEnvironment\> c,
17312       final Store store, final Scan scan, final NavigableSet\<byte[]\> targetCols,
17313       final KeyValueScanner s) throws IOException {
17315 Instead, override this method:
17317   public KeyValueScanner preStoreScannerOpen(final ObserverContext\<RegionCoprocessorEnvironment\> c,
17318       final Store store, final Scan scan, final NavigableSet\<byte[]\> targetCols,
17319       final KeyValueScanner s, final long readPt) throws IOException {
17324 * [HBASE-15743](https://issues.apache.org/jira/browse/HBASE-15743) | *Major* | **Add Transparent Data Encryption support for FanOutOneBlockAsyncDFSOutput**
17326 Now the AsyncFSWAL can write data to a encryption zone on HDFS.
17331 * [HBASE-15767](https://issues.apache.org/jira/browse/HBASE-15767) | *Major* | **Upgrade httpclient dependency**
17333 HBase now relies on version 4.3.6 of the Apache Commons HTTPClient library. Downstream users who are exposed to it via the HBase classpath will have to similarly update their dependency.
17338 * [HBASE-15575](https://issues.apache.org/jira/browse/HBASE-15575) | *Minor* | **Rename table DDL \*Handler methods in MasterObserver to more meaningful names**
17340 **WARNING: No release note provided for this change.**
17345 * [HBASE-15720](https://issues.apache.org/jira/browse/HBASE-15720) | *Major* | **Print row locks at the debug dump page**
17347 Adds a section to the debug dump page listing current row locks held.
17352 * [HBASE-15703](https://issues.apache.org/jira/browse/HBASE-15703) | *Critical* | **Deadline scheduler needs to return to the client info about skipped calls, not just drop them**
17354 With previous deadline mode of RPC scheduling (the implementation in SimpleRpcScheduler, which is basically a FIFO except that long-running scans are de-prioritized) and FIFO-based RPC scheduler clients are getting CallQueueTooBigException when RPC call queue is full.
17356 With this patch and when hbase.ipc.server.callqueue.type property is set to "codel" mode, clients will also be getting CallDroppedException, which means that the request was discarded by the server as it considers itself to be overloaded and starts to drop requests to avoid going down under the load. The clients will retry upon receiving this exception. It doesn't clear MetaCache with region locations.
17361 * [HBASE-15281](https://issues.apache.org/jira/browse/HBASE-15281) | *Major* | **Allow the FileSystem inside HFileSystem to be wrapped**
17363 This patch adds new configuration property - hbase.fs.wrapper. If provided, it should be fully qualified class name of the class used as a pluggable wrapper for HFileSystem. This may be useful for specific debugging/tracing needs.
17368 * [HBASE-15551](https://issues.apache.org/jira/browse/HBASE-15551) | *Minor* | **Make call queue too big exception use servername**
17370 Fixes issue when CallQueueTooBig exception returned to the client could print useless address info (like 0.0.0.0) if RPC server is listening on something other than the host name, making troubleshooting inconvenient.
17375 * [HBASE-15711](https://issues.apache.org/jira/browse/HBASE-15711) | *Major* | **Add client side property to allow logging details for batch errors**
17377 In HBASE-15711 a new client side property hbase.client.log.batcherrors.details is introduced to allow logging full stacktrace of exceptions for batch error. It's disabled by default and set the property to true will enable it.
17382 * [HBASE-15686](https://issues.apache.org/jira/browse/HBASE-15686) | *Major* | **Add override mechanism for the exempt classes when dynamically loading table coprocessor**
17384 New coprocessor table descriptor attribute, hbase.coprocessor.classloader.included.classes, is added.
17385 User can specify class name prefixes (semicolon separated) which should be loaded by CoprocessorClassLoader through this attribute using the following syntax:
17386 {code}
17387   hbase\> alter 't1',    'coprocessor'=\>'hdfs:///foo.jar\|com.foo.FooRegionObserver\|1001\|arg1=1,arg2=2'
17388 {code}
17393 * [HBASE-15645](https://issues.apache.org/jira/browse/HBASE-15645) | *Critical* | **hbase.rpc.timeout is not used in operations of HTable**
17395 Fixes regression where hbase.rpc.timeout configuration was ignored in branch-1.0+
17397 Adds new methods setOperationTimeout, getOperationTimeout, setRpcTimeout, and getRpcTimeout to Table. In branch-1.3+ they are public interfaces and in 1.0-1.2 they are labeled as @InterfaceAudience.Private.
17399 Adds hbase.client.operation.timeout to hbase-default.xml with default of 1200000
17404 * [HBASE-15477](https://issues.apache.org/jira/browse/HBASE-15477) | *Major* | **Do not save 'next block header' when we cache hfileblocks**
17406 Fix over-persisting in blockcache; no longer save the block PLUS the header of the next block (33 bytes) when writing the cache.
17408 Also removes support for hfileblock v1; hfile block v1 was used writing hfile v1. hfile v1 was the default in hbase before hbase-0.92. hbase.96 would not start unless all v1 hfiles had been compacted out of the cluster.
17413 * [HBASE-15628](https://issues.apache.org/jira/browse/HBASE-15628) | *Major* | **Implement an AsyncOutputStream which can work with any FileSystem implementation**
17415 Introduce an AsyncFSOutput interface which is an abstraction of the original FanOutOneBlockAsyncDFSOutput. Now you can create AsyncFSOutput on any FileSystem using the method AsyncFSOutputHelper.createOutput. The returned AsyncFSOutput will be FanOutOneBlockAsyncDFSOutput if the given FileSystem is a DistributedFileSystem.
17420 * [HBASE-15392](https://issues.apache.org/jira/browse/HBASE-15392) | *Major* | **Single Cell Get reads two HFileBlocks**
17422 When an explicit Get with a one or more columns specified, we at a minimum, were overseeking, reading until we tripped over the next row, regardless, and only then returning. If the next row was in-block, we'd just do too much seeking but if the next row was in the next (or in the next block beyond that), we would keep seeking and loading blocks until we found the next row before we'd return.
17424 There remains one case where we will still 'overread'. It is when the row end aligns with the end of the block. In this case we will load the next block just to find that there are no more cells in the current row. See HBASE-15457.
17429 * [HBASE-15671](https://issues.apache.org/jira/browse/HBASE-15671) | *Major* | **Add per-table metrics on memstore, storefile and regionsize**
17431 Adds storeFileSize, memstoreSize and tableSize to the per-table metrics.
17436 * [HBASE-15366](https://issues.apache.org/jira/browse/HBASE-15366) | *Major* | **Add doc, trace-level logging, and test around hfileblock**
17438 No functional change. Added javadoc, comments, and extra trace-level logging to make clear what is happening around the reading and caching of hfile blocks.
17443 * [HBASE-15368](https://issues.apache.org/jira/browse/HBASE-15368) | *Major* | **Add pluggable window support**
17445 Use 'hbase.hstore.compaction.date.tiered.window.factory.class' to specify the window implementation you like for date tiered compaction. Now the only and default implementation is org.apache.hadoop.hbase.regionserver.compactions.ExponentialCompactionWindowFactory.
17447 {code} 
17448 \<property\> 
17449 \<name\>hbase.hstore.compaction.date.tiered.window.factory.class\</name\> 
17450 \<value\>org.apache.hadoop.hbase.regionserver.compactions.ExponentialCompactionWindowFactory\</value\> 
17451 \</property\> 
17452 \<property\> 
17453 {code}
17458 * [HBASE-15518](https://issues.apache.org/jira/browse/HBASE-15518) | *Major* | **Add Per-Table metrics back**
17460 Adds per-table metrics aggregated from per-region metrics in region server metrics. New metrics are available under JMX section "Hadoop:service=HBase,name=RegionServer,sub=Tables" and they are available via hadoop metrics2 collectors.
17465 * [HBASE-15640](https://issues.apache.org/jira/browse/HBASE-15640) | *Major* | **L1 cache doesn't give fair warning that it is showing partial stats only when it hits limit**
17467 The blockcache UI tab would stop refreshing at 100k blocks (configurable, see "hbase.ui.blockcache.by.file.max"), which isn't very many blocks when doing a big cache, giving a misleading picture of the content of L1 and/or L2 cache. Up the default limit to 1M blocks (UI takes a while but just a few seconds counting over 1M blocks).
17469 Also, when beyond the limit give the user a noticeable WARNING in the UI.
17474 * [HBASE-15386](https://issues.apache.org/jira/browse/HBASE-15386) | *Major* | **PREFETCH\_BLOCKS\_ON\_OPEN in HColumnDescriptor is ignored**
17476 This was a non-issue. The PREFETCH\_... flag actually works. While here though made the following additions.
17478 Changes the prefetch TRACE-level loggings to include the word 'Prefetch' in them so you know what they are about.
17480 Changes the cryptic logging of the CacheConfig#toString to have some preamble saying why and what column family is responsible (helps figure what is going on)
17482 Add test that verifies setting flag on HColumnDescriptor actually works.
17487 * [HBASE-13372](https://issues.apache.org/jira/browse/HBASE-13372) | *Major* | **Unit tests for SplitTransaction and RegionMergeTransaction listeners**
17489 HBASE-13372 Add unit tests for SplitTransaction and RegionMergeTransaction listeners
17494 * [HBASE-15187](https://issues.apache.org/jira/browse/HBASE-15187) | *Major* | **Integrate CSRF prevention filter to REST gateway**
17496 Protection against CSRF attack can be turned on with config parameter, hbase.rest.csrf.enabled - default value is false.
17498 The custom header to be sent can be changed via config parameter, hbase.rest.csrf.custom.header whose default value is "X-XSRF-HEADER".
17500 Config parameter, hbase.rest.csrf.methods.to.ignore , controls which HTTP methods are not associated with customer header check.
17502 Config parameter, hbase.rest-csrf.browser-useragents-regex , is a comma-separated list of regular expressions used to match against an HTTP request's User-Agent header when protection against cross-site request forgery (CSRF) is enabled for REST server by setting hbase.rest.csrf.enabled to true.
17504 The implementation came from hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/security/http/RestCsrfPreventionFilter.java
17506 We should periodically update the RestCsrfPreventionFilter.java in hbase codebase to include fixes to the hadoop implementation.
17511 * [HBASE-15481](https://issues.apache.org/jira/browse/HBASE-15481) | *Trivial* | **Add pre/post roll to WALObserver**
17513 <!-- markdown -->
17516 WALObserver coprocessors now can receive notifications of WAL rolling via the new methods `preWALRoll` and `postWALRoll`.
17518 This change is incompatible due to the addition of these methods to the `WALObserver` interface. Downstream users are encouraged to instead extend the `BaseWALObserver` class, which remains compatible through this change.
17523 * [HBASE-15507](https://issues.apache.org/jira/browse/HBASE-15507) | *Major* | **Online modification of enabled ReplicationPeerConfig**
17525 Added update\_peer\_config to the HBase shell and ReplicationAdmin, and provided a callback for custom replication endpoints to be notified of changes to their configuration and peer data
17530 * [HBASE-15537](https://issues.apache.org/jira/browse/HBASE-15537) | *Major* | **Make multi WAL work with WALs other than FSHLog**
17532 Add the delegate config for multiwal back. Now you can use 'hbase.wal.regiongrouping.delegate.provider' to specify the wal provider you want to use for multiwal. For example:
17533 {code}
17534 \<property\>
17535 \<name\>hbase.wal.regiongrouping.delegate.provider\</name\>
17536 \<value\>asyncfs\</value\>
17537 \</property\>
17538 {code}
17539 And the default value is filesystem which is the alias of DefaultWALProvider, i.e., the FSHLog.
17544 * [HBASE-15400](https://issues.apache.org/jira/browse/HBASE-15400) | *Major* | **Use DateTieredCompactor for Date Tiered Compaction**
17546 With this patch combined with HBASE-15389, when we compact, we can output multiple files along the current window boundaries. There are two use cases:
17547 1. Major compaction: We want to output date tiered store files with data older than max age archived in trunks of the window size on the higher tier. Once a window is old enough, we don't combine the windows to promote to the next tier any further. So files in these windows retain the same timespan as they were minor-compacted last time, which is the window size of the highest tier. Major compaction will touch these files and we want to maintain the same layout. This way, TTL and archiving will be simpler and more efficient.
17548 2. Bulk load files and the old file generated by major compaction before upgrading to DTCP.
17550 This will change the way to enable date tiered compaction.
17551 To turn it on: 
17552 hbase.hstore.engine.class: org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine
17554 With tiered compaction all servers in the cluster will promote windows to higher tier at the same time, so using a compaction throttle is recommended: 
17555 hbase.regionserver.throughput.controller:org.apache.hadoop.hbase.regionserver.compactions.PressureAwareCompactionThroughputController 
17556 hbase.hstore.compaction.throughput.higher.bound and hbase.hstore.compaction.throughput.lower.bound need to be set for desired throughput range as uncompressed rates.
17558 Because there will most likely be more store files around, we need to adjust the configuration so that flush won't be blocked and compaction will be properly throttled: 
17559 hbase.hstore.blockingStoreFiles: change to 50 if using all default parameters when turning on date tiered compaction. Use 1.5~2 x projected file count if changing the parameters, Projected file count = windows per tier x tier count + incoming window min + files older than max age 
17561 Because major compaction is turned on now, we also need to adjust the configuration for max file to compact according to the larger file count:
17562 hbase.hstore.compaction.max: set to the same number as hbase.hstore.blockingStoreFiles.
17564 For more details, please refer to the design spec at https://docs.google.com/document/d/1\_AmlNb2N8Us1xICsTeGDLKIqL6T-oHoRLZ323MG\_uy8/edit#
17569 * [HBASE-15592](https://issues.apache.org/jira/browse/HBASE-15592) | *Major* | **Print Procedure WAL content**
17571 Use hbase org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALPrettyPrinter
17572 to print the content of a Procedure WAL.
17573 e.g.
17574 hbase org.apache.hadoop.hbase.procedure2.store.wal.ProcedureWALPrettyPrinter -f /hbase/MasterProcWALs/state-00000000000000002571.log
17579 * [HBASE-15396](https://issues.apache.org/jira/browse/HBASE-15396) | *Minor* | **Enhance mapreduce.TableSplit to add encoded region name**
17581 To aid troubleshooting of MapReduce job that rely on the HBase provided input format, splits now include the encoded region name they cover.
17586 * [HBASE-15568](https://issues.apache.org/jira/browse/HBASE-15568) | *Major* | **Procedure V2 - Remove CreateTableHandler in HBase Apache 2.0 release**
17588 **WARNING: No release note provided for this change.**
17593 * [HBASE-15521](https://issues.apache.org/jira/browse/HBASE-15521) | *Major* | **Procedure V2 - RestoreSnapshot and CloneSnapshot**
17595 **WARNING: No release note provided for this change.**
17600 * [HBASE-15538](https://issues.apache.org/jira/browse/HBASE-15538) | *Major* | **Implement secure async protobuf wal writer**
17602 Add the following config in hbase-site.xml if you want to use secure protobuf wal writer together with AsyncFSWAL
17603 {code}
17604 \<property\>
17605 \<name\>hbase.regionserver.hlog.async.writer.impl\</name\>
17606 \<value\>org.apache.hadoop.hbase.regionserver.wal.SecureAsyncProtobufLogWriter\</value\>
17607 \</property\>
17608 \<property\>
17609 {code}
17614 * [HBASE-11393](https://issues.apache.org/jira/browse/HBASE-11393) | *Major* | **Replication TableCfs should be a PB object rather than a string**
17616 **WARNING: No release note provided for this change.**
17621 * [HBASE-15265](https://issues.apache.org/jira/browse/HBASE-15265) | *Major* | **Implement an asynchronous FSHLog**
17623 To enable, set the WALProvider as follows:
17625 {code}
17626 \<property\>
17627 \<name\>hbase.wal.provider\</name\>
17628 \<value\>asyncfs\</value\>
17629 \</property\>
17630 \<property\>
17631 {code}
17633 To check which provider is active, look for the log line:
17635 LOG.info("Instantiating WALProvider of type " + clazz);
17640 * [HBASE-14256](https://issues.apache.org/jira/browse/HBASE-14256) | *Major* | **Flush task message may be confusing when region is recovered**
17642 HBASE-14256 Correct confusing flush task message
17647 * [HBASE-15212](https://issues.apache.org/jira/browse/HBASE-15212) | *Major* | **RPCServer should enforce max request size**
17649 Adds a configuration parameter "hbase.ipc.max.request.size" which defaults to 256MB to protect the server against very large incoming RPC requests. All requests larger than this size will be immediately rejected before allocating any resources (memory allocation, etc).
17654 * [HBASE-15412](https://issues.apache.org/jira/browse/HBASE-15412) | *Major* | **Add average region size metric**
17656 Adds a new metric for called "averageRegionSize" that is emitted as a regionserver metric. Metric description: 
17657 Average region size over the region server including memstore and storefile sizes
17662 * [HBASE-15479](https://issues.apache.org/jira/browse/HBASE-15479) | *Major* | **No more garbage or beware of autoboxing**
17664 This fix decreases client's memory allocation during writes by more than 50%.
17669 * [HBASE-15322](https://issues.apache.org/jira/browse/HBASE-15322) | *Critical* | **Operations using Unsafe path broken for platforms not having sun.misc.Unsafe**
17671 **WARNING: No release note provided for this change.**
17676 * [HBASE-12940](https://issues.apache.org/jira/browse/HBASE-12940) | *Major* | **Expose listPeerConfigs and getPeerConfig to the HBase shell**
17678 Adds get\_peer\_config and list\_peer\_configs to the hbase shell.
17683 * [HBASE-15430](https://issues.apache.org/jira/browse/HBASE-15430) | *Critical* | **Failed taking snapshot - Manifest proto-message too large**
17685 Failed taking snapshot - Manifest proto-message too large. add property ("snapshot.manifest.size.limit")  to change max size of proto-message
17690 * [HBASE-15323](https://issues.apache.org/jira/browse/HBASE-15323) | *Major* | **Hbase Rest CheckAndDeleteAPi should be able to delete more cells**
17692 Fixed an issue in REST server checkAndDelete operation where the remaining cells other than the to-be-checked column are also applied in the Delete operation. Also fixed an issue in RemoteHTable where the Delete object was not passed correctly to the REST server side.
17697 * [HBASE-15377](https://issues.apache.org/jira/browse/HBASE-15377) | *Major* | **Per-RS Get metric is time based, per-region metric is size-based**
17699 Per-region metrics related to Get histograms are changed from being response size based into being latency based similar to the per-regionserver metrics of the same name.  
17701 Added GetSize histogram metrics at the per-regionserver and per-region level for the response sizes.
17706 * [HBASE-6721](https://issues.apache.org/jira/browse/HBASE-6721) | *Major* | **RegionServer Group based Assignment**
17708 [ADVANCED USERS ONLY] This patch adds a new experimental module hbase-rsgroup. It is an advanced feature for partitioning regionservers into distinctive groups for strict isolation, and should only be used by users who are sophisticated enough to understand the full implications and have a sufficient background in managing HBase clusters. 
17710 RSGroups can be defined and managed with shell commands or corresponding Java APIs. A server can be added to a group with hostname and port pair, and tables can be moved to this group so that only regionservers in the same rsgroup can host the regions of the table. RegionServers and tables can only belong to 1 group at a time. By default, all tables and regionservers belong to the "default" group. System tables can also be put into a group using the regular APIs. A custom balancer implementation tracks assignments per rsgroup and makes sure to move regions to the relevant regionservers in that group. The group information is stored in a regular HBase table, and a zookeeper-based read-only cache is used at the cluster bootstrap time. 
17712 To enable, add the following to your hbase-site.xml and restart your Master:
17715  \<property\>
17716    \<name\>hbase.coprocessor.master.classes\</name\>
17717    \<value\>org.apache.hadoop.hbase.rsgroup.RSGroupAdminEndpoint\</value\>
17718  \</property\>
17719  \<property\>
17720    \<name\>hbase.master.loadbalancer.class\</name\>
17721    \<value\>org.apache.hadoop.hbase.rsgroup.RSGroupBasedLoadBalancer\</value\>
17722  \</property\>
17725 Then use the shell 'rsgroup' commands to create and manipulate regionserver groups: e.g. to add a group and then add a server to it, do as follows:
17727  hbase(main):008:0\> add\_rsgroup 'my\_group'
17728  Took 0.5610 seconds
17730 This adds a group to the 'hbase:rsgroup' system table. Add a server (hostname + port) to the group using the 'move\_rsgroup\_servers' command as follows:
17732  hbase(main):010:0\> move\_rsgroup\_servers 'my\_group',['k.att.net:51129']
17737 * [HBASE-15435](https://issues.apache.org/jira/browse/HBASE-15435) | *Major* | **Add WAL (in bytes) written metric**
17739 Adds a new metric named "writtenBytes" as a per-regionserver metric. Metric Description: 
17740 Size (in bytes) of the data written to the WAL.
17745 * [HBASE-13963](https://issues.apache.org/jira/browse/HBASE-13963) | *Critical* | **avoid leaking jdk.tools**
17747 HBase now ensures that the JDK tools jar used during the build process is not exposed to downstream clients as a transitive dependency of hbase-annotations.
17749 If you need to have the JDK tools jar in your classpath, you should add a system dependency on it. See the hbase-annotations pom for an example of the necessary pom additions.
17754 * [HBASE-15271](https://issues.apache.org/jira/browse/HBASE-15271) | *Major* | **Spark Bulk Load: Need to write HFiles to tmp location then rename to protect from Spark Executor Failures**
17756 When using the bulk load helper provided by the hbase-spark module, output files will now be written into temporary files and only made available when the executor has successfully completed.
17758 Previously, failed executors would leave their files in place in a way that would be picked up by a bulk load command. This caused retried failures to include spurious copies of some cells.
17763 * [HBASE-15364](https://issues.apache.org/jira/browse/HBASE-15364) | *Major* | **Fix unescaped \< characters in Javadoc**
17765 HBASE-15364 Fix unescaped \< and \> characters in Javadoc
17770 * [HBASE-15243](https://issues.apache.org/jira/browse/HBASE-15243) | *Major* | **Utilize the lowest seek value when all Filters in MUST\_PASS\_ONE FilterList return SEEK\_NEXT\_USING\_HINT**
17772 When all filters in a MUST\_PASS\_ONE FilterList return a SEEK\_USING\_NEXT\_HINT code, we return SEEK\_NEXT\_USING\_HINT from the FilterList#filterKeyValue() to utilize the lowest seek value.
17777 * [HBASE-15354](https://issues.apache.org/jira/browse/HBASE-15354) | *Major* | **Use same criteria for clearing meta cache for all operations**
17779 This patch fixes some issues when MetaCache (region location cache) gets unnecessarily dropped on the client.
17781 On master branch we now in RegionServerCallable and RegionServerAdminCallable pass the actual exception down to Connection#updateCachedLocation, so we could check there if the exception is "meta-clearing" or not.
17783 on branch-1, branch-1.2 and branch 1.3 we now check if the exception is meta-clearing or not in AsyncProcess (this check was there on master, but not on earlier branches)
17788 * [HBASE-15376](https://issues.apache.org/jira/browse/HBASE-15376) | *Major* | **ScanNext metric is size-based while every other per-operation metric is time based**
17790 Removed ScanNext histogram metrics as regionserver level and per-region level metrics since the semantics is not compatible with other similar metrics (size histogram vs latency histogram). 
17792 Instead, this patch adds ScanTime and ScanSize histogram metrics at the regionserver and per-region level.
17797 * [HBASE-15338](https://issues.apache.org/jira/browse/HBASE-15338) | *Minor* | **Add a option to disable the data block cache for testing the performance of underlying file system**
17799 Add a new config: hbase.block.data.cacheonread, which is a global switch for caching data blocks on read. The default value of this switch is true, and data blocks will be cached on read if the block cache is enabled for the family and cacheBlocks flag is set to be true for get and scan operations. If this global switch is set to false, data blocks won't be cached even if the block cache is enabled for the family and the cacheBlocks flag of Gets or Scans are sets as true. Bloom blocks and index blocks are always be cached if the block cache of the regionserver is enabled. One usage of this switch is for the performance tests for the extreme case that  the cache for data blocks all missed and all data blocks are read from underlying file system.
17804 * [HBASE-15136](https://issues.apache.org/jira/browse/HBASE-15136) | *Critical* | **Explore different queuing behaviors while busy**
17806 Previously RPC request scheduler in HBase had 2 modes in could operate in:
17808  - simple FIFO
17809  - "partial" deadline, where deadline constraints are only imposed on long-running scan requests.
17811 This patch adds new type of scheduler to HBase, based on the research around controlled delay (CoDel) algorithm [1], used in networking to combat bufferbloat, as well as some analysis on generalizing it to generic request queues [2]. The purpose of that work is to prevent long standing call queues caused by discrepancy between request rate and available throughput, caused by kernel/disk IO/networking stalls.
17813 New RPC scheduler could be enabled by setting hbase.ipc.server.callqueue.type=codel in configuration. Several additional params allow to configure algorithm behavior - 
17815 hbase.ipc.server.callqueue.codel.target.delay
17816 hbase.ipc.server.callqueue.codel.interval
17817 hbase.ipc.server.callqueue.codel.lifo.threshold
17819 [1] Controlling Queue Delay / A modern AQM is just one piece of the solution to bufferbloat. http://queue.acm.org/detail.cfm?id=2209336
17820 [2] Fail at Scale / Reliability in the face of rapid change. http://queue.acm.org/detail.cfm?id=2839461
17825 * [HBASE-15181](https://issues.apache.org/jira/browse/HBASE-15181) | *Major* | **A simple implementation of date based tiered compaction**
17827 Date tiered compaction policy is a date-aware store file layout that is beneficial for time-range scans for time-series data.
17829 When it performs well:
17831     reads for limited time ranges, especially scans of recent data
17833 When it doesn't perform as well:
17835     random gets without a time range
17836     frequent deletes and updates
17837     out of order data writes, especially writes with timestamps in the future
17838     bulk loads of historical data
17840 Recommended configuration:
17841 To turn on Date Tiered Compaction (It is not recommended to turn on for the whole cluster because that will put meta table on it too and random get on meta table will be impacted):
17842 hbase.hstore.compaction.compaction.policy: org.apache.hadoop.hbase.regionserver.compactions.DateTieredCompactionPolicy
17844 Parameters for Date Tiered Compaction:
17845 hbase.hstore.compaction.date.tiered.max.storefile.age.millis: Files with max-timestamp smaller than this will no longer be compacted.Default at Long.MAX\_VALUE.
17846 hbase.hstore.compaction.date.tiered.base.window.millis: base window size in milliseconds. Default at 6 hours.
17847 hbase.hstore.compaction.date.tiered.windows.per.tier: number of windows per tier. Default at 4.
17848 hbase.hstore.compaction.date.tiered.incoming.window.min: minimal number of files to compact in the incoming window. Set it to expected number of files in the window to avoid wasteful compaction. Default at 6.
17849 hbase.hstore.compaction.date.tiered.window.policy.class: the policy to select store files within the same time window. It doesn’t apply to the incoming window. Default at exploring compaction. This is to avoid wasteful compaction.
17851 With tiered compaction all servers in the cluster will promote windows to higher tier at the same time, so using a compaction throttle is recommended:
17852 hbase.regionserver.throughput.controller:org.apache.hadoop.hbase.regionserver.compactions.PressureAwareCompactionThroughputController
17854 Because there will most likely be more store files around, we need to adjust the configuration so that flush won't be blocked and compaction will be properly throttled:
17855 hbase.hstore.blockingStoreFiles: change to 50 if using all default parameters when turning on date tiered compaction. Use 1.5~2 x projected file count if changing the parameters, Projected file count = windows per tier x tier count + incoming window min + files older than max age
17857 For more details, please refer to the design spec at https://docs.google.com/document/d/1\_AmlNb2N8Us1xICsTeGDLKIqL6T-oHoRLZ323MG\_uy8/edit#
17862 * [HBASE-15290](https://issues.apache.org/jira/browse/HBASE-15290) | *Major* | **Hbase Rest CheckAndAPI should save other cells along with compared cell**
17864 Fixed an issue in REST server checkAndPut operation where the remaining cells other than the to-be-checked column are also applied in the put operation .
17869 * [HBASE-15264](https://issues.apache.org/jira/browse/HBASE-15264) | *Major* | **Implement a fan out HDFS OutputStream**
17871 Implement a fan-out asynchronous DFSOutputStream for implementing new WAL writer.
17876 * [HBASE-13259](https://issues.apache.org/jira/browse/HBASE-13259) | *Critical* | **mmap() based BucketCache IOEngine**
17878 mmap() based bucket cache can be configured by specifying the property
17879 {code}
17880 \<property\>
17881   \<name\>hbase.bucketcache.ioengine\</name\>
17882   \<value\> mmap://filepath \</value\>
17883 \</property\>
17884 {code}
17885 This mode of bucket cache is ideal when your file based bucket cache size is lesser than then available RAM. When the cache is bigger than the available RAM then the kernel page faults will make this cache perform lesser particularly in case of scans.
17890 * [HBASE-11927](https://issues.apache.org/jira/browse/HBASE-11927) | *Major* | **Use Native Hadoop Library for HFile checksum (And flip default from CRC32 to CRC32C)**
17892 Checksumming is cpu intensive. HBase computes additional checksums for HFiles (hdfs does checksums too) and stores them inline with file data. During reading, these checksums are verified to ensure data is not corrupted. This patch tries to use Hadoop Native Library for checksum computation, if it’s available, otherwise falls back to standard Java libraries. Instructions to load NHL in HBase can be found here (http://hbase.apache.org/book.html#hadoop.native.lib).
17894 Default checksum algorithm has been changed from CRC32 to CRC32C primarily because of two reasons: 1) CRC32C has better error detection properties, and 2) New Intel processors have a dedicated instruction for crc32c computation (SSE4.2 instruction set)\*. This change is fully backward compatible. Also, users should not see any differences except decrease in cpu usage. To keep old settings, set configuration ‘hbase.hstore.checksum.algorithm’ to ‘CRC32’.
17896 \* On linux, run 'cat /proc/cpuinfo’ and look for sse4\_2 in list of flags to see if your processor supports SSE4.2.
17901 * [HBASE-15219](https://issues.apache.org/jira/browse/HBASE-15219) | *Critical* | **Canary tool does not return non-zero exit code when one of regions is in stuck state**
17903 A new flag is added for Canary tool: -treatFailureAsError
17904 When this flag is specified, read / write failure would result in Canary tool exit code of 5.
17909 * [HBASE-14949](https://issues.apache.org/jira/browse/HBASE-14949) | *Major* | **Resolve name conflict when splitting if there are duplicated WAL entries**
17911 Now we can write duplicated WAL entries into different WAL files. This feature is required by the replication consistency fix and new implementation of WAL writer.
17916 * [HBASE-15100](https://issues.apache.org/jira/browse/HBASE-15100) | *Blocker* | **Master WALProcs still never clean up**
17918 The constructor for o.a.h.hbase.ProcedureInfo was mistakenly labeled IA.Public in previous releases and has now changed to IA.Private. Downstream users are safe to consume ProcedureInfo objects returned from HBase public interfaces, but should not expect to be able to reliably create new instances themselves.
17920 The method ProcedureInfo.setNonceKey has been removed, because it should not have been exposed to clients.
17925 * [HBASE-14355](https://issues.apache.org/jira/browse/HBASE-14355) | *Major* | **Scan different TimeRange for each column family**
17927 Adds being able to Scan each column family with a different time range. Adds new methods setColumnFamilyTimeRange and getColumnFamilyTimeRange to Scan.
17932 * [HBASE-14460](https://issues.apache.org/jira/browse/HBASE-14460) | *Critical* | **[Perf Regression] Merge of MVCC and SequenceId (HBASE-8763) slowed Increments, CheckAndPuts, batch operations**
17934 This release note tries to tell the general story. Dive into sub-tasks for more specific release noting.
17936 Increments, appends, checkAnd\* have been slow since hbase-.1.0.0. The unification of mvcc and sequence id done by HBASE-8763 was responsible.
17938 A ‘fast-path’ workaround was added by HBASE-15031 “Fix merge of MVCC and SequenceID performance regression in branch-1.0 for Increments”. It became available in 1.0.3 and 1.1.3. To enable the fast path, set "hbase.increment.fast.but.narrow.consistency" and then rolling restart. The workaround was for increments only (appends, checkAndPut, etc., were not addressed. See HBASE-15031 release note for more detail).
17940 Subsequently, the regression was properly identified and fixed in HBASE-15213 and the fix applied to branch-1.0 and branch-1.1. As it happens, hbase-1.2.0 does not suffer from the performance regression (though the thought was that it did -- and so it got the fast-path patch too via HBASE-15092) nor does the master branch. HBASE-15213 identified that HBASE-12751 (as a side effect) had cured the regression.
17942 hbase-1.0.4 (if it is ever released -- 1.0 has been end-of-lifed) and hbase-1.1.4 will have the HBASE-15213 fix.  If you are suffering from the increment regression and you are on 1.0.3 or 1.1.3, you can enable the work around to get back your increment performance but you should upgrade.
17947 * [HBASE-15046](https://issues.apache.org/jira/browse/HBASE-15046) | *Major* | **Perf test doing all mutation steps under row lock**
17949 In here we perf tested a realignment of the write pipeline and mvcc handling.  Thought was that this work was a predicate for a general fix of HBASE-14460 (turns out, realignment of write path was not needed to fix the increment perf regression). The perf testing here made it so we were able to simplify writing. HBASE-15158 was just committed. This work is done.
17954 * [HBASE-15158](https://issues.apache.org/jira/browse/HBASE-15158) | *Major* | **Change order in which we do write pipeline operations; do all under row locks!**
17956 Changed the write pipeline order; made it more rational, easier-to-reason-about doing all updates to WA, MemStore, and mvcc while read/write rowlock is held where before we'd release after WAL append and then do sync and mvcc.
17961 * [HBASE-15157](https://issues.apache.org/jira/browse/HBASE-15157) | *Major* | **Add \*PerformanceTest for Append, CheckAnd\***
17963 Add append, increment, checkAndMutate, checkAndPut, and checkAndDelete tests to PerformanceEvaluation tool. Below are excerpts from new usage from PE:
17965 ....
17966 Command:
17967  append          Append on each row; clients overlap on keyspace so some concurrent operations
17968  checkAndDelete  CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations
17969  checkAndMutate  CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations
17970  checkAndPut     CheckAndPut on each row; clients overlap on keyspace so some concurrent operations
17971  filterScan      Run scan test using a filter to find a specific row based on it's value (make sure to use --rows=20)
17972  increment       Increment on each row; clients overlap on keyspace so some concurrent operations
17973  randomRead      Run random read test
17974 ....
17975 Examples:
17977  To run 10 clients doing increments over ten rows:
17978  $ bin/hbase org.apache.hadoop.hbase.PerformanceEvaluation --rows=10 --nomapred increment 10
17980 Removed IncrementPerformanceTest. It is not as configurable as the additions made here.
17985 * [HBASE-15218](https://issues.apache.org/jira/browse/HBASE-15218) | *Blocker* | **On RS crash and replay of WAL, loosing all Tags in Cells**
17987 This issue fixes 
17988 - In case of normal WAL (Not encrypted) we were loosing all cell tags on WAL replay after an RS crash
17989 - In case of encrypted WAL we were not even persisting Cell tags in WAL.  Tags from all unflushed (to HFile) Cells will get lost even after WAL replay recovery is done.
17991 As we use tags for Cell level security, this fixes 2 security issues
17992  - Cell level visibility labels security breach . Making a visibility restricted cell global readable
17993  - Cell level ACL availability issue.  A user who is cell level authorized to read this cell can not read it. It is a data loss for him.
17998 * [HBASE-15129](https://issues.apache.org/jira/browse/HBASE-15129) | *Major* | **Set default value for hbase.fs.tmp.dir rather than fully depend on hbase-default.xml**
18000 Before HBASE-15129, if somehow hbase-default.xml is not on classpath, default values for hbase.fs.tmp.dir and hbase.bulkload.staging.dir are left empty. After HBASE-15129,  default values of both properties are set to "/user/\<user.name\>/hbase-staging".
18005 * [HBASE-14969](https://issues.apache.org/jira/browse/HBASE-14969) | *Major* | **Add throughput controller for flush**
18007 Adds means of throttling flush throughput. By default there is no limit; we use NoLimitThroughputController. An alternative controller, PressureAwareFlushThroughputController, allows specifying throughput bounds. A new simple factor, flush pressure, influences throughput. See PressureAwareFlushThroughputController.java class for detail.
18012 * [HBASE-11425](https://issues.apache.org/jira/browse/HBASE-11425) | *Major* | **Cell/DBB end-to-end on the read-path**
18014 For E2E off heaped read path, first of all there should be an off heap backed BucketCache(BC). Configure 'hbase.bucketcache.ioengine' to offheap in hbase-site.xml. Also specify the total capacity of the BC using hbase.bucketcache.size config.  Please remember to adjust value of 'HBASE\_OFFHEAPSIZE' in hbase-env.sh as per this capacity. Here-by we specify the max possible off-heap memory allocation for the RS java process. So this should be bigger than the off-heap BC size. Please keep in mind that there is no default for hbase.bucketcache.ioengine which means the BC is turned OFF by default.
18016 Next thing to tune is the ByteBuffer pool in the RPC server side. The buffers from this pool will be used to accumulate the cell bytes and create a result cell block to send back to the client side. 'hbase.ipc.server.reservoir.enabled' can be used to turn this pool ON or OFF. By default this pool is ON and available. HBase will create off heap ByteBuffers and pool them. Please make sure not to turn this OFF if you want E2E off heaping in read path. If this pool is turned off, the server will create temp buffers on heap to accumulate the cell bytes and make a result cell block. This can impact the GC on a highly read loaded server.  The user can tune this pool with respect to how many buffers are in the pool and what should be the size of each ByteBuffer.
18017 Use the config 'hbase.ipc.server.reservoir.initial.buffer.size' to tune each of the buffer sizes. Defaults is 64 KB.
18019 When the read pattern is a random row read and each of the rows are smaller in size compared to this 64 KB, try reducing this. When the result size is larger than one ByteBuffer size, the server will try to grab more than one buffer and make a result cell block out of these.  When the pool is running out of buffers, the server will end up creating temporary on-heap buffers.
18021 The maximum number of ByteBuffers in the pool can be tuned using the config 'hbase.ipc.server.reservoir.initial.max'. Its value defaults to 64 \* region server handlers configured (See the config 'hbase.regionserver.handler.count'). The math is such that by default we consider 2 MB as the result cell block size per read result and each handler will be handling a read. For 2 MB size, we need 32 buffers each of size 64 KB (See default buffer size in pool).  So per handler 32 ByteBuffers(BB). We allocate twice this size as the max BBs count such that one handler can be creating the response and handing it to the RPC Responder thread and then handling a new request creating a new response cell block (using pooled buffers). Even if the responder could not send back the first TCP reply immediately, our count should allow that we should still have enough buffers in our pool without having to make temporary buffers on the heap.  Again for smaller sized random row reads, tune this max count. There are lazily created buffers and the count is the max count to be pooled.
18023 The setting for HBASE\_OFFHEAPSIZE in hbase-env.sh should consider this off heap buffer pool at the RPC side also.  We need to config this max off heap size for RS as a bit higher than the sum of this max pool size and the off heap cache size. The TCP layer will also need to create direct bytebuffers for TCP communication. Also the DFS client will need some off-heap to do its workings especially if short-circuit reads are configured. Allocating an extra of 1 - 2 GB for the max direct memory size has worked in tests.
18025 If you still see GC issues even after making E2E read path off heap, look for issues in the appropriate buffer pool. Check the below RS log with INFO level:
18027   "Pool already reached its max capacity : XXX and no free buffers now. Consider increasing the value for 'hbase.ipc.server.reservoir.initial.max' ?"
18029 If you are using co processors and refer the Cells in the read results, DO NOT store reference to these Cells out of the scope of the CP hook methods. Some times the CPs need store info about the cell (Like its row key) for considering in the next CP hook call etc. For such cases, pls clone the required fields of the entire Cell as per the use cases.  [ See CellUtil#cloneXXX(Cell) APIs ]
18034 * [HBASE-15145](https://issues.apache.org/jira/browse/HBASE-15145) | *Major* | **HBCK and Replication should authenticate to zookepeer using server principal**
18036 Added a new command line argument: --auth-as-server to enable authenticating to ZooKeeper as the HBase Server principal. This is required for secure clusters for doing replication operations like add\_peer, list\_peers, etc until HBASE-11392 is fixed. This advanced option can also be used for manually fixing secure znodes. 
18038 Commands can now be invoked like: 
18039 hbase --auth-as-server shell 
18040 hbase --auth-as-server zkcli 
18042 HBCK in secure setup also needs to authenticate to ZK using servers principals.This is turned on by default (no need to pass additional argument). 
18044 When authenticating as server, HBASE\_SERVER\_JAAS\_OPTS is concatenated to HBASE\_OPTS if defined in hbase-env.sh. Otherwise, HBASE\_REGIONSERVER\_OPTS is concatenated.
18049 * [HBASE-15125](https://issues.apache.org/jira/browse/HBASE-15125) | *Major* | **HBaseFsck's adoptHdfsOrphan function creates region with wrong end key boundary**
18051 **WARNING: No release note provided for this change.**
18056 * [HBASE-13082](https://issues.apache.org/jira/browse/HBASE-13082) | *Major* | **Coarsen StoreScanner locks to RegionScanner**
18058 After this JIRA we will not be doing any scanner reset after compaction during a course of a scan. The files that were compacted will still be continued to be used in the scan process. The compacted files will be archived by a background thread that runs every 2 mins by default only when there are no active scanners on those comapcted files. The above duration can be controlled using the knob 'hbase.hfile.compactions.cleaner.interval'.
18063 * [HBASE-14865](https://issues.apache.org/jira/browse/HBASE-14865) | *Major* | **Support passing multiple QOPs to SaslClient/Server via hbase.rpc.protection**
18065 With this patch, hbase.rpc.protection can now take multiple comma-separate QOP values. Accepted QOP values remain unchanged and are 'authentication', 'integrity', and 'privacy'. Server or client can use this configuration to specify their preference (in decreasing order) while negotiating QOP.
18066 This feature can be used to upgrade or downgrade QOP in an online cluster without compromising availability (i.e. taking cluster offline). For e.g. to change qop from A to B, typical steps would be:
18067 "A" --\> "B,A" --\> rolling restart --\> "B" --\> rolling restart
18069 Sidenote: Based on experimentation, server's choice is given higher preference than client's choice. i.e. if server's choices are "A,B,C" and client's choices are "B,C,A", both A and B are acceptable, but A is chosen.
18074 * [HBASE-15098](https://issues.apache.org/jira/browse/HBASE-15098) | *Blocker* | **Normalizer switch in configuration is not used**
18076 The config parameter, hbase.normalizer.enabled, has been dropped since it is not used in the code base.
18081 * [HBASE-15111](https://issues.apache.org/jira/browse/HBASE-15111) | *Trivial* | **"hbase version" should write to stdout**
18083 The \`hbase version\` command now outputs directly to stdout rather than to a logger. This change allows the version information to be output consistently regardless of logger configuration. Naturally, this also means the command output ignores all logger configuration. Furthermore, the move from loggers to direct output changes the output of the command to omit metadata commonly included in logger ouput such as a timestamp, log level, and logger name.
18088 * [HBASE-15027](https://issues.apache.org/jira/browse/HBASE-15027) | *Major* | **Refactor the way the CompactedHFileDischarger threads are created**
18090 The property 'hbase.hfile.compactions.discharger.interval' has been renamed to 'hbase.hfile.compaction.discharger.interval' that describes the interval after which the compaction discharger chore service should run.
18091 The property 'hbase.hfile.compaction.discharger.thread.count' describes the thread count that does the compaction discharge work. 
18092 The CompactedHFilesDischarger is a chore service now started as part of the RegionServer and this chore service iterates over all the onlineRegions in that RS and uses the RegionServer's executor service to launch a set of threads that does this job of compaction files clean up.
18097 * [HBASE-14468](https://issues.apache.org/jira/browse/HBASE-14468) | *Major* | **Compaction improvements: FIFO compaction policy**
18099 FIFO compaction policy selects only files which have all cells expired. The column family MUST have non-default TTL. 
18100 Essentially, FIFO compactor does only one job: collects expired store files. 
18102 Because we do not do any real compaction, we do not use CPU and IO (disk and network), we do not evict hot data from a block cache. The result: improved throughput and latency both write and read.
18103 See: https://github.com/facebook/rocksdb/wiki/FIFO-compaction-style
18108 * [HBASE-14888](https://issues.apache.org/jira/browse/HBASE-14888) | *Major* | **ClusterSchema: Add Namespace Operations**
18110 This patch changes the semantic around namespace create/delete/modify when coprocessor asks that the invocation be by-passed. Previous the by-pass was done silently -- the method would just return with no indication as to whether by-pass route had been taken or not.  This patch adds throwing of a BypassCoprocessorException which is thrown if we have been asked to bypass a call.
18112 The bypass facility has been in place since hbase 1.0.0 when namespace creation/deletion, etc.., was originally added in HBASE-8408 (HBASE-15071 is about addressing bypass handling in a general way)
18117 * [HBASE-15018](https://issues.apache.org/jira/browse/HBASE-15018) | *Major* | **Inconsistent way of handling TimeoutException in the rpc client implementations**
18119 When using the new AsyncRpcClient introduced in HBase 1.1.0 (HBASE-12684), time outs now result in an IOException wrapped around a CallTimeoutException instead of a bare CallTimeoutException. This change makes the AsyncRpcClient behave the same as the default HBase 1.y RPC client implementation.
18124 * [HBASE-14796](https://issues.apache.org/jira/browse/HBASE-14796) | *Minor* | **Enhance the Gets in the connector**
18126 spark.hbase.bulkGetSize  in HBaseSparkConf is for grouping bulkGet, and default value is 1000.
18131 * [HBASE-14976](https://issues.apache.org/jira/browse/HBASE-14976) | *Minor* | **Add RPC call queues to the web ui**
18133 Adds column displaying current aggregated call queues size in region server queues tab UI.
18138 * [HBASE-14822](https://issues.apache.org/jira/browse/HBASE-14822) | *Major* | **Renewing leases of scanners doesn't work**
18140 And 1.1, 1.0, and 0.98.
18145 * [HBASE-14205](https://issues.apache.org/jira/browse/HBASE-14205) | *Critical* | **RegionCoprocessorHost System.nanoTime() performance bottleneck**
18147 **WARNING: No release note provided for this change.**
18152 * [HBASE-14978](https://issues.apache.org/jira/browse/HBASE-14978) | *Blocker* | **Don't allow Multi to retain too many blocks**
18154 Limiting the amount of memory resident for any one request allows the server to handle concurrent requests smoothly. To this end we added the ability to limit the size of responses to a multi request. That worked well however it correctly represent the amount of memory resident. So this issue adds on a an approximation of the number of blocks held for a request.
18156 All clients before 1.2.0 will not get this multi request chunking based upon blocks kept. All clients 1.2.0 and after will.
18161 * [HBASE-14951](https://issues.apache.org/jira/browse/HBASE-14951) | *Minor* | **Make hbase.regionserver.maxlogs obsolete**
18163 Rolling WAL events across a cluster can be highly correlated, hence flushing memstores, hence triggering minor compactions, that can be promoted to major ones. These events are highly correlated in time if there is a balanced write-load on the regions in a table. Default value for maximum WAL files (\* hbase.regionserver.maxlogs\*), which controls WAL rolling events - 32 is too small for many modern deployments. 
18164 Now we calculate this value dynamically (if not defined by user), using the following formula:
18166 maxLogs = Math.max( 32, HBASE\_HEAP\_SIZE \* memstoreRatio \* 2/ LogRollSize), where
18168 memstoreRatio is \*hbase.regionserver.global.memstore.size\*
18169 LogRollSize is maximum WAL file size (default 0.95 \* HDFS block size)
18171 We need to make sure that we avoid fully or minimize events when RS has to flush memstores prematurely only because it reached artificial limit of hbase.regionserver.maxlogs, this is why we put this 2 x multiplier in equation, this gives us maximum WAL capacity of 2 x RS memstore-size. 
18173 Runaway WAL files.
18175 The default log rolling period (1h) allows to accumulate up to 2 X Memstore Size data in a WAL. For heap size - 32G and all other default setting, this gives ~ 26GB of data. Under heavy write load, the number of WAL files can increase dramatically. RegionServer LogRoller will be archiving old WALs periodically. User has three options, either override default hbase.regionserver.maxlogs or override default hbase.regionserver.logroll.period (decrease), or both to control runaway WALs.
18177 For system with bursty write load,  the hbase.regionserver.logroll.period can be decreased to lower value. In this case the maximum number of wal files will be defined by the total size of memstore (unflushed data), not by the hbase.regionserver.maxlogs. But for majority of applications there will be no issues with defaults. Data will be flushed periodically from memstore, the LogRoller will archive old wal files and the system will never reach the new defaults for hbase.regionserver.maxlogs, unless the system is under extreme load for prolonged period of time, but in this case, decreasing hbase.regionserver.logroll.period allows us to control runaway wal files.
18179 The following table gives the new default maximum log files values for several different Region Server heap sizes:
18181 heap    memstore perc   maxLogs
18182 1G              40%                             32
18183 2G              40%                             32
18184 10G             40%                             80
18185 20G             40%                             160
18186 32G             40%                             256
18191 * [HBASE-14984](https://issues.apache.org/jira/browse/HBASE-14984) | *Major* | **Allow memcached block cache to set optimze to false**
18193 Setting hbase.cache.memcached.spy.optimze to true will allow the spy memcached client to try and optimize for the number of requests outstanding. This can increase throughput but can also increase variance for request times.
18195 Setting it to true will help when round trip times are longer.
18196 Setting it to false ( the default ) will help ensure a more even distribution of response times.
18201 * [HBASE-14534](https://issues.apache.org/jira/browse/HBASE-14534) | *Minor* | **Bump yammer/coda/dropwizard metrics dependency version**
18203 Updated yammer metrics to version 3.1.2 (now it's been renamed to dropwizard). API has changed quite a bit, consult https://dropwizard.github.io/metrics/3.1.0/manual/core/ for additional information. 
18205 Note that among other things, in yammer 2.2.0 histograms were by default created in non-biased mode (uniform sampling), while in 3.1.0 histograms created via MetricsRegistry.histogram(...) are by default exponentially decayed. This shouldn't affect end users, though.
18210 * [HBASE-14960](https://issues.apache.org/jira/browse/HBASE-14960) | *Major* | **Fallback to using default RPCControllerFactory if class cannot be loaded**
18212 If the configured RPC controller factory (via hbase.rpc.controllerfactory.class) cannot be found in the classpath or loaded, we fall back to using the default RPC controller factory in HBase.
18217 * [HBASE-14946](https://issues.apache.org/jira/browse/HBASE-14946) | *Critical* | **Don't allow multi's to over run the max result size.**
18219 The HBase region server will now send a chunk of get responses to a client if the total response size is too large. This will only be done for clients 1.2.0 and beyond. Older clients by default will have the old behavior.
18221 This patch is for the case where the basic flow is like this:
18223 I want to get a single column from lots of rows. So I create a list of gets. Then I send them to table.get(List\<Get\>). If the regions for that table are spread out then those requests get chunked out to all the region servers. No one regionserver gets too many. However if one region server contains lots of regions for that table then a multi action can contain lots of gets. No single get is too onerous. However the regionserver won't return until every get is complete. So if there are thousands of gets that are sent in one multi then the regionserver can retain lots of data in one thread.
18228 * [HBASE-14906](https://issues.apache.org/jira/browse/HBASE-14906) | *Major* | **Improvements on FlushLargeStoresPolicy**
18230 In HBASE-14906 we use "hbase.hregion.memstore.flush.size/column\_family\_number" as the default threshold for memstore flush instead of the fixed value through "hbase.hregion.percolumnfamilyflush.size.lower.bound" property, which makes  the default threshold more flexible to various use case. We also introduce a new property in name of "hbase.hregion.percolumnfamilyflush.size.lower.bound.min" with 16M as the default value to avoid small flush in cases like hundreds of column families.
18232 After this change setting "hbase.hregion.percolumnfamilyflush.size.lower.bound" in hbase-site.xml won't take effect anymore, but expert users could still set this property in table descriptor to override the default value just as before
18237 * [HBASE-14769](https://issues.apache.org/jira/browse/HBASE-14769) | *Major* | **Remove unused functions and duplicate javadocs from HBaseAdmin**
18239 - Removes functions from HBaseAdmin which require table name parameter as either byte[] or String. Use their counterparts which take TableName instead.
18240 - Removes redundant javadocs from HBaseAdmin as they will be automatically inherited from Admin interface.
18241 - HBaseAdmin is marked Audience.private so it should have been straight forward okay to remove the functions. But HBaseTestingUtility, which is marked Audience.public had a public function returning its instance, which moved this decision into gray area. Discussing in the community, it was decided that it would be okay to do so in this particular case.
18246 * [HBASE-13153](https://issues.apache.org/jira/browse/HBASE-13153) | *Major* | **Bulk Loaded HFile Replication**
18248 This enhances the HBase replication to support replication of bulk loaded data. This is configurable, by default it is set to false which means it will not replicate the bulk loaded data to its peer(s). To enable it set "hbase.replication.bulkload.enabled" to true.
18250 Following are the additional configurations added for this enhancement,
18251  a. hbase.replication.cluster.id - This is manadatory to configure in cluster where replication for bulk loaded data is enabled. A source cluster is uniquely identified by sink cluster using this id. This should be configured in the source cluster configuration file for all the RS.
18252  b. hbase.replication.conf.dir - This represents the directory where all the active cluster's file system client configurations are defined in subfolders corresponding to their respective replication cluster id in peer cluster. This should be configured in the peer cluster configuration file for all the RS. Default is HBASE\_CONF\_DIR.
18253  c. hbase.replication.source.fs.conf.provider - This represents the class which provides the source cluster file system client configuration to peer cluster. This should be configured in the peer cluster configuration file for all the RS. Default is org.apache.hadoop.hbase.replication.regionserver.DefaultSourceFSConfigurationProvider
18255  For example: If source cluster FS client configurations are copied in peer cluster under directory /home/user/dc1/ then  hbase.replication.cluster.id should be configured as dc1 and hbase.replication.conf.dir as /home/user
18257 Note: 
18258  a. Any modification to source cluster FS client configuration files in peer cluster side replication configuration directory then it needs to restart all its peer(s) cluster RS with default hbase.replication.source.fs.conf.provider.
18259  b. Only 'xml' type files will be loaded by the default hbase.replication.source.fs.conf.provider.
18261 As part of this we have made following changes to LoadIncrementalHFiles class which is marked as Public and Stable class,
18262  a. Raised the visibility scope of LoadQueueItem class from package private to public.
18263  b. Added a new method loadHFileQueue, which loads the queue of LoadQueueItem into the table as per the region keys provided.
18268 * [HBASE-7171](https://issues.apache.org/jira/browse/HBASE-7171) | *Major* | **Initial web UI for region/memstore/storefiles details**
18270 HBASE-7171 adds 2 new pages to the region server Web UI to ease debugging and provide greater insight into the physical data layout.
18272 Region names in UI table listing all regions (on the RS status page) are now hyperlinks leading to region detail page which shows some aggregate memstore information (currently just memory used) along with the list of all Store Files (HFiles) in the region. Names of Store Files are also hyperlinks leading to Store File detail page, which currently runs 'hbase hfile' command behind the scene and displays statistics about store file.
18277 * [HBASE-14655](https://issues.apache.org/jira/browse/HBASE-14655) | *Blocker* | **Narrow the scope of doAs() calls to region observer notifications for compaction**
18279 Region observer notifications w.r.t. compaction request are now audited with request user through proper scope of doAs() calls.
18284 * [HBASE-14631](https://issues.apache.org/jira/browse/HBASE-14631) | *Blocker* | **Region merge request should be audited with request user through proper scope of doAs() calls to region observer notifications**
18286 Region observer notifications w.r.t. merge request are now audited with request user through proper scope of doAs() calls.
18291 * [HBASE-14605](https://issues.apache.org/jira/browse/HBASE-14605) | *Blocker* | **Split fails due to 'No valid credentials' error when SecureBulkLoadEndpoint#start tries to access hdfs**
18293 When split is requested by non-super user, split related notifications for Coprocessor are executed using the login of the request user.
18294 Previously the notifications were carried out as super user.
18299 * [HBASE-14926](https://issues.apache.org/jira/browse/HBASE-14926) | *Major* | **Hung ThriftServer; no timeout on read from client; if client crashes, worker thread gets stuck reading**
18301 Adds a timeout to server read from clients. Adds new configs hbase.thrift.server.socket.read.timeout for setting read timeout on server socket in milliseconds. Default is 60000;
18306 * [HBASE-14825](https://issues.apache.org/jira/browse/HBASE-14825) | *Minor* | **HBase Ref Guide corrections of typos/misspellings**
18308 Corrections to content of "book.html", which is pulled from various \*.adoc files and \*.xml files.
18309 -- corrects typos/misspellings
18310 -- corrects incorrectly formatted links
18315 * [HBASE-14821](https://issues.apache.org/jira/browse/HBASE-14821) | *Major* | **CopyTable should allow overriding more config properties for peer cluster**
18317 Configuration properties for org.apache.hadoop.hbase.mapreduce.TableOutputFormat can now be overridden by prefixing the property keys with "hbase.mapred.output.".  When the configuration is applied to TableOutputFormat, these entries will be rewritten with the prefix removed -- ie. "hbase.mapred.output.hbase.security.authentication" becomes "hbase.security.authentication".  This can be useful when directing output to a peer cluster with different security configuration, for example.
18322 * [HBASE-14799](https://issues.apache.org/jira/browse/HBASE-14799) | *Critical* | **Commons-collections object deserialization remote command execution vulnerability**
18324 This issue resolves a potential security vulnerability. For all versions we update our commons-collections dependency to the release that fixes the reported vulnerability in that library. In 0.98 we additionally disable by default a feature of code carried from 0.94 for backwards compatibility that is not needed.
18329 * [HBASE-12751](https://issues.apache.org/jira/browse/HBASE-12751) | *Major* | **Allow RowLock to be reader writer**
18331 Locks on row are now reader/writer rather than exclusive.
18333 Moves sequenceid out of HRegion and into MVCC class; MVCC is now in charge. A WAL append is still stamped in same way (we pass MVCC context in a few places where we previously we did not).
18335 MVCC methods cleaned up. Make a bit more sense now. Less of them.
18337 Simplifies our update of MemStore/WAL. Now we update memstore AFTER we add to WAL (but before we sync). This fixes possible dataloss when two edits came in with same coordinates; we could order the edits in memstore differently to how they arrived in the WAL.
18339 Marked as an incompatible change because it breaks Distributed Log Replay, a feature we'd determined already was unreliable and to be removed.
18344 * [HBASE-14793](https://issues.apache.org/jira/browse/HBASE-14793) | *Major* | **Allow limiting size of block into L1 block cache.**
18346 Very large blocks can fragment the heap and cause bad issues for the garbage collector, especially the G1GC. Now there is a maximum size that a block can be and still stick in the LruBlockCache. That size defaults to 16mb but can be controlled by changing "hbase.lru.max.block.size"
18351 * [HBASE-14387](https://issues.apache.org/jira/browse/HBASE-14387) | *Major* | **Compaction improvements: Maximum off-peak compaction size**
18353 New configuration option: hbase.hstore.compaction.max.size.offpeak - maximum selection size eligible for minor compaction during off peak hours.
18354 hbase.hstore.compaction.max.size - this is default maximum if no off-peak hours are defined or if no maximum off-peak maximum size is defined.
18359 * [HBASE-12822](https://issues.apache.org/jira/browse/HBASE-12822) | *Minor* | **Option for Unloading regions through region\_mover.rb without Acknowledging**
18361 Incorporated in HBASE-13014.
18366 * [HBASE-14700](https://issues.apache.org/jira/browse/HBASE-14700) | *Major* | **Support a "permissive" mode for secure clusters to allow "simple" auth clients**
18368 Secure HBase now supports a permissive mode to allow mixed secure and insecure clients.  This allows clients to be incrementally migrated over to a secure configuration.  To enable clients to continue to connect using SIMPLE authentication when the cluster is configured for security, set "hbase.ipc.server.fallback-to-simple-auth-allowed" equal to "true" in hbase-site.xml.  NOTE: This setting should ONLY be used as a temporary measure while converting clients over to secure authentication.  It MUST BE DISABLED for secure operation.
18373 * [HBASE-14257](https://issues.apache.org/jira/browse/HBASE-14257) | *Major* | **Periodic flusher only handles hbase:meta, not other system tables**
18375 Memstore periodic flusher used to flush META table every 5 minutes but not any other system tables. This jira extends it to flush all system tables within this time period.
18380 * [HBASE-14658](https://issues.apache.org/jira/browse/HBASE-14658) | *Major* | **Allow loading a MonkeyFactory by class name**
18382 You can specify one of the predefined set of Monkeys when you run Integration Tests by passing the -m\|--monkey arguments on the command line; e.g -m CALM or -m SLOW\_DETERMINISTIC
18384 This patch  makes it so you can pass the name of a class as the monkey to run: e.g. -m org.example.KingKong
18389 * [HBASE-14521](https://issues.apache.org/jira/browse/HBASE-14521) | *Major* | **Unify the semantic of hbase.client.retries.number**
18391 After this change, hbase.client.reties.number universally means the number of retry which is one less than total tries number,  for both non-batch operations like get/scan/increment etc. which uses RpcRetryingCallerImpl#callWithRetries to submit the call or batch operations like put through AsyncProcess#submit.
18393 Note that previously this property means total tries number for puts, so please adjust the setting of its value if necessary. Please also be cautious when setting it to zero since retry is necessary for client cache update when region move happens.
18398 * [HBASE-13819](https://issues.apache.org/jira/browse/HBASE-13819) | *Major* | **Make RPC layer CellBlock buffer a DirectByteBuffer**
18400 For master branch(2.0 version), the BoundedByteBufferPool always create Direct (off heap) ByteBuffers and return that.
18401 For branch-1(1.3 version), byte default the buffers returned will be off heap. This can be changed to return on heap ByteBuffers by configuring 'hbase.ipc.server.reservoir.direct.buffer' to false.
18406 * [HBASE-14517](https://issues.apache.org/jira/browse/HBASE-14517) | *Minor* | **Show regionserver's version in master status page**
18408 Adds server version to the listing of regionservers on the master home page.
18410 if a cluster where the versions deviate, at the bottom of the 'Version' column on the master home page listing of 'Region Servers', you will see a note in red that says something like: 'Total:10              9 nodes with inconsistent version'
18415 * [HBASE-12911](https://issues.apache.org/jira/browse/HBASE-12911) | *Major* | **Client-side metrics**
18417 Introduces collection and reporting of various client-perceived metrics. Metrics are exposed via JMX under "org.apache.hadoop.hbase.client.MetricsConnection". Metrics are scoped according to connection instance, so multiple connection objects (ie, to different clusters) will report their metrics separately. Metrics are disabled by default, must be enabled by configuring "hbase.client.metrics.enable=true".
18422 * [HBASE-14529](https://issues.apache.org/jira/browse/HBASE-14529) | *Major* | **Respond to SIGHUP to reload config**
18424 HBase daemons can now be signaled to reload their config by sending SIGHUP to the java process. Not all config parameters can be reloaded.
18426 In order for this new feature to work the hbase-daemon.sh script was changed to use disown rather than nohup. Functionally this shouldn't change anything but the processes will have a different parent when being run from a connected login shell.
18431 * [HBASE-14502](https://issues.apache.org/jira/browse/HBASE-14502) | *Major* | **Purge use of jmock and remove as dependency**
18433 HBASE-14502 Purge use of jmock and remove as dependency
18438 * [HBASE-14544](https://issues.apache.org/jira/browse/HBASE-14544) | *Major* | **Allow HConnectionImpl to not refresh the dns on errors**
18440 By setting hbase.resolve.hostnames.on.failure to false you can reduce the number of dns name resolutions that a client will do. However if machines leave and come back with different ip's the changes will not be noticed by the clients. So only set hbase.resolve.hostnames.on.failure to false if your cluster dns is not changing while clients are connected.
18445 * [HBASE-14367](https://issues.apache.org/jira/browse/HBASE-14367) | *Major* | **Add normalization support to shell**
18447 This patch adds shell support for region normalizer (see HBASE-13103).
18449 3 commands have been added to hbase shell 'tools' command group (modeled on how the balancer works):
18451  - 'normalizer\_enabled' checks whether region normalizer is turned on
18452  - 'normalizer\_switch' allows user to turn normalizer on and off
18453  - 'normalize' runs region normalizer if it's turned on.
18455 Also 'alter' command has been extended to allow user to enable/disable region normalization per table (disabled by default). Use it as 
18457 alter 'testtable', {NORMALIZATION\_MODE =\> 'true'}
18459 Here is the help for the normalize command:
18461 {code}
18462 hbase(main):008:0\> help 'normalize'
18463 Trigger region normalizer for all tables which have NORMALIZATION\_MODE flag set. Returns true
18464  if normalizer ran successfully, false otherwise. Note that this command has no effect
18465  if region normalizer is disabled (make sure it's turned on using 'normalizer\_switch' command).
18467  Examples:
18469    hbase\> normalize
18470 {code}
18475 * [HBASE-14475](https://issues.apache.org/jira/browse/HBASE-14475) | *Major* | **Region split requests are always audited with "hbase" user rather than request user**
18477 Region observer notifications w.r.t. split request are now audited with request user through proper scope of doAs() calls.
18482 * [HBASE-14230](https://issues.apache.org/jira/browse/HBASE-14230) | *Minor* | **replace reflection in FSHlog with HdfsDataOutputStream#getCurrentBlockReplication()**
18484 Remove calling getNumCurrentReplicas on HdfsDataOutputStream via reflection. getNumCurrentReplicas showed up in hadoop 1+ and hadoop 0.2x. In hadoop-2 it was deprecated.
18489 * [HBASE-14495](https://issues.apache.org/jira/browse/HBASE-14495) | *Major* | **TestHRegion#testFlushCacheWhileScanning goes zombie**
18491 The WAL append was changed by HBASE-12751. Every append now sets a latch on an edit. The latch needs to be cleared or else the WAL will hang. The original failures in TestHRegion turned up 'holes' where we were failing to throw the latch if we skipped out early because we were interrupted. Other 'holes' were found where we had mocked up a WAL so the latch would just stay in place.  Futher holes were found appending WAL markers... here we were skipping the mvcc completely for a few edits.  A clean up of WALUtils made all markers take the same code paths.
18496 * [HBASE-14280](https://issues.apache.org/jira/browse/HBASE-14280) | *Minor* | **Bulk Upload from HA cluster to remote HA hbase cluster fails**
18498 Patch will effectively work with Hadoop version 2.6 or greater with a launch of "internal.nameservices".
18499 There will be no change in versions older than 2.6.
18504 * [HBASE-14334](https://issues.apache.org/jira/browse/HBASE-14334) | *Major* | **Move Memcached block cache in to it's own optional module.**
18506 Move external block cache to it's own module. This  will reduce dependencies for people who use hbase-server.
18507 Currently Memcached is the reference implementation for external block cache. External block caches allow HBase to take advantage of other more complex caches that can live longer than the HBase regionserver process and are not necessarily tied to a single computer
18508     life time. However external block caches add in extra operational overhead.
18513 * [HBASE-14433](https://issues.apache.org/jira/browse/HBASE-14433) | *Major* | **Set down the client executor core thread count from 256 in tests**
18515 Tests run with client executors that have core thread count of 4 and a keepalive of 3 seconds. They used to default to 256 core threads and 60 seconds  for keepalive.
18520 * [HBASE-14400](https://issues.apache.org/jira/browse/HBASE-14400) | *Critical* | **Fix HBase RPC protection documentation**
18522 To use rpc protection in HBase, set the value of 'hbase.rpc.protection' to:
18523 'authentication' : simple authentication using kerberos
18524 'integrity' : authentication and integrity
18525 'privacy' : authentication and confidentiality
18527 Earlier, HBase reference guide erroneously mentioned in some places to set the value to 'auth-conf'. This patch fixes the guide and adds temporary support for erroneously recommended values.
18532 * [HBASE-14306](https://issues.apache.org/jira/browse/HBASE-14306) | *Major* | **Refine RegionGroupingProvider: fix issues and make it more scalable**
18534 In HBASE-14306 we've changed default strategy of RegionGroupingProvider from "identify" to "bounded", so it's required to explicitly set "hbase.wal.regiongrouping.strategy" to "identify" if user still wants to use one WAL per region
18536 Please also notice that in the new framework there will be one WAL per group, and the region-group mapping is decided by RegionGroupingStrategy. Accordingly, we've removed BoundedRegionGroupingProvider and added BoundedRegionGroupingStrategy as a replacement. If you already have a customized class for hbase.wal.regiongrouping.strategy, please check the new logic and make updates if necessary.
18541 * [HBASE-6617](https://issues.apache.org/jira/browse/HBASE-6617) | *Major* | **ReplicationSourceManager should be able to track multiple WAL paths**
18543 ReplicationSourceManager now could track multiple wal paths. Notice that although most changes are internal and all metrics names remain the same, signature of below methods in MetricsSource are changed:
18545 1. refreshAgeOfLastShippedOp now requires a String parameter which indicates the wal group id of the reporter
18546 2. setAgeOfLastShippedOp also adds a String parameter for wal group id
18551 * [HBASE-14314](https://issues.apache.org/jira/browse/HBASE-14314) | *Major* | **Metrics for block cache should take region replicas into account**
18553 The following metrics for primary region replica are added:
18555 blockCacheHitCountPrimary
18556 blockCacheMissCountPrimary
18557 blockCacheEvictionCountPrimary
18562 * [HBASE-14317](https://issues.apache.org/jira/browse/HBASE-14317) | *Blocker* | **Stuck FSHLog: bad disk (HDFS-8960) and can't roll WAL**
18564 Tighten up WAL-use semantic.
18566 1. If an append or a sync throws an exception, all subsequent attempts at using the log will also throw this same exception. The WAL is now a lame-duck until you roll it.
18567 2. If a successful append, and then we fail to sync the append, this is a fatal exception. The container must abort to replay the WAL logs even though we have told the client that the appends failed.
18569 The above rules have been applied laxly up to this; it used to be possible to get a good sync to go in over the top of a failed append. This has been fixed in this patch.
18571 Also fixed a hang in the WAL subsystem if a request to pause the write pipeline took on a failed sync. before the roll requests sync got scheduled.
18574 TODO: Revisit our WAL system. HBASE-12751 helps rationalize our write pipeline. In particular, it manages sequenceid inside mvcc which should make it so we can purge mechanism that writes empty, unflushed appends just to get the next sequenceid... problematic when WAL goes lame-duck. Lets get it in.
18575 TODO: A successful append followed by a failed sync probably only needs us replace the WAL (if we have signalled the client that the appends failed). Bummer is that replicating, these last appends might make it to the sink cluster or get replayed during recovery. HBase should keep its own WAL length? Or sequenceid of last successful sync should be passed when doing recovery and replication?
18580 * [HBASE-14261](https://issues.apache.org/jira/browse/HBASE-14261) | *Major* | **Enhance Chaos Monkey framework by adding zookeeper and datanode fault injections.**
18582 This change augments existing chaos monkey framework with actions for restarting underlying zookeeper quorum and hdfs nodes of distributed hbase cluster. One assumption made while creating zk actions are that zookeper ensemble is an independent external service and won't be managed by hbase cluster.  For these actions to work as expected, the following parameters need to be configured appropriately.
18584 {code}
18585 \<property\>
18586   \<name\>hbase.it.clustermanager.hadoop.home\</name\>
18587   \<value\>$HADOOP\_HOME\</value\>
18588 \</property\>
18589 \<property\>
18590   \<name\>hbase.it.clustermanager.zookeeper.home\</name\>
18591   \<value\>$ZOOKEEPER\_HOME\</value\>
18592 \</property\>
18593 \<property\>
18594   \<name\>hbase.it.clustermanager.hbase.user\</name\>
18595   \<value\>hbase\</value\>
18596 \</property\>
18597 \<property\>
18598   \<name\>hbase.it.clustermanager.hadoop.hdfs.user\</name\>
18599   \<value\>hdfs\</value\>
18600 \</property\>
18601 \<property\>
18602   \<name\>hbase.it.clustermanager.zookeeper.user\</name\>
18603   \<value\>zookeeper\</value\>
18604 \</property\>
18605 {code}
18607 The service user related configurations are newly introduced since in prod/test environments each service is managed by different user. Once the above parameters are configured properly, you can start using them as needed. An example usage for invoking these new actions is:
18609 {{./hbase org.apache.hadoop.hbase.IntegrationTestAcidGuarantees -m serverAndDependenciesKilling}}
18614 * [HBASE-14309](https://issues.apache.org/jira/browse/HBASE-14309) | *Major* | **Allow load balancer to operate when there is region in transition by adding force flag**
18616 This issue adds boolean parameter, force, to 'balancer' command so that admin can force region balancing even when there is region (other than hbase:meta) in transition - assuming RIT being transient.
18617 If hbase:meta is in transition, balancer command returns false.
18619 WARNING: For experts only. Forcing a balance may do more damage than repair when assignment is confused
18620 Note: enclose the force parameter in double quotes
18625 * [HBASE-14313](https://issues.apache.org/jira/browse/HBASE-14313) | *Critical* | **After a Connection sees ConnectionClosingException it never recovers**
18627 HConnection could get stuck when talking to a host that went down and then returned. This has been fixed by closing the connection in all paths.
18632 * [HBASE-13339](https://issues.apache.org/jira/browse/HBASE-13339) | *Blocker* | **Update default Hadoop version to latest for master**
18634 Master/2.0.0 now builds on the latest stable hadoop by default.
18639 * [HBASE-14224](https://issues.apache.org/jira/browse/HBASE-14224) | *Critical* | **Fix coprocessor handling of duplicate classes**
18641 Prevent Coprocessors being doubly-loaded; a particular coprocessor can only be loaded once.
18646 * [HBASE-13127](https://issues.apache.org/jira/browse/HBASE-13127) | *Major* | **Add timeouts on all tests so less zombie sightings**
18648 Use junit facility to impose timeout on test. Use test category to chose which timeout to apply: small tests timeout after 30 seconds, medium tests after 180 seconds, and large tests after ten minutes.
18650 Updated junit version from 4.11 to 4.12. 4.12 has support for feature used here.
18652 Add this at the head of your junit4 class to add a category-based timeout:
18654 {code}
18655 @Rule public final TestRule timeout =   CategoryBasedTimeout.builder().withTimeout(this.getClass()).
18656       withLookingForStuckThread(true).build();
18657 {code}
18659 For example:
18664 * [HBASE-14148](https://issues.apache.org/jira/browse/HBASE-14148) | *Major* | **Web UI Framable Page**
18666 Security fix: Adds protection from clickjacking using X-Frame-Options header.
18667 This will prevent use of HBase UI in frames. To disable this feature, set the configuration 'hbase.http.filter.xframeoptions.mode' to 'ALLOW' (default is 'DENY').
18672 * [HBASE-10844](https://issues.apache.org/jira/browse/HBASE-10844) | *Major* | **Coprocessor failure during batchmutation leaves the memstore datastructs in an inconsistent state**
18674 Promotes an -ea assert to logged FATAL and RS abort when memstore is found to be in an inconsistent state.
18679 * [HBASE-13966](https://issues.apache.org/jira/browse/HBASE-13966) | *Minor* | **Limit column width in table.jsp**
18681 Wraps region, start key, end key columns if too long.
18686 * [HBASE-13706](https://issues.apache.org/jira/browse/HBASE-13706) | *Minor* | **CoprocessorClassLoader should not exempt Hive classes**
18688 Starting from HBase 2.0, CoprocessorClassLoader will not exempt hadoop classes or zookeeper classes.  This means that if the custom coprocessor jar contains hadoop or zookeeper packages and classes, they will be loaded by the CoprocessorClassLoader.  Only hbase packages and classes  are exempted from the CoprocessorClassLoader. They (and their dependencies) are loaded by the parent server class loader.
18693 * [HBASE-14054](https://issues.apache.org/jira/browse/HBASE-14054) | *Major* | **Acknowledged writes may get lost if regionserver clock is set backwards**
18695 In {{checkAndPut}} write path use max(max timestamp for the row, System.currentTimeMillis()) in the, instead of blindly taking System.currentTimeMillis() to ensure that checkAndPut() cannot do writes which is already eclipsed. This is similar to what has been done in HBASE-12449 for increment and append.
18700 * [HBASE-13985](https://issues.apache.org/jira/browse/HBASE-13985) | *Minor* | **Add configuration to skip validating HFile format when bulk loading**
18702 A new config, hbase.loadincremental.validate.hfile , is introduced - default to true
18703 When set to false, checking hfile format is skipped during bulkloading.
18708 * [HBASE-14201](https://issues.apache.org/jira/browse/HBASE-14201) | *Major* | **hbck should not take a lock unless fixing errors**
18710 HBCK no longer takes a lock until there are changes to the cluster being made.
18712 The old behavior can be achieved by passing the -exclusive flag.
18717 * [HBASE-14081](https://issues.apache.org/jira/browse/HBASE-14081) | *Minor* | **(outdated) references to SVN/trunk in documentation**
18719 HBASE-14081 Remove (outdated) references to SVN/trunk from documentation
18724 * [HBASE-13865](https://issues.apache.org/jira/browse/HBASE-13865) | *Trivial* | **Increase the default value for hbase.hregion.memstore.block.multipler from 2 to 4 (part 2)**
18726 Increase default hbase.hregion.memstore.block.multiplier from 2 to 4 in the code to match the default value in the config files.
18731 * [HBASE-12295](https://issues.apache.org/jira/browse/HBASE-12295) | *Major* | **Prevent block eviction under us if reads are in progress from the BBs**
18733 We try to delay the eviction of the block till the cellblocks are formed at the Rpc layer. A simple reference counting mechanism is introduced when ever a block is accessed from the Bucket cache.  Once a scanner completes using a block the reference count is decremented.  The eviction of the block happens only when the reference count of that block is 0.
18734 We also introduce a concept of ShareableMemory based on the type of blocks we create from the Block cache. The blocks from the ByteBufferIOEngine directly refer to the buckets in offheap and such blocks are marked SHARED memory type. The blocks from LRU, HDFS and file mode of Bucket cache are all marked EXCLUSIVE because these blocks have their own exclusive memory.
18735 For the CP case, any cell coming out of SHARED memory block is copied before returning the results, because CPs can use the results as its state so that eviction cannot corrupt the results.
18740 * [HBASE-11339](https://issues.apache.org/jira/browse/HBASE-11339) | *Major* | **HBase MOB**
18742 The Moderate Object Storage (MOB) feature (HBASE-11339[1]) is modified I/O and compaction path that allows individual moderately sized values (100KB-10MB) to be stored in a way that write amplification is reduced when compared to the normal I/O path. MOB is defined in the column family and it is almost isolated with other components, the features and performance cannot be effected in normal columns.
18744 For more details on how to use the feature please consult the HBase Reference Guide
18749 * [HBASE-13954](https://issues.apache.org/jira/browse/HBASE-13954) | *Major* | **Remove HTableInterface#getRowOrBefore related server side code**
18751 Removed Table#getRowOrBefore, Region#getClosestRowBefore, Store#getRowKeyAtOrBefore, RemoteHTable#getRowOrBefore apis and Thrift support for getRowOrBefore.
18752 Also removed two coprocessor hooks preGetClosestRowBefore and postGetClosestRowBefore.
18753 User using this api can instead use reverse scan something like below, 
18754 {code} 
18755  Scan scan = new Scan(row); 
18756   scan.setSmall(true); 
18757   scan.setCaching(1); 
18758   scan.setReversed(true); 
18759   scan.addFamily(family); 
18760 {code} 
18761 pass this scan object to the scanner and retrieve the first Result from scanner output.
18766 * [HBASE-12296](https://issues.apache.org/jira/browse/HBASE-12296) | *Major* | **Filters should work with ByteBufferedCell**
18768 Change to support offheaping.
18770 Incompatible change for filters ColumnPrefixFilter and MultipleColumnPrefixFilter
18772 Changes parameters to filterColumn so takes a Cell rather than a byte [].
18774 hbase-client-1.2.7-SNAPSHOT.jar, ColumnPrefixFilter.class
18775 package org.apache.hadoop.hbase.filter
18776 ColumnPrefixFilter.filterColumn ( byte[ ] buffer, int qualifierOffset, int qualifierLength )  :  Filter.ReturnCode 
18777 org/apache/hadoop/hbase/filter/ColumnPrefixFilter.filterColumn:([BII)Lorg/apache/hadoop/hbase/filter/Filter$ReturnCode;
18779 Ditto for filterColumnValue in SingleColumnValueFilter. Takes a Cell instead of byte array.
18784 * [HBASE-14045](https://issues.apache.org/jira/browse/HBASE-14045) | *Major* | **Bumping thrift version to 0.9.2.**
18786 This changes upgrades thrift dependency of HBase to 0.9.2. Though this doesn't break any HBase compatibility promises, it might impact any downstream projects that share thrift dependency with HBase.
18791 * [HBASE-14027](https://issues.apache.org/jira/browse/HBASE-14027) | *Major* | **Clean up netty dependencies**
18793 HBase's convenience binary artifact no longer contains the netty 3.2.4 jar . This jar was not directly used by HBase, but may have been relied on by downstream applications.
18798 * [HBASE-7782](https://issues.apache.org/jira/browse/HBASE-7782) | *Minor* | **HBaseTestingUtility.truncateTable() not acting like CLI**
18800 HBaseTestingUtility now uses the truncate API added in HBASE-8332 so that calls to HBTU.truncateTable will behave like the shell command: effectively dropping the table and recreating a new one with the same split points.
18802 Previously, HBTU.truncateTable instead issued deletes for all the data already in the table. If you wish to maintain the same behavior, you should use the newly added HBTU.deleteTableData method.
18807 * [HBASE-14047](https://issues.apache.org/jira/browse/HBASE-14047) | *Major* | **Cleanup deprecated APIs from Cell class**
18809 The following API from Cell (which were deprecated since past few major versions) are removed now.
18810 getRow
18811 getFamily
18812 getQualifier
18813 getValue
18814 getMvccVersion
18815 The above apis can be replaced with their respective CellUtil#cloneXXX (allocates a copy) or Cell#getXXXArray (essentially just returns a pointer) based on the use case.
18820 * [HBASE-14029](https://issues.apache.org/jira/browse/HBASE-14029) | *Major* | **getting started for standalone still references hadoop-version-specific binary artifacts**
18822 HBASE-14029 Correct documentation for Hadoop version specific artifacts
18827 * [HBASE-13849](https://issues.apache.org/jira/browse/HBASE-13849) | *Major* | **Remove restore and clone snapshot from the WebUI**
18829 The HBase master status web page no longer allows operators to clone snapshots nor restore snapshots.
18834 * [HBASE-13646](https://issues.apache.org/jira/browse/HBASE-13646) | *Major* | **HRegion#execService should not try to build incomplete messages**
18836 When RegionServerCoprocessors throw an exception we will no longer attempt to build an incomplete RPC response message. Instead, the response message will be null.
18841 * [HBASE-13639](https://issues.apache.org/jira/browse/HBASE-13639) | *Major* | **SyncTable - rsync for HBase tables**
18843 Tool to sync two tables that tries to send the differences only like rsync.
18845 Adds two new MapReduce jobs, SyncTable and HashTable. See usage for these jobs on how to use. See design doc for generally overview: https://docs.google.com/document/d/1-2c9kJEWNrXf5V4q\_wBcoIXfdchN7Pxvxv1IO6PW0-U/edit
18847 From comments below, "It can be challenging to run against a table getting live writes, if those writes are updates/overwrites. In general, you can run it against a time range to ignore new writes, but if those writes update existing cells, then the time range scan may or may not see older versions of those cells depending on whether major compaction has happened, which may be different in remote clusters."
18852 * [HBASE-13895](https://issues.apache.org/jira/browse/HBASE-13895) | *Critical* | **DATALOSS: Region assigned before WAL replay when abort**
18854 If the master went to assign a region concurrent with a RegionServer abort, the returned RegionServerAbortedException was being handled as though the region had been cleanly offlined so assign was allowed proceed. If the region was opened in its new location before WAL replay completion, the replayed edits were ignored, worst case, or were later played over the top of edits that had come in since open and so susceptible to overwrite. In either case, DATALOSS.
18859 * [HBASE-13983](https://issues.apache.org/jira/browse/HBASE-13983) | *Minor* | **Doc how the oddball HTable methods getStartKey, getEndKey, etc. will be removed in 2.0.0**
18861 Adds extra doc on getStartKeys, getEndKeys, and getStartEndKeys in HTable explaining that they will be removed in 2.0.0 (these methods did not get the proper full major version deprecation cycle).
18863 In this issue, we actually also remove these methods in master/2.0.0 branch.
18868 * [HBASE-13747](https://issues.apache.org/jira/browse/HBASE-13747) | *Critical* | **Promote Java 8 to "yes" in support matrix**
18870 Java 8 is considered supported and tested as of HBase 1.2+
18875 * [HBASE-13959](https://issues.apache.org/jira/browse/HBASE-13959) | *Critical* | **Region splitting uses a single thread in most common cases**
18877 The performance of region splitting has been improved by using a thread pool to split the store files concurrently. Prior to this change, the store files were always split sequentially in a single thread, so a region with multiple store files ended up taking several seconds. The thread pool is sized dynamically with the aim of getting maximum concurrency, without exceeding the number of cores available for HBase Java process. A lower limit for the thread pool can be explicitly set using the property hbase.regionserver.region.split.threads.max.
18882 * [HBASE-13930](https://issues.apache.org/jira/browse/HBASE-13930) | *Major* | **Exclude Findbugs packages from shaded jars**
18884 Exclude Findbugs packages from shaded jars
18889 * [HBASE-13214](https://issues.apache.org/jira/browse/HBASE-13214) | *Major* | **Remove deprecated and unused methods from HTable class**
18891 **WARNING: No release note provided for this change.**
18896 * [HBASE-13869](https://issues.apache.org/jira/browse/HBASE-13869) | *Trivial* | **Fix typo in HBase book**
18898 Fix typo in HBase book
18903 * [HBASE-13938](https://issues.apache.org/jira/browse/HBASE-13938) | *Major* | **Deletes done during the region merge transaction may get eclipsed**
18905 Use the master's timestamp when sending hbase:meta edits on region merge to ensure proper ordering of new region addition and old region deletes.
18910 * [HBASE-13898](https://issues.apache.org/jira/browse/HBASE-13898) | *Minor* | **correct additional javadoc failures under java 8**
18912 Correct Javadoc generation errors
18917 * [HBASE-13103](https://issues.apache.org/jira/browse/HBASE-13103) | *Major* | **[ergonomics] add region size balancing as a feature of master**
18919 This patch adds optional ability for HMaster to normalize regions in size (disabled by default, change hbase.normalizer.enabled property to true to turn it on). If enabled, HMaster periodically (every 30 minutes by default) monitors tables for which normalization is enabled in table configuration and performs splits/merges as seems appropriate. Users may implement their own normalization strategies by implementing RegionNormalizer interface and configuring it in hbase-site.xml.
18924 * [HBASE-13900](https://issues.apache.org/jira/browse/HBASE-13900) | *Minor* | **duplicate methods between ProtobufMagic and ProtobufUtil**
18926 Use ProtobufMagic methods in ProtobufUtil
18931 * [HBASE-13843](https://issues.apache.org/jira/browse/HBASE-13843) | *Trivial* | **Fix internal constant text in ReplicationManager.java**
18933 In previous versions of HBase, the ReplicationAdmin utility erroneously used the string key "columnFamlyName" when listing replicated column families. It now uses the corrected spelling of "columnFamilyName" (note the added "i").
18935 Downstream code that parsed the replication entries returned from listReplicated will need to be updated to use the new key. Previously compiled code that relied on the static CFNAME member of ReplicationAdmin will need to be recompiled in order to see the updated value.
18940 * [HBASE-13886](https://issues.apache.org/jira/browse/HBASE-13886) | *Major* | **Return empty value when the mob file is corrupt instead of throwing exceptions**
18942 By default the Get/Scan will throw Exception when it is not able to find a mob cell because the mob file is missing/corrupted. This jira adds a facility to continue scan/get and get other cells with mob cell value as empty. Set an attribute MobConstants.EMPTY\_VALUE\_ON\_MOBCELL\_MISS = true in Scan/Get for getting this behaviour
18947 * [HBASE-13686](https://issues.apache.org/jira/browse/HBASE-13686) | *Major* | **Fail to limit rate in RateLimiter**
18949 As per this jira contribution. We now support two kinds of RateLimiter.
18950 1) org.apache.hadoop.hbase.quotas.AverageIntervalRateLimiter : This limiter will refill resources at every TimeUnit/resources interval.
18951 Example: For a limiter configured with 10resources/second, then 1resource will be refilled after every 100ms.
18953 2) org.apache.hadoop.hbase.quotas.FixedIntervalRateLimiter: This limiter will refill resources only after a given fixed interval of time.
18955 Client can configure anyone of this rate limiter for the cluster by setting the value for the property "hbase.quota.rate.limiter" in the hbase-site.xml. org.apache.hadoop.hbase.quotas.AverageIntervalRateLimiter is the default value.
18956 Note: Client needs to restart the cluster for the configuration to take into effect.
18961 * [HBASE-13816](https://issues.apache.org/jira/browse/HBASE-13816) | *Major* | **Build shaded modules only in release profile**
18963 hbase-shaded-client and hbase-shaded-server modules will not build the actual jars unless -Prelease is supplied in mvn.
18968 * [HBASE-13754](https://issues.apache.org/jira/browse/HBASE-13754) | *Major* | **Allow non KeyValue Cell types also to oswrite**
18970 This jira has removed the already deprecated method 
18971 KeyValue#oswrite(final KeyValue kv, final OutputStream out)
18976 * [HBASE-13375](https://issues.apache.org/jira/browse/HBASE-13375) | *Major* | **Provide HBase superuser higher priority over other users in the RPC handling**
18978 This JIRA modifies the signature of PriorityFunction#getPriority() method to also take request user as a parameter; all RPC requests sent by super users (as determined by cluster configuration) are executed with Admin QoS.
18983 * [HBASE-5980](https://issues.apache.org/jira/browse/HBASE-5980) | *Minor* | **Scanner responses from RS should include metrics on rows/KVs filtered**
18985 Adds scan metrics to the result. In the shell, set the ALL\_METRICS attribute to true on your scan to see dump of metrics after results (see the scan help for examples).
18987 If you would prefer to see only a subset of the metrics, the METRICS array can be defined to include the names of only the metrics you care about.
18992 * [HBASE-13698](https://issues.apache.org/jira/browse/HBASE-13698) | *Major* | **Add RegionLocator methods to Thrift2 proxy.**
18994 Added getRegionLocation and getAllRegionLocations to the thrift2 interface.
18999 * [HBASE-13636](https://issues.apache.org/jira/browse/HBASE-13636) | *Major* | **Remove deprecation for HBASE-4072 (Reading of zoo.cfg)**
19001 Purge support for parsing zookeepers zoo.cfg deprecated since hbase-0.96.0
19006 * [HBASE-13071](https://issues.apache.org/jira/browse/HBASE-13071) | *Major* | **Hbase Streaming Scan Feature**
19008 MOTIVATION
19010 A pipelined scan API is introduced for speeding up applications that combine massive data traversal with compute-intensive processing. Traditional HBase scans save network trips through prefetching the data to the client side cache. However, they prefetch synchronously: the fetch request to regionserver is invoked only when the entire cache is consumed. This leads to a stop-and-wait access pattern, in which the client stalls until the next chunk of data is fetched. Applications that do significant processing can benefit from background data prefetching, which eliminates this bottleneck. The pipelined scan implementation overlaps the cache population at the client side with application processing. Namely, it issues a new scan RPC when the iteration retrieves 50% of the cache. If the application processing (that is, the time between invocations of next()) is substantial, the new chunk of data will be available before the previous one is exhausted, and the client will not experience any delay. Ideally, the prefetch and the processing times should be balanced. 
19012 API AND CONFIGURATION
19014 Asynchronous scanning can be configured either globally for all tables and scans, or on per-scan basis via a new Scan class API. 
19016 Configuration in hbase-site.xml: hbase.client.scanner.async.prefetch, default false:
19018  \<property\>
19019    \<name\>hbase.client.scanner.async.prefetch\</name\>
19020    \<value\>true\</value\>
19021  \</property\>
19023 API - Scan#setAsyncPrefetch(boolean)
19025       Scan scan = new Scan();
19026       scan.setCaching(1000);
19027       scan.setMaxResultSize(BIG\_SIZE);
19028       scan.setAsyncPrefetch(true);
19029         ...
19030       ResultScanner scanner = table.getScanner(scan);
19032 IMPLEMENTATION NOTES
19034 Pipelined scan is implemented by a new ClientAsyncPrefetchScanner class, which is fully API-compatible with the synchronous ClientSimpleScanner. ClientAsyncPrefetchScanner is not instantiated in case of small (Scan#setSmall) and reversed (Scan#setReversed) scanners. The application is responsible for setting the prefetch size in a way that the prefetch time and the processing times are balanced. Note that due to double buffering, the client side cache can use twice as much memory as the synchronous scanner.
19036 Generally, this feature will put more load on the server (higher fetch rate -- which is the whole point).  Also, YMMV.
19041 * [HBASE-13533](https://issues.apache.org/jira/browse/HBASE-13533) | *Trivial* | **section on configuring ~/.m2/settings.xml has no anchor**
19043 Correct setting.xml anchor in book
19048 * [HBASE-13625](https://issues.apache.org/jira/browse/HBASE-13625) | *Major* | **Use HDFS for HFileOutputFormat2 partitioner's path**
19050 Introduces a new config hbase.fs.tmp.dir which is a directory in HDFS (or default file system) to use as a staging directory for HFileOutputFormat2. This is also used as the default for hbase.bulkload.staging.dir
19055 * [HBASE-10800](https://issues.apache.org/jira/browse/HBASE-10800) | *Major* | **Use CellComparator instead of KVComparator**
19057 From 2.0 branch onwards KVComparator and its subclasses MetaComparator, RawBytesComparator are all deprecated. 
19058 All the comparators are moved to CellComparator.  MetaCellComparator, a subclass of CellComparator, will be used to compare hbase:meta cells.  
19059 Previously exposed static instances KeyValue.COMPARATOR, KeyValue.META\_COMPARATOR and KeyValue.RAW\_COMPARATOR are deprecated instead use CellComparator.COMPARATOR and CellComparator.META\_COMPARATOR.
19060 Also note that there will be no RawBytesComparator.  Where ever we need to compare raw bytes use Bytes.BYTES\_RAWCOMPARATOR.
19061 CellComparator will always operate on cells and its components, abstracting the fact that a cell can be backed by a single byte[] as opposed to how KVComparators were working.
19066 * [HBASE-13333](https://issues.apache.org/jira/browse/HBASE-13333) | *Major* | **Renew Scanner Lease without advancing the RegionScanner**
19068 Adds a renewLease call to ClientScanner
19073 * [HBASE-13564](https://issues.apache.org/jira/browse/HBASE-13564) | *Major* | **Master MBeans are not published**
19075 To use the coprocessor-based JMX implementation provided by HBase for Master.
19076 Add below property in hbase-site.xml file: 
19078 \<property\>
19079   \<name\>hbase.coprocessor.master.classes\</name\>
19080   \<value\>org.apache.hadoop.hbase.JMXListener\</value\>
19081 \</property\>
19083 NOTE: DO NOT set \`com.sun.management.jmxremote.port\` for Java VM at the same time.
19085 By default, the JMX listens on TCP port 10101 for Master, we can further configure the port using below properties:
19087 \<property\>
19088   \<name\>master.rmi.registry.port\</name\>
19089   \<value\>61110\</value\>
19090 \</property\>
19091 \<property\>
19092   \<name\>master.rmi.connector.port\</name\>
19093   \<value\>61120\</value\>
19094 \</property\>
19095 ----
19097 The registry port can be shared with connector port in most cases, so you only need to configure master.rmi.registry.port.
19098 However if you want to use SSL communication, the 2 ports must be configured to different values.
19103 * [HBASE-13537](https://issues.apache.org/jira/browse/HBASE-13537) | *Major* | **Procedure V2 - Change the admin interface for async operations to return Future (incompatible with branch-1.x)**
19105 As we made changes to return types in asynchronous methods of Admin API, this change is going to break binary compatibility. The source compatibility is kept intact though. The applications running against this change needs to be recompiled to keep things working.
19110 * [HBASE-13517](https://issues.apache.org/jira/browse/HBASE-13517) | *Major* | **Publish a client artifact with shaded dependencies**
19112 HBase now provides added convenience artifacts that shade most dependencies. These jars hbase-shaded-client and hbase-shaded-server are meant to be used when dependency conflicts can not be solved any other way. The normal jars hbase-client and hbase-server should still be preferred when possible.
19114 Do not use hbase-shaded-server or hbase-shaded-client inside of a co-processor as bad things will happen.
19119 * [HBASE-13149](https://issues.apache.org/jira/browse/HBASE-13149) | *Blocker* | **HBase MR is broken on Hadoop 2.5+ Yarn**
19121 In HBase 1.1.0 and above we have upgraded the version of Jackson dependencies (jackson-core-asl, jackson-mapper-asl, jackson-jaxrs and jackson-xc) from 1.8.8 to 1.9.13. This is to follow the upgrade to Jackson 1.9.13 in Hadoop 2.5 and above which causes Jackson class incompatibility for HBase as reported in HBASE-13149.  Refer to HADOOP-10104 and YARN-2092 for additional information. Jackson1.9.13 is not completely backward compatible with the prior version 1.8.8 used in HBase. See the Compatibility reports attached in HBASE-13149 and http://svn.codehaus.org/jackson/trunk/release-notes/VERSION for more information.
19123 This upgrade does not have direct impact on HBase users and HBase applications in most cases. In the rare case where your HBase application uses Jackson directly AND your application has compatibility issue with Jackson 1.9.13, you can do the following to mitigate the problem.
19125 1. If you are on Hadoop 2.5 or above, and your HBase application involves running Yarn jobs, we recommend you update your application to use Jackson 1.9.13. You may be able to explore classpath isolation options (e.g. HADOOP-10893) or have your own classpath isolation strategy that works for you, but the general recommendation is that you upgrade to Jackson 1.9.13.
19126 2. You may choose to continue using Jackson 1.8.8 and not to use Jackson 1.9.13 in your classpath.  You can also choose to replace the Jackson 1.9.13 jars in $HBASE\_HOME/lib with 1.8.8 jars.  It can work for you in the following cases:
19127 a) You are on a Hadoop version earlier than Hadoop 2.5,  or
19128 b) You are on Hadoop 2.5 or above, but your HBase application does not involve running Yarn jobs.
19129 3. You may experiment with further isolation using the shaded jars introduced with 1.1.0 via HBASE-13517.
19131 Note that it may not be tested or guaranteed that using Jackson 1.8.8 in $HBASE\_HOME/lib will work in future HBase releases.
19132 It is recommended that your HBase application matches the Jackson version provided in HBase.
19134 In HBase 0.98.x and HBase 1.0.x, we have NOT upgraded the version of Jackson dependencies. If you are on Hadoop 2.5 or above, and your HBase application involves running Yarn jobs, you may encounter Jackson class incomparability issue, as reported in HBASE-13149.
19136 You can do the following to mitigate the problem:
19137 1. Use 'hadoop jar' command to run your HBase jobs.
19138 2. Explore classpath isolation options (e.g. HADOOP-10893) or have your own classpath isolation strategy that works for you.
19139 3. You can also choose to replace the Jackson 1.8.8 jars in $HBASE\_HOME/lib with 1.9.13 jars from your Hadoop lib directory. We have tested HBase 0.98 with Jackson 1.9.13.
19144 * [HBASE-13481](https://issues.apache.org/jira/browse/HBASE-13481) | *Major* | **Master should respect master (old) DNS/bind related configurations**
19146 Master now honors configuration options as was before 1.0.0 releases:
19147 hbase.master.ipc.address
19148 hbase.master.dns.interface
19149 hbase.master.dns.nameserver
19150 hbase.master.info.bindAddress
19151 This jira also adds hbase.master.hostname parameter as an extension to HBASE-12954.
19156 * [HBASE-13090](https://issues.apache.org/jira/browse/HBASE-13090) | *Major* | **Progress heartbeats for long running scanners**
19158 Previously, there was no way to enforce a time limit on scan RPC requests. The server would receive a scan RPC request and take as much time as it needed to accumulate enough results to reach a limit or exhaust the region. The problem with this approach was that, in the case of a very selective scan, the processing of the scan could take too long and cause timeouts client side.
19160 With this fix, the server will now enforce a time limit on the execution of scan RPC requests. When a scan RPC request arrives to the server, a time limit is calculated to be half of whichever timeout value is more restictive between the configurations ("hbase.client.scanner.timeout.period" and "hbase.rpc.timeout"). When the time limit is reached, the server will return whatever results it has accumulated up to that point. The results may be empty.
19162 To ensure that timeout checks do not occur too often (which would hurt the performance of scans), the configuration "hbase.cells.scanned.per.heartbeat.check" has been introduced. This configuration controls how often System.currentTimeMillis() is called to update the progress towards the time limit. Currently, the default value of this configuration value is 10000. Specifying a smaller value will provide a tighter bound on the time limit, but may hurt scan performance due to the higher frequency of calls to System.currentTimeMillis().
19164 Protobuf models for ScanRequest and ScanResponse have been updated so that heartbeat support can be communicated. Support for heartbeat messages is specified in the request sent to the server via ScanRequest.Builder#setClientHandlesHeartbeats. Only when the server sees that ScanRequest#getClientHandlesHeartbeats() is true will it send heartbeat messages back to the client. A response is marked as a heartbeat message via the boolean flag ScanResponse#getHeartbeatMessage
19169 * [HBASE-13307](https://issues.apache.org/jira/browse/HBASE-13307) | *Major* | **Making methods under ScannerV2#next inlineable, faster**
19171 Made methods smaller under Scanner#next so inlinable and compilable (was getting 'too big to compile' from hotspot). Use of unsafe to parse shorts rather than use BB#getShort... faster, etc.
19176 * [HBASE-13453](https://issues.apache.org/jira/browse/HBASE-13453) | *Critical* | **Master should not bind to region server ports**
19178 In 1.0.x, master by default binds to the region server ports (both rpc and info). This change brings back the usage of old master rpc and info ports in 1.1+ and master (2.0) branches. The motivation for this change is to ease the life of the user so that he does not need to do anything to bring up a RS on the same host and also to make the migration from 0.98 to 1.1  hassle free.  However, the users going from 1.0 to 1.1 would see the change in the master ports.
19183 * [HBASE-13419](https://issues.apache.org/jira/browse/HBASE-13419) | *Major* | **Thrift gateway should propagate text from exception causes.**
19185 Compose thrift exception text from the text of the entire cause chain of the underlying exception.
19190 * [HBASE-13275](https://issues.apache.org/jira/browse/HBASE-13275) | *Major* | **Setting hbase.security.authorization to false does not disable authorization**
19192 Prior to this change the configuration setting 'hbase.security.authorization' had no effect if security coprocessor were installed. The act of installing the security coprocessors was assumed to indicate active authorizaton was desired and required. Now it is possible to install the security coprocessors yet have them operate in a passive state with active authorization disabled by setting 'hbase.security.authorization' to false. This can be useful but is probably not what you want. For more information, consult the Security section of the HBase online manual. 
19194 'hbase.security.authorization' defaults to true for backwards comptatible behavior.
19199 * [HBASE-13118](https://issues.apache.org/jira/browse/HBASE-13118) | *Major* | **[PE] Add being able to write many columns**
19201 Adds a --columns option to PE so you can write more than one column (changes default qualifier from 'data' to '0').
19206 * [HBASE-13270](https://issues.apache.org/jira/browse/HBASE-13270) | *Major* | **Setter for Result#getStats is #addResults; confusing!**
19208 Deprecates Result#addResults in favor of Result#setStatistics
19213 * [HBASE-13362](https://issues.apache.org/jira/browse/HBASE-13362) | *Major* | **Set max result size from client only (like scanner caching).**
19215 This introduces a new config option: hbase.server.scanner.max.result.size
19216 This setting enforces a maximum result size (in bytes), when reached the server will return the results is has so far.
19217 This is a safety setting and should be kept large. The default is inifinite in 0.98 and 1.0.x and 100mb in 1.1 and later.
19219 Use hbase.client.scanner.max.result.size instead to enforce practical chunk sizes of a few mb (defaults to 2mb)
19224 * [HBASE-11544](https://issues.apache.org/jira/browse/HBASE-11544) | *Critical* | **[Ergonomics] hbase.client.scanner.caching is dogged and will try to return batch even if it means OOME**
19226 Results returned from RPC calls may now be returned as partials
19228 When is a Result marked as a partial? 
19229 When the server must stop the scan because the max size limit has been reached. Means that the LAST Result returned within the ScanResult's Result array may be marked as a partial if the scan's max size limit caused it to stop in the middle of a row.
19231 Incompatible Change: The return type of InternalScanners#next and RegionScanners#nextRaw has been changed to NextState from boolean
19232 The previous boolean return value can be accessed via NextState#hasMoreValues()
19233 Provides more context as to what happened inside the scanner
19235 Scan caching default has been changed to Integer.Max\_Value 
19236 This value works together with the new maxResultSize value from HBASE-12976 (defaults to 2MB) 
19237 Results returned from server on basis of size rather than number of rows
19238 Provides better use of network since row size varies amongst tables
19240 Protobuf models have changed for Result, ScanRequest, and ScanResponse to support new partial Results
19242 Partial Results should be invisible to application layer unless Scan#setAllowPartials is set
19244 Scan#setAllowPartials has been added to allow the application to request to see the partial Results returned by the server rather than have the ClientScanner form the complete Result prior to returning it to the application
19246 To disable the use of partial Results on the server, set ScanRequest.Builder#setClientHandlesPartials() to be false in the ScanRequest issued to server
19248 Partial Results should allow the server to return large rows in parts rather than accumulate all the cells for that particular row and run out of memory
19253 * [HBASE-11864](https://issues.apache.org/jira/browse/HBASE-11864) | *Minor* | **Enhance HLogPrettyPrinter to print information from WAL Header**
19255 Enhance WALPrettyPrinter to print information (writer classnames and cell codec classname) from WAL Header
19260 * [HBASE-13289](https://issues.apache.org/jira/browse/HBASE-13289) | *Major* | **typo in splitSuccessCount  metric**
19262 In hbase 1.0.0, 0.98.10, 0.98.10.1, 0.98.11, and 0.98.12 'splitSuccessCount' was misspelled as 'splitSuccessCounnt'
19267 * [HBASE-12990](https://issues.apache.org/jira/browse/HBASE-12990) | *Major* | **MetaScanner should be replaced by MetaTableAccessor**
19269 Removes MetaScanner. Use MetaTableAccessor instead.
19274 * [HBASE-13373](https://issues.apache.org/jira/browse/HBASE-13373) | *Major* | **Squash HFileReaderV3 together with HFileReaderV2 and AbstractHFileReader; ditto for Scanners and BlockReader, etc.**
19276 Marking as incompatible change. Requires hfiles be major version \>= 2 and \>= minor version 3.  Version 3 files are enabled by default in 1.0.  0.98 writes version 2 minor version 3.  You cannot go to 1.0 from anything before 0.98.
19281 * [HBASE-13252](https://issues.apache.org/jira/browse/HBASE-13252) | *Major* | **Get rid of managed connections and connection caching**
19283 For a long time, HBase supported 2 types of connections - managed, which were cached and closed automatically when not needed, and unmanaged, where user is responsible for closing the connections by calling #close() on them.
19285 The concept of managed connections in HBase (deprecated before) has now been extinguished completely, and now all callers are responsible for managing the lifecycle of connections they acquire.
19290 * [HBASE-12954](https://issues.apache.org/jira/browse/HBASE-12954) | *Minor* | **Ability impaired using HBase on multihomed hosts**
19292 The following config is added by this JIRA:
19294 hbase.regionserver.hostname
19296 This config is for experts: don't set its value unless you really know what you are doing.
19297 When set to a non-empty value, this represents the (external facing) hostname for the underlying server.
19298 See https://issues.apache.org/jira/browse/HBASE-12954 for details.
19300 Caution: please make sure rolling upgrade succeeds before turning on this feature.
19305 * [HBASE-13187](https://issues.apache.org/jira/browse/HBASE-13187) | *Critical* | **Add ITBLL that exercises per CF flush**
19307 Pass the -D flag generator.multiple.columnfamilies on the command-line if you want the generator to write three column families rather than the default one. When set, we will write the usual 'meta' column family and use it checking linked-list is wholesome but we will also write a 'tiny' column family and a 'big' column family to provoke uneven flushing; good for testing the flush-by-columnfamily feature.
19312 * [HBASE-13361](https://issues.apache.org/jira/browse/HBASE-13361) | *Minor* | **Remove or undeprecate {get\|set}ScannerCaching in HTable**
19314 Removed getScannerCaching and setScannerCaching from Table
19319 * [HBASE-10728](https://issues.apache.org/jira/browse/HBASE-10728) | *Major* | **get\_counter value is never used.**
19321 for 0.98 and 1.0 changes are compatible (due to mitigation by HBASE-13433):
19323 \* The "get\_counter" command no longer requires a dummy 4th argument. Downstream users are encouraged to migrate code to not pass this argument because it will result in an error for HBase 1.1+.
19324 \* The "incr" command now outputs the current value of the counter to stdout.
19326 {code}
19327 jruby-1.6.8 :005 \> incr 'counter\_example', 'r1', 'cf1:foo', 10
19328 COUNTER VALUE = 1772
19329 0 row(s) in 0.1180 seconds
19330 {code}
19332 for 1.1+ changes are incompatible:
19334 \* The "get\_counter" command no longer accepts a dummy 4th argument. Downstream users will need to update their code to not pass this argument.
19336 {code}
19337 jruby-1.6.8 :006 \> get\_counter 'counter\_example', 'r1', 'cf1:foo'
19338 COUNTER VALUE = 1772
19340 {code}
19341 \* The "incr" command now outputs the current value of the counter to stdout.
19343 {code}
19344 jruby-1.6.8 :005 \> incr 'counter\_example', 'r1', 'cf1:foo', 10
19345 COUNTER VALUE = 1772
19346 0 row(s) in 0.1180 seconds
19347 {code}
19352 * [HBASE-13170](https://issues.apache.org/jira/browse/HBASE-13170) | *Major* | **Allow block cache to be external**
19354 HBase can use memcached as an external block cache. To use this change your config to set hbase.blockcache.use.external to true and hbase.cache.memcached.servers to contain the list of memcached servers to use.
19359 * [HBASE-13316](https://issues.apache.org/jira/browse/HBASE-13316) | *Minor* | **Reduce the downtime on planned moves of regions**
19361 When issuing an Admin.move command the RegionServer that receive the region will try and open the StoreFiles of that region to prime the block cache with index blocks.
19366 * [HBASE-13298](https://issues.apache.org/jira/browse/HBASE-13298) | *Critical* | **Clarify if Table.{set\|get}WriteBufferSize() is deprecated or not**
19368 Deprecate said methods. They were mistakenly included in Table Interface.
19373 * [HBASE-13248](https://issues.apache.org/jira/browse/HBASE-13248) | *Major* | **Make HConnectionImplementation top-level class.**
19375 **WARNING: No release note provided for this change.**
19380 * [HBASE-13331](https://issues.apache.org/jira/browse/HBASE-13331) | *Blocker* | **Exceptions from DFS client can cause CatalogJanitor to delete referenced files**
19382 Fixes an issue where files from a split region that were still referenced were erroneously deleted leading to data loss.
19387 * [HBASE-13273](https://issues.apache.org/jira/browse/HBASE-13273) | *Major* | **Make Result.EMPTY\_RESULT read-only; currently it can be modified**
19389 The Result.EMPTY\_RESULT object is now immutable. In previous releases, the object could be modified by a caller to no longer be empty. Code that relies on this behavior will now receive an UnsupportedOperationException.
19394 * [HBASE-12867](https://issues.apache.org/jira/browse/HBASE-12867) | *Major* | **Shell does not support custom replication endpoint specification**
19396 Adds support to add\_peer in hbase shell to add a custom replication endpoint from HBASE-12254.
19401 * [HBASE-13198](https://issues.apache.org/jira/browse/HBASE-13198) | *Major* | **Remove HConnectionManager**
19403 **WARNING: No release note provided for this change.**
19408 * [HBASE-12586](https://issues.apache.org/jira/browse/HBASE-12586) | *Major* | **Task 6 & 7 from HBASE-9117,  delete all public HTable constructors and delete ConnectionManager#{delete,get}Connection**
19410 HTable class has been marked as private API before, and now it's no longer directly instantiable from client code (all public constructors have been removed). All clients should use Connection#getTable() and Connection#getRegionLocator() when appropriate to obtain Table and RegionLocator implementations to work with.
19415 * [HBASE-13171](https://issues.apache.org/jira/browse/HBASE-13171) | *Minor* | **Change AccessControlClient methods to accept connection object to reduce setup time.**
19417 **WARNING: No release note provided for this change.**
19422 * [HBASE-12706](https://issues.apache.org/jira/browse/HBASE-12706) | *Critical* | **Support multiple port numbers in ZK quorum string**
19424 hbase.zookeeper.quorum configuration now allows servers together with client ports consistent with the way Zookeeper java client accepts the quorum string. In this case, using hbase.zookeeper.clientPort is not needed. eg.  hbase.zookeeper.quorum=myserver1:2181,myserver2:20000,myserver3:31111
19429 * [HBASE-13142](https://issues.apache.org/jira/browse/HBASE-13142) | *Major* | **[PERF] Reuse the IPCUtil#buildCellBlock buffer**
19431 Adds buffer reuse sending Cell results. It is on by default and should not need configuration. Improves GC profile and ups throughput. The benefit gets better the larger the row size returned.
19433 The buffer reservoir is bounded at a maximum count after which we will start logging at WARN level that the reservoir is running at capacity (returned buffers will be discarded and not added back to the reservoir pool). Default maximum is twice the handler count: i.e. 2 \* hbase.regionserver.handler.count. This should be more than enough. Set the maximum with the new configuration: hbase.ipc.server.reservoir.max
19435 The reservoir will not cache buffers in excess of hbase.ipc.server.reservoir.max.buffer.size  The default is 10MB. This means that if a row is very large, then we will allocate a buffer of the average size that is currently in the pool and we will then resize it till we can accommodate the return. These resizes are expensive. The resultant buffer will be used and then discarded.
19437 To check how the reservoir is doing, enable trace level logging for a few seconds on a regionserver. You can do this from the regionserver UI. See 'Log Level'. Set org.apache.hadoop.hbase.io.BoundedByteBufferPool to TRACE. The BoundedByteBufferPool will spew report to the log. Disable the TRACE level and then check the log. You'll see allocation rate, size of pool, size of buffers in pool, etc.
19442 * [HBASE-13012](https://issues.apache.org/jira/browse/HBASE-13012) | *Major* | **Add shell commands to trigger the mob file compactor**
19444 This adds two new shell commands -- compact\_mob and major\_compact\_mob to the hbase shell.
19446 Run compaction on a mob enabled column family or all mob enabled column families within a table
19447           Examples:
19448           Compact a column family within a table:
19449           hbase\> compact\_mob 't1', 'c1'
19450           Compact all mob enabled column families
19451           hbase\> compact\_mob 't1'
19453 Run major compaction on a mob enabled column family or all mob enabled column families within a table
19454           Examples:
19455           Compact a column family within a table:
19456           hbase\> major\_compact\_mob 't1', 'c1'
19457           Compact all mob enabled column families within a table
19458           hbase\> major\_compact\_mob 't1'
19463 * [HBASE-12869](https://issues.apache.org/jira/browse/HBASE-12869) | *Major* | **Add a REST API implementation of the ClusterManager interface**
19465 Adds an implementation of ClusterManager to control REST API-managed HBase clusters.
19470 * [HBASE-13047](https://issues.apache.org/jira/browse/HBASE-13047) | *Trivial* | **Add "HBase Configuration" link missing on the table details pages**
19472 Add a '/conf' link to UI
19477 * [HBASE-13044](https://issues.apache.org/jira/browse/HBASE-13044) | *Minor* | **Configuration option for disabling coprocessor loading**
19479 This change adds two new configuration options:
19480 - "hbase.coprocessor.enabled" controls globally if any coprocessors will be loaded. Set to "false" to disable. Defaults to "true" for compatibility with previous releases.
19481 - "hbase.coprocessor.user.enabled" controls if any user (aka table) coprocessors will be loaded. Set to "false" to disable. Defaults to "true" for compatibility with previous releases.
19486 * [HBASE-12961](https://issues.apache.org/jira/browse/HBASE-12961) | *Minor* | **Negative values in read and write region server metrics**
19488 Change read and write request count in ServerLoad from int to long
19493 * [HBASE-7332](https://issues.apache.org/jira/browse/HBASE-7332) | *Minor* | **[webui] HMaster webui should display the number of regions a table has.**
19495 Adds counts for various regions states to the table listing on main page. See attached screenshot.
19500 * [HBASE-8329](https://issues.apache.org/jira/browse/HBASE-8329) | *Major* | **Limit compaction speed**
19502 Adds compaction throughput limit mechanism(the word "throttle" is already used when choosing compaction thread pool, so use a different word here to avoid ambiguity). Default is org.apache.hadoop.hbase.regionserver.compactions.PressureAwareCompactionThroughputController, will limit throughput as follow:
19503 1. In off peak hours, use a fixed limitation "hbase.hstore.compaction.throughput.offpeak" (default is Long.MAX\_VALUE which means no limitation).
19504 2. In normal hours, the limitation is tuned between "hbase.hstore.compaction.throughput.lower.bound"(default 10MB/sec) and "hbase.hstore.compaction.throughput.higher.bound"(default 20MB/sec), using the formula "lower + (higer - lower) \* param" where param is in range [0.0, 1.0] and calculate based on store files count on this regionserver.
19505 3. If some stores have too many store files(storefilesCount \> blockingFileCount), then there is no limitation no matter peak or off peak.
19506 You can set "hbase.regionserver.throughput.controller" to org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController to disable throughput controlling.
19507 And we have implemented ConfigurationObserver which means you can change all configurations above and do not need to restart cluster.
19509 The throttle is on by default in hbase-2.0.0. There is no limit in hbase-1.x.
19514 * [HBASE-6778](https://issues.apache.org/jira/browse/HBASE-6778) | *Major* | **Deprecate Chore; its a thread per task when we should have one thread to do all tasks**
19516 Corresponding usages for new ScheduledChore vs. Deprecated Chore:
19517 Chore.interrupt() -\> ScheduledChore.cancel(mayInterruptWhileRunning = true)
19518 Threads.setDaemonThreadRunning(Chore) -\> ChoreService.scheduleChore(ScheduledChore)
19519 Chore.isAlive -\> ScheduledChore.isScheduled()
19520 Chore.getSleeper().skipSleepCycle() -\> ScheduledChore.triggerNow()
19525 * [HBASE-11574](https://issues.apache.org/jira/browse/HBASE-11574) | *Major* | **hbase:meta's regions can be replicated**
19527 On the server side, set hbase.meta.replica.count to the number of replicas of meta that you want to have in the cluster (defaults to 1). hbase.regionserver. meta.storefile.refresh.period should be set to a non-zero number in milliseconds - something like 30000 (defaults to 0).
19528 On the client/user side, set hbase.meta.replicas.use to true.
19533 * [HBASE-12808](https://issues.apache.org/jira/browse/HBASE-12808) | *Major* | **Use Java API Compliance Checker for binary/source compatibility**
19535 Adds a dev-support/check\_compatibility.sh script for comparing versions. Run the script to see usage.
19540 * [HBASE-12684](https://issues.apache.org/jira/browse/HBASE-12684) | *Major* | **Add new AsyncRpcClient**
19542 Retrofit a new, netty-based rpc transport on the client. This client is slightly slower if little contention given the extra tier or so that netty adds and that we block on a Future waiting on the call to finish.  This client opens the way for HBase having a native Async API.
19544 This client is on by default in master branch (2.0 hbase). It is off in branch-1.0 (hbase-1.1.x).  To enable it, set "hbase.rpc.client.impl" to "org.apache.hadoop.hbase.ipc.AsyncRpcClient"
19549 * [HBASE-8410](https://issues.apache.org/jira/browse/HBASE-8410) | *Major* | **Basic quota support for namespaces**
19551 Namespace auditor provides basic quota support for namespaces in terms of number of tables and number of regions. In order to use namespace quotas, quota support must be enabled by setting
19552 "hbase.quota.enabled" property to true in hbase-site.xml file.
19554 The users can add quota information to namespace, while creating new namespaces or by altering existing ones. 
19556 Examples:
19557 1. create\_namespace 'ns1', {'hbase.namespace.quota.maxregions'=\>'10'}
19558 2. create\_namespace 'ns2', {'hbase.namespace.quota.maxtables'=\>'2','hbase.namespace.quota.maxregions'=\>'5'}
19559 3. alter\_namespace 'ns3', {METHOD =\> 'set', 'hbase.namespace.quota.maxtables'=\>'5','hbase.namespace.quota.maxregions'=\>'25'}
19561 The quotas can be modified/added to namespace at any point of time. To remove quotas, the following command can be used: 
19563 alter\_namespace 'ns3', {METHOD =\> 'unset', NAME =\> 'hbase.namespace.quota.maxtables'}
19564 alter\_namespace 'ns3', {METHOD =\> 'unset', NAME =\> 'hbase.namespace.quota.maxregions'}
19569 * [HBASE-12902](https://issues.apache.org/jira/browse/HBASE-12902) | *Major* | **Post-asciidoc conversion fix-ups**
19571 Pushed to master. Shout if there are any issues.
19576 * [HBASE-12848](https://issues.apache.org/jira/browse/HBASE-12848) | *Major* | **Utilize Flash storage for WAL**
19578 For users on a version of Hadoop that supports tiered storage policies (i.e. Apache Hadoop 2.6.0+), HBase now allows users to opt-in to having the write ahead log placed on the SSD tier. Users on earlier versions of Hadoop will be unable to take advantage of this feature.
19580 Use of tiered storage is controlled by a new RegionServer config, hbase.wal.storage.policy. It defaults to the value 'NONE', which will rely on HDFS defaults for a policy decision.
19582 User can specify ONE\_SSD or ALL\_SSD as the value:
19583 ONE\_SSD: place only one replica of WAL files in SSD and the remaining in default storage
19584 ALL\_SSD: all replica for WAL files are placed on SSD
19586 See [the HDFS docs on storage policy\|http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-hdfs/ArchivalStorage.html]
19591 * [HBASE-11144](https://issues.apache.org/jira/browse/HBASE-11144) | *Major* | **Filter to support scanning multiple row key ranges**
19593 MultiRowRangeFilter is a filter to support scanning multiple row key ranges. If the number of the ranges is small, using multiple scans can also do the same thing and can work well. But when the number of ranges are quite big (e.g. millions), use the MultiRowRangeFilter will be nice. In this filter, the ranges will be sorted and merged, so users do not have to take care of ranges are not continuous. And if users are using something like rest, thrift or pig to access the data the filter might be the practical solution.
19598 * [HBASE-12268](https://issues.apache.org/jira/browse/HBASE-12268) | *Major* | **Add support for Scan.setRowPrefixFilter to shell**
19600 Added new option, ROWPREFIXFILTER, to the scan command in the HBase shell to easily scan for a specific row prefix.
19605 * [HBASE-12775](https://issues.apache.org/jira/browse/HBASE-12775) | *Major* | **CompressionTest ate my HFile (sigh!)**
19607 CompressionTest will now abort when the target path exists.
19612 * [HBASE-12695](https://issues.apache.org/jira/browse/HBASE-12695) | *Critical* | **JDK 1.8 compilation broken**
19614 Use the -Pjavac maven profile in order to compile HBase using the compiler provided by the JDK instead of the default error-prone compiler plugin. This is useful for now if you are building HBase with JDK 1.8 or a JDK that doesn't support error-prone.
19619 * [HBASE-10201](https://issues.apache.org/jira/browse/HBASE-10201) | *Major* | **Port 'Make flush decisions per column family' to trunk**
19621 Adds new flushing policy mechanism. Default, org.apache.hadoop.hbase.regionserver.FlushLargeStoresPolicy, will try to avoid flushing out the small column families in a region, those whose memstores are \< hbase.hregion.percolumnfamilyflush.size.lower.bound. To restore the old behavior of flushes writing out all column families, set hbase.regionserver.flush.policy to org.apache.hadoop.hbase.regionserver.FlushAllStoresPolicy either in hbase-default.xml or on a per-table basis by setting the policy to use with HTableDescriptor.getFlushPolicyClassName().
19626 * [HBASE-12559](https://issues.apache.org/jira/browse/HBASE-12559) | *Major* | **Provide LoadBalancer with online configuration capability**
19628 updateConfiguration(ServerName server) method of Admin now updates config for HMaster as well.
19629 Specifically, config update would be taken by load balancer.
19634 * [HBASE-10378](https://issues.apache.org/jira/browse/HBASE-10378) | *Major* | **Divide HLog interface into User and Implementor specific interfaces**
19636 HBase internals for the write ahead log have been refactored. Advanced users of HBase should be aware of the following changes.
19638 Public Audience
19639   - The Admin API for asking a region server to roll WAL files has changed from a synchronous command that returns a set of regions the WAL implementation would like flushed into an asynchronous command that returns nothing. Older clients relying on the former behavior will still be able to interact with newer servers, but the response body will always contain an empty list of regions to flush.
19640   - The shell command "hlog\_roll" has been deprecated. Operators should use the "wal\_roll" command instead. This command is subject to the changes described above for the Admin API to roll WAL files.
19641   - The command for analyzing write ahead logs has been renamed from 'hlog' to 'wal'. The old usage is deprecated and will be removed in a future version.
19642   - Some utility methods in the HBaseTesetingUtility related to testing write-ahead-logs were changed in incompatible ways. No functionality has been removed, but method names and arguments have changed. See the HBaseTestingUtility javadoc for details.
19643   - The WALPlayer utility has deprecated the configuration keys used for advanced customization. Users should switch to the updated configuration keys. See the usage information on the WALPlayer tool for details.
19644   - The HLogInputFormat utility class for processing logs with MapReduce has been deprecated and will be removed in a future version. Users should switch to the WALInputFormat.
19645   - The labeling of server metrics on the region server status pages changed. Previously, the number of backing files for the write ahead log was labeled 'Num. HLog Files'. If you wish to see this statistic now, please look for the label 'Num. WAL Files.'  If you rely on JMX for these metrics, their location has not changed.
19647 LimitedPrivate(COPROC) Audience, LimitedPrivate(PHOENIX)
19648   - The RegionObserver API has been updated. The changes are both binary and source backwards compatible for coprocessors that use the BaseRegionObserver class. For those that implement RegionObserver directly the changes are binary backwards compatible. Depending on the internals of future HBase versions, coprocessors using the deprecated API may not see all WAL related events. Users are strongly encouraged to update their use of the API; see the RegionObserver javadoc for details.
19649   - Classes related to reading WAL entries (ReaderBase, ProtobufLogReader, SequenceFileLogReader) have changed in a backwards incompatible way. Users who referenced HLog.Reader directly or HLog.Entry will have to update. These changes do not impact compatibility with extant wal files.
19650   - The WALObserver API has been updated. The changes are both binary and source backwards compatible for coprocessors that use the BaseWALObserver class. For those that implement WALObserver directly the changes are binary backwards compatible. Depending on the internals of future HBase versions, coprocessors using the deprecated API may not see all WAL related events. Users are strongly encouraged to update their use of the API; see the WALObserver javadoc for details.
19651  - The WALCoprocessorEnvironment  has changed in a backwards incompatible way. WALObserver coprocessors that relied on retrieving an object representing the write ahead log instance will have to be updated.
19653 LimitedPrivate(REPLICATION) Audience
19654  - The WALEntryFilter API has changed in a backwards incompatible way. Implementers will have to be updated.
19655  - The ReplicationEndpoint.ReplicateContext API has changed in a backwards incompatible way. Implementers who use this interface will have to be updated. These changes do not impact wire compatibility for replicating between clusters.
19656  - The HLogKey API is deprecated in favor of the WALKey API. Additionally, the HLogKey API has changed in a backwards incompatible way by changing from implementing WriteableComparable\<HLogKey\> to implementing Writeable and Comparable\<WALKey\>.
19661 * [HBASE-11683](https://issues.apache.org/jira/browse/HBASE-11683) | *Major* | **Metrics for MOB**
19663 Adds new mob related metrics:
19665 mobCompactedIntoMobCellsCount
19666 mobCompactedIntoMobCellsSize
19667 mobCompactedFromMobCellsCount
19668 mobCompactedFromMobCellsSize
19669 mobFlushCount
19670 mobFlushedCellsCount
19671 mobFlushedCellsSize
19672 mobScanCellsCount
19673 mobScanCellsSize
19674 mobFileCacheAccessCount
19675 mobFileCacheMissCount
19676 mobFileCacheHitPercent
19677 mobFileCacheEvictedCount
19678 mobFileCacheCount
19683 * [HBASE-11912](https://issues.apache.org/jira/browse/HBASE-11912) | *Major* | **Catch some bad practices at compile time with error-prone**
19685 Errors from error-prone will fail the build in the compile phase. Warnings look like Javac warnings and are counted as such by test-patch etc
19690 * [HBASE-12220](https://issues.apache.org/jira/browse/HBASE-12220) | *Major* | **Add hedgedReads and hedgedReadWins metrics**
19692 Adds metrics hedgedReads and hedgedReadWins counts.
19697 * [HBASE-6290](https://issues.apache.org/jira/browse/HBASE-6290) | *Minor* | **Add a function a mark a server as dead and start the recovery the process**
19699 Adds a script to mark a server as dead.
19701 Usage: considerAsDead.sh --hostname serverName
19706 * [HBASE-12111](https://issues.apache.org/jira/browse/HBASE-12111) | *Major* | **Remove deprecated APIs from Mutation(s)**
19708 Removed the below from hbase-2 (were deprecated on release of hbase-1.0.0)
19710 Mutation setWriteToWAL(boolean)
19711 boolean getWriteToWAL()
19712 Mutation setFamilyMap(NavigableMap\<byte [], List\<KeyValue\>\>)
19713 NavigableMap\<byte [], List\<KeyValue\>\> getFamilyMap()
19718 * [HBASE-12084](https://issues.apache.org/jira/browse/HBASE-12084) | *Major* | **Remove deprecated APIs from Result**
19720 The below KeyValue based APIs are removed from Result
19721 KeyValue[] raw() 
19722 List\<KeyValue\> list()
19723 List\<KeyValue\> getColumn(byte [] family, byte [] qualifier)
19724 KeyValue getColumnLatest(byte [] family, byte [] qualifier)
19725 KeyValue getColumnLatest(byte [] family, int foffset, int flength, byte [] qualifier, int qoffset, int qlength)
19727 They are replaced with
19728 Cell[] rawCells()
19729 List\<Cell\> listCells()
19730 List\<Cell\> getColumnCells(byte [] family, byte [] qualifier)
19731 Cell getColumnLatestCell(byte [] family, byte [] qualifier)
19732 Cell getColumnLatestCell(byte [] family, int foffset, int flength, byte [] qualifier, int qoffset, int qlength)
19733 respectively
19735 Also the constructors which were taking KeyValues also removed
19736 Result(KeyValue [] cells) 
19737 Result(List\<KeyValue\> kvs)
19742 * [HBASE-12048](https://issues.apache.org/jira/browse/HBASE-12048) | *Major* | **Remove deprecated APIs from Filter**
19744 The following APIs are removed from Filter
19745 KeyValue transform(KeyValue)
19746 KeyValue getNextKeyHint(KeyValue)
19747 and replaced with 
19748 Cell transformCell(Cell)
19749 Cell getNextCellHint(Cell)
19750 respectively.
19751 If a custom Filter implementation have overridden any of these methods, we will no longer call them. User has to change the custom Filter to override cell based methods as shown above
19756 * [HBASE-7767](https://issues.apache.org/jira/browse/HBASE-7767) | *Major* | **Get rid of ZKTable, and table enable/disable state in ZK**
19758 Keeps table enabled/disabled state in HDFS rather than up in ZooKeeper.  Auto-migrates any existing zk state.
19763 * [HBASE-11911](https://issues.apache.org/jira/browse/HBASE-11911) | *Major* | **Break up tests into more fine grained categories**
19765 Adds new test categories besides the class smalltests, mediumtests, and largetests.  Adds:
19767 ClientTests
19768 CoprocessorTests
19769 FilterTests
19770 FlakeyTests
19771 IOTests
19772 MapReduceTests
19773 MasterTests
19774 MiscTests
19775 RegionServerTests
19776 ReplicationTests
19777 RestTests
19778 SecurityTests
19779 VerySlowMapReduceTests
19780 VerySlowRegionServerTests
19782 See description for examples on how to use them.
19787 * [HBASE-11658](https://issues.apache.org/jira/browse/HBASE-11658) | *Major* | **Piped commands to hbase shell should return non-zero if shell command failed.**
19789 Adds a noninteractive mode (-n or --noninteractive) to the hbase shell that exits with a non-zero error code on failed or invalid shell command executions, and exits with a zero error code upon successful execution.
19794 * [HBASE-11640](https://issues.apache.org/jira/browse/HBASE-11640) | *Major* | **Add syntax highlighting support to HBase Ref Guide programlistings**
19796 This got committed, so I guess it is safe to resolve it?
19801 * [HBASE-11606](https://issues.apache.org/jira/browse/HBASE-11606) | *Minor* | **Enable ZK-less region assignment by default**
19803 By default, we don't use ZK for region assignment now. To fall back to the old way, you can set hbase.assignment.usezk to true.
19808 * [HBASE-3135](https://issues.apache.org/jira/browse/HBASE-3135) | *Major* | **Make our MR jobs implement Tool and use ToolRunner so can do -D trickery, etc.**
19810 All MR jobs implement Tool Interface, http://hadoop.apache.org/docs/current/api/org/apache/hadoop/util/Tool.html, so now you can pass properties on command line with the -D flag, etc.
19815 * [HBASE-11556](https://issues.apache.org/jira/browse/HBASE-11556) | *Major* | **Move HTablePool to hbase-thrift module.**
19817 HTablePool was deprecated in 0.98.1 but was still present and usable by apps built against versions before HBase 2.0.  It has been moved and is not intended to be used by user applications, and is now an internal part of the thrift2 proxy server only.
19822 * [HBASE-11548](https://issues.apache.org/jira/browse/HBASE-11548) | *Trivial* | **[PE] Add 'cycling' test N times and unit tests for size/zipf/valueSize calculations**
19824 Adds --cycles=N argument.
19829 * [HBASE-11344](https://issues.apache.org/jira/browse/HBASE-11344) | *Major* | **Hide row keys and such from the web UIs**
19831 Configure "hbase.display.keys" to false (default: true) in the master/regionservers if the row-keys should be hidden in the webUIs (like in the webUI for table details).
19836 * [HBASE-6580](https://issues.apache.org/jira/browse/HBASE-6580) | *Major* | **Deprecate HTablePool in favor of HConnection.getTable(...)**
19838 This issue introduces a few new APIs:
19839 \* HConnectionManager:
19840 {code}
19841     public static HConnection createConnection(Configuration conf)
19842     public static HConnection createConnection(Configuration conf, ExecutorService pool)
19843 {code}
19844 \* HConnection:
19845 {code}
19846     public HTableInterface getTable(String tableName) throws IOException
19847     public HTableInterface getTable(byte[] tableName) throws IOException
19848     public HTableInterface getTable(String tableName, ExecutorService pool) throws IOException
19849     public HTableInterface getTable(byte[] tableName, ExecutorService pool) throws IOException
19850 {code}
19852 By default HConnectionImplementation will create an ExecutorService when needed. The ExecutorService can optionally passed be passed in.
19853 HTableInterfaces are retrieved from the HConnection. By default the HConnection's ExecutorService is used, but optionally that can be overridden for each HTable.
19858 * [HBASE-8450](https://issues.apache.org/jira/browse/HBASE-8450) | *Critical* | **Update hbase-default.xml and general recommendations to better suit current hw, h2, experience, etc.**
19860 Changed defaults:
19862 + max versions now 1 instead of 3
19863 + row blooms on by default (except on .META. table)
19864 + handlers 30 instead of 10
19865 + upped memstore lower limit from .35 to .38
19866 + zookeeper timeout default is 90seconds instead of 180
19867 + client pause is 100ms instead of 1000ms
19868 + retries are now 20 instead of 10 (so overall we still wait same amount of time)
19869 + bulkload retries is 10 instead of infinite
19870 + major compactions are now once a week instead of once every 24 hours; they are staggered so all regionservers do not start compacting at the same time
19871 + blockingstorefiles is 10 instead of 7
19872 + block cache is 0.4 instead of 0.25
19873 + Previous, default for hbase.rootdir was /tmp/hbase-${user.name}.  Now it is ${java.io.tmpdir}/hbase-${user.name} which is usually the same location but may not be (on macos, it points to /var/tmp....).
19878 * [HBASE-4072](https://issues.apache.org/jira/browse/HBASE-4072) | *Major* | **Deprecate/disable and remove support for reading ZooKeeper zoo.cfg files from the classpath**
19880 The Apache ZooKeeper config file zoo.cfg will no longer be read when instantiating a HBaseConfiguration object, as it causes various inconsistency issues. Instead, users have to specify all HBase-relevant ZooKeeper properties in the hbase-site.xml using the various "hbase.zookeeper" prefixed properties. For example, specify "hbase.zookeeper.quorum" to provide a ZK quorum server list.
19882 To enable zoo.cfg reading, for which support may be removed in a future release, set the property "hbase.config.read.zookeeper.config" to true in the hbase-site.xml at the client and servers like so:
19884 \<property\>
19885   \<name\>hbase.config.read.zookeeper.config\</name\>
19886   \<value\>true\</value\>
19887   \<description\>
19888         Set to true to allow HBaseConfiguration to read the
19889         zoo.cfg file for ZooKeeper properties. Switching this to true
19890         is not recommended, since the functionality of reading ZK
19891         properties from a zoo.cfg file has been deprecated.
19892   \</description\>
19893 \</property\>