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

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

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

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


The following commit(s) were added to refs/heads/asf-site by this push:
     new 7dd9d2e2976 Published site at c2de8a425afd4b7f36fcbb825481c7c178b067a1.
7dd9d2e2976 is described below

commit 7dd9d2e29761bcd5dba15d74d4fc0179de9e7ab7
Author: HBase <de...@hbase.apache.org>
AuthorDate: Thu Oct 8 23:51:11 2026 +0000

    Published site at c2de8a425afd4b7f36fcbb825481c7c178b067a1.
---
 .../hbase/quotas/RegionServerRpcQuotaManager.html  | 212 +++----
 books/apache-hbase-reference-guide-dark-mode.pdf   | Bin 38930041 -> 38930038 bytes
 books/apache-hbase-reference-guide.pdf             | Bin 38819809 -> 38819808 bytes
 checkstyle-aggregate.html                          |   2 +-
 dependency-convergence.html                        |   2 +-
 dependency-info.html                               |   2 +-
 dependency-management.html                         |   2 +-
 .../hbase/quotas/RegionServerRpcQuotaManager.html  |   6 +-
 .../hbase/quotas/RegionServerRpcQuotaManager.html  | 212 +++----
 hbase-website/dependency-convergence.html          |   2 +-
 hbase-website/dependency-info.html                 |   2 +-
 hbase-website/dependency-management.html           |   2 +-
 hbase-website/index.html                           |   2 +-
 hbase-website/issue-management.html                |   2 +-
 hbase-website/licenses.html                        |   2 +-
 hbase-website/mailing-lists.html                   |   2 +-
 hbase-website/plugin-management.html               |   2 +-
 hbase-website/plugins.html                         |   2 +-
 hbase-website/project-info.html                    |   2 +-
 hbase-website/scm.html                             |   2 +-
 hbase-website/summary.html                         |   2 +-
 hbase-website/team.html                            |   2 +-
 issue-management.html                              |   2 +-
 licenses.html                                      |   2 +-
 mailing-lists.html                                 |   2 +-
 plugin-management.html                             |   2 +-
 plugins.html                                       |   2 +-
 project-info.html                                  |   2 +-
 project-reports.html                               |   2 +-
 scm.html                                           |   2 +-
 summary.html                                       |   2 +-
 team.html                                          |   2 +-
 testapidocs/index-all.html                         |   2 +
 testapidocs/member-search-index.js                 |   2 +-
 .../hadoop/hbase/quotas/TestAtomicReadQuota.html   | 616 +++++++++++----------
 testdevapidocs/index-all.html                      |   2 +
 testdevapidocs/member-search-index.js              |   2 +-
 .../TestAtomicReadQuota.ThrowingFunction.html      |   4 +-
 .../hadoop/hbase/quotas/TestAtomicReadQuota.html   |  97 ++--
 .../TestAtomicReadQuota.ThrowingFunction.html      | 616 +++++++++++----------
 .../hadoop/hbase/quotas/TestAtomicReadQuota.html   | 616 +++++++++++----------
 41 files changed, 1308 insertions(+), 1133 deletions(-)

diff --git a/apidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html b/apidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
index 1e52182eb0b..a3cfca5fbb2 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
@@ -194,109 +194,115 @@
 <span class="source-line-no">181</span><span id="line-181">    final ClientProtos.ScanRequest scanRequest, long maxScannerResultSize,</span>
 <span class="source-line-no">182</span><span id="line-182">    long maxBlockBytesScanned, long prevBlockBytesScannedDifference)</span>
 <span class="source-line-no">183</span><span id="line-183">    throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">184</span><span id="line-184">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
-<span class="source-line-no">185</span><span id="line-185">    UserGroupInformation ugi;</span>
-<span class="source-line-no">186</span><span id="line-186">    if (user.isPresent()) {</span>
-<span class="source-line-no">187</span><span id="line-187">      ugi = user.get().getUGI();</span>
-<span class="source-line-no">188</span><span id="line-188">    } else {</span>
-<span class="source-line-no">189</span><span id="line-189">      ugi = User.getCurrent().getUGI();</span>
-<span class="source-line-no">190</span><span id="line-190">    }</span>
-<span class="source-line-no">191</span><span id="line-191">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
-<span class="source-line-no">192</span><span id="line-192">    TableName table = tableDescriptor.getTableName();</span>
-<span class="source-line-no">193</span><span id="line-193"></span>
-<span class="source-line-no">194</span><span id="line-194">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
-<span class="source-line-no">195</span><span id="line-195">    try {</span>
-<span class="source-line-no">196</span><span id="line-196">      quota.checkScanQuota(scanRequest, maxScannerResultSize, maxBlockBytesScanned,</span>
-<span class="source-line-no">197</span><span id="line-197">        prevBlockBytesScannedDifference);</span>
-<span class="source-line-no">198</span><span id="line-198">    } catch (RpcThrottlingException e) {</span>
-<span class="source-line-no">199</span><span id="line-199">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table + " scan="</span>
-<span class="source-line-no">200</span><span id="line-200">        + scanRequest.getScannerId() + ": " + e.getMessage());</span>
-<span class="source-line-no">201</span><span id="line-201"></span>
-<span class="source-line-no">202</span><span id="line-202">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
-<span class="source-line-no">203</span><span id="line-203">        table.getNameAsString());</span>
-<span class="source-line-no">204</span><span id="line-204"></span>
-<span class="source-line-no">205</span><span id="line-205">      throw e;</span>
-<span class="source-line-no">206</span><span id="line-206">    }</span>
-<span class="source-line-no">207</span><span id="line-207">    return quota;</span>
-<span class="source-line-no">208</span><span id="line-208">  }</span>
-<span class="source-line-no">209</span><span id="line-209"></span>
-<span class="source-line-no">210</span><span id="line-210">  @Override</span>
-<span class="source-line-no">211</span><span id="line-211">  public OperationQuota checkBatchQuota(final Region region,</span>
-<span class="source-line-no">212</span><span id="line-212">    final OperationQuota.OperationType type) throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">213</span><span id="line-213">    switch (type) {</span>
-<span class="source-line-no">214</span><span id="line-214">      case GET:</span>
-<span class="source-line-no">215</span><span id="line-215">        return this.checkBatchQuota(region, 0, 1, false);</span>
-<span class="source-line-no">216</span><span id="line-216">      case MUTATE:</span>
-<span class="source-line-no">217</span><span id="line-217">        return this.checkBatchQuota(region, 1, 0, false);</span>
-<span class="source-line-no">218</span><span id="line-218">      case CHECK_AND_MUTATE:</span>
-<span class="source-line-no">219</span><span id="line-219">        return this.checkBatchQuota(region, 1, 1, true);</span>
-<span class="source-line-no">220</span><span id="line-220">    }</span>
-<span class="source-line-no">221</span><span id="line-221">    throw new RuntimeException("Invalid operation type: " + type);</span>
-<span class="source-line-no">222</span><span id="line-222">  }</span>
-<span class="source-line-no">223</span><span id="line-223"></span>
-<span class="source-line-no">224</span><span id="line-224">  @Override</span>
-<span class="source-line-no">225</span><span id="line-225">  public OperationQuota checkBatchQuota(final Region region,</span>
-<span class="source-line-no">226</span><span id="line-226">    final List&lt;ClientProtos.Action&gt; actions, boolean hasCondition)</span>
-<span class="source-line-no">227</span><span id="line-227">    throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">228</span><span id="line-228">    int numWrites = 0;</span>
-<span class="source-line-no">229</span><span id="line-229">    int numReads = 0;</span>
-<span class="source-line-no">230</span><span id="line-230">    boolean isAtomic = false;</span>
-<span class="source-line-no">231</span><span id="line-231">    for (final ClientProtos.Action action : actions) {</span>
-<span class="source-line-no">232</span><span id="line-232">      if (action.hasMutation()) {</span>
-<span class="source-line-no">233</span><span id="line-233">        numWrites++;</span>
-<span class="source-line-no">234</span><span id="line-234">        OperationQuota.OperationType operationType =</span>
-<span class="source-line-no">235</span><span id="line-235">          QuotaUtil.getQuotaOperationType(action, hasCondition);</span>
-<span class="source-line-no">236</span><span id="line-236">        if (operationType == OperationQuota.OperationType.CHECK_AND_MUTATE) {</span>
-<span class="source-line-no">237</span><span id="line-237">          numReads++;</span>
-<span class="source-line-no">238</span><span id="line-238">          // If any mutations in this batch are atomic, we will count the entire batch as atomic.</span>
-<span class="source-line-no">239</span><span id="line-239">          // This is a conservative approach, but it is the best that we can do without knowing</span>
-<span class="source-line-no">240</span><span id="line-240">          // the block bytes scanned of each individual action.</span>
-<span class="source-line-no">241</span><span id="line-241">          isAtomic = true;</span>
-<span class="source-line-no">242</span><span id="line-242">        }</span>
-<span class="source-line-no">243</span><span id="line-243">      } else if (action.hasGet()) {</span>
-<span class="source-line-no">244</span><span id="line-244">        numReads++;</span>
-<span class="source-line-no">245</span><span id="line-245">      }</span>
-<span class="source-line-no">246</span><span id="line-246">    }</span>
-<span class="source-line-no">247</span><span id="line-247">    return checkBatchQuota(region, numWrites, numReads, isAtomic);</span>
-<span class="source-line-no">248</span><span id="line-248">  }</span>
-<span class="source-line-no">249</span><span id="line-249"></span>
-<span class="source-line-no">250</span><span id="line-250">  /**</span>
-<span class="source-line-no">251</span><span id="line-251">   * Check the quota for the current (rpc-context) user. Returns the OperationQuota used to get the</span>
-<span class="source-line-no">252</span><span id="line-252">   * available quota and to report the data/usage of the operation.</span>
-<span class="source-line-no">253</span><span id="line-253">   * @param region    the region where the operation will be performed</span>
-<span class="source-line-no">254</span><span id="line-254">   * @param numWrites number of writes to perform</span>
-<span class="source-line-no">255</span><span id="line-255">   * @param numReads  number of short-reads to perform</span>
-<span class="source-line-no">256</span><span id="line-256">   * @return the OperationQuota</span>
-<span class="source-line-no">257</span><span id="line-257">   * @throws RpcThrottlingException if the operation cannot be executed due to quota exceeded.</span>
-<span class="source-line-no">258</span><span id="line-258">   */</span>
-<span class="source-line-no">259</span><span id="line-259">  @Override</span>
-<span class="source-line-no">260</span><span id="line-260">  public OperationQuota checkBatchQuota(final Region region, final int numWrites,</span>
-<span class="source-line-no">261</span><span id="line-261">    final int numReads, boolean isAtomic) throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">262</span><span id="line-262">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
-<span class="source-line-no">263</span><span id="line-263">    UserGroupInformation ugi;</span>
-<span class="source-line-no">264</span><span id="line-264">    if (user.isPresent()) {</span>
-<span class="source-line-no">265</span><span id="line-265">      ugi = user.get().getUGI();</span>
-<span class="source-line-no">266</span><span id="line-266">    } else {</span>
-<span class="source-line-no">267</span><span id="line-267">      ugi = User.getCurrent().getUGI();</span>
-<span class="source-line-no">268</span><span id="line-268">    }</span>
-<span class="source-line-no">269</span><span id="line-269">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
-<span class="source-line-no">270</span><span id="line-270">    TableName table = tableDescriptor.getTableName();</span>
-<span class="source-line-no">271</span><span id="line-271"></span>
-<span class="source-line-no">272</span><span id="line-272">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
-<span class="source-line-no">273</span><span id="line-273">    try {</span>
-<span class="source-line-no">274</span><span id="line-274">      quota.checkBatchQuota(numWrites, numReads, isAtomic);</span>
-<span class="source-line-no">275</span><span id="line-275">    } catch (RpcThrottlingException e) {</span>
-<span class="source-line-no">276</span><span id="line-276">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table</span>
-<span class="source-line-no">277</span><span id="line-277">        + " numWrites=" + numWrites + " numReads=" + numReads + ": " + e.getMessage());</span>
-<span class="source-line-no">278</span><span id="line-278"></span>
-<span class="source-line-no">279</span><span id="line-279">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
-<span class="source-line-no">280</span><span id="line-280">        table.getNameAsString());</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">      throw e;</span>
-<span class="source-line-no">283</span><span id="line-283">    }</span>
-<span class="source-line-no">284</span><span id="line-284">    return quota;</span>
-<span class="source-line-no">285</span><span id="line-285">  }</span>
-<span class="source-line-no">286</span><span id="line-286">}</span>
+<span class="source-line-no">184</span><span id="line-184">    if (</span>
+<span class="source-line-no">185</span><span id="line-185">      scanRequest.hasScannerId() &amp;&amp; scanRequest.getCloseScanner()</span>
+<span class="source-line-no">186</span><span id="line-186">        &amp;&amp; scanRequest.getNumberOfRows() == 0 &amp;&amp; !scanRequest.getRenew()</span>
+<span class="source-line-no">187</span><span id="line-187">    ) {</span>
+<span class="source-line-no">188</span><span id="line-188">      return NoopOperationQuota.get();</span>
+<span class="source-line-no">189</span><span id="line-189">    }</span>
+<span class="source-line-no">190</span><span id="line-190">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
+<span class="source-line-no">191</span><span id="line-191">    UserGroupInformation ugi;</span>
+<span class="source-line-no">192</span><span id="line-192">    if (user.isPresent()) {</span>
+<span class="source-line-no">193</span><span id="line-193">      ugi = user.get().getUGI();</span>
+<span class="source-line-no">194</span><span id="line-194">    } else {</span>
+<span class="source-line-no">195</span><span id="line-195">      ugi = User.getCurrent().getUGI();</span>
+<span class="source-line-no">196</span><span id="line-196">    }</span>
+<span class="source-line-no">197</span><span id="line-197">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
+<span class="source-line-no">198</span><span id="line-198">    TableName table = tableDescriptor.getTableName();</span>
+<span class="source-line-no">199</span><span id="line-199"></span>
+<span class="source-line-no">200</span><span id="line-200">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
+<span class="source-line-no">201</span><span id="line-201">    try {</span>
+<span class="source-line-no">202</span><span id="line-202">      quota.checkScanQuota(scanRequest, maxScannerResultSize, maxBlockBytesScanned,</span>
+<span class="source-line-no">203</span><span id="line-203">        prevBlockBytesScannedDifference);</span>
+<span class="source-line-no">204</span><span id="line-204">    } catch (RpcThrottlingException e) {</span>
+<span class="source-line-no">205</span><span id="line-205">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table + " scan="</span>
+<span class="source-line-no">206</span><span id="line-206">        + scanRequest.getScannerId() + ": " + e.getMessage());</span>
+<span class="source-line-no">207</span><span id="line-207"></span>
+<span class="source-line-no">208</span><span id="line-208">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
+<span class="source-line-no">209</span><span id="line-209">        table.getNameAsString());</span>
+<span class="source-line-no">210</span><span id="line-210"></span>
+<span class="source-line-no">211</span><span id="line-211">      throw e;</span>
+<span class="source-line-no">212</span><span id="line-212">    }</span>
+<span class="source-line-no">213</span><span id="line-213">    return quota;</span>
+<span class="source-line-no">214</span><span id="line-214">  }</span>
+<span class="source-line-no">215</span><span id="line-215"></span>
+<span class="source-line-no">216</span><span id="line-216">  @Override</span>
+<span class="source-line-no">217</span><span id="line-217">  public OperationQuota checkBatchQuota(final Region region,</span>
+<span class="source-line-no">218</span><span id="line-218">    final OperationQuota.OperationType type) throws IOException, RpcThrottlingException {</span>
+<span class="source-line-no">219</span><span id="line-219">    switch (type) {</span>
+<span class="source-line-no">220</span><span id="line-220">      case GET:</span>
+<span class="source-line-no">221</span><span id="line-221">        return this.checkBatchQuota(region, 0, 1, false);</span>
+<span class="source-line-no">222</span><span id="line-222">      case MUTATE:</span>
+<span class="source-line-no">223</span><span id="line-223">        return this.checkBatchQuota(region, 1, 0, false);</span>
+<span class="source-line-no">224</span><span id="line-224">      case CHECK_AND_MUTATE:</span>
+<span class="source-line-no">225</span><span id="line-225">        return this.checkBatchQuota(region, 1, 1, true);</span>
+<span class="source-line-no">226</span><span id="line-226">    }</span>
+<span class="source-line-no">227</span><span id="line-227">    throw new RuntimeException("Invalid operation type: " + type);</span>
+<span class="source-line-no">228</span><span id="line-228">  }</span>
+<span class="source-line-no">229</span><span id="line-229"></span>
+<span class="source-line-no">230</span><span id="line-230">  @Override</span>
+<span class="source-line-no">231</span><span id="line-231">  public OperationQuota checkBatchQuota(final Region region,</span>
+<span class="source-line-no">232</span><span id="line-232">    final List&lt;ClientProtos.Action&gt; actions, boolean hasCondition)</span>
+<span class="source-line-no">233</span><span id="line-233">    throws IOException, RpcThrottlingException {</span>
+<span class="source-line-no">234</span><span id="line-234">    int numWrites = 0;</span>
+<span class="source-line-no">235</span><span id="line-235">    int numReads = 0;</span>
+<span class="source-line-no">236</span><span id="line-236">    boolean isAtomic = false;</span>
+<span class="source-line-no">237</span><span id="line-237">    for (final ClientProtos.Action action : actions) {</span>
+<span class="source-line-no">238</span><span id="line-238">      if (action.hasMutation()) {</span>
+<span class="source-line-no">239</span><span id="line-239">        numWrites++;</span>
+<span class="source-line-no">240</span><span id="line-240">        OperationQuota.OperationType operationType =</span>
+<span class="source-line-no">241</span><span id="line-241">          QuotaUtil.getQuotaOperationType(action, hasCondition);</span>
+<span class="source-line-no">242</span><span id="line-242">        if (operationType == OperationQuota.OperationType.CHECK_AND_MUTATE) {</span>
+<span class="source-line-no">243</span><span id="line-243">          numReads++;</span>
+<span class="source-line-no">244</span><span id="line-244">          // If any mutations in this batch are atomic, we will count the entire batch as atomic.</span>
+<span class="source-line-no">245</span><span id="line-245">          // This is a conservative approach, but it is the best that we can do without knowing</span>
+<span class="source-line-no">246</span><span id="line-246">          // the block bytes scanned of each individual action.</span>
+<span class="source-line-no">247</span><span id="line-247">          isAtomic = true;</span>
+<span class="source-line-no">248</span><span id="line-248">        }</span>
+<span class="source-line-no">249</span><span id="line-249">      } else if (action.hasGet()) {</span>
+<span class="source-line-no">250</span><span id="line-250">        numReads++;</span>
+<span class="source-line-no">251</span><span id="line-251">      }</span>
+<span class="source-line-no">252</span><span id="line-252">    }</span>
+<span class="source-line-no">253</span><span id="line-253">    return checkBatchQuota(region, numWrites, numReads, isAtomic);</span>
+<span class="source-line-no">254</span><span id="line-254">  }</span>
+<span class="source-line-no">255</span><span id="line-255"></span>
+<span class="source-line-no">256</span><span id="line-256">  /**</span>
+<span class="source-line-no">257</span><span id="line-257">   * Check the quota for the current (rpc-context) user. Returns the OperationQuota used to get the</span>
+<span class="source-line-no">258</span><span id="line-258">   * available quota and to report the data/usage of the operation.</span>
+<span class="source-line-no">259</span><span id="line-259">   * @param region    the region where the operation will be performed</span>
+<span class="source-line-no">260</span><span id="line-260">   * @param numWrites number of writes to perform</span>
+<span class="source-line-no">261</span><span id="line-261">   * @param numReads  number of short-reads to perform</span>
+<span class="source-line-no">262</span><span id="line-262">   * @return the OperationQuota</span>
+<span class="source-line-no">263</span><span id="line-263">   * @throws RpcThrottlingException if the operation cannot be executed due to quota exceeded.</span>
+<span class="source-line-no">264</span><span id="line-264">   */</span>
+<span class="source-line-no">265</span><span id="line-265">  @Override</span>
+<span class="source-line-no">266</span><span id="line-266">  public OperationQuota checkBatchQuota(final Region region, final int numWrites,</span>
+<span class="source-line-no">267</span><span id="line-267">    final int numReads, boolean isAtomic) throws IOException, RpcThrottlingException {</span>
+<span class="source-line-no">268</span><span id="line-268">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
+<span class="source-line-no">269</span><span id="line-269">    UserGroupInformation ugi;</span>
+<span class="source-line-no">270</span><span id="line-270">    if (user.isPresent()) {</span>
+<span class="source-line-no">271</span><span id="line-271">      ugi = user.get().getUGI();</span>
+<span class="source-line-no">272</span><span id="line-272">    } else {</span>
+<span class="source-line-no">273</span><span id="line-273">      ugi = User.getCurrent().getUGI();</span>
+<span class="source-line-no">274</span><span id="line-274">    }</span>
+<span class="source-line-no">275</span><span id="line-275">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
+<span class="source-line-no">276</span><span id="line-276">    TableName table = tableDescriptor.getTableName();</span>
+<span class="source-line-no">277</span><span id="line-277"></span>
+<span class="source-line-no">278</span><span id="line-278">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
+<span class="source-line-no">279</span><span id="line-279">    try {</span>
+<span class="source-line-no">280</span><span id="line-280">      quota.checkBatchQuota(numWrites, numReads, isAtomic);</span>
+<span class="source-line-no">281</span><span id="line-281">    } catch (RpcThrottlingException e) {</span>
+<span class="source-line-no">282</span><span id="line-282">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table</span>
+<span class="source-line-no">283</span><span id="line-283">        + " numWrites=" + numWrites + " numReads=" + numReads + ": " + e.getMessage());</span>
+<span class="source-line-no">284</span><span id="line-284"></span>
+<span class="source-line-no">285</span><span id="line-285">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
+<span class="source-line-no">286</span><span id="line-286">        table.getNameAsString());</span>
+<span class="source-line-no">287</span><span id="line-287"></span>
+<span class="source-line-no">288</span><span id="line-288">      throw e;</span>
+<span class="source-line-no">289</span><span id="line-289">    }</span>
+<span class="source-line-no">290</span><span id="line-290">    return quota;</span>
+<span class="source-line-no">291</span><span id="line-291">  }</span>
+<span class="source-line-no">292</span><span id="line-292">}</span>
 
 
 
diff --git a/books/apache-hbase-reference-guide-dark-mode.pdf b/books/apache-hbase-reference-guide-dark-mode.pdf
index 37f0252395b..b303e204631 100644
Binary files a/books/apache-hbase-reference-guide-dark-mode.pdf and b/books/apache-hbase-reference-guide-dark-mode.pdf differ
diff --git a/books/apache-hbase-reference-guide.pdf b/books/apache-hbase-reference-guide.pdf
index 52f320ac59c..68fd233aefb 100644
Binary files a/books/apache-hbase-reference-guide.pdf and b/books/apache-hbase-reference-guide.pdf differ
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 1b3828a3bad..dd3f0d58b67 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:checkstyle-aggregate at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-checkstyle-plugin:3.6.0:checkstyle-aggregate at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/dependency-convergence.html b/dependency-convergence.html
index 2528a291048..71fba4b76b2 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/dependency-info.html b/dependency-info.html
index 7da31f04695..7193dfd3ac3 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/dependency-management.html b/dependency-management.html
index 4f70d1563e0..149f5f996ca 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html b/devapidocs/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
index 53cf607f0f6..d95d12848d6 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
@@ -404,7 +404,7 @@ implements <a href="RpcQuotaManager.html" title="interface in org.apache.hadoop.
 <li>
 <section class="detail" id="checkBatchQuota(org.apache.hadoop.hbase.regionserver.Region,org.apache.hadoop.hbase.quotas.OperationQuota.OperationType)">
 <h3>checkBatchQuota</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html#line-210">checkBatchQuota</a></span><wbr><span class="parameters">(<a href="../regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regions [...]
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html#line-216">checkBatchQuota</a></span><wbr><span class="parameters">(<a href="../regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regions [...]
  <a href="OperationQuota.OperationType.html" title="enum class in org.apache.hadoop.hbase.quotas">OperationQuota.OperationType</a>&nbsp;type)</span>
                                throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
 <a href="RpcThrottlingException.html" title="class in org.apache.hadoop.hbase.quotas">RpcThrottlingException</a></span></div>
@@ -430,7 +430,7 @@ implements <a href="RpcQuotaManager.html" title="interface in org.apache.hadoop.
 <li>
 <section class="detail" id="checkBatchQuota(org.apache.hadoop.hbase.regionserver.Region,java.util.List,boolean)">
 <h3>checkBatchQuota</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html#line-224">checkBatchQuota</a></span><wbr><span class="parameters">(<a href="../regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regions [...]
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html#line-230">checkBatchQuota</a></span><wbr><span class="parameters">(<a href="../regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regions [...]
  <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/List.html" title="class or interface in java.util" class="external-link">List</a>&lt;org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action&gt;&nbsp;actions,
  boolean&nbsp;hasCondition)</span>
                                throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a>,
@@ -458,7 +458,7 @@ implements <a href="RpcQuotaManager.html" title="interface in org.apache.hadoop.
 <li>
 <section class="detail" id="checkBatchQuota(org.apache.hadoop.hbase.regionserver.Region,int,int,boolean)">
 <h3>checkBatchQuota</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html#line-259">checkBatchQuota</a></span><wbr><span class="parameters">(<a href="../regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regions [...]
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html#line-265">checkBatchQuota</a></span><wbr><span class="parameters">(<a href="../regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regions [...]
  int&nbsp;numWrites,
  int&nbsp;numReads,
  boolean&nbsp;isAtomic)</span>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html b/devapidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
index 1e52182eb0b..a3cfca5fbb2 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/quotas/RegionServerRpcQuotaManager.html
@@ -194,109 +194,115 @@
 <span class="source-line-no">181</span><span id="line-181">    final ClientProtos.ScanRequest scanRequest, long maxScannerResultSize,</span>
 <span class="source-line-no">182</span><span id="line-182">    long maxBlockBytesScanned, long prevBlockBytesScannedDifference)</span>
 <span class="source-line-no">183</span><span id="line-183">    throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">184</span><span id="line-184">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
