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<User> 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<ClientProtos.Action> 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<User> 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() && scanRequest.getCloseScanner()</span>
+<span class="source-line-no">186</span><span id="line-186"> && scanRequest.getNumberOfRows() == 0 && !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<User> 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<ClientProtos.Action> 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<User> 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> <span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span> <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> <span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span> <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> 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> <span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span> <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> <span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span> <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><org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.Action> actions,
boolean 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> <span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span> <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> <span class="return-type"><a href="OperationQuota.html" title="interface in org.apache.hadoop.hbase.quotas">OperationQuota</a></span> <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 numWrites,
int numReads,
boolean 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<User> 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<ClientProtos.Action> 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<User> 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() && scanRequest.getCloseScanner()</span>
+<span class="source-line-no">186</span><span id="line-186"> && scanRequest.getNumberOfRows() == 0 && !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<User> 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<ClientProtos.Action> 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<User> 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> </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> </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> </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> </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 -> 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 -> 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 < 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, () -> 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, () -> 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, () -> 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 -> 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<Increment> incs = new ArrayList<>(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 -> {</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<Increment> incs = new ArrayList<>(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 -> {</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 -> 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 -> 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 < 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<Increment> incs = new ArrayList<>(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 -> {</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 -> 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<Increment> incs = new ArrayList<>(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 -> {</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<Increment> incs = new ArrayList<>(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 -> {</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<Put> puts = new ArrayList<>(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 < 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<Increment> incs = new ArrayList<>(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 -> {</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<Table, ?> 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, () -> {</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<I, O> {</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<Put> puts = new ArrayList<>(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 < 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<Table, ?> 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, () -> {</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<I, O> {</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> </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> </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> </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> </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><I,<wbr>O></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><I,<wbr>O></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> <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> <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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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"> </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><org.apache.hadoop.hbase.client.Table,<wbr>?> 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"> </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><org.apache.hadoop.hbase.client.Table,<wbr>?> request)</code></div>
+<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab4"> </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> <span class="return-type">org.slf4j.Logger</span> <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> <span class="return-type">org.slf4j.Logger</span> <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> <span class="return-type"><a href="../HBaseTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtil</a></span> <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> <span class="return-type"><a href="../HBaseTestingUtil.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtil</a></span> <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> <span class="return-type">org.apache.hadoop.hbase.TableName</span> <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> <span class="return-type">org.apache.hadoop.hbase.TableName</span> <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> <span class="return-type">byte[]</span> <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> <span class="return-type">byte[]</span> <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> <span class="return-type">byte[]</span> <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> <span class="return-type">byte[]</span> <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="<init>()">
<h3>TestAtomicReadQuota</h3>
-<div class="member-signature"><span class="modifiers">public</span> <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> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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> <span class="return-type">void</span> <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><org.apache.hadoop.hbase.client.Table,<wbr>?> [...]
+<div class="member-signature"><span class="modifiers">private</span> <span class="return-type">void</span> <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><org.apache.hadoop.hbase.client.Table,<wbr>?> [...]
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> <span class="return-type">org.apache.hadoop.hbase.client.Table</span> <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> <span class="return-type">org.apache.hadoop.hbase.client.Table</span> <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 -> 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 -> 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 < 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, () -> 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, () -> 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, () -> 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 -> 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<Increment> incs = new ArrayList<>(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 -> {</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<Increment> incs = new ArrayList<>(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 -> {</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 -> 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 -> 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 < 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<Increment> incs = new ArrayList<>(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 -> {</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 -> 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<Increment> incs = new ArrayList<>(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 -> {</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<Increment> incs = new ArrayList<>(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 -> {</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<Put> puts = new ArrayList<>(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 < 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<Increment> incs = new ArrayList<>(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 -> {</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<Table, ?> 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, () -> {</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<I, O> {</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<Put> puts = new ArrayList<>(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 < 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<Table, ?> 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, () -> {</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<I, O> {</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 -> 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 -> 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 < 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, () -> 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, () -> 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, () -> 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 -> 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<Increment> incs = new ArrayList<>(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 -> {</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<Increment> incs = new ArrayList<>(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 -> {</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 -> 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 -> 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 < 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<Increment> incs = new ArrayList<>(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 -> {</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 -> 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<Increment> incs = new ArrayList<>(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 -> {</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<Increment> incs = new ArrayList<>(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 -> {</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<Put> puts = new ArrayList<>(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 < 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<Increment> incs = new ArrayList<>(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 -> {</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<Table, ?> 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, () -> {</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<I, O> {</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<Put> puts = new ArrayList<>(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 < 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<Table, ?> 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, () -> {</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<I, O> {</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>