-<span class="source-line-no">185</span><span id="line-185">    UserGroupInformation ugi;</span>
-<span class="source-line-no">186</span><span id="line-186">    if (user.isPresent()) {</span>
-<span class="source-line-no">187</span><span id="line-187">      ugi = user.get().getUGI();</span>
-<span class="source-line-no">188</span><span id="line-188">    } else {</span>
-<span class="source-line-no">189</span><span id="line-189">      ugi = User.getCurrent().getUGI();</span>
-<span class="source-line-no">190</span><span id="line-190">    }</span>
-<span class="source-line-no">191</span><span id="line-191">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
-<span class="source-line-no">192</span><span id="line-192">    TableName table = tableDescriptor.getTableName();</span>
-<span class="source-line-no">193</span><span id="line-193"></span>
-<span class="source-line-no">194</span><span id="line-194">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
-<span class="source-line-no">195</span><span id="line-195">    try {</span>
-<span class="source-line-no">196</span><span id="line-196">      quota.checkScanQuota(scanRequest, maxScannerResultSize, maxBlockBytesScanned,</span>
-<span class="source-line-no">197</span><span id="line-197">        prevBlockBytesScannedDifference);</span>
-<span class="source-line-no">198</span><span id="line-198">    } catch (RpcThrottlingException e) {</span>
-<span class="source-line-no">199</span><span id="line-199">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table + " scan="</span>
-<span class="source-line-no">200</span><span id="line-200">        + scanRequest.getScannerId() + ": " + e.getMessage());</span>
-<span class="source-line-no">201</span><span id="line-201"></span>
-<span class="source-line-no">202</span><span id="line-202">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
-<span class="source-line-no">203</span><span id="line-203">        table.getNameAsString());</span>
-<span class="source-line-no">204</span><span id="line-204"></span>
-<span class="source-line-no">205</span><span id="line-205">      throw e;</span>
-<span class="source-line-no">206</span><span id="line-206">    }</span>
-<span class="source-line-no">207</span><span id="line-207">    return quota;</span>
-<span class="source-line-no">208</span><span id="line-208">  }</span>
-<span class="source-line-no">209</span><span id="line-209"></span>
-<span class="source-line-no">210</span><span id="line-210">  @Override</span>
-<span class="source-line-no">211</span><span id="line-211">  public OperationQuota checkBatchQuota(final Region region,</span>
-<span class="source-line-no">212</span><span id="line-212">    final OperationQuota.OperationType type) throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">213</span><span id="line-213">    switch (type) {</span>
-<span class="source-line-no">214</span><span id="line-214">      case GET:</span>
-<span class="source-line-no">215</span><span id="line-215">        return this.checkBatchQuota(region, 0, 1, false);</span>
-<span class="source-line-no">216</span><span id="line-216">      case MUTATE:</span>
-<span class="source-line-no">217</span><span id="line-217">        return this.checkBatchQuota(region, 1, 0, false);</span>
-<span class="source-line-no">218</span><span id="line-218">      case CHECK_AND_MUTATE:</span>
-<span class="source-line-no">219</span><span id="line-219">        return this.checkBatchQuota(region, 1, 1, true);</span>
-<span class="source-line-no">220</span><span id="line-220">    }</span>
-<span class="source-line-no">221</span><span id="line-221">    throw new RuntimeException("Invalid operation type: " + type);</span>
-<span class="source-line-no">222</span><span id="line-222">  }</span>
-<span class="source-line-no">223</span><span id="line-223"></span>
-<span class="source-line-no">224</span><span id="line-224">  @Override</span>
-<span class="source-line-no">225</span><span id="line-225">  public OperationQuota checkBatchQuota(final Region region,</span>
-<span class="source-line-no">226</span><span id="line-226">    final List&lt;ClientProtos.Action&gt; actions, boolean hasCondition)</span>
-<span class="source-line-no">227</span><span id="line-227">    throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">228</span><span id="line-228">    int numWrites = 0;</span>
-<span class="source-line-no">229</span><span id="line-229">    int numReads = 0;</span>
-<span class="source-line-no">230</span><span id="line-230">    boolean isAtomic = false;</span>
-<span class="source-line-no">231</span><span id="line-231">    for (final ClientProtos.Action action : actions) {</span>
-<span class="source-line-no">232</span><span id="line-232">      if (action.hasMutation()) {</span>
-<span class="source-line-no">233</span><span id="line-233">        numWrites++;</span>
-<span class="source-line-no">234</span><span id="line-234">        OperationQuota.OperationType operationType =</span>
-<span class="source-line-no">235</span><span id="line-235">          QuotaUtil.getQuotaOperationType(action, hasCondition);</span>
-<span class="source-line-no">236</span><span id="line-236">        if (operationType == OperationQuota.OperationType.CHECK_AND_MUTATE) {</span>
-<span class="source-line-no">237</span><span id="line-237">          numReads++;</span>
-<span class="source-line-no">238</span><span id="line-238">          // If any mutations in this batch are atomic, we will count the entire batch as atomic.</span>
-<span class="source-line-no">239</span><span id="line-239">          // This is a conservative approach, but it is the best that we can do without knowing</span>
-<span class="source-line-no">240</span><span id="line-240">          // the block bytes scanned of each individual action.</span>
-<span class="source-line-no">241</span><span id="line-241">          isAtomic = true;</span>
-<span class="source-line-no">242</span><span id="line-242">        }</span>
-<span class="source-line-no">243</span><span id="line-243">      } else if (action.hasGet()) {</span>
-<span class="source-line-no">244</span><span id="line-244">        numReads++;</span>
-<span class="source-line-no">245</span><span id="line-245">      }</span>
-<span class="source-line-no">246</span><span id="line-246">    }</span>
-<span class="source-line-no">247</span><span id="line-247">    return checkBatchQuota(region, numWrites, numReads, isAtomic);</span>
-<span class="source-line-no">248</span><span id="line-248">  }</span>
-<span class="source-line-no">249</span><span id="line-249"></span>
-<span class="source-line-no">250</span><span id="line-250">  /**</span>
-<span class="source-line-no">251</span><span id="line-251">   * Check the quota for the current (rpc-context) user. Returns the OperationQuota used to get the</span>
-<span class="source-line-no">252</span><span id="line-252">   * available quota and to report the data/usage of the operation.</span>
-<span class="source-line-no">253</span><span id="line-253">   * @param region    the region where the operation will be performed</span>
-<span class="source-line-no">254</span><span id="line-254">   * @param numWrites number of writes to perform</span>
-<span class="source-line-no">255</span><span id="line-255">   * @param numReads  number of short-reads to perform</span>
-<span class="source-line-no">256</span><span id="line-256">   * @return the OperationQuota</span>
-<span class="source-line-no">257</span><span id="line-257">   * @throws RpcThrottlingException if the operation cannot be executed due to quota exceeded.</span>
-<span class="source-line-no">258</span><span id="line-258">   */</span>
-<span class="source-line-no">259</span><span id="line-259">  @Override</span>
-<span class="source-line-no">260</span><span id="line-260">  public OperationQuota checkBatchQuota(final Region region, final int numWrites,</span>
-<span class="source-line-no">261</span><span id="line-261">    final int numReads, boolean isAtomic) throws IOException, RpcThrottlingException {</span>
-<span class="source-line-no">262</span><span id="line-262">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
-<span class="source-line-no">263</span><span id="line-263">    UserGroupInformation ugi;</span>
-<span class="source-line-no">264</span><span id="line-264">    if (user.isPresent()) {</span>
-<span class="source-line-no">265</span><span id="line-265">      ugi = user.get().getUGI();</span>
-<span class="source-line-no">266</span><span id="line-266">    } else {</span>
-<span class="source-line-no">267</span><span id="line-267">      ugi = User.getCurrent().getUGI();</span>
-<span class="source-line-no">268</span><span id="line-268">    }</span>
-<span class="source-line-no">269</span><span id="line-269">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
-<span class="source-line-no">270</span><span id="line-270">    TableName table = tableDescriptor.getTableName();</span>
-<span class="source-line-no">271</span><span id="line-271"></span>
-<span class="source-line-no">272</span><span id="line-272">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
-<span class="source-line-no">273</span><span id="line-273">    try {</span>
-<span class="source-line-no">274</span><span id="line-274">      quota.checkBatchQuota(numWrites, numReads, isAtomic);</span>
-<span class="source-line-no">275</span><span id="line-275">    } catch (RpcThrottlingException e) {</span>
-<span class="source-line-no">276</span><span id="line-276">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table</span>
-<span class="source-line-no">277</span><span id="line-277">        + " numWrites=" + numWrites + " numReads=" + numReads + ": " + e.getMessage());</span>
-<span class="source-line-no">278</span><span id="line-278"></span>
-<span class="source-line-no">279</span><span id="line-279">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
-<span class="source-line-no">280</span><span id="line-280">        table.getNameAsString());</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">      throw e;</span>
-<span class="source-line-no">283</span><span id="line-283">    }</span>
-<span class="source-line-no">284</span><span id="line-284">    return quota;</span>
-<span class="source-line-no">285</span><span id="line-285">  }</span>
-<span class="source-line-no">286</span><span id="line-286">}</span>
+<span class="source-line-no">184</span><span id="line-184">    if (</span>
+<span class="source-line-no">185</span><span id="line-185">      scanRequest.hasScannerId() &amp;&amp; scanRequest.getCloseScanner()</span>
+<span class="source-line-no">186</span><span id="line-186">        &amp;&amp; scanRequest.getNumberOfRows() == 0 &amp;&amp; !scanRequest.getRenew()</span>
+<span class="source-line-no">187</span><span id="line-187">    ) {</span>
+<span class="source-line-no">188</span><span id="line-188">      return NoopOperationQuota.get();</span>
+<span class="source-line-no">189</span><span id="line-189">    }</span>
+<span class="source-line-no">190</span><span id="line-190">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
+<span class="source-line-no">191</span><span id="line-191">    UserGroupInformation ugi;</span>
+<span class="source-line-no">192</span><span id="line-192">    if (user.isPresent()) {</span>
+<span class="source-line-no">193</span><span id="line-193">      ugi = user.get().getUGI();</span>
+<span class="source-line-no">194</span><span id="line-194">    } else {</span>
+<span class="source-line-no">195</span><span id="line-195">      ugi = User.getCurrent().getUGI();</span>
+<span class="source-line-no">196</span><span id="line-196">    }</span>
+<span class="source-line-no">197</span><span id="line-197">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
+<span class="source-line-no">198</span><span id="line-198">    TableName table = tableDescriptor.getTableName();</span>
+<span class="source-line-no">199</span><span id="line-199"></span>
+<span class="source-line-no">200</span><span id="line-200">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
+<span class="source-line-no">201</span><span id="line-201">    try {</span>
+<span class="source-line-no">202</span><span id="line-202">      quota.checkScanQuota(scanRequest, maxScannerResultSize, maxBlockBytesScanned,</span>
+<span class="source-line-no">203</span><span id="line-203">        prevBlockBytesScannedDifference);</span>
+<span class="source-line-no">204</span><span id="line-204">    } catch (RpcThrottlingException e) {</span>
+<span class="source-line-no">205</span><span id="line-205">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table + " scan="</span>
+<span class="source-line-no">206</span><span id="line-206">        + scanRequest.getScannerId() + ": " + e.getMessage());</span>
+<span class="source-line-no">207</span><span id="line-207"></span>
+<span class="source-line-no">208</span><span id="line-208">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
+<span class="source-line-no">209</span><span id="line-209">        table.getNameAsString());</span>
+<span class="source-line-no">210</span><span id="line-210"></span>
+<span class="source-line-no">211</span><span id="line-211">      throw e;</span>
+<span class="source-line-no">212</span><span id="line-212">    }</span>
+<span class="source-line-no">213</span><span id="line-213">    return quota;</span>
+<span class="source-line-no">214</span><span id="line-214">  }</span>
+<span class="source-line-no">215</span><span id="line-215"></span>
+<span class="source-line-no">216</span><span id="line-216">  @Override</span>
+<span class="source-line-no">217</span><span id="line-217">  public OperationQuota checkBatchQuota(final Region region,</span>
+<span class="source-line-no">218</span><span id="line-218">    final OperationQuota.OperationType type) throws IOException, RpcThrottlingException {</span>
+<span class="source-line-no">219</span><span id="line-219">    switch (type) {</span>
+<span class="source-line-no">220</span><span id="line-220">      case GET:</span>
+<span class="source-line-no">221</span><span id="line-221">        return this.checkBatchQuota(region, 0, 1, false);</span>
+<span class="source-line-no">222</span><span id="line-222">      case MUTATE:</span>
+<span class="source-line-no">223</span><span id="line-223">        return this.checkBatchQuota(region, 1, 0, false);</span>
+<span class="source-line-no">224</span><span id="line-224">      case CHECK_AND_MUTATE:</span>
+<span class="source-line-no">225</span><span id="line-225">        return this.checkBatchQuota(region, 1, 1, true);</span>
+<span class="source-line-no">226</span><span id="line-226">    }</span>
+<span class="source-line-no">227</span><span id="line-227">    throw new RuntimeException("Invalid operation type: " + type);</span>
+<span class="source-line-no">228</span><span id="line-228">  }</span>
+<span class="source-line-no">229</span><span id="line-229"></span>
+<span class="source-line-no">230</span><span id="line-230">  @Override</span>
+<span class="source-line-no">231</span><span id="line-231">  public OperationQuota checkBatchQuota(final Region region,</span>
+<span class="source-line-no">232</span><span id="line-232">    final List&lt;ClientProtos.Action&gt; actions, boolean hasCondition)</span>
+<span class="source-line-no">233</span><span id="line-233">    throws IOException, RpcThrottlingException {</span>
+<span class="source-line-no">234</span><span id="line-234">    int numWrites = 0;</span>
+<span class="source-line-no">235</span><span id="line-235">    int numReads = 0;</span>
+<span class="source-line-no">236</span><span id="line-236">    boolean isAtomic = false;</span>
+<span class="source-line-no">237</span><span id="line-237">    for (final ClientProtos.Action action : actions) {</span>
+<span class="source-line-no">238</span><span id="line-238">      if (action.hasMutation()) {</span>
+<span class="source-line-no">239</span><span id="line-239">        numWrites++;</span>
+<span class="source-line-no">240</span><span id="line-240">        OperationQuota.OperationType operationType =</span>
+<span class="source-line-no">241</span><span id="line-241">          QuotaUtil.getQuotaOperationType(action, hasCondition);</span>
+<span class="source-line-no">242</span><span id="line-242">        if (operationType == OperationQuota.OperationType.CHECK_AND_MUTATE) {</span>
+<span class="source-line-no">243</span><span id="line-243">          numReads++;</span>
+<span class="source-line-no">244</span><span id="line-244">          // If any mutations in this batch are atomic, we will count the entire batch as atomic.</span>
+<span class="source-line-no">245</span><span id="line-245">          // This is a conservative approach, but it is the best that we can do without knowing</span>
+<span class="source-line-no">246</span><span id="line-246">          // the block bytes scanned of each individual action.</span>
+<span class="source-line-no">247</span><span id="line-247">          isAtomic = true;</span>
+<span class="source-line-no">248</span><span id="line-248">        }</span>
+<span class="source-line-no">249</span><span id="line-249">      } else if (action.hasGet()) {</span>
+<span class="source-line-no">250</span><span id="line-250">        numReads++;</span>
+<span class="source-line-no">251</span><span id="line-251">      }</span>
+<span class="source-line-no">252</span><span id="line-252">    }</span>
+<span class="source-line-no">253</span><span id="line-253">    return checkBatchQuota(region, numWrites, numReads, isAtomic);</span>
+<span class="source-line-no">254</span><span id="line-254">  }</span>
+<span class="source-line-no">255</span><span id="line-255"></span>
+<span class="source-line-no">256</span><span id="line-256">  /**</span>
+<span class="source-line-no">257</span><span id="line-257">   * Check the quota for the current (rpc-context) user. Returns the OperationQuota used to get the</span>
+<span class="source-line-no">258</span><span id="line-258">   * available quota and to report the data/usage of the operation.</span>
+<span class="source-line-no">259</span><span id="line-259">   * @param region    the region where the operation will be performed</span>
+<span class="source-line-no">260</span><span id="line-260">   * @param numWrites number of writes to perform</span>
+<span class="source-line-no">261</span><span id="line-261">   * @param numReads  number of short-reads to perform</span>
+<span class="source-line-no">262</span><span id="line-262">   * @return the OperationQuota</span>
+<span class="source-line-no">263</span><span id="line-263">   * @throws RpcThrottlingException if the operation cannot be executed due to quota exceeded.</span>
+<span class="source-line-no">264</span><span id="line-264">   */</span>
+<span class="source-line-no">265</span><span id="line-265">  @Override</span>
+<span class="source-line-no">266</span><span id="line-266">  public OperationQuota checkBatchQuota(final Region region, final int numWrites,</span>
+<span class="source-line-no">267</span><span id="line-267">    final int numReads, boolean isAtomic) throws IOException, RpcThrottlingException {</span>
+<span class="source-line-no">268</span><span id="line-268">    Optional&lt;User&gt; user = RpcServer.getRequestUser();</span>
+<span class="source-line-no">269</span><span id="line-269">    UserGroupInformation ugi;</span>
+<span class="source-line-no">270</span><span id="line-270">    if (user.isPresent()) {</span>
+<span class="source-line-no">271</span><span id="line-271">      ugi = user.get().getUGI();</span>
+<span class="source-line-no">272</span><span id="line-272">    } else {</span>
+<span class="source-line-no">273</span><span id="line-273">      ugi = User.getCurrent().getUGI();</span>
+<span class="source-line-no">274</span><span id="line-274">    }</span>
+<span class="source-line-no">275</span><span id="line-275">    TableDescriptor tableDescriptor = region.getTableDescriptor();</span>
+<span class="source-line-no">276</span><span id="line-276">    TableName table = tableDescriptor.getTableName();</span>
+<span class="source-line-no">277</span><span id="line-277"></span>
+<span class="source-line-no">278</span><span id="line-278">    OperationQuota quota = getQuota(ugi, table, region.getMinBlockSizeBytes());</span>
+<span class="source-line-no">279</span><span id="line-279">    try {</span>
+<span class="source-line-no">280</span><span id="line-280">      quota.checkBatchQuota(numWrites, numReads, isAtomic);</span>
+<span class="source-line-no">281</span><span id="line-281">    } catch (RpcThrottlingException e) {</span>
+<span class="source-line-no">282</span><span id="line-282">      LOG.debug("Throttling exception for user=" + ugi.getUserName() + " table=" + table</span>
+<span class="source-line-no">283</span><span id="line-283">        + " numWrites=" + numWrites + " numReads=" + numReads + ": " + e.getMessage());</span>
+<span class="source-line-no">284</span><span id="line-284"></span>
+<span class="source-line-no">285</span><span id="line-285">      rsServices.getMetrics().recordThrottleException(e.getType(), quotaCache.getQuotaUserName(ugi),</span>
+<span class="source-line-no">286</span><span id="line-286">        table.getNameAsString());</span>
+<span class="source-line-no">287</span><span id="line-287"></span>
+<span class="source-line-no">288</span><span id="line-288">      throw e;</span>
+<span class="source-line-no">289</span><span id="line-289">    }</span>
+<span class="source-line-no">290</span><span id="line-290">    return quota;</span>
+<span class="source-line-no">291</span><span id="line-291">  }</span>
+<span class="source-line-no">292</span><span id="line-292">}</span>
 
 
 
diff --git a/hbase-website/dependency-convergence.html b/hbase-website/dependency-convergence.html
index d91529ba75c..2a17ee8e78d 100644
--- a/hbase-website/dependency-convergence.html
+++ b/hbase-website/dependency-convergence.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-convergence at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/dependency-info.html b/hbase-website/dependency-info.html
index bf9ded2e920..1fed4e96823 100644
--- a/hbase-website/dependency-info.html
+++ b/hbase-website/dependency-info.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-info at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/dependency-management.html b/hbase-website/dependency-management.html
index 949b80b3a7f..e8b35c22f1c 100644
--- a/hbase-website/dependency-management.html
+++ b/hbase-website/dependency-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:dependency-management at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/index.html b/hbase-website/index.html
index 6d8937d3054..8e7dac701f6 100644
--- a/hbase-website/index.html
+++ b/hbase-website/index.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:index at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:index at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/issue-management.html b/hbase-website/issue-management.html
index b3cf77079c7..7ada2432513 100644
--- a/hbase-website/issue-management.html
+++ b/hbase-website/issue-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/licenses.html b/hbase-website/licenses.html
index a1c151111d2..7f4adc35745 100644
--- a/hbase-website/licenses.html
+++ b/hbase-website/licenses.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/mailing-lists.html b/hbase-website/mailing-lists.html
index e7961781790..4f09ba7fe6d 100644
--- a/hbase-website/mailing-lists.html
+++ b/hbase-website/mailing-lists.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/plugin-management.html b/hbase-website/plugin-management.html
index 2d0e24b8a31..62cd38bcf96 100644
--- a/hbase-website/plugin-management.html
+++ b/hbase-website/plugin-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/plugins.html b/hbase-website/plugins.html
index abeffff66de..77ccae7547c 100644
--- a/hbase-website/plugins.html
+++ b/hbase-website/plugins.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/project-info.html b/hbase-website/project-info.html
index d4ae9a0e730..e9592603f34 100644
--- a/hbase-website/project-info.html
+++ b/hbase-website/project-info.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-site-plugin:3.21.0:project-info at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-site-plugin:3.21.0:project-info at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/scm.html b/hbase-website/scm.html
index 59d0e7ac8cf..d9193aae03d 100644
--- a/hbase-website/scm.html
+++ b/hbase-website/scm.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/summary.html b/hbase-website/summary.html
index 9230cee2802..efed96faef0 100644
--- a/hbase-website/summary.html
+++ b/hbase-website/summary.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/hbase-website/team.html b/hbase-website/team.html
index bcc32a52848..7184601b039 100644
--- a/hbase-website/team.html
+++ b/hbase-website/team.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/issue-management.html b/issue-management.html
index eed0b82bd93..1354b151581 100644
--- a/issue-management.html
+++ b/issue-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:issue-management at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/licenses.html b/licenses.html
index d3c9e46c3ab..84e74cf7159 100644
--- a/licenses.html
+++ b/licenses.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:licenses at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/mailing-lists.html b/mailing-lists.html
index b1c07e37979..9ea073c1a0b 100644
--- a/mailing-lists.html
+++ b/mailing-lists.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:mailing-lists at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/plugin-management.html b/plugin-management.html
index 14e94a475ee..5a5530bde61 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugin-management at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/plugins.html b/plugins.html
index d2cbcf88248..7cfdd07231f 100644
--- a/plugins.html
+++ b/plugins.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:plugins at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/project-info.html b/project-info.html
index 75696769e73..c06aa347ef1 100644
--- a/project-info.html
+++ b/project-info.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-site-plugin:3.21.0:project-info at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-site-plugin:3.21.0:project-info at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/project-reports.html b/project-reports.html
index 5fe1195ca85..4feae28d55b 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-site-plugin:3.21.0:project-reports at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-site-plugin:3.21.0:project-reports at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/scm.html b/scm.html
index cc6831c3fd6..14a89f5f22d 100644
--- a/scm.html
+++ b/scm.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:scm at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/summary.html b/summary.html
index c930bd82b69..633f7f1072a 100644
--- a/summary.html
+++ b/summary.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:summary at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/team.html b/team.html
index bfe2155bf83..e1e1e82a63a 100644
--- a/team.html
+++ b/team.html
@@ -2,7 +2,7 @@
 
 
 <!--
- | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-10-07
+ | Generated by Apache Maven Doxia Site Renderer 2.0.0 from org.apache.maven.plugins:maven-project-info-reports-plugin:3.9.0:team at 2026-10-08
  | Rendered using Apache Maven Fluido Skin 2.0.0-M9
 -->
 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
diff --git a/testapidocs/index-all.html b/testapidocs/index-all.html
index 9b41315b299..1d0b2c3145b 100644
--- a/testapidocs/index-all.html
+++ b/testapidocs/index-all.html
@@ -25117,6 +25117,8 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html#testCloseRegionWrittenToWAL()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.regionserver">testCloseRegionWrittenToWAL()</a> - Method in class org.apache.hadoop.hbase.regionserver.<a href="../apidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html" title="class or interface in org.apache.hadoop.hbase.regionserver" class="external-link">TestHRegion</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="../apidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#testCloseScannerWhenReadQuotaIsExhausted()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.quotas">testCloseScannerWhenReadQuotaIsExhausted()</a> - Method in class org.apache.hadoop.hbase.quotas.<a href="../apidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html" title="class or interface in org.apache.hadoop.hbase.quotas" class="external-link">TestAtomicRe [...]
+<dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/client/TestAsyncTableScannerCloseWhileSuspending.html#testCloseScannerWhileSuspending()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.client">testCloseScannerWhileSuspending()</a> - Method in class org.apache.hadoop.hbase.client.<a href="../apidocs/org/apache/hadoop/hbase/client/TestAsyncTableScannerCloseWhileSuspending.html" title="class or interface in org.apache.hadoop.hbase.client" class="e [...]
 <dd>&nbsp;</dd>
 <dt><a href="../apidocs/org/apache/hadoop/hbase/wal/TestRecoveredEditsOutputSink.html#testCloseSuccess()" class="member-name-link external-link" title="class or interface in org.apache.hadoop.hbase.wal">testCloseSuccess()</a> - Method in class org.apache.hadoop.hbase.wal.<a href="../apidocs/org/apache/hadoop/hbase/wal/TestRecoveredEditsOutputSink.html" title="class or interface in org.apache.hadoop.hbase.wal" class="external-link">TestRecoveredEditsOutputSink</a></dt>
diff --git a/testapidocs/member-search-index.js b/testapidocs/member-search-index.js
index 0d98990a99f..bb3ffd31338 100644
--- a/testapidocs/member-search-index.js
+++ b/testapidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"TestRegionObserverInterface","l":"A"},{"p":"org.apache.hadoop.hbase.client","c":"TestGetProcedureResult.DummyProcedure","l":"abort(MasterProcedureEnv)","u":"abort(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv)"},{"p":"org.apache.hadoop.hbase.master","c":"TestMigrateNamespaceTable.SuspendProcedure","l" [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"TestRegionObserverInterface","l":"A"},{"p":"org.apache.hadoop.hbase.client","c":"TestGetProcedureResult.DummyProcedure","l":"abort(MasterProcedureEnv)","u":"abort(org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv)"},{"p":"org.apache.hadoop.hbase.master","c":"TestMigrateNamespaceTable.SuspendProcedure","l" [...]
\ No newline at end of file
diff --git a/testapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html b/testapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
index 527a21f96fb..82ff92a6134 100644
--- a/testapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
+++ b/testapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
@@ -30,301 +30,349 @@
 <span class="source-line-no">017</span><span id="line-17"> */</span>
 <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.quotas;</span>
 <span class="source-line-no">019</span><span id="line-19"></span>
-<span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
-<span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import java.util.UUID;</span>
-<span class="source-line-no">024</span><span id="line-24">import java.util.concurrent.TimeUnit;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.HBaseTestingUtil;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.HConstants;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.TableName;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.client.Admin;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.client.Get;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.client.Increment;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.client.Put;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.client.RowMutations;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.client.Table;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.testclassification.RegionServerTests;</span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.junit.jupiter.api.AfterAll;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.junit.jupiter.api.BeforeAll;</span>
-<span class="source-line-no">042</span><span id="line-42">import org.junit.jupiter.api.Tag;</span>
-<span class="source-line-no">043</span><span id="line-43">import org.junit.jupiter.api.Test;</span>
-<span class="source-line-no">044</span><span id="line-44">import org.slf4j.Logger;</span>
-<span class="source-line-no">045</span><span id="line-45">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">@Tag(RegionServerTests.TAG)</span>
-<span class="source-line-no">048</span><span id="line-48">@Tag(MediumTests.TAG)</span>
-<span class="source-line-no">049</span><span id="line-49">public class TestAtomicReadQuota {</span>
-<span class="source-line-no">050</span><span id="line-50">  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicReadQuota.class);</span>
-<span class="source-line-no">051</span><span id="line-51">  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();</span>
-<span class="source-line-no">052</span><span id="line-52">  private static final TableName TABLE_NAME = TableName.valueOf(UUID.randomUUID().toString());</span>
-<span class="source-line-no">053</span><span id="line-53">  private static final byte[] FAMILY = Bytes.toBytes("cf");</span>
-<span class="source-line-no">054</span><span id="line-54">  private static final byte[] QUALIFIER = Bytes.toBytes("q");</span>
+<span class="source-line-no">020</span><span id="line-20">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">021</span><span id="line-21">import static org.junit.jupiter.api.Assertions.assertInstanceOf;</span>
+<span class="source-line-no">022</span><span id="line-22">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">023</span><span id="line-23"></span>
+<span class="source-line-no">024</span><span id="line-24">import java.io.IOException;</span>
+<span class="source-line-no">025</span><span id="line-25">import java.util.ArrayList;</span>
+<span class="source-line-no">026</span><span id="line-26">import java.util.List;</span>
+<span class="source-line-no">027</span><span id="line-27">import java.util.UUID;</span>
+<span class="source-line-no">028</span><span id="line-28">import java.util.concurrent.TimeUnit;</span>
+<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.HBaseTestingUtil;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.HConstants;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.TableName;</span>
+<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.client.Admin;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
+<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.client.Get;</span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.client.Increment;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.client.Put;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.client.RowMutations;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.client.Scan;</span>
+<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.client.Table;</span>
+<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl;</span>
+<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.regionserver.RSRpcServices;</span>
+<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.RegionServerTests;</span>
+<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">046</span><span id="line-46">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">047</span><span id="line-47">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">048</span><span id="line-48">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">049</span><span id="line-49">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">050</span><span id="line-50">import org.junit.jupiter.api.Test;</span>
+<span class="source-line-no">051</span><span id="line-51">import org.slf4j.Logger;</span>
+<span class="source-line-no">052</span><span id="line-52">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
 <span class="source-line-no">055</span><span id="line-55"></span>
-<span class="source-line-no">056</span><span id="line-56">  @AfterAll</span>
-<span class="source-line-no">057</span><span id="line-57">  public static void tearDown() throws Exception {</span>
-<span class="source-line-no">058</span><span id="line-58">    ThrottleQuotaTestUtil.clearQuotaCache(TEST_UTIL);</span>
-<span class="source-line-no">059</span><span id="line-59">    EnvironmentEdgeManager.reset();</span>
-<span class="source-line-no">060</span><span id="line-60">    TEST_UTIL.deleteTable(TABLE_NAME);</span>
-<span class="source-line-no">061</span><span id="line-61">    TEST_UTIL.shutdownMiniCluster();</span>
-<span class="source-line-no">062</span><span id="line-62">  }</span>
-<span class="source-line-no">063</span><span id="line-63"></span>
-<span class="source-line-no">064</span><span id="line-64">  @BeforeAll</span>
-<span class="source-line-no">065</span><span id="line-65">  public static void setUpBeforeClass() throws Exception {</span>
-<span class="source-line-no">066</span><span id="line-66">    TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);</span>
-<span class="source-line-no">067</span><span id="line-67">    TEST_UTIL.getConfiguration().setInt(QuotaCache.REFRESH_CONF_KEY, 1000);</span>
-<span class="source-line-no">068</span><span id="line-68">    TEST_UTIL.startMiniCluster(1);</span>
-<span class="source-line-no">069</span><span id="line-69">    TEST_UTIL.waitTableAvailable(QuotaTableUtil.QUOTA_TABLE_NAME);</span>
-<span class="source-line-no">070</span><span id="line-70">    TEST_UTIL.createTable(TABLE_NAME, FAMILY);</span>
-<span class="source-line-no">071</span><span id="line-71">    TEST_UTIL.waitTableAvailable(TABLE_NAME);</span>
-<span class="source-line-no">072</span><span id="line-72">  }</span>
-<span class="source-line-no">073</span><span id="line-73"></span>
-<span class="source-line-no">074</span><span id="line-74">  @Test</span>
-<span class="source-line-no">075</span><span id="line-75">  public void testIncrementCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">076</span><span id="line-76">    setupGenericQuota();</span>
-<span class="source-line-no">077</span><span id="line-77"></span>
-<span class="source-line-no">078</span><span id="line-78">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">079</span><span id="line-79">    inc.addColumn(FAMILY, QUALIFIER, 1);</span>
-<span class="source-line-no">080</span><span id="line-80">    testThrottle(table -&gt; table.increment(inc));</span>
-<span class="source-line-no">081</span><span id="line-81">  }</span>
-<span class="source-line-no">082</span><span id="line-82"></span>
-<span class="source-line-no">083</span><span id="line-83">  @Test</span>
-<span class="source-line-no">084</span><span id="line-84">  public void testConditionalRowMutationsCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">085</span><span id="line-85">    setupGenericQuota();</span>
-<span class="source-line-no">086</span><span id="line-86"></span>
-<span class="source-line-no">087</span><span id="line-87">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">088</span><span id="line-88">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">089</span><span id="line-89">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">090</span><span id="line-90">    Put put = new Put(row);</span>
-<span class="source-line-no">091</span><span id="line-91">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">092</span><span id="line-92"></span>
-<span class="source-line-no">093</span><span id="line-93">    RowMutations rowMutations = new RowMutations(row);</span>
-<span class="source-line-no">094</span><span id="line-94">    rowMutations.add(inc);</span>
-<span class="source-line-no">095</span><span id="line-95">    rowMutations.add(put);</span>
-<span class="source-line-no">096</span><span id="line-96">    testThrottle(table -&gt; table.mutateRow(rowMutations));</span>
-<span class="source-line-no">097</span><span id="line-97">  }</span>
-<span class="source-line-no">098</span><span id="line-98"></span>
-<span class="source-line-no">099</span><span id="line-99">  @Test</span>
-<span class="source-line-no">100</span><span id="line-100">  public void testNonConditionalRowMutationsOmittedFromReadCapacity() throws Exception {</span>
-<span class="source-line-no">101</span><span id="line-101">    setupGenericQuota();</span>
-<span class="source-line-no">102</span><span id="line-102"></span>
-<span class="source-line-no">103</span><span id="line-103">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">104</span><span id="line-104">    Put put = new Put(row);</span>
-<span class="source-line-no">105</span><span id="line-105">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">106</span><span id="line-106"></span>
-<span class="source-line-no">107</span><span id="line-107">    RowMutations rowMutations = new RowMutations(row);</span>
-<span class="source-line-no">108</span><span id="line-108">    rowMutations.add(put);</span>
-<span class="source-line-no">109</span><span id="line-109">    try (Table table = getTable()) {</span>
-<span class="source-line-no">110</span><span id="line-110">      for (int i = 0; i &lt; 100; i++) {</span>
-<span class="source-line-no">111</span><span id="line-111">        table.mutateRow(rowMutations);</span>
-<span class="source-line-no">112</span><span id="line-112">      }</span>
-<span class="source-line-no">113</span><span id="line-113">    }</span>
-<span class="source-line-no">114</span><span id="line-114">  }</span>
-<span class="source-line-no">115</span><span id="line-115"></span>
-<span class="source-line-no">116</span><span id="line-116">  @Test</span>
-<span class="source-line-no">117</span><span id="line-117">  public void testNonAtomicPutOmittedFromReadCapacity() throws Exception {</span>
-<span class="source-line-no">118</span><span id="line-118">    setupGenericQuota();</span>
-<span class="source-line-no">119</span><span id="line-119">    runNonAtomicPuts();</span>
+<span class="source-line-no">056</span><span id="line-56">import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;</span>
+<span class="source-line-no">057</span><span id="line-57">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse;</span>
+<span class="source-line-no">058</span><span id="line-58"></span>
+<span class="source-line-no">059</span><span id="line-59">@Tag(RegionServerTests.TAG)</span>
+<span class="source-line-no">060</span><span id="line-60">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">061</span><span id="line-61">public class TestAtomicReadQuota {</span>
+<span class="source-line-no">062</span><span id="line-62">  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicReadQuota.class);</span>
+<span class="source-line-no">063</span><span id="line-63">  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();</span>
+<span class="source-line-no">064</span><span id="line-64">  private static final TableName TABLE_NAME = TableName.valueOf(UUID.randomUUID().toString());</span>
+<span class="source-line-no">065</span><span id="line-65">  private static final byte[] FAMILY = Bytes.toBytes("cf");</span>
+<span class="source-line-no">066</span><span id="line-66">  private static final byte[] QUALIFIER = Bytes.toBytes("q");</span>
+<span class="source-line-no">067</span><span id="line-67"></span>
+<span class="source-line-no">068</span><span id="line-68">  @AfterAll</span>
+<span class="source-line-no">069</span><span id="line-69">  public static void tearDown() throws Exception {</span>
+<span class="source-line-no">070</span><span id="line-70">    ThrottleQuotaTestUtil.clearQuotaCache(TEST_UTIL);</span>
+<span class="source-line-no">071</span><span id="line-71">    EnvironmentEdgeManager.reset();</span>
+<span class="source-line-no">072</span><span id="line-72">    TEST_UTIL.deleteTable(TABLE_NAME);</span>
+<span class="source-line-no">073</span><span id="line-73">    TEST_UTIL.shutdownMiniCluster();</span>
+<span class="source-line-no">074</span><span id="line-74">  }</span>
+<span class="source-line-no">075</span><span id="line-75"></span>
+<span class="source-line-no">076</span><span id="line-76">  @BeforeAll</span>
+<span class="source-line-no">077</span><span id="line-77">  public static void setUpBeforeClass() throws Exception {</span>
+<span class="source-line-no">078</span><span id="line-78">    TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);</span>
+<span class="source-line-no">079</span><span id="line-79">    TEST_UTIL.getConfiguration().setInt(QuotaCache.REFRESH_CONF_KEY, 1000);</span>
+<span class="source-line-no">080</span><span id="line-80">    TEST_UTIL.startMiniCluster(1);</span>
+<span class="source-line-no">081</span><span id="line-81">    TEST_UTIL.waitTableAvailable(QuotaTableUtil.QUOTA_TABLE_NAME);</span>
+<span class="source-line-no">082</span><span id="line-82">    TEST_UTIL.createTable(TABLE_NAME, FAMILY);</span>
+<span class="source-line-no">083</span><span id="line-83">    TEST_UTIL.waitTableAvailable(TABLE_NAME);</span>
+<span class="source-line-no">084</span><span id="line-84">  }</span>
+<span class="source-line-no">085</span><span id="line-85"></span>
+<span class="source-line-no">086</span><span id="line-86">  @Test</span>
+<span class="source-line-no">087</span><span id="line-87">  public void testCloseScannerWhenReadQuotaIsExhausted() throws Exception {</span>
+<span class="source-line-no">088</span><span id="line-88">    setupGenericQuota();</span>
+<span class="source-line-no">089</span><span id="line-89">    try {</span>
+<span class="source-line-no">090</span><span id="line-90">      RSRpcServices rpcServices = TEST_UTIL.getHBaseCluster().getRegionServer(0).getRSRpcServices();</span>
+<span class="source-line-no">091</span><span id="line-91">      int scannerCount = rpcServices.getScannersCount();</span>
+<span class="source-line-no">092</span><span id="line-92">      byte[] regionName = TEST_UTIL.getAdmin().getRegions(TABLE_NAME).get(0).getRegionName();</span>
+<span class="source-line-no">093</span><span id="line-93">      ScanResponse opened = rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">094</span><span id="line-94">        RequestConverter.buildScanRequest(regionName, new Scan(), 0, false));</span>
+<span class="source-line-no">095</span><span id="line-95">      long scannerId = opened.getScannerId();</span>
+<span class="source-line-no">096</span><span id="line-96">      assertEquals(scannerCount + 1, rpcServices.getScannersCount());</span>
+<span class="source-line-no">097</span><span id="line-97"></span>
+<span class="source-line-no">098</span><span id="line-98">      ServiceException throttled =</span>
+<span class="source-line-no">099</span><span id="line-99">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">100</span><span id="line-100">          RequestConverter.buildScanRequest(scannerId, 1, true, false)));</span>
+<span class="source-line-no">101</span><span id="line-101">      assertInstanceOf(RpcThrottlingException.class, throttled.getCause());</span>
+<span class="source-line-no">102</span><span id="line-102">      assertEquals(scannerCount + 1, rpcServices.getScannersCount());</span>
+<span class="source-line-no">103</span><span id="line-103"></span>
+<span class="source-line-no">104</span><span id="line-104">      ServiceException renewThrottled =</span>
+<span class="source-line-no">105</span><span id="line-105">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">106</span><span id="line-106">          RequestConverter.buildScanRequest(scannerId, 0, true, 0, false, true, -1)));</span>
+<span class="source-line-no">107</span><span id="line-107">      assertInstanceOf(RpcThrottlingException.class, renewThrottled.getCause());</span>
+<span class="source-line-no">108</span><span id="line-108"></span>
+<span class="source-line-no">109</span><span id="line-109">      ServiceException openThrottled =</span>
+<span class="source-line-no">110</span><span id="line-110">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">111</span><span id="line-111">          RequestConverter.buildScanRequest(regionName, new Scan(), 0, true)));</span>
+<span class="source-line-no">112</span><span id="line-112">      assertInstanceOf(RpcThrottlingException.class, openThrottled.getCause());</span>
+<span class="source-line-no">113</span><span id="line-113"></span>
+<span class="source-line-no">114</span><span id="line-114">      rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">115</span><span id="line-115">        RequestConverter.buildScanRequest(scannerId, 0, true, false));</span>
+<span class="source-line-no">116</span><span id="line-116">      assertEquals(scannerCount, rpcServices.getScannersCount());</span>
+<span class="source-line-no">117</span><span id="line-117">    } finally {</span>
+<span class="source-line-no">118</span><span id="line-118">      cleanupQuota();</span>
+<span class="source-line-no">119</span><span id="line-119">    }</span>
 <span class="source-line-no">120</span><span id="line-120">  }</span>
 <span class="source-line-no">121</span><span id="line-121"></span>
 <span class="source-line-no">122</span><span id="line-122">  @Test</span>
-<span class="source-line-no">123</span><span id="line-123">  public void testNonAtomicMultiPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">123</span><span id="line-123">  public void testIncrementCountedAgainstReadCapacity() throws Exception {</span>
 <span class="source-line-no">124</span><span id="line-124">    setupGenericQuota();</span>
-<span class="source-line-no">125</span><span id="line-125">    runNonAtomicPuts();</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  @Test</span>
-<span class="source-line-no">129</span><span id="line-129">  public void testCheckAndMutateCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">130</span><span id="line-130">    setupGenericQuota();</span>
-<span class="source-line-no">131</span><span id="line-131"></span>
-<span class="source-line-no">132</span><span id="line-132">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">133</span><span id="line-133">    byte[] value = Bytes.toBytes("v");</span>
-<span class="source-line-no">134</span><span id="line-134">    Put put = new Put(row);</span>
-<span class="source-line-no">135</span><span id="line-135">    put.addColumn(FAMILY, Bytes.toBytes("doot"), value);</span>
-<span class="source-line-no">136</span><span id="line-136">    CheckAndMutate checkAndMutate =</span>
-<span class="source-line-no">137</span><span id="line-137">      CheckAndMutate.newBuilder(row).ifEquals(FAMILY, QUALIFIER, value).build(put);</span>
-<span class="source-line-no">138</span><span id="line-138"></span>
-<span class="source-line-no">139</span><span id="line-139">    testThrottle(table -&gt; table.checkAndMutate(checkAndMutate));</span>
-<span class="source-line-no">140</span><span id="line-140">  }</span>
-<span class="source-line-no">141</span><span id="line-141"></span>
-<span class="source-line-no">142</span><span id="line-142">  @Test</span>
-<span class="source-line-no">143</span><span id="line-143">  public void testAtomicBatchCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">144</span><span id="line-144">    setupGenericQuota();</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">147</span><span id="line-147">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">148</span><span id="line-148">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">149</span><span id="line-149"></span>
-<span class="source-line-no">150</span><span id="line-150">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">151</span><span id="line-151">    incs.add(inc);</span>
-<span class="source-line-no">152</span><span id="line-152">    incs.add(inc);</span>
-<span class="source-line-no">153</span><span id="line-153"></span>
-<span class="source-line-no">154</span><span id="line-154">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">155</span><span id="line-155">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">156</span><span id="line-156">      table.batch(incs, results);</span>
-<span class="source-line-no">157</span><span id="line-157">      return results;</span>
-<span class="source-line-no">158</span><span id="line-158">    });</span>
-<span class="source-line-no">159</span><span id="line-159">  }</span>
-<span class="source-line-no">160</span><span id="line-160"></span>
-<span class="source-line-no">161</span><span id="line-161">  @Test</span>
-<span class="source-line-no">162</span><span id="line-162">  public void testAtomicBatchCountedAgainstAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">163</span><span id="line-163">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">164</span><span id="line-164"></span>
-<span class="source-line-no">165</span><span id="line-165">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">166</span><span id="line-166">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">167</span><span id="line-167">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">168</span><span id="line-168"></span>
-<span class="source-line-no">169</span><span id="line-169">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">170</span><span id="line-170">    incs.add(inc);</span>
-<span class="source-line-no">171</span><span id="line-171">    incs.add(inc);</span>
-<span class="source-line-no">172</span><span id="line-172"></span>
-<span class="source-line-no">173</span><span id="line-173">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">174</span><span id="line-174">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">175</span><span id="line-175">      table.batch(incs, results);</span>
-<span class="source-line-no">176</span><span id="line-176">      return results;</span>
-<span class="source-line-no">177</span><span id="line-177">    });</span>
-<span class="source-line-no">178</span><span id="line-178">  }</span>
+<span class="source-line-no">125</span><span id="line-125"></span>
+<span class="source-line-no">126</span><span id="line-126">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">127</span><span id="line-127">    inc.addColumn(FAMILY, QUALIFIER, 1);</span>
+<span class="source-line-no">128</span><span id="line-128">    testThrottle(table -&gt; table.increment(inc));</span>
+<span class="source-line-no">129</span><span id="line-129">  }</span>
+<span class="source-line-no">130</span><span id="line-130"></span>
+<span class="source-line-no">131</span><span id="line-131">  @Test</span>
+<span class="source-line-no">132</span><span id="line-132">  public void testConditionalRowMutationsCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">133</span><span id="line-133">    setupGenericQuota();</span>
+<span class="source-line-no">134</span><span id="line-134"></span>
+<span class="source-line-no">135</span><span id="line-135">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">136</span><span id="line-136">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">137</span><span id="line-137">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">138</span><span id="line-138">    Put put = new Put(row);</span>
+<span class="source-line-no">139</span><span id="line-139">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">140</span><span id="line-140"></span>
+<span class="source-line-no">141</span><span id="line-141">    RowMutations rowMutations = new RowMutations(row);</span>
+<span class="source-line-no">142</span><span id="line-142">    rowMutations.add(inc);</span>
+<span class="source-line-no">143</span><span id="line-143">    rowMutations.add(put);</span>
+<span class="source-line-no">144</span><span id="line-144">    testThrottle(table -&gt; table.mutateRow(rowMutations));</span>
+<span class="source-line-no">145</span><span id="line-145">  }</span>
+<span class="source-line-no">146</span><span id="line-146"></span>
+<span class="source-line-no">147</span><span id="line-147">  @Test</span>
+<span class="source-line-no">148</span><span id="line-148">  public void testNonConditionalRowMutationsOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">149</span><span id="line-149">    setupGenericQuota();</span>
+<span class="source-line-no">150</span><span id="line-150"></span>
+<span class="source-line-no">151</span><span id="line-151">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">152</span><span id="line-152">    Put put = new Put(row);</span>
+<span class="source-line-no">153</span><span id="line-153">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">154</span><span id="line-154"></span>
+<span class="source-line-no">155</span><span id="line-155">    RowMutations rowMutations = new RowMutations(row);</span>
+<span class="source-line-no">156</span><span id="line-156">    rowMutations.add(put);</span>
+<span class="source-line-no">157</span><span id="line-157">    try (Table table = getTable()) {</span>
+<span class="source-line-no">158</span><span id="line-158">      for (int i = 0; i &lt; 100; i++) {</span>
+<span class="source-line-no">159</span><span id="line-159">        table.mutateRow(rowMutations);</span>
+<span class="source-line-no">160</span><span id="line-160">      }</span>
+<span class="source-line-no">161</span><span id="line-161">    }</span>
+<span class="source-line-no">162</span><span id="line-162">  }</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Test</span>
+<span class="source-line-no">165</span><span id="line-165">  public void testNonAtomicPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">166</span><span id="line-166">    setupGenericQuota();</span>
+<span class="source-line-no">167</span><span id="line-167">    runNonAtomicPuts();</span>
+<span class="source-line-no">168</span><span id="line-168">  }</span>
+<span class="source-line-no">169</span><span id="line-169"></span>
+<span class="source-line-no">170</span><span id="line-170">  @Test</span>
+<span class="source-line-no">171</span><span id="line-171">  public void testNonAtomicMultiPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">172</span><span id="line-172">    setupGenericQuota();</span>
+<span class="source-line-no">173</span><span id="line-173">    runNonAtomicPuts();</span>
+<span class="source-line-no">174</span><span id="line-174">  }</span>
+<span class="source-line-no">175</span><span id="line-175"></span>
+<span class="source-line-no">176</span><span id="line-176">  @Test</span>
+<span class="source-line-no">177</span><span id="line-177">  public void testCheckAndMutateCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">178</span><span id="line-178">    setupGenericQuota();</span>
 <span class="source-line-no">179</span><span id="line-179"></span>
-<span class="source-line-no">180</span><span id="line-180">  @Test</span>
-<span class="source-line-no">181</span><span id="line-181">  public void testAtomicBatchCountedAgainstAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">182</span><span id="line-182">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">183</span><span id="line-183"></span>
-<span class="source-line-no">184</span><span id="line-184">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">185</span><span id="line-185">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">186</span><span id="line-186">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">189</span><span id="line-189">    incs.add(inc);</span>
-<span class="source-line-no">190</span><span id="line-190">    incs.add(inc);</span>
-<span class="source-line-no">191</span><span id="line-191"></span>
-<span class="source-line-no">192</span><span id="line-192">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">193</span><span id="line-193">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">194</span><span id="line-194">      table.batch(incs, results);</span>
-<span class="source-line-no">195</span><span id="line-195">      return results;</span>
-<span class="source-line-no">196</span><span id="line-196">    });</span>
-<span class="source-line-no">197</span><span id="line-197">  }</span>
-<span class="source-line-no">198</span><span id="line-198"></span>
-<span class="source-line-no">199</span><span id="line-199">  @Test</span>
-<span class="source-line-no">200</span><span id="line-200">  public void testNonAtomicWritesIgnoredByAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">201</span><span id="line-201">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">202</span><span id="line-202">    runNonAtomicPuts();</span>
-<span class="source-line-no">203</span><span id="line-203">  }</span>
-<span class="source-line-no">204</span><span id="line-204"></span>
-<span class="source-line-no">205</span><span id="line-205">  @Test</span>
-<span class="source-line-no">206</span><span id="line-206">  public void testNonAtomicWritesIgnoredByAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">207</span><span id="line-207">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">208</span><span id="line-208">    runNonAtomicPuts();</span>
-<span class="source-line-no">209</span><span id="line-209">  }</span>
-<span class="source-line-no">210</span><span id="line-210"></span>
-<span class="source-line-no">211</span><span id="line-211">  @Test</span>
-<span class="source-line-no">212</span><span id="line-212">  public void testNonAtomicReadsIgnoredByAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">213</span><span id="line-213">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">214</span><span id="line-214">    runNonAtomicReads();</span>
-<span class="source-line-no">215</span><span id="line-215">  }</span>
+<span class="source-line-no">180</span><span id="line-180">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">181</span><span id="line-181">    byte[] value = Bytes.toBytes("v");</span>
+<span class="source-line-no">182</span><span id="line-182">    Put put = new Put(row);</span>
+<span class="source-line-no">183</span><span id="line-183">    put.addColumn(FAMILY, Bytes.toBytes("doot"), value);</span>
+<span class="source-line-no">184</span><span id="line-184">    CheckAndMutate checkAndMutate =</span>
+<span class="source-line-no">185</span><span id="line-185">      CheckAndMutate.newBuilder(row).ifEquals(FAMILY, QUALIFIER, value).build(put);</span>
+<span class="source-line-no">186</span><span id="line-186"></span>
+<span class="source-line-no">187</span><span id="line-187">    testThrottle(table -&gt; table.checkAndMutate(checkAndMutate));</span>
+<span class="source-line-no">188</span><span id="line-188">  }</span>
+<span class="source-line-no">189</span><span id="line-189"></span>
+<span class="source-line-no">190</span><span id="line-190">  @Test</span>
+<span class="source-line-no">191</span><span id="line-191">  public void testAtomicBatchCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">192</span><span id="line-192">    setupGenericQuota();</span>
+<span class="source-line-no">193</span><span id="line-193"></span>
+<span class="source-line-no">194</span><span id="line-194">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">195</span><span id="line-195">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">196</span><span id="line-196">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">197</span><span id="line-197"></span>
+<span class="source-line-no">198</span><span id="line-198">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">199</span><span id="line-199">    incs.add(inc);</span>
+<span class="source-line-no">200</span><span id="line-200">    incs.add(inc);</span>
+<span class="source-line-no">201</span><span id="line-201"></span>
+<span class="source-line-no">202</span><span id="line-202">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">203</span><span id="line-203">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">204</span><span id="line-204">      table.batch(incs, results);</span>
+<span class="source-line-no">205</span><span id="line-205">      return results;</span>
+<span class="source-line-no">206</span><span id="line-206">    });</span>
+<span class="source-line-no">207</span><span id="line-207">  }</span>
+<span class="source-line-no">208</span><span id="line-208"></span>
+<span class="source-line-no">209</span><span id="line-209">  @Test</span>
+<span class="source-line-no">210</span><span id="line-210">  public void testAtomicBatchCountedAgainstAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">211</span><span id="line-211">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">214</span><span id="line-214">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">215</span><span id="line-215">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
 <span class="source-line-no">216</span><span id="line-216"></span>
-<span class="source-line-no">217</span><span id="line-217">  @Test</span>
-<span class="source-line-no">218</span><span id="line-218">  public void testNonAtomicReadsIgnoredByAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">219</span><span id="line-219">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">220</span><span id="line-220">    runNonAtomicReads();</span>
-<span class="source-line-no">221</span><span id="line-221">  }</span>
-<span class="source-line-no">222</span><span id="line-222"></span>
-<span class="source-line-no">223</span><span id="line-223">  private void runNonAtomicPuts() throws Exception {</span>
-<span class="source-line-no">224</span><span id="line-224">    Put put1 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">225</span><span id="line-225">    put1.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">226</span><span id="line-226">    Put put2 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">227</span><span id="line-227">    put2.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">228</span><span id="line-228"></span>
-<span class="source-line-no">229</span><span id="line-229">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">230</span><span id="line-230">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">217</span><span id="line-217">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">218</span><span id="line-218">    incs.add(inc);</span>
+<span class="source-line-no">219</span><span id="line-219">    incs.add(inc);</span>
+<span class="source-line-no">220</span><span id="line-220"></span>
+<span class="source-line-no">221</span><span id="line-221">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">222</span><span id="line-222">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">223</span><span id="line-223">      table.batch(incs, results);</span>
+<span class="source-line-no">224</span><span id="line-224">      return results;</span>
+<span class="source-line-no">225</span><span id="line-225">    });</span>
+<span class="source-line-no">226</span><span id="line-226">  }</span>
+<span class="source-line-no">227</span><span id="line-227"></span>
+<span class="source-line-no">228</span><span id="line-228">  @Test</span>
+<span class="source-line-no">229</span><span id="line-229">  public void testAtomicBatchCountedAgainstAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">230</span><span id="line-230">    setupAtomicOnlyReadSizeQuota();</span>
 <span class="source-line-no">231</span><span id="line-231"></span>
-<span class="source-line-no">232</span><span id="line-232">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">233</span><span id="line-233">    puts.add(put1);</span>
-<span class="source-line-no">234</span><span id="line-234">    puts.add(put2);</span>
+<span class="source-line-no">232</span><span id="line-232">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">233</span><span id="line-233">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">234</span><span id="line-234">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
 <span class="source-line-no">235</span><span id="line-235"></span>
-<span class="source-line-no">236</span><span id="line-236">    try (Table table = getTable()) {</span>
-<span class="source-line-no">237</span><span id="line-237">      for (int i = 0; i &lt; 100; i++) {</span>
-<span class="source-line-no">238</span><span id="line-238">        table.put(puts);</span>
-<span class="source-line-no">239</span><span id="line-239">      }</span>
-<span class="source-line-no">240</span><span id="line-240">    }</span>
-<span class="source-line-no">241</span><span id="line-241">  }</span>
-<span class="source-line-no">242</span><span id="line-242"></span>
-<span class="source-line-no">243</span><span id="line-243">  private void runNonAtomicReads() throws Exception {</span>
-<span class="source-line-no">244</span><span id="line-244">    try (Table table = getTable()) {</span>
-<span class="source-line-no">245</span><span id="line-245">      byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">246</span><span id="line-246">      Get get = new Get(row);</span>
-<span class="source-line-no">247</span><span id="line-247">      table.get(get);</span>
-<span class="source-line-no">248</span><span id="line-248">    }</span>
-<span class="source-line-no">249</span><span id="line-249">  }</span>
-<span class="source-line-no">250</span><span id="line-250"></span>
-<span class="source-line-no">251</span><span id="line-251">  private void setupGenericQuota() throws Exception {</span>
-<span class="source-line-no">252</span><span id="line-252">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">253</span><span id="line-253">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">254</span><span id="line-254">        ThrottleType.READ_NUMBER, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">255</span><span id="line-255">    }</span>
-<span class="source-line-no">256</span><span id="line-256">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">236</span><span id="line-236">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">237</span><span id="line-237">    incs.add(inc);</span>
+<span class="source-line-no">238</span><span id="line-238">    incs.add(inc);</span>
+<span class="source-line-no">239</span><span id="line-239"></span>
+<span class="source-line-no">240</span><span id="line-240">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">241</span><span id="line-241">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">242</span><span id="line-242">      table.batch(incs, results);</span>
+<span class="source-line-no">243</span><span id="line-243">      return results;</span>
+<span class="source-line-no">244</span><span id="line-244">    });</span>
+<span class="source-line-no">245</span><span id="line-245">  }</span>
+<span class="source-line-no">246</span><span id="line-246"></span>
+<span class="source-line-no">247</span><span id="line-247">  @Test</span>
+<span class="source-line-no">248</span><span id="line-248">  public void testNonAtomicWritesIgnoredByAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">249</span><span id="line-249">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">250</span><span id="line-250">    runNonAtomicPuts();</span>
+<span class="source-line-no">251</span><span id="line-251">  }</span>
+<span class="source-line-no">252</span><span id="line-252"></span>
+<span class="source-line-no">253</span><span id="line-253">  @Test</span>
+<span class="source-line-no">254</span><span id="line-254">  public void testNonAtomicWritesIgnoredByAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">255</span><span id="line-255">    setupAtomicOnlyReadSizeQuota();</span>
+<span class="source-line-no">256</span><span id="line-256">    runNonAtomicPuts();</span>
 <span class="source-line-no">257</span><span id="line-257">  }</span>
 <span class="source-line-no">258</span><span id="line-258"></span>
-<span class="source-line-no">259</span><span id="line-259">  private void setupAtomicOnlyReqNumQuota() throws Exception {</span>
-<span class="source-line-no">260</span><span id="line-260">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">261</span><span id="line-261">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">262</span><span id="line-262">        ThrottleType.ATOMIC_REQUEST_NUMBER, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">263</span><span id="line-263">    }</span>
-<span class="source-line-no">264</span><span id="line-264">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  private void setupAtomicOnlyReadSizeQuota() throws Exception {</span>
-<span class="source-line-no">268</span><span id="line-268">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">269</span><span id="line-269">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">270</span><span id="line-270">        ThrottleType.ATOMIC_READ_SIZE, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">271</span><span id="line-271">    }</span>
-<span class="source-line-no">272</span><span id="line-272">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
-<span class="source-line-no">273</span><span id="line-273">  }</span>
-<span class="source-line-no">274</span><span id="line-274"></span>
-<span class="source-line-no">275</span><span id="line-275">  private void cleanupQuota() throws Exception {</span>
-<span class="source-line-no">276</span><span id="line-276">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">277</span><span id="line-277">      admin.setQuota(QuotaSettingsFactory.unthrottleUser(User.getCurrent().getShortName()));</span>
-<span class="source-line-no">278</span><span id="line-278">    }</span>
-<span class="source-line-no">279</span><span id="line-279">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, true, TABLE_NAME);</span>
-<span class="source-line-no">280</span><span id="line-280">  }</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">  private void testThrottle(ThrowingFunction&lt;Table, ?&gt; request) throws Exception {</span>
-<span class="source-line-no">283</span><span id="line-283">    try (Table table = getTable()) {</span>
-<span class="source-line-no">284</span><span id="line-284">      // we have a read quota configured, so this should fail</span>
-<span class="source-line-no">285</span><span id="line-285">      TEST_UTIL.waitFor(60_000, () -&gt; {</span>
-<span class="source-line-no">286</span><span id="line-286">        try {</span>
-<span class="source-line-no">287</span><span id="line-287">          request.run(table);</span>
-<span class="source-line-no">288</span><span id="line-288">          return false;</span>
-<span class="source-line-no">289</span><span id="line-289">        } catch (Exception e) {</span>
-<span class="source-line-no">290</span><span id="line-290">          boolean success = e.getCause() instanceof RpcThrottlingException;</span>
-<span class="source-line-no">291</span><span id="line-291">          if (!success) {</span>
-<span class="source-line-no">292</span><span id="line-292">            LOG.error("Unexpected exception", e);</span>
-<span class="source-line-no">293</span><span id="line-293">          }</span>
-<span class="source-line-no">294</span><span id="line-294">          return success;</span>
-<span class="source-line-no">295</span><span id="line-295">        }</span>
-<span class="source-line-no">296</span><span id="line-296">      });</span>
-<span class="source-line-no">297</span><span id="line-297">    } finally {</span>
-<span class="source-line-no">298</span><span id="line-298">      cleanupQuota();</span>
-<span class="source-line-no">299</span><span id="line-299">    }</span>
-<span class="source-line-no">300</span><span id="line-300">  }</span>
-<span class="source-line-no">301</span><span id="line-301"></span>
-<span class="source-line-no">302</span><span id="line-302">  private Table getTable() throws IOException {</span>
-<span class="source-line-no">303</span><span id="line-303">    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 100);</span>
-<span class="source-line-no">304</span><span id="line-304">    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);</span>
-<span class="source-line-no">305</span><span id="line-305">    return TEST_UTIL.getConnection().getTableBuilder(TABLE_NAME, null).setOperationTimeout(250)</span>
-<span class="source-line-no">306</span><span id="line-306">      .build();</span>
-<span class="source-line-no">307</span><span id="line-307">  }</span>
-<span class="source-line-no">308</span><span id="line-308"></span>
-<span class="source-line-no">309</span><span id="line-309">  @FunctionalInterface</span>
-<span class="source-line-no">310</span><span id="line-310">  private interface ThrowingFunction&lt;I, O&gt; {</span>
-<span class="source-line-no">311</span><span id="line-311">    O run(I input) throws Exception;</span>
-<span class="source-line-no">312</span><span id="line-312">  }</span>
-<span class="source-line-no">313</span><span id="line-313"></span>
-<span class="source-line-no">314</span><span id="line-314">}</span>
+<span class="source-line-no">259</span><span id="line-259">  @Test</span>
+<span class="source-line-no">260</span><span id="line-260">  public void testNonAtomicReadsIgnoredByAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">261</span><span id="line-261">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">262</span><span id="line-262">    runNonAtomicReads();</span>
+<span class="source-line-no">263</span><span id="line-263">  }</span>
+<span class="source-line-no">264</span><span id="line-264"></span>
+<span class="source-line-no">265</span><span id="line-265">  @Test</span>
+<span class="source-line-no">266</span><span id="line-266">  public void testNonAtomicReadsIgnoredByAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">267</span><span id="line-267">    setupAtomicOnlyReadSizeQuota();</span>
+<span class="source-line-no">268</span><span id="line-268">    runNonAtomicReads();</span>
+<span class="source-line-no">269</span><span id="line-269">  }</span>
+<span class="source-line-no">270</span><span id="line-270"></span>
+<span class="source-line-no">271</span><span id="line-271">  private void runNonAtomicPuts() throws Exception {</span>
+<span class="source-line-no">272</span><span id="line-272">    Put put1 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">273</span><span id="line-273">    put1.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">274</span><span id="line-274">    Put put2 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">275</span><span id="line-275">    put2.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">278</span><span id="line-278">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">281</span><span id="line-281">    puts.add(put1);</span>
+<span class="source-line-no">282</span><span id="line-282">    puts.add(put2);</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">    try (Table table = getTable()) {</span>
+<span class="source-line-no">285</span><span id="line-285">      for (int i = 0; i &lt; 100; i++) {</span>
+<span class="source-line-no">286</span><span id="line-286">        table.put(puts);</span>
+<span class="source-line-no">287</span><span id="line-287">      }</span>
+<span class="source-line-no">288</span><span id="line-288">    }</span>
+<span class="source-line-no">289</span><span id="line-289">  }</span>
+<span class="source-line-no">290</span><span id="line-290"></span>
+<span class="source-line-no">291</span><span id="line-291">  private void runNonAtomicReads() throws Exception {</span>
+<span class="source-line-no">292</span><span id="line-292">    try (Table table = getTable()) {</span>
+<span class="source-line-no">293</span><span id="line-293">      byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">294</span><span id="line-294">      Get get = new Get(row);</span>
+<span class="source-line-no">295</span><span id="line-295">      table.get(get);</span>
+<span class="source-line-no">296</span><span id="line-296">    }</span>
+<span class="source-line-no">297</span><span id="line-297">  }</span>
+<span class="source-line-no">298</span><span id="line-298"></span>
+<span class="source-line-no">299</span><span id="line-299">  private void setupGenericQuota() throws Exception {</span>
+<span class="source-line-no">300</span><span id="line-300">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">301</span><span id="line-301">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">302</span><span id="line-302">        ThrottleType.READ_NUMBER, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">303</span><span id="line-303">    }</span>
+<span class="source-line-no">304</span><span id="line-304">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">305</span><span id="line-305">  }</span>
+<span class="source-line-no">306</span><span id="line-306"></span>
+<span class="source-line-no">307</span><span id="line-307">  private void setupAtomicOnlyReqNumQuota() throws Exception {</span>
+<span class="source-line-no">308</span><span id="line-308">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">309</span><span id="line-309">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">310</span><span id="line-310">        ThrottleType.ATOMIC_REQUEST_NUMBER, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">311</span><span id="line-311">    }</span>
+<span class="source-line-no">312</span><span id="line-312">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">313</span><span id="line-313">  }</span>
+<span class="source-line-no">314</span><span id="line-314"></span>
+<span class="source-line-no">315</span><span id="line-315">  private void setupAtomicOnlyReadSizeQuota() throws Exception {</span>
+<span class="source-line-no">316</span><span id="line-316">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">317</span><span id="line-317">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">318</span><span id="line-318">        ThrottleType.ATOMIC_READ_SIZE, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">319</span><span id="line-319">    }</span>
+<span class="source-line-no">320</span><span id="line-320">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">321</span><span id="line-321">  }</span>
+<span class="source-line-no">322</span><span id="line-322"></span>
+<span class="source-line-no">323</span><span id="line-323">  private void cleanupQuota() throws Exception {</span>
+<span class="source-line-no">324</span><span id="line-324">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">325</span><span id="line-325">      admin.setQuota(QuotaSettingsFactory.unthrottleUser(User.getCurrent().getShortName()));</span>
+<span class="source-line-no">326</span><span id="line-326">    }</span>
+<span class="source-line-no">327</span><span id="line-327">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, true, TABLE_NAME);</span>
+<span class="source-line-no">328</span><span id="line-328">  }</span>
+<span class="source-line-no">329</span><span id="line-329"></span>
+<span class="source-line-no">330</span><span id="line-330">  private void testThrottle(ThrowingFunction&lt;Table, ?&gt; request) throws Exception {</span>
+<span class="source-line-no">331</span><span id="line-331">    try (Table table = getTable()) {</span>
+<span class="source-line-no">332</span><span id="line-332">      // we have a read quota configured, so this should fail</span>
+<span class="source-line-no">333</span><span id="line-333">      TEST_UTIL.waitFor(60_000, () -&gt; {</span>
+<span class="source-line-no">334</span><span id="line-334">        try {</span>
+<span class="source-line-no">335</span><span id="line-335">          request.run(table);</span>
+<span class="source-line-no">336</span><span id="line-336">          return false;</span>
+<span class="source-line-no">337</span><span id="line-337">        } catch (Exception e) {</span>
+<span class="source-line-no">338</span><span id="line-338">          boolean success = e.getCause() instanceof RpcThrottlingException;</span>
+<span class="source-line-no">339</span><span id="line-339">          if (!success) {</span>
+<span class="source-line-no">340</span><span id="line-340">            LOG.error("Unexpected exception", e);</span>
+<span class="source-line-no">341</span><span id="line-341">          }</span>
+<span class="source-line-no">342</span><span id="line-342">          return success;</span>
+<span class="source-line-no">343</span><span id="line-343">        }</span>
+<span class="source-line-no">344</span><span id="line-344">      });</span>
+<span class="source-line-no">345</span><span id="line-345">    } finally {</span>
+<span class="source-line-no">346</span><span id="line-346">      cleanupQuota();</span>
+<span class="source-line-no">347</span><span id="line-347">    }</span>
+<span class="source-line-no">348</span><span id="line-348">  }</span>
+<span class="source-line-no">349</span><span id="line-349"></span>
+<span class="source-line-no">350</span><span id="line-350">  private Table getTable() throws IOException {</span>
+<span class="source-line-no">351</span><span id="line-351">    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 100);</span>
+<span class="source-line-no">352</span><span id="line-352">    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);</span>
+<span class="source-line-no">353</span><span id="line-353">    return TEST_UTIL.getConnection().getTableBuilder(TABLE_NAME, null).setOperationTimeout(250)</span>
+<span class="source-line-no">354</span><span id="line-354">      .build();</span>
+<span class="source-line-no">355</span><span id="line-355">  }</span>
+<span class="source-line-no">356</span><span id="line-356"></span>
+<span class="source-line-no">357</span><span id="line-357">  @FunctionalInterface</span>
+<span class="source-line-no">358</span><span id="line-358">  private interface ThrowingFunction&lt;I, O&gt; {</span>
+<span class="source-line-no">359</span><span id="line-359">    O run(I input) throws Exception;</span>
+<span class="source-line-no">360</span><span id="line-360">  }</span>
+<span class="source-line-no">361</span><span id="line-361"></span>
+<span class="source-line-no">362</span><span id="line-362">}</span>
 
 
 
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index b92054aa9db..7d66923aa37 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -62516,6 +62516,8 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/regionserver/TestHRegion.html#testCloseRegionWrittenToWAL()" class="member-name-link">testCloseRegionWrittenToWAL()</a> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegion.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#testCloseScannerWhenReadQuotaIsExhausted()" class="member-name-link">testCloseScannerWhenReadQuotaIsExhausted()</a> - Method in class org.apache.hadoop.hbase.quotas.<a href="org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html" title="class in org.apache.hadoop.hbase.quotas">TestAtomicReadQuota</a></dt>
+<dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/client/TestAsyncTableScannerCloseWhileSuspending.html#testCloseScannerWhileSuspending()" class="member-name-link">testCloseScannerWhileSuspending()</a> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestAsyncTableScannerCloseWhileSuspending.html" title="class in org.apache.hadoop.hbase.client">TestAsyncTableScannerCloseWhileSuspending</a></dt>
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/wal/TestRecoveredEditsOutputSink.html#testCloseSuccess()" class="member-name-link">testCloseSuccess()</a> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestRecoveredEditsOutputSink.html" title="class in org.apache.hadoop.hbase.wal">TestRecoveredEditsOutputSink</a></dt>
diff --git a/testdevapidocs/member-search-index.js b/testdevapidocs/member-search-index.js
index 6fa6d2988c5..ff052e250ef 100644
--- a/testdevapidocs/member-search-index.js
+++ b/testdevapidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_ARI"},{"p":"org.apache.hadoop.hbase.io","c":"TestHalfStoreFileReader","l":"_b(String)","u":"_b(java.lang.String)"},{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_BRI"},{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.regionserver","c":"TestBlocksScanned","l":"_testBlo [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_ARI"},{"p":"org.apache.hadoop.hbase.io","c":"TestHalfStoreFileReader","l":"_b(String)","u":"_b(java.lang.String)"},{"p":"org.apache.hadoop.hbase.master.janitor","c":"TestMetaFixerNoCluster","l":"_BRI"},{"p":"org.apache.hadoop.hbase.backup","c":"TestSystemTableSnapshot","l":"_testBackupRestoreSystemTable()"},{"p":"org.apache.hadoop.hbase.regionserver","c":"TestBlocksScanned","l":"_testBlo [...]
\ No newline at end of file
diff --git a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html
index 440e2ef9714..08508c46f37 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html
@@ -83,7 +83,7 @@ loadScripts(document, 'script');</script>
 </dl>
 <hr>
 <div class="type-signature"><span class="annotations"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/FunctionalInterface.html" title="class or interface in java.lang" class="external-link">@FunctionalInterface</a>
-</span><span class="modifiers">private static interface </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-309">TestAtomicReadQuota.ThrowingFunction</a>&lt;I,<wbr>O&gt;</span></div>
+</span><span class="modifiers">private static interface </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-357">TestAtomicReadQuota.ThrowingFunction</a>&lt;I,<wbr>O&gt;</span></div>
 </section>
 <section class="summary">
 <ul class="summary-list">
@@ -118,7 +118,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="run(I)">
 <h3 id="run(java.lang.Object)">run</h3>
-<div class="member-signature"><span class="return-type"><a href="TestAtomicReadQuota.ThrowingFunction.html" title="type parameter in TestAtomicReadQuota.ThrowingFunction">O</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html#line-311">run</a></span><wbr><span class="parameters">(<a href="TestAtomicReadQuota.ThrowingFunction.html" title="type parameter in TestAtomicReadQuota.ThrowingFunction"> [...]
+<div class="member-signature"><span class="return-type"><a href="TestAtomicReadQuota.ThrowingFunction.html" title="type parameter in TestAtomicReadQuota.ThrowingFunction">O</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html#line-359">run</a></span><wbr><span class="parameters">(<a href="TestAtomicReadQuota.ThrowingFunction.html" title="type parameter in TestAtomicReadQuota.ThrowingFunction"> [...]
 throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
index 65fa24b82ff..55e53c0b31a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
@@ -78,7 +78,7 @@ loadScripts(document, 'script');</script>
 <section class="class-description" id="class-description">
 <hr>
 <div class="type-signature"><span class="annotations">@Tag("org.apache.hadoop.hbase.testclassification.RegionServerTests") @Tag("org.apache.hadoop.hbase.testclassification.MediumTests")
-</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-47">TestAtomicReadQuota</a></span>
+</span><span class="modifiers">public class </span><span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-59">TestAtomicReadQuota</a></span>
 <span class="extends-implements">extends <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Object.html" title="class or interface in java.lang" class="external-link">Object</a></span></div>
 </section>
 <section class="summary">
@@ -189,35 +189,38 @@ loadScripts(document, 'script');</script>
 <div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testCheckAndMutateCountedAgainstReadCapacity()" class="member-name-link">testCheckAndMutateCountedAgainstReadCapacity</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testConditionalRowMutationsCountedAgainstReadCapacity()" class="member-name-link">testConditionalRowMutationsCountedAgainstReadCapacity</a>()</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testCloseScannerWhenReadQuotaIsExhausted()" class="member-name-link">testCloseScannerWhenReadQuotaIsExhausted</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testIncrementCountedAgainstReadCapacity()" class="member-name-link">testIncrementCountedAgainstReadCapacity</a>()</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testConditionalRowMutationsCountedAgainstReadCapacity()" class="member-name-link">testConditionalRowMutationsCountedAgainstReadCapacity</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicMultiPutOmittedFromReadCapacity()" class="member-name-link">testNonAtomicMultiPutOmittedFromReadCapacity</a>()</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testIncrementCountedAgainstReadCapacity()" class="member-name-link">testIncrementCountedAgainstReadCapacity</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicPutOmittedFromReadCapacity()" class="member-name-link">testNonAtomicPutOmittedFromReadCapacity</a>()</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicMultiPutOmittedFromReadCapacity()" class="member-name-link">testNonAtomicMultiPutOmittedFromReadCapacity</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicReadsIgnoredByAtomicOnlyReadSize()" class="member-name-link">testNonAtomicReadsIgnoredByAtomicOnlyReadSize</a>()</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicPutOmittedFromReadCapacity()" class="member-name-link">testNonAtomicPutOmittedFromReadCapacity</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicReadsIgnoredByAtomicOnlyReqNum()" class="member-name-link">testNonAtomicReadsIgnoredByAtomicOnlyReqNum</a>()</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicReadsIgnoredByAtomicOnlyReadSize()" class="member-name-link">testNonAtomicReadsIgnoredByAtomicOnlyReadSize</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicWritesIgnoredByAtomicOnlyReadSize()" class="member-name-link">testNonAtomicWritesIgnoredByAtomicOnlyReadSize</a>()</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicReadsIgnoredByAtomicOnlyReqNum()" class="member-name-link">testNonAtomicReadsIgnoredByAtomicOnlyReqNum</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicWritesIgnoredByAtomicOnlyReqNum()" class="member-name-link">testNonAtomicWritesIgnoredByAtomicOnlyReqNum</a>()</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicWritesIgnoredByAtomicOnlyReadSize()" class="member-name-link">testNonAtomicWritesIgnoredByAtomicOnlyReadSize</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 <div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
-<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonConditionalRowMutationsOmittedFromReadCapacity()" class="member-name-link">testNonConditionalRowMutationsOmittedFromReadCapacity</a>()</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonAtomicWritesIgnoredByAtomicOnlyReqNum()" class="member-name-link">testNonAtomicWritesIgnoredByAtomicOnlyReqNum</a>()</code></div>
 <div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
-<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>private void</code></div>
-<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testThrottle(org.apache.hadoop.hbase.quotas.TestAtomicReadQuota.ThrowingFunction)" class="member-name-link">testThrottle</a><wbr>(<a href="TestAtomicReadQuota.ThrowingFunction.html" title="interface in org.apache.hadoop.hbase.quotas">TestAtomicReadQuota.ThrowingFunction</a>&lt;org.apache.hadoop.hbase.client.Table,<wbr>?&gt;&nbsp;request)</code></div>
+<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>void</code></div>
+<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testNonConditionalRowMutationsOmittedFromReadCapacity()" class="member-name-link">testNonConditionalRowMutationsOmittedFromReadCapacity</a>()</code></div>
 <div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
+<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code>private void</code></div>
+<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"><code><a href="#testThrottle(org.apache.hadoop.hbase.quotas.TestAtomicReadQuota.ThrowingFunction)" class="member-name-link">testThrottle</a><wbr>(<a href="TestAtomicReadQuota.ThrowingFunction.html" title="interface in org.apache.hadoop.hbase.quotas">TestAtomicReadQuota.ThrowingFunction</a>&lt;org.apache.hadoop.hbase.client.Table,<wbr>?&gt;&nbsp;request)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4">&nbsp;</div>
 </div>
 </div>
 </div>
@@ -238,31 +241,31 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="LOG">
 <h3>LOG</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.slf4j.Logger</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-50">LOG</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.slf4j.Logger</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-62">LOG</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="TEST_UTIL">
 <h3>TEST_UTIL</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type"><a href="../HBaseTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtil</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-51">TEST_UTIL</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type"><a href="../HBaseTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtil</a></span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-63">TEST_UTIL</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="TABLE_NAME">
 <h3>TABLE_NAME</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.TableName</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-52">TABLE_NAME</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.TableName</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-64">TABLE_NAME</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="FAMILY">
 <h3>FAMILY</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-53">FAMILY</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-65">FAMILY</a></span></div>
 </section>
 </li>
 <li>
 <section class="detail" id="QUALIFIER">
 <h3>QUALIFIER</h3>
-<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-54">QUALIFIER</a></span></div>
+<div class="member-signature"><span class="modifiers">private static final</span>&nbsp;<span class="return-type">byte[]</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-66">QUALIFIER</a></span></div>
 </section>
 </li>
 </ul>
@@ -276,7 +279,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="&lt;init&gt;()">
 <h3>TestAtomicReadQuota</h3>
-<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-49">TestAtomicReadQuota</a></span>()</div>
+<div class="member-signature"><span class="modifiers">public</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-61">TestAtomicReadQuota</a></span>()</div>
 </section>
 </li>
 </ul>
@@ -291,7 +294,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="tearDown()">
 <h3>tearDown</h3>
 <div class="member-signature"><span class="annotations">@AfterAll
-</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-56">tearDown</a></span>()
+</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-68">tearDown</a></span>()
                      throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -303,7 +306,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="setUpBeforeClass()">
 <h3>setUpBeforeClass</h3>
 <div class="member-signature"><span class="annotations">@BeforeAll
-</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-64">setUpBeforeClass</a></span>()
+</span><span class="modifiers">public static</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-76">setUpBeforeClass</a></span>()
                              throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -312,10 +315,22 @@ loadScripts(document, 'script');</script>
 </section>
 </li>
 <li>
+<section class="detail" id="testCloseScannerWhenReadQuotaIsExhausted()">
+<h3>testCloseScannerWhenReadQuotaIsExhausted</h3>
+<div class="member-signature"><span class="annotations">@Test
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-86">testCloseScannerWhenReadQuotaIsExhausted</a></span>()
+                                              throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
+<dl class="notes">
+<dt>Throws:</dt>
+<dd><code><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></code></dd>
+</dl>
+</section>
+</li>
+<li>
 <section class="detail" id="testIncrementCountedAgainstReadCapacity()">
 <h3>testIncrementCountedAgainstReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-74">testIncrementCountedAgainstReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-122">testIncrementCountedAgainstReadCapacity</a></span>()
                                              throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -327,7 +342,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testConditionalRowMutationsCountedAgainstReadCapacity()">
 <h3>testConditionalRowMutationsCountedAgainstReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-83">testConditionalRowMutationsCountedAgainstReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-131">testConditionalRowMutationsCountedAgainstReadCapacity</a></span>()
                                                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -339,7 +354,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonConditionalRowMutationsOmittedFromReadCapacity()">
 <h3>testNonConditionalRowMutationsOmittedFromReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-99">testNonConditionalRowMutationsOmittedFromReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-147">testNonConditionalRowMutationsOmittedFromReadCapacity</a></span>()
                                                            throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -351,7 +366,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonAtomicPutOmittedFromReadCapacity()">
 <h3>testNonAtomicPutOmittedFromReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-116">testNonAtomicPutOmittedFromReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-164">testNonAtomicPutOmittedFromReadCapacity</a></span>()
                                              throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -363,7 +378,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonAtomicMultiPutOmittedFromReadCapacity()">
 <h3>testNonAtomicMultiPutOmittedFromReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-122">testNonAtomicMultiPutOmittedFromReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-170">testNonAtomicMultiPutOmittedFromReadCapacity</a></span>()
                                                   throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -375,7 +390,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testCheckAndMutateCountedAgainstReadCapacity()">
 <h3>testCheckAndMutateCountedAgainstReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-128">testCheckAndMutateCountedAgainstReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-176">testCheckAndMutateCountedAgainstReadCapacity</a></span>()
                                                   throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -387,7 +402,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testAtomicBatchCountedAgainstReadCapacity()">
 <h3>testAtomicBatchCountedAgainstReadCapacity</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-142">testAtomicBatchCountedAgainstReadCapacity</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-190">testAtomicBatchCountedAgainstReadCapacity</a></span>()
                                                throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -399,7 +414,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testAtomicBatchCountedAgainstAtomicOnlyReqNum()">
 <h3>testAtomicBatchCountedAgainstAtomicOnlyReqNum</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-161">testAtomicBatchCountedAgainstAtomicOnlyReqNum</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-209">testAtomicBatchCountedAgainstAtomicOnlyReqNum</a></span>()
                                                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -411,7 +426,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testAtomicBatchCountedAgainstAtomicOnlyReadSize()">
 <h3>testAtomicBatchCountedAgainstAtomicOnlyReadSize</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-180">testAtomicBatchCountedAgainstAtomicOnlyReadSize</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-228">testAtomicBatchCountedAgainstAtomicOnlyReadSize</a></span>()
                                                      throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -423,7 +438,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonAtomicWritesIgnoredByAtomicOnlyReqNum()">
 <h3>testNonAtomicWritesIgnoredByAtomicOnlyReqNum</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-199">testNonAtomicWritesIgnoredByAtomicOnlyReqNum</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-247">testNonAtomicWritesIgnoredByAtomicOnlyReqNum</a></span>()
                                                   throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -435,7 +450,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonAtomicWritesIgnoredByAtomicOnlyReadSize()">
 <h3>testNonAtomicWritesIgnoredByAtomicOnlyReadSize</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-205">testNonAtomicWritesIgnoredByAtomicOnlyReadSize</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-253">testNonAtomicWritesIgnoredByAtomicOnlyReadSize</a></span>()
                                                     throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -447,7 +462,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonAtomicReadsIgnoredByAtomicOnlyReqNum()">
 <h3>testNonAtomicReadsIgnoredByAtomicOnlyReqNum</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-211">testNonAtomicReadsIgnoredByAtomicOnlyReqNum</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-259">testNonAtomicReadsIgnoredByAtomicOnlyReqNum</a></span>()
                                                  throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -459,7 +474,7 @@ loadScripts(document, 'script');</script>
 <section class="detail" id="testNonAtomicReadsIgnoredByAtomicOnlyReadSize()">
 <h3>testNonAtomicReadsIgnoredByAtomicOnlyReadSize</h3>
 <div class="member-signature"><span class="annotations">@Test
-</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-217">testNonAtomicReadsIgnoredByAtomicOnlyReadSize</a></span>()
+</span><span class="modifiers">public</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-265">testNonAtomicReadsIgnoredByAtomicOnlyReadSize</a></span>()
                                                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -470,7 +485,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="runNonAtomicPuts()">
 <h3>runNonAtomicPuts</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-223">runNonAtomicPuts</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-271">runNonAtomicPuts</a></span>()
                        throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -481,7 +496,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="runNonAtomicReads()">
 <h3>runNonAtomicReads</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-243">runNonAtomicReads</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-291">runNonAtomicReads</a></span>()
                         throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -492,7 +507,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="setupGenericQuota()">
 <h3>setupGenericQuota</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-251">setupGenericQuota</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-299">setupGenericQuota</a></span>()
                         throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -503,7 +518,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="setupAtomicOnlyReqNumQuota()">
 <h3>setupAtomicOnlyReqNumQuota</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-259">setupAtomicOnlyReqNumQuota</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-307">setupAtomicOnlyReqNumQuota</a></span>()
                                  throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -514,7 +529,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="setupAtomicOnlyReadSizeQuota()">
 <h3>setupAtomicOnlyReadSizeQuota</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-267">setupAtomicOnlyReadSizeQuota</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-315">setupAtomicOnlyReadSizeQuota</a></span>()
                                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -525,7 +540,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="cleanupQuota()">
 <h3>cleanupQuota</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-275">cleanupQuota</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-323">cleanupQuota</a></span>()
                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -536,7 +551,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="testThrottle(org.apache.hadoop.hbase.quotas.TestAtomicReadQuota.ThrowingFunction)">
 <h3>testThrottle</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-282">testThrottle</a></span><wbr><span class="parameters">(<a href="TestAtomicReadQuota.ThrowingFunction.html" title="interface in org.apache.hadoop.hbase.quotas">TestAtomicReadQuota.ThrowingFunction</a>&lt;org.apache.hadoop.hbase.client.Table,<wbr>?&gt; [...]
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">void</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-330">testThrottle</a></span><wbr><span class="parameters">(<a href="TestAtomicReadQuota.ThrowingFunction.html" title="interface in org.apache.hadoop.hbase.quotas">TestAtomicReadQuota.ThrowingFunction</a>&lt;org.apache.hadoop.hbase.client.Table,<wbr>?&gt; [...]
                    throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Exception.html" title="class or interface in java.lang" class="external-link">Exception</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
@@ -547,7 +562,7 @@ loadScripts(document, 'script');</script>
 <li>
 <section class="detail" id="getTable()">
 <h3>getTable</h3>
-<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.client.Table</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-302">getTable</a></span>()
+<div class="member-signature"><span class="modifiers">private</span>&nbsp;<span class="return-type">org.apache.hadoop.hbase.client.Table</span>&nbsp;<span class="element-name"><a href="../../../../../src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html#line-350">getTable</a></span>()
                                                throws <span class="exceptions"><a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/IOException.html" title="class or interface in java.io" class="external-link">IOException</a></span></div>
 <dl class="notes">
 <dt>Throws:</dt>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html
index 73fa82ef5f7..135e821fcd0 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.ThrowingFunction.html
@@ -30,301 +30,349 @@
 <span class="source-line-no">017</span><span id="line-17"> */</span>
 <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.quotas;</span>
 <span class="source-line-no">019</span><span id="line-19"></span>
-<span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
-<span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import java.util.UUID;</span>
-<span class="source-line-no">024</span><span id="line-24">import java.util.concurrent.TimeUnit;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.HBaseTestingUtil;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.HConstants;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.TableName;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.client.Admin;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.client.Get;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.client.Increment;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.client.Put;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.client.RowMutations;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.client.Table;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.testclassification.RegionServerTests;</span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.junit.jupiter.api.AfterAll;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.junit.jupiter.api.BeforeAll;</span>
-<span class="source-line-no">042</span><span id="line-42">import org.junit.jupiter.api.Tag;</span>
-<span class="source-line-no">043</span><span id="line-43">import org.junit.jupiter.api.Test;</span>
-<span class="source-line-no">044</span><span id="line-44">import org.slf4j.Logger;</span>
-<span class="source-line-no">045</span><span id="line-45">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">@Tag(RegionServerTests.TAG)</span>
-<span class="source-line-no">048</span><span id="line-48">@Tag(MediumTests.TAG)</span>
-<span class="source-line-no">049</span><span id="line-49">public class TestAtomicReadQuota {</span>
-<span class="source-line-no">050</span><span id="line-50">  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicReadQuota.class);</span>
-<span class="source-line-no">051</span><span id="line-51">  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();</span>
-<span class="source-line-no">052</span><span id="line-52">  private static final TableName TABLE_NAME = TableName.valueOf(UUID.randomUUID().toString());</span>
-<span class="source-line-no">053</span><span id="line-53">  private static final byte[] FAMILY = Bytes.toBytes("cf");</span>
-<span class="source-line-no">054</span><span id="line-54">  private static final byte[] QUALIFIER = Bytes.toBytes("q");</span>
+<span class="source-line-no">020</span><span id="line-20">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">021</span><span id="line-21">import static org.junit.jupiter.api.Assertions.assertInstanceOf;</span>
+<span class="source-line-no">022</span><span id="line-22">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">023</span><span id="line-23"></span>
+<span class="source-line-no">024</span><span id="line-24">import java.io.IOException;</span>
+<span class="source-line-no">025</span><span id="line-25">import java.util.ArrayList;</span>
+<span class="source-line-no">026</span><span id="line-26">import java.util.List;</span>
+<span class="source-line-no">027</span><span id="line-27">import java.util.UUID;</span>
+<span class="source-line-no">028</span><span id="line-28">import java.util.concurrent.TimeUnit;</span>
+<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.HBaseTestingUtil;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.HConstants;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.TableName;</span>
+<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.client.Admin;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
+<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.client.Get;</span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.client.Increment;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.client.Put;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.client.RowMutations;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.client.Scan;</span>
+<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.client.Table;</span>
+<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl;</span>
+<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.regionserver.RSRpcServices;</span>
+<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.RegionServerTests;</span>
+<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">046</span><span id="line-46">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">047</span><span id="line-47">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">048</span><span id="line-48">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">049</span><span id="line-49">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">050</span><span id="line-50">import org.junit.jupiter.api.Test;</span>
+<span class="source-line-no">051</span><span id="line-51">import org.slf4j.Logger;</span>
+<span class="source-line-no">052</span><span id="line-52">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
 <span class="source-line-no">055</span><span id="line-55"></span>
-<span class="source-line-no">056</span><span id="line-56">  @AfterAll</span>
-<span class="source-line-no">057</span><span id="line-57">  public static void tearDown() throws Exception {</span>
-<span class="source-line-no">058</span><span id="line-58">    ThrottleQuotaTestUtil.clearQuotaCache(TEST_UTIL);</span>
-<span class="source-line-no">059</span><span id="line-59">    EnvironmentEdgeManager.reset();</span>
-<span class="source-line-no">060</span><span id="line-60">    TEST_UTIL.deleteTable(TABLE_NAME);</span>
-<span class="source-line-no">061</span><span id="line-61">    TEST_UTIL.shutdownMiniCluster();</span>
-<span class="source-line-no">062</span><span id="line-62">  }</span>
-<span class="source-line-no">063</span><span id="line-63"></span>
-<span class="source-line-no">064</span><span id="line-64">  @BeforeAll</span>
-<span class="source-line-no">065</span><span id="line-65">  public static void setUpBeforeClass() throws Exception {</span>
-<span class="source-line-no">066</span><span id="line-66">    TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);</span>
-<span class="source-line-no">067</span><span id="line-67">    TEST_UTIL.getConfiguration().setInt(QuotaCache.REFRESH_CONF_KEY, 1000);</span>
-<span class="source-line-no">068</span><span id="line-68">    TEST_UTIL.startMiniCluster(1);</span>
-<span class="source-line-no">069</span><span id="line-69">    TEST_UTIL.waitTableAvailable(QuotaTableUtil.QUOTA_TABLE_NAME);</span>
-<span class="source-line-no">070</span><span id="line-70">    TEST_UTIL.createTable(TABLE_NAME, FAMILY);</span>
-<span class="source-line-no">071</span><span id="line-71">    TEST_UTIL.waitTableAvailable(TABLE_NAME);</span>
-<span class="source-line-no">072</span><span id="line-72">  }</span>
-<span class="source-line-no">073</span><span id="line-73"></span>
-<span class="source-line-no">074</span><span id="line-74">  @Test</span>
-<span class="source-line-no">075</span><span id="line-75">  public void testIncrementCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">076</span><span id="line-76">    setupGenericQuota();</span>
-<span class="source-line-no">077</span><span id="line-77"></span>
-<span class="source-line-no">078</span><span id="line-78">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">079</span><span id="line-79">    inc.addColumn(FAMILY, QUALIFIER, 1);</span>
-<span class="source-line-no">080</span><span id="line-80">    testThrottle(table -&gt; table.increment(inc));</span>
-<span class="source-line-no">081</span><span id="line-81">  }</span>
-<span class="source-line-no">082</span><span id="line-82"></span>
-<span class="source-line-no">083</span><span id="line-83">  @Test</span>
-<span class="source-line-no">084</span><span id="line-84">  public void testConditionalRowMutationsCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">085</span><span id="line-85">    setupGenericQuota();</span>
-<span class="source-line-no">086</span><span id="line-86"></span>
-<span class="source-line-no">087</span><span id="line-87">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">088</span><span id="line-88">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">089</span><span id="line-89">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">090</span><span id="line-90">    Put put = new Put(row);</span>
-<span class="source-line-no">091</span><span id="line-91">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">092</span><span id="line-92"></span>
-<span class="source-line-no">093</span><span id="line-93">    RowMutations rowMutations = new RowMutations(row);</span>
-<span class="source-line-no">094</span><span id="line-94">    rowMutations.add(inc);</span>
-<span class="source-line-no">095</span><span id="line-95">    rowMutations.add(put);</span>
-<span class="source-line-no">096</span><span id="line-96">    testThrottle(table -&gt; table.mutateRow(rowMutations));</span>
-<span class="source-line-no">097</span><span id="line-97">  }</span>
-<span class="source-line-no">098</span><span id="line-98"></span>
-<span class="source-line-no">099</span><span id="line-99">  @Test</span>
-<span class="source-line-no">100</span><span id="line-100">  public void testNonConditionalRowMutationsOmittedFromReadCapacity() throws Exception {</span>
-<span class="source-line-no">101</span><span id="line-101">    setupGenericQuota();</span>
-<span class="source-line-no">102</span><span id="line-102"></span>
-<span class="source-line-no">103</span><span id="line-103">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">104</span><span id="line-104">    Put put = new Put(row);</span>
-<span class="source-line-no">105</span><span id="line-105">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">106</span><span id="line-106"></span>
-<span class="source-line-no">107</span><span id="line-107">    RowMutations rowMutations = new RowMutations(row);</span>
-<span class="source-line-no">108</span><span id="line-108">    rowMutations.add(put);</span>
-<span class="source-line-no">109</span><span id="line-109">    try (Table table = getTable()) {</span>
-<span class="source-line-no">110</span><span id="line-110">      for (int i = 0; i &lt; 100; i++) {</span>
-<span class="source-line-no">111</span><span id="line-111">        table.mutateRow(rowMutations);</span>
-<span class="source-line-no">112</span><span id="line-112">      }</span>
-<span class="source-line-no">113</span><span id="line-113">    }</span>
-<span class="source-line-no">114</span><span id="line-114">  }</span>
-<span class="source-line-no">115</span><span id="line-115"></span>
-<span class="source-line-no">116</span><span id="line-116">  @Test</span>
-<span class="source-line-no">117</span><span id="line-117">  public void testNonAtomicPutOmittedFromReadCapacity() throws Exception {</span>
-<span class="source-line-no">118</span><span id="line-118">    setupGenericQuota();</span>
-<span class="source-line-no">119</span><span id="line-119">    runNonAtomicPuts();</span>
+<span class="source-line-no">056</span><span id="line-56">import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;</span>
+<span class="source-line-no">057</span><span id="line-57">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse;</span>
+<span class="source-line-no">058</span><span id="line-58"></span>
+<span class="source-line-no">059</span><span id="line-59">@Tag(RegionServerTests.TAG)</span>
+<span class="source-line-no">060</span><span id="line-60">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">061</span><span id="line-61">public class TestAtomicReadQuota {</span>
+<span class="source-line-no">062</span><span id="line-62">  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicReadQuota.class);</span>
+<span class="source-line-no">063</span><span id="line-63">  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();</span>
+<span class="source-line-no">064</span><span id="line-64">  private static final TableName TABLE_NAME = TableName.valueOf(UUID.randomUUID().toString());</span>
+<span class="source-line-no">065</span><span id="line-65">  private static final byte[] FAMILY = Bytes.toBytes("cf");</span>
+<span class="source-line-no">066</span><span id="line-66">  private static final byte[] QUALIFIER = Bytes.toBytes("q");</span>
+<span class="source-line-no">067</span><span id="line-67"></span>
+<span class="source-line-no">068</span><span id="line-68">  @AfterAll</span>
+<span class="source-line-no">069</span><span id="line-69">  public static void tearDown() throws Exception {</span>
+<span class="source-line-no">070</span><span id="line-70">    ThrottleQuotaTestUtil.clearQuotaCache(TEST_UTIL);</span>
+<span class="source-line-no">071</span><span id="line-71">    EnvironmentEdgeManager.reset();</span>
+<span class="source-line-no">072</span><span id="line-72">    TEST_UTIL.deleteTable(TABLE_NAME);</span>
+<span class="source-line-no">073</span><span id="line-73">    TEST_UTIL.shutdownMiniCluster();</span>
+<span class="source-line-no">074</span><span id="line-74">  }</span>
+<span class="source-line-no">075</span><span id="line-75"></span>
+<span class="source-line-no">076</span><span id="line-76">  @BeforeAll</span>
+<span class="source-line-no">077</span><span id="line-77">  public static void setUpBeforeClass() throws Exception {</span>
+<span class="source-line-no">078</span><span id="line-78">    TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);</span>
+<span class="source-line-no">079</span><span id="line-79">    TEST_UTIL.getConfiguration().setInt(QuotaCache.REFRESH_CONF_KEY, 1000);</span>
+<span class="source-line-no">080</span><span id="line-80">    TEST_UTIL.startMiniCluster(1);</span>
+<span class="source-line-no">081</span><span id="line-81">    TEST_UTIL.waitTableAvailable(QuotaTableUtil.QUOTA_TABLE_NAME);</span>
+<span class="source-line-no">082</span><span id="line-82">    TEST_UTIL.createTable(TABLE_NAME, FAMILY);</span>
+<span class="source-line-no">083</span><span id="line-83">    TEST_UTIL.waitTableAvailable(TABLE_NAME);</span>
+<span class="source-line-no">084</span><span id="line-84">  }</span>
+<span class="source-line-no">085</span><span id="line-85"></span>
+<span class="source-line-no">086</span><span id="line-86">  @Test</span>
+<span class="source-line-no">087</span><span id="line-87">  public void testCloseScannerWhenReadQuotaIsExhausted() throws Exception {</span>
+<span class="source-line-no">088</span><span id="line-88">    setupGenericQuota();</span>
+<span class="source-line-no">089</span><span id="line-89">    try {</span>
+<span class="source-line-no">090</span><span id="line-90">      RSRpcServices rpcServices = TEST_UTIL.getHBaseCluster().getRegionServer(0).getRSRpcServices();</span>
+<span class="source-line-no">091</span><span id="line-91">      int scannerCount = rpcServices.getScannersCount();</span>
+<span class="source-line-no">092</span><span id="line-92">      byte[] regionName = TEST_UTIL.getAdmin().getRegions(TABLE_NAME).get(0).getRegionName();</span>
+<span class="source-line-no">093</span><span id="line-93">      ScanResponse opened = rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">094</span><span id="line-94">        RequestConverter.buildScanRequest(regionName, new Scan(), 0, false));</span>
+<span class="source-line-no">095</span><span id="line-95">      long scannerId = opened.getScannerId();</span>
+<span class="source-line-no">096</span><span id="line-96">      assertEquals(scannerCount + 1, rpcServices.getScannersCount());</span>
+<span class="source-line-no">097</span><span id="line-97"></span>
+<span class="source-line-no">098</span><span id="line-98">      ServiceException throttled =</span>
+<span class="source-line-no">099</span><span id="line-99">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">100</span><span id="line-100">          RequestConverter.buildScanRequest(scannerId, 1, true, false)));</span>
+<span class="source-line-no">101</span><span id="line-101">      assertInstanceOf(RpcThrottlingException.class, throttled.getCause());</span>
+<span class="source-line-no">102</span><span id="line-102">      assertEquals(scannerCount + 1, rpcServices.getScannersCount());</span>
+<span class="source-line-no">103</span><span id="line-103"></span>
+<span class="source-line-no">104</span><span id="line-104">      ServiceException renewThrottled =</span>
+<span class="source-line-no">105</span><span id="line-105">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">106</span><span id="line-106">          RequestConverter.buildScanRequest(scannerId, 0, true, 0, false, true, -1)));</span>
+<span class="source-line-no">107</span><span id="line-107">      assertInstanceOf(RpcThrottlingException.class, renewThrottled.getCause());</span>
+<span class="source-line-no">108</span><span id="line-108"></span>
+<span class="source-line-no">109</span><span id="line-109">      ServiceException openThrottled =</span>
+<span class="source-line-no">110</span><span id="line-110">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">111</span><span id="line-111">          RequestConverter.buildScanRequest(regionName, new Scan(), 0, true)));</span>
+<span class="source-line-no">112</span><span id="line-112">      assertInstanceOf(RpcThrottlingException.class, openThrottled.getCause());</span>
+<span class="source-line-no">113</span><span id="line-113"></span>
+<span class="source-line-no">114</span><span id="line-114">      rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">115</span><span id="line-115">        RequestConverter.buildScanRequest(scannerId, 0, true, false));</span>
+<span class="source-line-no">116</span><span id="line-116">      assertEquals(scannerCount, rpcServices.getScannersCount());</span>
+<span class="source-line-no">117</span><span id="line-117">    } finally {</span>
+<span class="source-line-no">118</span><span id="line-118">      cleanupQuota();</span>
+<span class="source-line-no">119</span><span id="line-119">    }</span>
 <span class="source-line-no">120</span><span id="line-120">  }</span>
 <span class="source-line-no">121</span><span id="line-121"></span>
 <span class="source-line-no">122</span><span id="line-122">  @Test</span>
-<span class="source-line-no">123</span><span id="line-123">  public void testNonAtomicMultiPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">123</span><span id="line-123">  public void testIncrementCountedAgainstReadCapacity() throws Exception {</span>
 <span class="source-line-no">124</span><span id="line-124">    setupGenericQuota();</span>
-<span class="source-line-no">125</span><span id="line-125">    runNonAtomicPuts();</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  @Test</span>
-<span class="source-line-no">129</span><span id="line-129">  public void testCheckAndMutateCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">130</span><span id="line-130">    setupGenericQuota();</span>
-<span class="source-line-no">131</span><span id="line-131"></span>
-<span class="source-line-no">132</span><span id="line-132">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">133</span><span id="line-133">    byte[] value = Bytes.toBytes("v");</span>
-<span class="source-line-no">134</span><span id="line-134">    Put put = new Put(row);</span>
-<span class="source-line-no">135</span><span id="line-135">    put.addColumn(FAMILY, Bytes.toBytes("doot"), value);</span>
-<span class="source-line-no">136</span><span id="line-136">    CheckAndMutate checkAndMutate =</span>
-<span class="source-line-no">137</span><span id="line-137">      CheckAndMutate.newBuilder(row).ifEquals(FAMILY, QUALIFIER, value).build(put);</span>
-<span class="source-line-no">138</span><span id="line-138"></span>
-<span class="source-line-no">139</span><span id="line-139">    testThrottle(table -&gt; table.checkAndMutate(checkAndMutate));</span>
-<span class="source-line-no">140</span><span id="line-140">  }</span>
-<span class="source-line-no">141</span><span id="line-141"></span>
-<span class="source-line-no">142</span><span id="line-142">  @Test</span>
-<span class="source-line-no">143</span><span id="line-143">  public void testAtomicBatchCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">144</span><span id="line-144">    setupGenericQuota();</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">147</span><span id="line-147">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">148</span><span id="line-148">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">149</span><span id="line-149"></span>
-<span class="source-line-no">150</span><span id="line-150">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">151</span><span id="line-151">    incs.add(inc);</span>
-<span class="source-line-no">152</span><span id="line-152">    incs.add(inc);</span>
-<span class="source-line-no">153</span><span id="line-153"></span>
-<span class="source-line-no">154</span><span id="line-154">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">155</span><span id="line-155">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">156</span><span id="line-156">      table.batch(incs, results);</span>
-<span class="source-line-no">157</span><span id="line-157">      return results;</span>
-<span class="source-line-no">158</span><span id="line-158">    });</span>
-<span class="source-line-no">159</span><span id="line-159">  }</span>
-<span class="source-line-no">160</span><span id="line-160"></span>
-<span class="source-line-no">161</span><span id="line-161">  @Test</span>
-<span class="source-line-no">162</span><span id="line-162">  public void testAtomicBatchCountedAgainstAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">163</span><span id="line-163">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">164</span><span id="line-164"></span>
-<span class="source-line-no">165</span><span id="line-165">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">166</span><span id="line-166">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">167</span><span id="line-167">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">168</span><span id="line-168"></span>
-<span class="source-line-no">169</span><span id="line-169">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">170</span><span id="line-170">    incs.add(inc);</span>
-<span class="source-line-no">171</span><span id="line-171">    incs.add(inc);</span>
-<span class="source-line-no">172</span><span id="line-172"></span>
-<span class="source-line-no">173</span><span id="line-173">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">174</span><span id="line-174">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">175</span><span id="line-175">      table.batch(incs, results);</span>
-<span class="source-line-no">176</span><span id="line-176">      return results;</span>
-<span class="source-line-no">177</span><span id="line-177">    });</span>
-<span class="source-line-no">178</span><span id="line-178">  }</span>
+<span class="source-line-no">125</span><span id="line-125"></span>
+<span class="source-line-no">126</span><span id="line-126">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">127</span><span id="line-127">    inc.addColumn(FAMILY, QUALIFIER, 1);</span>
+<span class="source-line-no">128</span><span id="line-128">    testThrottle(table -&gt; table.increment(inc));</span>
+<span class="source-line-no">129</span><span id="line-129">  }</span>
+<span class="source-line-no">130</span><span id="line-130"></span>
+<span class="source-line-no">131</span><span id="line-131">  @Test</span>
+<span class="source-line-no">132</span><span id="line-132">  public void testConditionalRowMutationsCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">133</span><span id="line-133">    setupGenericQuota();</span>
+<span class="source-line-no">134</span><span id="line-134"></span>
+<span class="source-line-no">135</span><span id="line-135">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">136</span><span id="line-136">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">137</span><span id="line-137">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">138</span><span id="line-138">    Put put = new Put(row);</span>
+<span class="source-line-no">139</span><span id="line-139">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">140</span><span id="line-140"></span>
+<span class="source-line-no">141</span><span id="line-141">    RowMutations rowMutations = new RowMutations(row);</span>
+<span class="source-line-no">142</span><span id="line-142">    rowMutations.add(inc);</span>
+<span class="source-line-no">143</span><span id="line-143">    rowMutations.add(put);</span>
+<span class="source-line-no">144</span><span id="line-144">    testThrottle(table -&gt; table.mutateRow(rowMutations));</span>
+<span class="source-line-no">145</span><span id="line-145">  }</span>
+<span class="source-line-no">146</span><span id="line-146"></span>
+<span class="source-line-no">147</span><span id="line-147">  @Test</span>
+<span class="source-line-no">148</span><span id="line-148">  public void testNonConditionalRowMutationsOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">149</span><span id="line-149">    setupGenericQuota();</span>
+<span class="source-line-no">150</span><span id="line-150"></span>
+<span class="source-line-no">151</span><span id="line-151">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">152</span><span id="line-152">    Put put = new Put(row);</span>
+<span class="source-line-no">153</span><span id="line-153">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">154</span><span id="line-154"></span>
+<span class="source-line-no">155</span><span id="line-155">    RowMutations rowMutations = new RowMutations(row);</span>
+<span class="source-line-no">156</span><span id="line-156">    rowMutations.add(put);</span>
+<span class="source-line-no">157</span><span id="line-157">    try (Table table = getTable()) {</span>
+<span class="source-line-no">158</span><span id="line-158">      for (int i = 0; i &lt; 100; i++) {</span>
+<span class="source-line-no">159</span><span id="line-159">        table.mutateRow(rowMutations);</span>
+<span class="source-line-no">160</span><span id="line-160">      }</span>
+<span class="source-line-no">161</span><span id="line-161">    }</span>
+<span class="source-line-no">162</span><span id="line-162">  }</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Test</span>
+<span class="source-line-no">165</span><span id="line-165">  public void testNonAtomicPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">166</span><span id="line-166">    setupGenericQuota();</span>
+<span class="source-line-no">167</span><span id="line-167">    runNonAtomicPuts();</span>
+<span class="source-line-no">168</span><span id="line-168">  }</span>
+<span class="source-line-no">169</span><span id="line-169"></span>
+<span class="source-line-no">170</span><span id="line-170">  @Test</span>
+<span class="source-line-no">171</span><span id="line-171">  public void testNonAtomicMultiPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">172</span><span id="line-172">    setupGenericQuota();</span>
+<span class="source-line-no">173</span><span id="line-173">    runNonAtomicPuts();</span>
+<span class="source-line-no">174</span><span id="line-174">  }</span>
+<span class="source-line-no">175</span><span id="line-175"></span>
+<span class="source-line-no">176</span><span id="line-176">  @Test</span>
+<span class="source-line-no">177</span><span id="line-177">  public void testCheckAndMutateCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">178</span><span id="line-178">    setupGenericQuota();</span>
 <span class="source-line-no">179</span><span id="line-179"></span>
-<span class="source-line-no">180</span><span id="line-180">  @Test</span>
-<span class="source-line-no">181</span><span id="line-181">  public void testAtomicBatchCountedAgainstAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">182</span><span id="line-182">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">183</span><span id="line-183"></span>
-<span class="source-line-no">184</span><span id="line-184">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">185</span><span id="line-185">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">186</span><span id="line-186">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">189</span><span id="line-189">    incs.add(inc);</span>
-<span class="source-line-no">190</span><span id="line-190">    incs.add(inc);</span>
-<span class="source-line-no">191</span><span id="line-191"></span>
-<span class="source-line-no">192</span><span id="line-192">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">193</span><span id="line-193">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">194</span><span id="line-194">      table.batch(incs, results);</span>
-<span class="source-line-no">195</span><span id="line-195">      return results;</span>
-<span class="source-line-no">196</span><span id="line-196">    });</span>
-<span class="source-line-no">197</span><span id="line-197">  }</span>
-<span class="source-line-no">198</span><span id="line-198"></span>
-<span class="source-line-no">199</span><span id="line-199">  @Test</span>
-<span class="source-line-no">200</span><span id="line-200">  public void testNonAtomicWritesIgnoredByAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">201</span><span id="line-201">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">202</span><span id="line-202">    runNonAtomicPuts();</span>
-<span class="source-line-no">203</span><span id="line-203">  }</span>
-<span class="source-line-no">204</span><span id="line-204"></span>
-<span class="source-line-no">205</span><span id="line-205">  @Test</span>
-<span class="source-line-no">206</span><span id="line-206">  public void testNonAtomicWritesIgnoredByAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">207</span><span id="line-207">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">208</span><span id="line-208">    runNonAtomicPuts();</span>
-<span class="source-line-no">209</span><span id="line-209">  }</span>
-<span class="source-line-no">210</span><span id="line-210"></span>
-<span class="source-line-no">211</span><span id="line-211">  @Test</span>
-<span class="source-line-no">212</span><span id="line-212">  public void testNonAtomicReadsIgnoredByAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">213</span><span id="line-213">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">214</span><span id="line-214">    runNonAtomicReads();</span>
-<span class="source-line-no">215</span><span id="line-215">  }</span>
+<span class="source-line-no">180</span><span id="line-180">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">181</span><span id="line-181">    byte[] value = Bytes.toBytes("v");</span>
+<span class="source-line-no">182</span><span id="line-182">    Put put = new Put(row);</span>
+<span class="source-line-no">183</span><span id="line-183">    put.addColumn(FAMILY, Bytes.toBytes("doot"), value);</span>
+<span class="source-line-no">184</span><span id="line-184">    CheckAndMutate checkAndMutate =</span>
+<span class="source-line-no">185</span><span id="line-185">      CheckAndMutate.newBuilder(row).ifEquals(FAMILY, QUALIFIER, value).build(put);</span>
+<span class="source-line-no">186</span><span id="line-186"></span>
+<span class="source-line-no">187</span><span id="line-187">    testThrottle(table -&gt; table.checkAndMutate(checkAndMutate));</span>
+<span class="source-line-no">188</span><span id="line-188">  }</span>
+<span class="source-line-no">189</span><span id="line-189"></span>
+<span class="source-line-no">190</span><span id="line-190">  @Test</span>
+<span class="source-line-no">191</span><span id="line-191">  public void testAtomicBatchCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">192</span><span id="line-192">    setupGenericQuota();</span>
+<span class="source-line-no">193</span><span id="line-193"></span>
+<span class="source-line-no">194</span><span id="line-194">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">195</span><span id="line-195">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">196</span><span id="line-196">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">197</span><span id="line-197"></span>
+<span class="source-line-no">198</span><span id="line-198">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">199</span><span id="line-199">    incs.add(inc);</span>
+<span class="source-line-no">200</span><span id="line-200">    incs.add(inc);</span>
+<span class="source-line-no">201</span><span id="line-201"></span>
+<span class="source-line-no">202</span><span id="line-202">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">203</span><span id="line-203">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">204</span><span id="line-204">      table.batch(incs, results);</span>
+<span class="source-line-no">205</span><span id="line-205">      return results;</span>
+<span class="source-line-no">206</span><span id="line-206">    });</span>
+<span class="source-line-no">207</span><span id="line-207">  }</span>
+<span class="source-line-no">208</span><span id="line-208"></span>
+<span class="source-line-no">209</span><span id="line-209">  @Test</span>
+<span class="source-line-no">210</span><span id="line-210">  public void testAtomicBatchCountedAgainstAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">211</span><span id="line-211">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">214</span><span id="line-214">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">215</span><span id="line-215">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
 <span class="source-line-no">216</span><span id="line-216"></span>
-<span class="source-line-no">217</span><span id="line-217">  @Test</span>
-<span class="source-line-no">218</span><span id="line-218">  public void testNonAtomicReadsIgnoredByAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">219</span><span id="line-219">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">220</span><span id="line-220">    runNonAtomicReads();</span>
-<span class="source-line-no">221</span><span id="line-221">  }</span>
-<span class="source-line-no">222</span><span id="line-222"></span>
-<span class="source-line-no">223</span><span id="line-223">  private void runNonAtomicPuts() throws Exception {</span>
-<span class="source-line-no">224</span><span id="line-224">    Put put1 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">225</span><span id="line-225">    put1.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">226</span><span id="line-226">    Put put2 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">227</span><span id="line-227">    put2.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">228</span><span id="line-228"></span>
-<span class="source-line-no">229</span><span id="line-229">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">230</span><span id="line-230">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">217</span><span id="line-217">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">218</span><span id="line-218">    incs.add(inc);</span>
+<span class="source-line-no">219</span><span id="line-219">    incs.add(inc);</span>
+<span class="source-line-no">220</span><span id="line-220"></span>
+<span class="source-line-no">221</span><span id="line-221">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">222</span><span id="line-222">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">223</span><span id="line-223">      table.batch(incs, results);</span>
+<span class="source-line-no">224</span><span id="line-224">      return results;</span>
+<span class="source-line-no">225</span><span id="line-225">    });</span>
+<span class="source-line-no">226</span><span id="line-226">  }</span>
+<span class="source-line-no">227</span><span id="line-227"></span>
+<span class="source-line-no">228</span><span id="line-228">  @Test</span>
+<span class="source-line-no">229</span><span id="line-229">  public void testAtomicBatchCountedAgainstAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">230</span><span id="line-230">    setupAtomicOnlyReadSizeQuota();</span>
 <span class="source-line-no">231</span><span id="line-231"></span>
-<span class="source-line-no">232</span><span id="line-232">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">233</span><span id="line-233">    puts.add(put1);</span>
-<span class="source-line-no">234</span><span id="line-234">    puts.add(put2);</span>
+<span class="source-line-no">232</span><span id="line-232">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">233</span><span id="line-233">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">234</span><span id="line-234">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
 <span class="source-line-no">235</span><span id="line-235"></span>
-<span class="source-line-no">236</span><span id="line-236">    try (Table table = getTable()) {</span>
-<span class="source-line-no">237</span><span id="line-237">      for (int i = 0; i &lt; 100; i++) {</span>
-<span class="source-line-no">238</span><span id="line-238">        table.put(puts);</span>
-<span class="source-line-no">239</span><span id="line-239">      }</span>
-<span class="source-line-no">240</span><span id="line-240">    }</span>
-<span class="source-line-no">241</span><span id="line-241">  }</span>
-<span class="source-line-no">242</span><span id="line-242"></span>
-<span class="source-line-no">243</span><span id="line-243">  private void runNonAtomicReads() throws Exception {</span>
-<span class="source-line-no">244</span><span id="line-244">    try (Table table = getTable()) {</span>
-<span class="source-line-no">245</span><span id="line-245">      byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">246</span><span id="line-246">      Get get = new Get(row);</span>
-<span class="source-line-no">247</span><span id="line-247">      table.get(get);</span>
-<span class="source-line-no">248</span><span id="line-248">    }</span>
-<span class="source-line-no">249</span><span id="line-249">  }</span>
-<span class="source-line-no">250</span><span id="line-250"></span>
-<span class="source-line-no">251</span><span id="line-251">  private void setupGenericQuota() throws Exception {</span>
-<span class="source-line-no">252</span><span id="line-252">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">253</span><span id="line-253">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">254</span><span id="line-254">        ThrottleType.READ_NUMBER, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">255</span><span id="line-255">    }</span>
-<span class="source-line-no">256</span><span id="line-256">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">236</span><span id="line-236">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">237</span><span id="line-237">    incs.add(inc);</span>
+<span class="source-line-no">238</span><span id="line-238">    incs.add(inc);</span>
+<span class="source-line-no">239</span><span id="line-239"></span>
+<span class="source-line-no">240</span><span id="line-240">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">241</span><span id="line-241">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">242</span><span id="line-242">      table.batch(incs, results);</span>
+<span class="source-line-no">243</span><span id="line-243">      return results;</span>
+<span class="source-line-no">244</span><span id="line-244">    });</span>
+<span class="source-line-no">245</span><span id="line-245">  }</span>
+<span class="source-line-no">246</span><span id="line-246"></span>
+<span class="source-line-no">247</span><span id="line-247">  @Test</span>
+<span class="source-line-no">248</span><span id="line-248">  public void testNonAtomicWritesIgnoredByAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">249</span><span id="line-249">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">250</span><span id="line-250">    runNonAtomicPuts();</span>
+<span class="source-line-no">251</span><span id="line-251">  }</span>
+<span class="source-line-no">252</span><span id="line-252"></span>
+<span class="source-line-no">253</span><span id="line-253">  @Test</span>
+<span class="source-line-no">254</span><span id="line-254">  public void testNonAtomicWritesIgnoredByAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">255</span><span id="line-255">    setupAtomicOnlyReadSizeQuota();</span>
+<span class="source-line-no">256</span><span id="line-256">    runNonAtomicPuts();</span>
 <span class="source-line-no">257</span><span id="line-257">  }</span>
 <span class="source-line-no">258</span><span id="line-258"></span>
-<span class="source-line-no">259</span><span id="line-259">  private void setupAtomicOnlyReqNumQuota() throws Exception {</span>
-<span class="source-line-no">260</span><span id="line-260">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">261</span><span id="line-261">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">262</span><span id="line-262">        ThrottleType.ATOMIC_REQUEST_NUMBER, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">263</span><span id="line-263">    }</span>
-<span class="source-line-no">264</span><span id="line-264">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  private void setupAtomicOnlyReadSizeQuota() throws Exception {</span>
-<span class="source-line-no">268</span><span id="line-268">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">269</span><span id="line-269">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">270</span><span id="line-270">        ThrottleType.ATOMIC_READ_SIZE, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">271</span><span id="line-271">    }</span>
-<span class="source-line-no">272</span><span id="line-272">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
-<span class="source-line-no">273</span><span id="line-273">  }</span>
-<span class="source-line-no">274</span><span id="line-274"></span>
-<span class="source-line-no">275</span><span id="line-275">  private void cleanupQuota() throws Exception {</span>
-<span class="source-line-no">276</span><span id="line-276">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">277</span><span id="line-277">      admin.setQuota(QuotaSettingsFactory.unthrottleUser(User.getCurrent().getShortName()));</span>
-<span class="source-line-no">278</span><span id="line-278">    }</span>
-<span class="source-line-no">279</span><span id="line-279">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, true, TABLE_NAME);</span>
-<span class="source-line-no">280</span><span id="line-280">  }</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">  private void testThrottle(ThrowingFunction&lt;Table, ?&gt; request) throws Exception {</span>
-<span class="source-line-no">283</span><span id="line-283">    try (Table table = getTable()) {</span>
-<span class="source-line-no">284</span><span id="line-284">      // we have a read quota configured, so this should fail</span>
-<span class="source-line-no">285</span><span id="line-285">      TEST_UTIL.waitFor(60_000, () -&gt; {</span>
-<span class="source-line-no">286</span><span id="line-286">        try {</span>
-<span class="source-line-no">287</span><span id="line-287">          request.run(table);</span>
-<span class="source-line-no">288</span><span id="line-288">          return false;</span>
-<span class="source-line-no">289</span><span id="line-289">        } catch (Exception e) {</span>
-<span class="source-line-no">290</span><span id="line-290">          boolean success = e.getCause() instanceof RpcThrottlingException;</span>
-<span class="source-line-no">291</span><span id="line-291">          if (!success) {</span>
-<span class="source-line-no">292</span><span id="line-292">            LOG.error("Unexpected exception", e);</span>
-<span class="source-line-no">293</span><span id="line-293">          }</span>
-<span class="source-line-no">294</span><span id="line-294">          return success;</span>
-<span class="source-line-no">295</span><span id="line-295">        }</span>
-<span class="source-line-no">296</span><span id="line-296">      });</span>
-<span class="source-line-no">297</span><span id="line-297">    } finally {</span>
-<span class="source-line-no">298</span><span id="line-298">      cleanupQuota();</span>
-<span class="source-line-no">299</span><span id="line-299">    }</span>
-<span class="source-line-no">300</span><span id="line-300">  }</span>
-<span class="source-line-no">301</span><span id="line-301"></span>
-<span class="source-line-no">302</span><span id="line-302">  private Table getTable() throws IOException {</span>
-<span class="source-line-no">303</span><span id="line-303">    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 100);</span>
-<span class="source-line-no">304</span><span id="line-304">    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);</span>
-<span class="source-line-no">305</span><span id="line-305">    return TEST_UTIL.getConnection().getTableBuilder(TABLE_NAME, null).setOperationTimeout(250)</span>
-<span class="source-line-no">306</span><span id="line-306">      .build();</span>
-<span class="source-line-no">307</span><span id="line-307">  }</span>
-<span class="source-line-no">308</span><span id="line-308"></span>
-<span class="source-line-no">309</span><span id="line-309">  @FunctionalInterface</span>
-<span class="source-line-no">310</span><span id="line-310">  private interface ThrowingFunction&lt;I, O&gt; {</span>
-<span class="source-line-no">311</span><span id="line-311">    O run(I input) throws Exception;</span>
-<span class="source-line-no">312</span><span id="line-312">  }</span>
-<span class="source-line-no">313</span><span id="line-313"></span>
-<span class="source-line-no">314</span><span id="line-314">}</span>
+<span class="source-line-no">259</span><span id="line-259">  @Test</span>
+<span class="source-line-no">260</span><span id="line-260">  public void testNonAtomicReadsIgnoredByAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">261</span><span id="line-261">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">262</span><span id="line-262">    runNonAtomicReads();</span>
+<span class="source-line-no">263</span><span id="line-263">  }</span>
+<span class="source-line-no">264</span><span id="line-264"></span>
+<span class="source-line-no">265</span><span id="line-265">  @Test</span>
+<span class="source-line-no">266</span><span id="line-266">  public void testNonAtomicReadsIgnoredByAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">267</span><span id="line-267">    setupAtomicOnlyReadSizeQuota();</span>
+<span class="source-line-no">268</span><span id="line-268">    runNonAtomicReads();</span>
+<span class="source-line-no">269</span><span id="line-269">  }</span>
+<span class="source-line-no">270</span><span id="line-270"></span>
+<span class="source-line-no">271</span><span id="line-271">  private void runNonAtomicPuts() throws Exception {</span>
+<span class="source-line-no">272</span><span id="line-272">    Put put1 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">273</span><span id="line-273">    put1.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">274</span><span id="line-274">    Put put2 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">275</span><span id="line-275">    put2.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">278</span><span id="line-278">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">281</span><span id="line-281">    puts.add(put1);</span>
+<span class="source-line-no">282</span><span id="line-282">    puts.add(put2);</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">    try (Table table = getTable()) {</span>
+<span class="source-line-no">285</span><span id="line-285">      for (int i = 0; i &lt; 100; i++) {</span>
+<span class="source-line-no">286</span><span id="line-286">        table.put(puts);</span>
+<span class="source-line-no">287</span><span id="line-287">      }</span>
+<span class="source-line-no">288</span><span id="line-288">    }</span>
+<span class="source-line-no">289</span><span id="line-289">  }</span>
+<span class="source-line-no">290</span><span id="line-290"></span>
+<span class="source-line-no">291</span><span id="line-291">  private void runNonAtomicReads() throws Exception {</span>
+<span class="source-line-no">292</span><span id="line-292">    try (Table table = getTable()) {</span>
+<span class="source-line-no">293</span><span id="line-293">      byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">294</span><span id="line-294">      Get get = new Get(row);</span>
+<span class="source-line-no">295</span><span id="line-295">      table.get(get);</span>
+<span class="source-line-no">296</span><span id="line-296">    }</span>
+<span class="source-line-no">297</span><span id="line-297">  }</span>
+<span class="source-line-no">298</span><span id="line-298"></span>
+<span class="source-line-no">299</span><span id="line-299">  private void setupGenericQuota() throws Exception {</span>
+<span class="source-line-no">300</span><span id="line-300">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">301</span><span id="line-301">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">302</span><span id="line-302">        ThrottleType.READ_NUMBER, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">303</span><span id="line-303">    }</span>
+<span class="source-line-no">304</span><span id="line-304">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">305</span><span id="line-305">  }</span>
+<span class="source-line-no">306</span><span id="line-306"></span>
+<span class="source-line-no">307</span><span id="line-307">  private void setupAtomicOnlyReqNumQuota() throws Exception {</span>
+<span class="source-line-no">308</span><span id="line-308">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">309</span><span id="line-309">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">310</span><span id="line-310">        ThrottleType.ATOMIC_REQUEST_NUMBER, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">311</span><span id="line-311">    }</span>
+<span class="source-line-no">312</span><span id="line-312">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">313</span><span id="line-313">  }</span>
+<span class="source-line-no">314</span><span id="line-314"></span>
+<span class="source-line-no">315</span><span id="line-315">  private void setupAtomicOnlyReadSizeQuota() throws Exception {</span>
+<span class="source-line-no">316</span><span id="line-316">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">317</span><span id="line-317">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">318</span><span id="line-318">        ThrottleType.ATOMIC_READ_SIZE, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">319</span><span id="line-319">    }</span>
+<span class="source-line-no">320</span><span id="line-320">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">321</span><span id="line-321">  }</span>
+<span class="source-line-no">322</span><span id="line-322"></span>
+<span class="source-line-no">323</span><span id="line-323">  private void cleanupQuota() throws Exception {</span>
+<span class="source-line-no">324</span><span id="line-324">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">325</span><span id="line-325">      admin.setQuota(QuotaSettingsFactory.unthrottleUser(User.getCurrent().getShortName()));</span>
+<span class="source-line-no">326</span><span id="line-326">    }</span>
+<span class="source-line-no">327</span><span id="line-327">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, true, TABLE_NAME);</span>
+<span class="source-line-no">328</span><span id="line-328">  }</span>
+<span class="source-line-no">329</span><span id="line-329"></span>
+<span class="source-line-no">330</span><span id="line-330">  private void testThrottle(ThrowingFunction&lt;Table, ?&gt; request) throws Exception {</span>
+<span class="source-line-no">331</span><span id="line-331">    try (Table table = getTable()) {</span>
+<span class="source-line-no">332</span><span id="line-332">      // we have a read quota configured, so this should fail</span>
+<span class="source-line-no">333</span><span id="line-333">      TEST_UTIL.waitFor(60_000, () -&gt; {</span>
+<span class="source-line-no">334</span><span id="line-334">        try {</span>
+<span class="source-line-no">335</span><span id="line-335">          request.run(table);</span>
+<span class="source-line-no">336</span><span id="line-336">          return false;</span>
+<span class="source-line-no">337</span><span id="line-337">        } catch (Exception e) {</span>
+<span class="source-line-no">338</span><span id="line-338">          boolean success = e.getCause() instanceof RpcThrottlingException;</span>
+<span class="source-line-no">339</span><span id="line-339">          if (!success) {</span>
+<span class="source-line-no">340</span><span id="line-340">            LOG.error("Unexpected exception", e);</span>
+<span class="source-line-no">341</span><span id="line-341">          }</span>
+<span class="source-line-no">342</span><span id="line-342">          return success;</span>
+<span class="source-line-no">343</span><span id="line-343">        }</span>
+<span class="source-line-no">344</span><span id="line-344">      });</span>
+<span class="source-line-no">345</span><span id="line-345">    } finally {</span>
+<span class="source-line-no">346</span><span id="line-346">      cleanupQuota();</span>
+<span class="source-line-no">347</span><span id="line-347">    }</span>
+<span class="source-line-no">348</span><span id="line-348">  }</span>
+<span class="source-line-no">349</span><span id="line-349"></span>
+<span class="source-line-no">350</span><span id="line-350">  private Table getTable() throws IOException {</span>
+<span class="source-line-no">351</span><span id="line-351">    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 100);</span>
+<span class="source-line-no">352</span><span id="line-352">    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);</span>
+<span class="source-line-no">353</span><span id="line-353">    return TEST_UTIL.getConnection().getTableBuilder(TABLE_NAME, null).setOperationTimeout(250)</span>
+<span class="source-line-no">354</span><span id="line-354">      .build();</span>
+<span class="source-line-no">355</span><span id="line-355">  }</span>
+<span class="source-line-no">356</span><span id="line-356"></span>
+<span class="source-line-no">357</span><span id="line-357">  @FunctionalInterface</span>
+<span class="source-line-no">358</span><span id="line-358">  private interface ThrowingFunction&lt;I, O&gt; {</span>
+<span class="source-line-no">359</span><span id="line-359">    O run(I input) throws Exception;</span>
+<span class="source-line-no">360</span><span id="line-360">  }</span>
+<span class="source-line-no">361</span><span id="line-361"></span>
+<span class="source-line-no">362</span><span id="line-362">}</span>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
index 527a21f96fb..82ff92a6134 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/quotas/TestAtomicReadQuota.html
@@ -30,301 +30,349 @@
 <span class="source-line-no">017</span><span id="line-17"> */</span>
 <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase.quotas;</span>
 <span class="source-line-no">019</span><span id="line-19"></span>
-<span class="source-line-no">020</span><span id="line-20">import java.io.IOException;</span>
-<span class="source-line-no">021</span><span id="line-21">import java.util.ArrayList;</span>
-<span class="source-line-no">022</span><span id="line-22">import java.util.List;</span>
-<span class="source-line-no">023</span><span id="line-23">import java.util.UUID;</span>
-<span class="source-line-no">024</span><span id="line-24">import java.util.concurrent.TimeUnit;</span>
-<span class="source-line-no">025</span><span id="line-25">import org.apache.hadoop.hbase.HBaseTestingUtil;</span>
-<span class="source-line-no">026</span><span id="line-26">import org.apache.hadoop.hbase.HConstants;</span>
-<span class="source-line-no">027</span><span id="line-27">import org.apache.hadoop.hbase.TableName;</span>
-<span class="source-line-no">028</span><span id="line-28">import org.apache.hadoop.hbase.client.Admin;</span>
-<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
-<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.client.Get;</span>
-<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.client.Increment;</span>
-<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.client.Put;</span>
-<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.client.RowMutations;</span>
-<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.client.Table;</span>
-<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.security.User;</span>
-<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
-<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.testclassification.RegionServerTests;</span>
-<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.util.Bytes;</span>
-<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
-<span class="source-line-no">040</span><span id="line-40">import org.junit.jupiter.api.AfterAll;</span>
-<span class="source-line-no">041</span><span id="line-41">import org.junit.jupiter.api.BeforeAll;</span>
-<span class="source-line-no">042</span><span id="line-42">import org.junit.jupiter.api.Tag;</span>
-<span class="source-line-no">043</span><span id="line-43">import org.junit.jupiter.api.Test;</span>
-<span class="source-line-no">044</span><span id="line-44">import org.slf4j.Logger;</span>
-<span class="source-line-no">045</span><span id="line-45">import org.slf4j.LoggerFactory;</span>
-<span class="source-line-no">046</span><span id="line-46"></span>
-<span class="source-line-no">047</span><span id="line-47">@Tag(RegionServerTests.TAG)</span>
-<span class="source-line-no">048</span><span id="line-48">@Tag(MediumTests.TAG)</span>
-<span class="source-line-no">049</span><span id="line-49">public class TestAtomicReadQuota {</span>
-<span class="source-line-no">050</span><span id="line-50">  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicReadQuota.class);</span>
-<span class="source-line-no">051</span><span id="line-51">  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();</span>
-<span class="source-line-no">052</span><span id="line-52">  private static final TableName TABLE_NAME = TableName.valueOf(UUID.randomUUID().toString());</span>
-<span class="source-line-no">053</span><span id="line-53">  private static final byte[] FAMILY = Bytes.toBytes("cf");</span>
-<span class="source-line-no">054</span><span id="line-54">  private static final byte[] QUALIFIER = Bytes.toBytes("q");</span>
+<span class="source-line-no">020</span><span id="line-20">import static org.junit.jupiter.api.Assertions.assertEquals;</span>
+<span class="source-line-no">021</span><span id="line-21">import static org.junit.jupiter.api.Assertions.assertInstanceOf;</span>
+<span class="source-line-no">022</span><span id="line-22">import static org.junit.jupiter.api.Assertions.assertThrows;</span>
+<span class="source-line-no">023</span><span id="line-23"></span>
+<span class="source-line-no">024</span><span id="line-24">import java.io.IOException;</span>
+<span class="source-line-no">025</span><span id="line-25">import java.util.ArrayList;</span>
+<span class="source-line-no">026</span><span id="line-26">import java.util.List;</span>
+<span class="source-line-no">027</span><span id="line-27">import java.util.UUID;</span>
+<span class="source-line-no">028</span><span id="line-28">import java.util.concurrent.TimeUnit;</span>
+<span class="source-line-no">029</span><span id="line-29">import org.apache.hadoop.hbase.HBaseTestingUtil;</span>
+<span class="source-line-no">030</span><span id="line-30">import org.apache.hadoop.hbase.HConstants;</span>
+<span class="source-line-no">031</span><span id="line-31">import org.apache.hadoop.hbase.TableName;</span>
+<span class="source-line-no">032</span><span id="line-32">import org.apache.hadoop.hbase.client.Admin;</span>
+<span class="source-line-no">033</span><span id="line-33">import org.apache.hadoop.hbase.client.CheckAndMutate;</span>
+<span class="source-line-no">034</span><span id="line-34">import org.apache.hadoop.hbase.client.Get;</span>
+<span class="source-line-no">035</span><span id="line-35">import org.apache.hadoop.hbase.client.Increment;</span>
+<span class="source-line-no">036</span><span id="line-36">import org.apache.hadoop.hbase.client.Put;</span>
+<span class="source-line-no">037</span><span id="line-37">import org.apache.hadoop.hbase.client.RowMutations;</span>
+<span class="source-line-no">038</span><span id="line-38">import org.apache.hadoop.hbase.client.Scan;</span>
+<span class="source-line-no">039</span><span id="line-39">import org.apache.hadoop.hbase.client.Table;</span>
+<span class="source-line-no">040</span><span id="line-40">import org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl;</span>
+<span class="source-line-no">041</span><span id="line-41">import org.apache.hadoop.hbase.regionserver.RSRpcServices;</span>
+<span class="source-line-no">042</span><span id="line-42">import org.apache.hadoop.hbase.security.User;</span>
+<span class="source-line-no">043</span><span id="line-43">import org.apache.hadoop.hbase.testclassification.MediumTests;</span>
+<span class="source-line-no">044</span><span id="line-44">import org.apache.hadoop.hbase.testclassification.RegionServerTests;</span>
+<span class="source-line-no">045</span><span id="line-45">import org.apache.hadoop.hbase.util.Bytes;</span>
+<span class="source-line-no">046</span><span id="line-46">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span>
+<span class="source-line-no">047</span><span id="line-47">import org.junit.jupiter.api.AfterAll;</span>
+<span class="source-line-no">048</span><span id="line-48">import org.junit.jupiter.api.BeforeAll;</span>
+<span class="source-line-no">049</span><span id="line-49">import org.junit.jupiter.api.Tag;</span>
+<span class="source-line-no">050</span><span id="line-50">import org.junit.jupiter.api.Test;</span>
+<span class="source-line-no">051</span><span id="line-51">import org.slf4j.Logger;</span>
+<span class="source-line-no">052</span><span id="line-52">import org.slf4j.LoggerFactory;</span>
+<span class="source-line-no">053</span><span id="line-53"></span>
+<span class="source-line-no">054</span><span id="line-54">import org.apache.hbase.thirdparty.com.google.protobuf.ServiceException;</span>
 <span class="source-line-no">055</span><span id="line-55"></span>
-<span class="source-line-no">056</span><span id="line-56">  @AfterAll</span>
-<span class="source-line-no">057</span><span id="line-57">  public static void tearDown() throws Exception {</span>
-<span class="source-line-no">058</span><span id="line-58">    ThrottleQuotaTestUtil.clearQuotaCache(TEST_UTIL);</span>
-<span class="source-line-no">059</span><span id="line-59">    EnvironmentEdgeManager.reset();</span>
-<span class="source-line-no">060</span><span id="line-60">    TEST_UTIL.deleteTable(TABLE_NAME);</span>
-<span class="source-line-no">061</span><span id="line-61">    TEST_UTIL.shutdownMiniCluster();</span>
-<span class="source-line-no">062</span><span id="line-62">  }</span>
-<span class="source-line-no">063</span><span id="line-63"></span>
-<span class="source-line-no">064</span><span id="line-64">  @BeforeAll</span>
-<span class="source-line-no">065</span><span id="line-65">  public static void setUpBeforeClass() throws Exception {</span>
-<span class="source-line-no">066</span><span id="line-66">    TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);</span>
-<span class="source-line-no">067</span><span id="line-67">    TEST_UTIL.getConfiguration().setInt(QuotaCache.REFRESH_CONF_KEY, 1000);</span>
-<span class="source-line-no">068</span><span id="line-68">    TEST_UTIL.startMiniCluster(1);</span>
-<span class="source-line-no">069</span><span id="line-69">    TEST_UTIL.waitTableAvailable(QuotaTableUtil.QUOTA_TABLE_NAME);</span>
-<span class="source-line-no">070</span><span id="line-70">    TEST_UTIL.createTable(TABLE_NAME, FAMILY);</span>
-<span class="source-line-no">071</span><span id="line-71">    TEST_UTIL.waitTableAvailable(TABLE_NAME);</span>
-<span class="source-line-no">072</span><span id="line-72">  }</span>
-<span class="source-line-no">073</span><span id="line-73"></span>
-<span class="source-line-no">074</span><span id="line-74">  @Test</span>
-<span class="source-line-no">075</span><span id="line-75">  public void testIncrementCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">076</span><span id="line-76">    setupGenericQuota();</span>
-<span class="source-line-no">077</span><span id="line-77"></span>
-<span class="source-line-no">078</span><span id="line-78">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">079</span><span id="line-79">    inc.addColumn(FAMILY, QUALIFIER, 1);</span>
-<span class="source-line-no">080</span><span id="line-80">    testThrottle(table -&gt; table.increment(inc));</span>
-<span class="source-line-no">081</span><span id="line-81">  }</span>
-<span class="source-line-no">082</span><span id="line-82"></span>
-<span class="source-line-no">083</span><span id="line-83">  @Test</span>
-<span class="source-line-no">084</span><span id="line-84">  public void testConditionalRowMutationsCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">085</span><span id="line-85">    setupGenericQuota();</span>
-<span class="source-line-no">086</span><span id="line-86"></span>
-<span class="source-line-no">087</span><span id="line-87">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">088</span><span id="line-88">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">089</span><span id="line-89">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">090</span><span id="line-90">    Put put = new Put(row);</span>
-<span class="source-line-no">091</span><span id="line-91">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">092</span><span id="line-92"></span>
-<span class="source-line-no">093</span><span id="line-93">    RowMutations rowMutations = new RowMutations(row);</span>
-<span class="source-line-no">094</span><span id="line-94">    rowMutations.add(inc);</span>
-<span class="source-line-no">095</span><span id="line-95">    rowMutations.add(put);</span>
-<span class="source-line-no">096</span><span id="line-96">    testThrottle(table -&gt; table.mutateRow(rowMutations));</span>
-<span class="source-line-no">097</span><span id="line-97">  }</span>
-<span class="source-line-no">098</span><span id="line-98"></span>
-<span class="source-line-no">099</span><span id="line-99">  @Test</span>
-<span class="source-line-no">100</span><span id="line-100">  public void testNonConditionalRowMutationsOmittedFromReadCapacity() throws Exception {</span>
-<span class="source-line-no">101</span><span id="line-101">    setupGenericQuota();</span>
-<span class="source-line-no">102</span><span id="line-102"></span>
-<span class="source-line-no">103</span><span id="line-103">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">104</span><span id="line-104">    Put put = new Put(row);</span>
-<span class="source-line-no">105</span><span id="line-105">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">106</span><span id="line-106"></span>
-<span class="source-line-no">107</span><span id="line-107">    RowMutations rowMutations = new RowMutations(row);</span>
-<span class="source-line-no">108</span><span id="line-108">    rowMutations.add(put);</span>
-<span class="source-line-no">109</span><span id="line-109">    try (Table table = getTable()) {</span>
-<span class="source-line-no">110</span><span id="line-110">      for (int i = 0; i &lt; 100; i++) {</span>
-<span class="source-line-no">111</span><span id="line-111">        table.mutateRow(rowMutations);</span>
-<span class="source-line-no">112</span><span id="line-112">      }</span>
-<span class="source-line-no">113</span><span id="line-113">    }</span>
-<span class="source-line-no">114</span><span id="line-114">  }</span>
-<span class="source-line-no">115</span><span id="line-115"></span>
-<span class="source-line-no">116</span><span id="line-116">  @Test</span>
-<span class="source-line-no">117</span><span id="line-117">  public void testNonAtomicPutOmittedFromReadCapacity() throws Exception {</span>
-<span class="source-line-no">118</span><span id="line-118">    setupGenericQuota();</span>
-<span class="source-line-no">119</span><span id="line-119">    runNonAtomicPuts();</span>
+<span class="source-line-no">056</span><span id="line-56">import org.apache.hadoop.hbase.shaded.protobuf.RequestConverter;</span>
+<span class="source-line-no">057</span><span id="line-57">import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.ScanResponse;</span>
+<span class="source-line-no">058</span><span id="line-58"></span>
+<span class="source-line-no">059</span><span id="line-59">@Tag(RegionServerTests.TAG)</span>
+<span class="source-line-no">060</span><span id="line-60">@Tag(MediumTests.TAG)</span>
+<span class="source-line-no">061</span><span id="line-61">public class TestAtomicReadQuota {</span>
+<span class="source-line-no">062</span><span id="line-62">  private static final Logger LOG = LoggerFactory.getLogger(TestAtomicReadQuota.class);</span>
+<span class="source-line-no">063</span><span id="line-63">  private static final HBaseTestingUtil TEST_UTIL = new HBaseTestingUtil();</span>
+<span class="source-line-no">064</span><span id="line-64">  private static final TableName TABLE_NAME = TableName.valueOf(UUID.randomUUID().toString());</span>
+<span class="source-line-no">065</span><span id="line-65">  private static final byte[] FAMILY = Bytes.toBytes("cf");</span>
+<span class="source-line-no">066</span><span id="line-66">  private static final byte[] QUALIFIER = Bytes.toBytes("q");</span>
+<span class="source-line-no">067</span><span id="line-67"></span>
+<span class="source-line-no">068</span><span id="line-68">  @AfterAll</span>
+<span class="source-line-no">069</span><span id="line-69">  public static void tearDown() throws Exception {</span>
+<span class="source-line-no">070</span><span id="line-70">    ThrottleQuotaTestUtil.clearQuotaCache(TEST_UTIL);</span>
+<span class="source-line-no">071</span><span id="line-71">    EnvironmentEdgeManager.reset();</span>
+<span class="source-line-no">072</span><span id="line-72">    TEST_UTIL.deleteTable(TABLE_NAME);</span>
+<span class="source-line-no">073</span><span id="line-73">    TEST_UTIL.shutdownMiniCluster();</span>
+<span class="source-line-no">074</span><span id="line-74">  }</span>
+<span class="source-line-no">075</span><span id="line-75"></span>
+<span class="source-line-no">076</span><span id="line-76">  @BeforeAll</span>
+<span class="source-line-no">077</span><span id="line-77">  public static void setUpBeforeClass() throws Exception {</span>
+<span class="source-line-no">078</span><span id="line-78">    TEST_UTIL.getConfiguration().setBoolean(QuotaUtil.QUOTA_CONF_KEY, true);</span>
+<span class="source-line-no">079</span><span id="line-79">    TEST_UTIL.getConfiguration().setInt(QuotaCache.REFRESH_CONF_KEY, 1000);</span>
+<span class="source-line-no">080</span><span id="line-80">    TEST_UTIL.startMiniCluster(1);</span>
+<span class="source-line-no">081</span><span id="line-81">    TEST_UTIL.waitTableAvailable(QuotaTableUtil.QUOTA_TABLE_NAME);</span>
+<span class="source-line-no">082</span><span id="line-82">    TEST_UTIL.createTable(TABLE_NAME, FAMILY);</span>
+<span class="source-line-no">083</span><span id="line-83">    TEST_UTIL.waitTableAvailable(TABLE_NAME);</span>
+<span class="source-line-no">084</span><span id="line-84">  }</span>
+<span class="source-line-no">085</span><span id="line-85"></span>
+<span class="source-line-no">086</span><span id="line-86">  @Test</span>
+<span class="source-line-no">087</span><span id="line-87">  public void testCloseScannerWhenReadQuotaIsExhausted() throws Exception {</span>
+<span class="source-line-no">088</span><span id="line-88">    setupGenericQuota();</span>
+<span class="source-line-no">089</span><span id="line-89">    try {</span>
+<span class="source-line-no">090</span><span id="line-90">      RSRpcServices rpcServices = TEST_UTIL.getHBaseCluster().getRegionServer(0).getRSRpcServices();</span>
+<span class="source-line-no">091</span><span id="line-91">      int scannerCount = rpcServices.getScannersCount();</span>
+<span class="source-line-no">092</span><span id="line-92">      byte[] regionName = TEST_UTIL.getAdmin().getRegions(TABLE_NAME).get(0).getRegionName();</span>
+<span class="source-line-no">093</span><span id="line-93">      ScanResponse opened = rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">094</span><span id="line-94">        RequestConverter.buildScanRequest(regionName, new Scan(), 0, false));</span>
+<span class="source-line-no">095</span><span id="line-95">      long scannerId = opened.getScannerId();</span>
+<span class="source-line-no">096</span><span id="line-96">      assertEquals(scannerCount + 1, rpcServices.getScannersCount());</span>
+<span class="source-line-no">097</span><span id="line-97"></span>
+<span class="source-line-no">098</span><span id="line-98">      ServiceException throttled =</span>
+<span class="source-line-no">099</span><span id="line-99">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">100</span><span id="line-100">          RequestConverter.buildScanRequest(scannerId, 1, true, false)));</span>
+<span class="source-line-no">101</span><span id="line-101">      assertInstanceOf(RpcThrottlingException.class, throttled.getCause());</span>
+<span class="source-line-no">102</span><span id="line-102">      assertEquals(scannerCount + 1, rpcServices.getScannersCount());</span>
+<span class="source-line-no">103</span><span id="line-103"></span>
+<span class="source-line-no">104</span><span id="line-104">      ServiceException renewThrottled =</span>
+<span class="source-line-no">105</span><span id="line-105">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">106</span><span id="line-106">          RequestConverter.buildScanRequest(scannerId, 0, true, 0, false, true, -1)));</span>
+<span class="source-line-no">107</span><span id="line-107">      assertInstanceOf(RpcThrottlingException.class, renewThrottled.getCause());</span>
+<span class="source-line-no">108</span><span id="line-108"></span>
+<span class="source-line-no">109</span><span id="line-109">      ServiceException openThrottled =</span>
+<span class="source-line-no">110</span><span id="line-110">        assertThrows(ServiceException.class, () -&gt; rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">111</span><span id="line-111">          RequestConverter.buildScanRequest(regionName, new Scan(), 0, true)));</span>
+<span class="source-line-no">112</span><span id="line-112">      assertInstanceOf(RpcThrottlingException.class, openThrottled.getCause());</span>
+<span class="source-line-no">113</span><span id="line-113"></span>
+<span class="source-line-no">114</span><span id="line-114">      rpcServices.scan(new HBaseRpcControllerImpl(),</span>
+<span class="source-line-no">115</span><span id="line-115">        RequestConverter.buildScanRequest(scannerId, 0, true, false));</span>
+<span class="source-line-no">116</span><span id="line-116">      assertEquals(scannerCount, rpcServices.getScannersCount());</span>
+<span class="source-line-no">117</span><span id="line-117">    } finally {</span>
+<span class="source-line-no">118</span><span id="line-118">      cleanupQuota();</span>
+<span class="source-line-no">119</span><span id="line-119">    }</span>
 <span class="source-line-no">120</span><span id="line-120">  }</span>
 <span class="source-line-no">121</span><span id="line-121"></span>
 <span class="source-line-no">122</span><span id="line-122">  @Test</span>
-<span class="source-line-no">123</span><span id="line-123">  public void testNonAtomicMultiPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">123</span><span id="line-123">  public void testIncrementCountedAgainstReadCapacity() throws Exception {</span>
 <span class="source-line-no">124</span><span id="line-124">    setupGenericQuota();</span>
-<span class="source-line-no">125</span><span id="line-125">    runNonAtomicPuts();</span>
-<span class="source-line-no">126</span><span id="line-126">  }</span>
-<span class="source-line-no">127</span><span id="line-127"></span>
-<span class="source-line-no">128</span><span id="line-128">  @Test</span>
-<span class="source-line-no">129</span><span id="line-129">  public void testCheckAndMutateCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">130</span><span id="line-130">    setupGenericQuota();</span>
-<span class="source-line-no">131</span><span id="line-131"></span>
-<span class="source-line-no">132</span><span id="line-132">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">133</span><span id="line-133">    byte[] value = Bytes.toBytes("v");</span>
-<span class="source-line-no">134</span><span id="line-134">    Put put = new Put(row);</span>
-<span class="source-line-no">135</span><span id="line-135">    put.addColumn(FAMILY, Bytes.toBytes("doot"), value);</span>
-<span class="source-line-no">136</span><span id="line-136">    CheckAndMutate checkAndMutate =</span>
-<span class="source-line-no">137</span><span id="line-137">      CheckAndMutate.newBuilder(row).ifEquals(FAMILY, QUALIFIER, value).build(put);</span>
-<span class="source-line-no">138</span><span id="line-138"></span>
-<span class="source-line-no">139</span><span id="line-139">    testThrottle(table -&gt; table.checkAndMutate(checkAndMutate));</span>
-<span class="source-line-no">140</span><span id="line-140">  }</span>
-<span class="source-line-no">141</span><span id="line-141"></span>
-<span class="source-line-no">142</span><span id="line-142">  @Test</span>
-<span class="source-line-no">143</span><span id="line-143">  public void testAtomicBatchCountedAgainstReadCapacity() throws Exception {</span>
-<span class="source-line-no">144</span><span id="line-144">    setupGenericQuota();</span>
-<span class="source-line-no">145</span><span id="line-145"></span>
-<span class="source-line-no">146</span><span id="line-146">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">147</span><span id="line-147">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">148</span><span id="line-148">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">149</span><span id="line-149"></span>
-<span class="source-line-no">150</span><span id="line-150">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">151</span><span id="line-151">    incs.add(inc);</span>
-<span class="source-line-no">152</span><span id="line-152">    incs.add(inc);</span>
-<span class="source-line-no">153</span><span id="line-153"></span>
-<span class="source-line-no">154</span><span id="line-154">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">155</span><span id="line-155">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">156</span><span id="line-156">      table.batch(incs, results);</span>
-<span class="source-line-no">157</span><span id="line-157">      return results;</span>
-<span class="source-line-no">158</span><span id="line-158">    });</span>
-<span class="source-line-no">159</span><span id="line-159">  }</span>
-<span class="source-line-no">160</span><span id="line-160"></span>
-<span class="source-line-no">161</span><span id="line-161">  @Test</span>
-<span class="source-line-no">162</span><span id="line-162">  public void testAtomicBatchCountedAgainstAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">163</span><span id="line-163">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">164</span><span id="line-164"></span>
-<span class="source-line-no">165</span><span id="line-165">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">166</span><span id="line-166">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">167</span><span id="line-167">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">168</span><span id="line-168"></span>
-<span class="source-line-no">169</span><span id="line-169">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">170</span><span id="line-170">    incs.add(inc);</span>
-<span class="source-line-no">171</span><span id="line-171">    incs.add(inc);</span>
-<span class="source-line-no">172</span><span id="line-172"></span>
-<span class="source-line-no">173</span><span id="line-173">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">174</span><span id="line-174">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">175</span><span id="line-175">      table.batch(incs, results);</span>
-<span class="source-line-no">176</span><span id="line-176">      return results;</span>
-<span class="source-line-no">177</span><span id="line-177">    });</span>
-<span class="source-line-no">178</span><span id="line-178">  }</span>
+<span class="source-line-no">125</span><span id="line-125"></span>
+<span class="source-line-no">126</span><span id="line-126">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">127</span><span id="line-127">    inc.addColumn(FAMILY, QUALIFIER, 1);</span>
+<span class="source-line-no">128</span><span id="line-128">    testThrottle(table -&gt; table.increment(inc));</span>
+<span class="source-line-no">129</span><span id="line-129">  }</span>
+<span class="source-line-no">130</span><span id="line-130"></span>
+<span class="source-line-no">131</span><span id="line-131">  @Test</span>
+<span class="source-line-no">132</span><span id="line-132">  public void testConditionalRowMutationsCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">133</span><span id="line-133">    setupGenericQuota();</span>
+<span class="source-line-no">134</span><span id="line-134"></span>
+<span class="source-line-no">135</span><span id="line-135">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">136</span><span id="line-136">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">137</span><span id="line-137">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">138</span><span id="line-138">    Put put = new Put(row);</span>
+<span class="source-line-no">139</span><span id="line-139">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">140</span><span id="line-140"></span>
+<span class="source-line-no">141</span><span id="line-141">    RowMutations rowMutations = new RowMutations(row);</span>
+<span class="source-line-no">142</span><span id="line-142">    rowMutations.add(inc);</span>
+<span class="source-line-no">143</span><span id="line-143">    rowMutations.add(put);</span>
+<span class="source-line-no">144</span><span id="line-144">    testThrottle(table -&gt; table.mutateRow(rowMutations));</span>
+<span class="source-line-no">145</span><span id="line-145">  }</span>
+<span class="source-line-no">146</span><span id="line-146"></span>
+<span class="source-line-no">147</span><span id="line-147">  @Test</span>
+<span class="source-line-no">148</span><span id="line-148">  public void testNonConditionalRowMutationsOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">149</span><span id="line-149">    setupGenericQuota();</span>
+<span class="source-line-no">150</span><span id="line-150"></span>
+<span class="source-line-no">151</span><span id="line-151">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">152</span><span id="line-152">    Put put = new Put(row);</span>
+<span class="source-line-no">153</span><span id="line-153">    put.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">154</span><span id="line-154"></span>
+<span class="source-line-no">155</span><span id="line-155">    RowMutations rowMutations = new RowMutations(row);</span>
+<span class="source-line-no">156</span><span id="line-156">    rowMutations.add(put);</span>
+<span class="source-line-no">157</span><span id="line-157">    try (Table table = getTable()) {</span>
+<span class="source-line-no">158</span><span id="line-158">      for (int i = 0; i &lt; 100; i++) {</span>
+<span class="source-line-no">159</span><span id="line-159">        table.mutateRow(rowMutations);</span>
+<span class="source-line-no">160</span><span id="line-160">      }</span>
+<span class="source-line-no">161</span><span id="line-161">    }</span>
+<span class="source-line-no">162</span><span id="line-162">  }</span>
+<span class="source-line-no">163</span><span id="line-163"></span>
+<span class="source-line-no">164</span><span id="line-164">  @Test</span>
+<span class="source-line-no">165</span><span id="line-165">  public void testNonAtomicPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">166</span><span id="line-166">    setupGenericQuota();</span>
+<span class="source-line-no">167</span><span id="line-167">    runNonAtomicPuts();</span>
+<span class="source-line-no">168</span><span id="line-168">  }</span>
+<span class="source-line-no">169</span><span id="line-169"></span>
+<span class="source-line-no">170</span><span id="line-170">  @Test</span>
+<span class="source-line-no">171</span><span id="line-171">  public void testNonAtomicMultiPutOmittedFromReadCapacity() throws Exception {</span>
+<span class="source-line-no">172</span><span id="line-172">    setupGenericQuota();</span>
+<span class="source-line-no">173</span><span id="line-173">    runNonAtomicPuts();</span>
+<span class="source-line-no">174</span><span id="line-174">  }</span>
+<span class="source-line-no">175</span><span id="line-175"></span>
+<span class="source-line-no">176</span><span id="line-176">  @Test</span>
+<span class="source-line-no">177</span><span id="line-177">  public void testCheckAndMutateCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">178</span><span id="line-178">    setupGenericQuota();</span>
 <span class="source-line-no">179</span><span id="line-179"></span>
-<span class="source-line-no">180</span><span id="line-180">  @Test</span>
-<span class="source-line-no">181</span><span id="line-181">  public void testAtomicBatchCountedAgainstAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">182</span><span id="line-182">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">183</span><span id="line-183"></span>
-<span class="source-line-no">184</span><span id="line-184">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">185</span><span id="line-185">    Increment inc = new Increment(row);</span>
-<span class="source-line-no">186</span><span id="line-186">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
-<span class="source-line-no">187</span><span id="line-187"></span>
-<span class="source-line-no">188</span><span id="line-188">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">189</span><span id="line-189">    incs.add(inc);</span>
-<span class="source-line-no">190</span><span id="line-190">    incs.add(inc);</span>
-<span class="source-line-no">191</span><span id="line-191"></span>
-<span class="source-line-no">192</span><span id="line-192">    testThrottle(table -&gt; {</span>
-<span class="source-line-no">193</span><span id="line-193">      Object[] results = new Object[] {};</span>
-<span class="source-line-no">194</span><span id="line-194">      table.batch(incs, results);</span>
-<span class="source-line-no">195</span><span id="line-195">      return results;</span>
-<span class="source-line-no">196</span><span id="line-196">    });</span>
-<span class="source-line-no">197</span><span id="line-197">  }</span>
-<span class="source-line-no">198</span><span id="line-198"></span>
-<span class="source-line-no">199</span><span id="line-199">  @Test</span>
-<span class="source-line-no">200</span><span id="line-200">  public void testNonAtomicWritesIgnoredByAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">201</span><span id="line-201">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">202</span><span id="line-202">    runNonAtomicPuts();</span>
-<span class="source-line-no">203</span><span id="line-203">  }</span>
-<span class="source-line-no">204</span><span id="line-204"></span>
-<span class="source-line-no">205</span><span id="line-205">  @Test</span>
-<span class="source-line-no">206</span><span id="line-206">  public void testNonAtomicWritesIgnoredByAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">207</span><span id="line-207">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">208</span><span id="line-208">    runNonAtomicPuts();</span>
-<span class="source-line-no">209</span><span id="line-209">  }</span>
-<span class="source-line-no">210</span><span id="line-210"></span>
-<span class="source-line-no">211</span><span id="line-211">  @Test</span>
-<span class="source-line-no">212</span><span id="line-212">  public void testNonAtomicReadsIgnoredByAtomicOnlyReqNum() throws Exception {</span>
-<span class="source-line-no">213</span><span id="line-213">    setupAtomicOnlyReqNumQuota();</span>
-<span class="source-line-no">214</span><span id="line-214">    runNonAtomicReads();</span>
-<span class="source-line-no">215</span><span id="line-215">  }</span>
+<span class="source-line-no">180</span><span id="line-180">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">181</span><span id="line-181">    byte[] value = Bytes.toBytes("v");</span>
+<span class="source-line-no">182</span><span id="line-182">    Put put = new Put(row);</span>
+<span class="source-line-no">183</span><span id="line-183">    put.addColumn(FAMILY, Bytes.toBytes("doot"), value);</span>
+<span class="source-line-no">184</span><span id="line-184">    CheckAndMutate checkAndMutate =</span>
+<span class="source-line-no">185</span><span id="line-185">      CheckAndMutate.newBuilder(row).ifEquals(FAMILY, QUALIFIER, value).build(put);</span>
+<span class="source-line-no">186</span><span id="line-186"></span>
+<span class="source-line-no">187</span><span id="line-187">    testThrottle(table -&gt; table.checkAndMutate(checkAndMutate));</span>
+<span class="source-line-no">188</span><span id="line-188">  }</span>
+<span class="source-line-no">189</span><span id="line-189"></span>
+<span class="source-line-no">190</span><span id="line-190">  @Test</span>
+<span class="source-line-no">191</span><span id="line-191">  public void testAtomicBatchCountedAgainstReadCapacity() throws Exception {</span>
+<span class="source-line-no">192</span><span id="line-192">    setupGenericQuota();</span>
+<span class="source-line-no">193</span><span id="line-193"></span>
+<span class="source-line-no">194</span><span id="line-194">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">195</span><span id="line-195">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">196</span><span id="line-196">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">197</span><span id="line-197"></span>
+<span class="source-line-no">198</span><span id="line-198">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">199</span><span id="line-199">    incs.add(inc);</span>
+<span class="source-line-no">200</span><span id="line-200">    incs.add(inc);</span>
+<span class="source-line-no">201</span><span id="line-201"></span>
+<span class="source-line-no">202</span><span id="line-202">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">203</span><span id="line-203">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">204</span><span id="line-204">      table.batch(incs, results);</span>
+<span class="source-line-no">205</span><span id="line-205">      return results;</span>
+<span class="source-line-no">206</span><span id="line-206">    });</span>
+<span class="source-line-no">207</span><span id="line-207">  }</span>
+<span class="source-line-no">208</span><span id="line-208"></span>
+<span class="source-line-no">209</span><span id="line-209">  @Test</span>
+<span class="source-line-no">210</span><span id="line-210">  public void testAtomicBatchCountedAgainstAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">211</span><span id="line-211">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">212</span><span id="line-212"></span>
+<span class="source-line-no">213</span><span id="line-213">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">214</span><span id="line-214">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">215</span><span id="line-215">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
 <span class="source-line-no">216</span><span id="line-216"></span>
-<span class="source-line-no">217</span><span id="line-217">  @Test</span>
-<span class="source-line-no">218</span><span id="line-218">  public void testNonAtomicReadsIgnoredByAtomicOnlyReadSize() throws Exception {</span>
-<span class="source-line-no">219</span><span id="line-219">    setupAtomicOnlyReadSizeQuota();</span>
-<span class="source-line-no">220</span><span id="line-220">    runNonAtomicReads();</span>
-<span class="source-line-no">221</span><span id="line-221">  }</span>
-<span class="source-line-no">222</span><span id="line-222"></span>
-<span class="source-line-no">223</span><span id="line-223">  private void runNonAtomicPuts() throws Exception {</span>
-<span class="source-line-no">224</span><span id="line-224">    Put put1 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">225</span><span id="line-225">    put1.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">226</span><span id="line-226">    Put put2 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">227</span><span id="line-227">    put2.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
-<span class="source-line-no">228</span><span id="line-228"></span>
-<span class="source-line-no">229</span><span id="line-229">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
-<span class="source-line-no">230</span><span id="line-230">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">217</span><span id="line-217">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">218</span><span id="line-218">    incs.add(inc);</span>
+<span class="source-line-no">219</span><span id="line-219">    incs.add(inc);</span>
+<span class="source-line-no">220</span><span id="line-220"></span>
+<span class="source-line-no">221</span><span id="line-221">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">222</span><span id="line-222">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">223</span><span id="line-223">      table.batch(incs, results);</span>
+<span class="source-line-no">224</span><span id="line-224">      return results;</span>
+<span class="source-line-no">225</span><span id="line-225">    });</span>
+<span class="source-line-no">226</span><span id="line-226">  }</span>
+<span class="source-line-no">227</span><span id="line-227"></span>
+<span class="source-line-no">228</span><span id="line-228">  @Test</span>
+<span class="source-line-no">229</span><span id="line-229">  public void testAtomicBatchCountedAgainstAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">230</span><span id="line-230">    setupAtomicOnlyReadSizeQuota();</span>
 <span class="source-line-no">231</span><span id="line-231"></span>
-<span class="source-line-no">232</span><span id="line-232">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(2);</span>
-<span class="source-line-no">233</span><span id="line-233">    puts.add(put1);</span>
-<span class="source-line-no">234</span><span id="line-234">    puts.add(put2);</span>
+<span class="source-line-no">232</span><span id="line-232">    byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">233</span><span id="line-233">    Increment inc = new Increment(row);</span>
+<span class="source-line-no">234</span><span id="line-234">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
 <span class="source-line-no">235</span><span id="line-235"></span>
-<span class="source-line-no">236</span><span id="line-236">    try (Table table = getTable()) {</span>
-<span class="source-line-no">237</span><span id="line-237">      for (int i = 0; i &lt; 100; i++) {</span>
-<span class="source-line-no">238</span><span id="line-238">        table.put(puts);</span>
-<span class="source-line-no">239</span><span id="line-239">      }</span>
-<span class="source-line-no">240</span><span id="line-240">    }</span>
-<span class="source-line-no">241</span><span id="line-241">  }</span>
-<span class="source-line-no">242</span><span id="line-242"></span>
-<span class="source-line-no">243</span><span id="line-243">  private void runNonAtomicReads() throws Exception {</span>
-<span class="source-line-no">244</span><span id="line-244">    try (Table table = getTable()) {</span>
-<span class="source-line-no">245</span><span id="line-245">      byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
-<span class="source-line-no">246</span><span id="line-246">      Get get = new Get(row);</span>
-<span class="source-line-no">247</span><span id="line-247">      table.get(get);</span>
-<span class="source-line-no">248</span><span id="line-248">    }</span>
-<span class="source-line-no">249</span><span id="line-249">  }</span>
-<span class="source-line-no">250</span><span id="line-250"></span>
-<span class="source-line-no">251</span><span id="line-251">  private void setupGenericQuota() throws Exception {</span>
-<span class="source-line-no">252</span><span id="line-252">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">253</span><span id="line-253">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">254</span><span id="line-254">        ThrottleType.READ_NUMBER, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">255</span><span id="line-255">    }</span>
-<span class="source-line-no">256</span><span id="line-256">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">236</span><span id="line-236">    List&lt;Increment&gt; incs = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">237</span><span id="line-237">    incs.add(inc);</span>
+<span class="source-line-no">238</span><span id="line-238">    incs.add(inc);</span>
+<span class="source-line-no">239</span><span id="line-239"></span>
+<span class="source-line-no">240</span><span id="line-240">    testThrottle(table -&gt; {</span>
+<span class="source-line-no">241</span><span id="line-241">      Object[] results = new Object[] {};</span>
+<span class="source-line-no">242</span><span id="line-242">      table.batch(incs, results);</span>
+<span class="source-line-no">243</span><span id="line-243">      return results;</span>
+<span class="source-line-no">244</span><span id="line-244">    });</span>
+<span class="source-line-no">245</span><span id="line-245">  }</span>
+<span class="source-line-no">246</span><span id="line-246"></span>
+<span class="source-line-no">247</span><span id="line-247">  @Test</span>
+<span class="source-line-no">248</span><span id="line-248">  public void testNonAtomicWritesIgnoredByAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">249</span><span id="line-249">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">250</span><span id="line-250">    runNonAtomicPuts();</span>
+<span class="source-line-no">251</span><span id="line-251">  }</span>
+<span class="source-line-no">252</span><span id="line-252"></span>
+<span class="source-line-no">253</span><span id="line-253">  @Test</span>
+<span class="source-line-no">254</span><span id="line-254">  public void testNonAtomicWritesIgnoredByAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">255</span><span id="line-255">    setupAtomicOnlyReadSizeQuota();</span>
+<span class="source-line-no">256</span><span id="line-256">    runNonAtomicPuts();</span>
 <span class="source-line-no">257</span><span id="line-257">  }</span>
 <span class="source-line-no">258</span><span id="line-258"></span>
-<span class="source-line-no">259</span><span id="line-259">  private void setupAtomicOnlyReqNumQuota() throws Exception {</span>
-<span class="source-line-no">260</span><span id="line-260">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">261</span><span id="line-261">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">262</span><span id="line-262">        ThrottleType.ATOMIC_REQUEST_NUMBER, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">263</span><span id="line-263">    }</span>
-<span class="source-line-no">264</span><span id="line-264">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
-<span class="source-line-no">265</span><span id="line-265">  }</span>
-<span class="source-line-no">266</span><span id="line-266"></span>
-<span class="source-line-no">267</span><span id="line-267">  private void setupAtomicOnlyReadSizeQuota() throws Exception {</span>
-<span class="source-line-no">268</span><span id="line-268">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">269</span><span id="line-269">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
-<span class="source-line-no">270</span><span id="line-270">        ThrottleType.ATOMIC_READ_SIZE, 1, TimeUnit.MINUTES));</span>
-<span class="source-line-no">271</span><span id="line-271">    }</span>
-<span class="source-line-no">272</span><span id="line-272">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
-<span class="source-line-no">273</span><span id="line-273">  }</span>
-<span class="source-line-no">274</span><span id="line-274"></span>
-<span class="source-line-no">275</span><span id="line-275">  private void cleanupQuota() throws Exception {</span>
-<span class="source-line-no">276</span><span id="line-276">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
-<span class="source-line-no">277</span><span id="line-277">      admin.setQuota(QuotaSettingsFactory.unthrottleUser(User.getCurrent().getShortName()));</span>
-<span class="source-line-no">278</span><span id="line-278">    }</span>
-<span class="source-line-no">279</span><span id="line-279">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, true, TABLE_NAME);</span>
-<span class="source-line-no">280</span><span id="line-280">  }</span>
-<span class="source-line-no">281</span><span id="line-281"></span>
-<span class="source-line-no">282</span><span id="line-282">  private void testThrottle(ThrowingFunction&lt;Table, ?&gt; request) throws Exception {</span>
-<span class="source-line-no">283</span><span id="line-283">    try (Table table = getTable()) {</span>
-<span class="source-line-no">284</span><span id="line-284">      // we have a read quota configured, so this should fail</span>
-<span class="source-line-no">285</span><span id="line-285">      TEST_UTIL.waitFor(60_000, () -&gt; {</span>
-<span class="source-line-no">286</span><span id="line-286">        try {</span>
-<span class="source-line-no">287</span><span id="line-287">          request.run(table);</span>
-<span class="source-line-no">288</span><span id="line-288">          return false;</span>
-<span class="source-line-no">289</span><span id="line-289">        } catch (Exception e) {</span>
-<span class="source-line-no">290</span><span id="line-290">          boolean success = e.getCause() instanceof RpcThrottlingException;</span>
-<span class="source-line-no">291</span><span id="line-291">          if (!success) {</span>
-<span class="source-line-no">292</span><span id="line-292">            LOG.error("Unexpected exception", e);</span>
-<span class="source-line-no">293</span><span id="line-293">          }</span>
-<span class="source-line-no">294</span><span id="line-294">          return success;</span>
-<span class="source-line-no">295</span><span id="line-295">        }</span>
-<span class="source-line-no">296</span><span id="line-296">      });</span>
-<span class="source-line-no">297</span><span id="line-297">    } finally {</span>
-<span class="source-line-no">298</span><span id="line-298">      cleanupQuota();</span>
-<span class="source-line-no">299</span><span id="line-299">    }</span>
-<span class="source-line-no">300</span><span id="line-300">  }</span>
-<span class="source-line-no">301</span><span id="line-301"></span>
-<span class="source-line-no">302</span><span id="line-302">  private Table getTable() throws IOException {</span>
-<span class="source-line-no">303</span><span id="line-303">    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 100);</span>
-<span class="source-line-no">304</span><span id="line-304">    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);</span>
-<span class="source-line-no">305</span><span id="line-305">    return TEST_UTIL.getConnection().getTableBuilder(TABLE_NAME, null).setOperationTimeout(250)</span>
-<span class="source-line-no">306</span><span id="line-306">      .build();</span>
-<span class="source-line-no">307</span><span id="line-307">  }</span>
-<span class="source-line-no">308</span><span id="line-308"></span>
-<span class="source-line-no">309</span><span id="line-309">  @FunctionalInterface</span>
-<span class="source-line-no">310</span><span id="line-310">  private interface ThrowingFunction&lt;I, O&gt; {</span>
-<span class="source-line-no">311</span><span id="line-311">    O run(I input) throws Exception;</span>
-<span class="source-line-no">312</span><span id="line-312">  }</span>
-<span class="source-line-no">313</span><span id="line-313"></span>
-<span class="source-line-no">314</span><span id="line-314">}</span>
+<span class="source-line-no">259</span><span id="line-259">  @Test</span>
+<span class="source-line-no">260</span><span id="line-260">  public void testNonAtomicReadsIgnoredByAtomicOnlyReqNum() throws Exception {</span>
+<span class="source-line-no">261</span><span id="line-261">    setupAtomicOnlyReqNumQuota();</span>
+<span class="source-line-no">262</span><span id="line-262">    runNonAtomicReads();</span>
+<span class="source-line-no">263</span><span id="line-263">  }</span>
+<span class="source-line-no">264</span><span id="line-264"></span>
+<span class="source-line-no">265</span><span id="line-265">  @Test</span>
+<span class="source-line-no">266</span><span id="line-266">  public void testNonAtomicReadsIgnoredByAtomicOnlyReadSize() throws Exception {</span>
+<span class="source-line-no">267</span><span id="line-267">    setupAtomicOnlyReadSizeQuota();</span>
+<span class="source-line-no">268</span><span id="line-268">    runNonAtomicReads();</span>
+<span class="source-line-no">269</span><span id="line-269">  }</span>
+<span class="source-line-no">270</span><span id="line-270"></span>
+<span class="source-line-no">271</span><span id="line-271">  private void runNonAtomicPuts() throws Exception {</span>
+<span class="source-line-no">272</span><span id="line-272">    Put put1 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">273</span><span id="line-273">    put1.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">274</span><span id="line-274">    Put put2 = new Put(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">275</span><span id="line-275">    put2.addColumn(FAMILY, Bytes.toBytes("doot"), Bytes.toBytes("v"));</span>
+<span class="source-line-no">276</span><span id="line-276"></span>
+<span class="source-line-no">277</span><span id="line-277">    Increment inc = new Increment(Bytes.toBytes(UUID.randomUUID().toString()));</span>
+<span class="source-line-no">278</span><span id="line-278">    inc.addColumn(FAMILY, Bytes.toBytes("doot"), 1);</span>
+<span class="source-line-no">279</span><span id="line-279"></span>
+<span class="source-line-no">280</span><span id="line-280">    List&lt;Put&gt; puts = new ArrayList&lt;&gt;(2);</span>
+<span class="source-line-no">281</span><span id="line-281">    puts.add(put1);</span>
+<span class="source-line-no">282</span><span id="line-282">    puts.add(put2);</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">    try (Table table = getTable()) {</span>
+<span class="source-line-no">285</span><span id="line-285">      for (int i = 0; i &lt; 100; i++) {</span>
+<span class="source-line-no">286</span><span id="line-286">        table.put(puts);</span>
+<span class="source-line-no">287</span><span id="line-287">      }</span>
+<span class="source-line-no">288</span><span id="line-288">    }</span>
+<span class="source-line-no">289</span><span id="line-289">  }</span>
+<span class="source-line-no">290</span><span id="line-290"></span>
+<span class="source-line-no">291</span><span id="line-291">  private void runNonAtomicReads() throws Exception {</span>
+<span class="source-line-no">292</span><span id="line-292">    try (Table table = getTable()) {</span>
+<span class="source-line-no">293</span><span id="line-293">      byte[] row = Bytes.toBytes(UUID.randomUUID().toString());</span>
+<span class="source-line-no">294</span><span id="line-294">      Get get = new Get(row);</span>
+<span class="source-line-no">295</span><span id="line-295">      table.get(get);</span>
+<span class="source-line-no">296</span><span id="line-296">    }</span>
+<span class="source-line-no">297</span><span id="line-297">  }</span>
+<span class="source-line-no">298</span><span id="line-298"></span>
+<span class="source-line-no">299</span><span id="line-299">  private void setupGenericQuota() throws Exception {</span>
+<span class="source-line-no">300</span><span id="line-300">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">301</span><span id="line-301">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">302</span><span id="line-302">        ThrottleType.READ_NUMBER, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">303</span><span id="line-303">    }</span>
+<span class="source-line-no">304</span><span id="line-304">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">305</span><span id="line-305">  }</span>
+<span class="source-line-no">306</span><span id="line-306"></span>
+<span class="source-line-no">307</span><span id="line-307">  private void setupAtomicOnlyReqNumQuota() throws Exception {</span>
+<span class="source-line-no">308</span><span id="line-308">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">309</span><span id="line-309">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">310</span><span id="line-310">        ThrottleType.ATOMIC_REQUEST_NUMBER, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">311</span><span id="line-311">    }</span>
+<span class="source-line-no">312</span><span id="line-312">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">313</span><span id="line-313">  }</span>
+<span class="source-line-no">314</span><span id="line-314"></span>
+<span class="source-line-no">315</span><span id="line-315">  private void setupAtomicOnlyReadSizeQuota() throws Exception {</span>
+<span class="source-line-no">316</span><span id="line-316">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">317</span><span id="line-317">      admin.setQuota(QuotaSettingsFactory.throttleUser(User.getCurrent().getShortName(),</span>
+<span class="source-line-no">318</span><span id="line-318">        ThrottleType.ATOMIC_READ_SIZE, 1, TimeUnit.MINUTES));</span>
+<span class="source-line-no">319</span><span id="line-319">    }</span>
+<span class="source-line-no">320</span><span id="line-320">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, false, TABLE_NAME);</span>
+<span class="source-line-no">321</span><span id="line-321">  }</span>
+<span class="source-line-no">322</span><span id="line-322"></span>
+<span class="source-line-no">323</span><span id="line-323">  private void cleanupQuota() throws Exception {</span>
+<span class="source-line-no">324</span><span id="line-324">    try (Admin admin = TEST_UTIL.getAdmin()) {</span>
+<span class="source-line-no">325</span><span id="line-325">      admin.setQuota(QuotaSettingsFactory.unthrottleUser(User.getCurrent().getShortName()));</span>
+<span class="source-line-no">326</span><span id="line-326">    }</span>
+<span class="source-line-no">327</span><span id="line-327">    ThrottleQuotaTestUtil.triggerUserCacheRefresh(TEST_UTIL, true, TABLE_NAME);</span>
+<span class="source-line-no">328</span><span id="line-328">  }</span>
+<span class="source-line-no">329</span><span id="line-329"></span>
+<span class="source-line-no">330</span><span id="line-330">  private void testThrottle(ThrowingFunction&lt;Table, ?&gt; request) throws Exception {</span>
+<span class="source-line-no">331</span><span id="line-331">    try (Table table = getTable()) {</span>
+<span class="source-line-no">332</span><span id="line-332">      // we have a read quota configured, so this should fail</span>
+<span class="source-line-no">333</span><span id="line-333">      TEST_UTIL.waitFor(60_000, () -&gt; {</span>
+<span class="source-line-no">334</span><span id="line-334">        try {</span>
+<span class="source-line-no">335</span><span id="line-335">          request.run(table);</span>
+<span class="source-line-no">336</span><span id="line-336">          return false;</span>
+<span class="source-line-no">337</span><span id="line-337">        } catch (Exception e) {</span>
+<span class="source-line-no">338</span><span id="line-338">          boolean success = e.getCause() instanceof RpcThrottlingException;</span>
+<span class="source-line-no">339</span><span id="line-339">          if (!success) {</span>
+<span class="source-line-no">340</span><span id="line-340">            LOG.error("Unexpected exception", e);</span>
+<span class="source-line-no">341</span><span id="line-341">          }</span>
+<span class="source-line-no">342</span><span id="line-342">          return success;</span>
+<span class="source-line-no">343</span><span id="line-343">        }</span>
+<span class="source-line-no">344</span><span id="line-344">      });</span>
+<span class="source-line-no">345</span><span id="line-345">    } finally {</span>
+<span class="source-line-no">346</span><span id="line-346">      cleanupQuota();</span>
+<span class="source-line-no">347</span><span id="line-347">    }</span>
+<span class="source-line-no">348</span><span id="line-348">  }</span>
+<span class="source-line-no">349</span><span id="line-349"></span>
+<span class="source-line-no">350</span><span id="line-350">  private Table getTable() throws IOException {</span>
+<span class="source-line-no">351</span><span id="line-351">    TEST_UTIL.getConfiguration().setInt("hbase.client.pause", 100);</span>
+<span class="source-line-no">352</span><span id="line-352">    TEST_UTIL.getConfiguration().setInt(HConstants.HBASE_CLIENT_RETRIES_NUMBER, 1);</span>
+<span class="source-line-no">353</span><span id="line-353">    return TEST_UTIL.getConnection().getTableBuilder(TABLE_NAME, null).setOperationTimeout(250)</span>
+<span class="source-line-no">354</span><span id="line-354">      .build();</span>
+<span class="source-line-no">355</span><span id="line-355">  }</span>
+<span class="source-line-no">356</span><span id="line-356"></span>
+<span class="source-line-no">357</span><span id="line-357">  @FunctionalInterface</span>
+<span class="source-line-no">358</span><span id="line-358">  private interface ThrowingFunction&lt;I, O&gt; {</span>
+<span class="source-line-no">359</span><span id="line-359">    O run(I input) throws Exception;</span>
+<span class="source-line-no">360</span><span id="line-360">  }</span>
+<span class="source-line-no">361</span><span id="line-361"></span>
+<span class="source-line-no">362</span><span id="line-362">}</span>