[
https://issues.apache.org/jira/browse/HBASE-28730?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Daniel Roudnitsky updated HBASE-28730:
--------------------------------------
Description:
I'll be referring to hbase.client.operation.timeout as 'operation timeout' and
hbase.client.meta.operation.timeout as 'meta timeout'.
In the branch-2 client there is a userRegionLock that a thread needs to acquire
to run a meta scan to locate a region. userRegionLock acquisition time is
bounded by the meta timeout (HBASE-24956) and once the lock is acquired the
meta scan time is bounded by hbase.client.meta.scanner.timeout.period
(HBASE-27078). The following describes two cases where resolving the region
location for an operation can exceed the end to end operation timeout when
there is contention around userRegionLock and/or meta slowness (high contention
could result from meta slowness/hotspotting , and is more likely in a high
concurrency environment where lots of batch operations are being executed):
1. In locateRegionInMeta , if the relevant region location is not cached,
userRegion lock acquisition and meta scan (if userRegionLock is able to be
acquired within the lock timeout) [may be retried up to
hbase.client.retries.number times|#L1012]. Operation timeout check is not done
in between retries, so even if one has meta timeout + meta scanner timeout <
operation timeout, retries could take the client beyond the operation timeout
before we exit out of locateRegionInMeta and an operation timeout check is done
if (meta operation timeout + meta scanner timeout) * region lookup attempts >
operation timeout.
Suppose we have operation timeout = meta timeout = 10sec and client retries =
2, and there is enough contention/meta slowness that userRegionLock cannot be
acquired for 1min, and we have a new thread running an operation that needs to
do a region lookup. For this operation, locateRegionInMeta will try to acquire
the userRegionLock 3 times , taking 3 * 10sec + some pause time in between
retries before we exit out of locateRegionInMeta and the operation times out
after >3x the configured 10sec operation/meta timeout.
2. Without any retries, if one has (hbase.client.meta.operation.timeout ||
hbase.client.meta.scanner.timeout.period) > hbase.client.operation.timeout
(meta operation timeout default makes this easily possible - HBASE-28608) the
client operation timeout could be exceeded.
+Proposal+
I propose two changes:
1. Doing an operation timeout check in between retrying userRegion lock
acquisition + meta scan (perhaps moving the retry logic + loop outside of the
locateRegionInMeta method?)
2. Change userRegionLock timeout and meta scanner timeout to a dynamic values
that depend on the time remaining for the end to end operation. userRegionLock
acquisition and meta scan time are bounded by static values regardless of how
much time was already spent trying to do region location lookups or how much
time might be remaining to run the actual operations once all required region
locations are found.
If we were to use time remaining for the operation for the lock timeout, and
then set the meta scanner timeout to
min(hbase.client.meta.scanner.timeout.period, operation time remaining after
userRegionLock acquisition), that would provide a good upper bound on time
spent attempting to locate a region that should keep the operation closely
within the desired end to end timeout.
Dynamic userRegionLock and meta scanner timeouts would also remove some
complexity/dependence on client configurations in the locate region codepath
which should simplify the thought process behind choosing appropriate client
timeouts.
----
Branch-2 blocking client is effected, I am not yet sure and have not tested how
branch-2 AsyncTable is effected. Branch-3+ does not have userRegionLock, and
the sync client connection implementation is very
[different|https://github.com/apache/hbase/pull/6000#issuecomment-2210913557]
(thank you Duo for explaining).
This issue extends/develops on what was originally reported in the bottom of
HBASE-28358. HBASE-27490 is related work which greatly improved the upper bound
on region location resolution time for batch operations.
was:
I'll be referring to hbase.client.operation.timeout as 'operation timeout' and
hbase.client.meta.operation.timeout as 'meta timeout'.
In the branch-2 client there is a userRegionLock that a thread needs to acquire
to run a meta scan to locate a region. userRegionLock acquisition time is
bounded by the meta timeout (HBASE-24956) and once the lock is acquired the
meta scan time is bounded by hbase.client.meta.scanner.timeout.period
(HBASE-27078). The following describes two cases where resolving the region
location for an operation can exceed the end to end operation timeout when
there is contention around userRegionLock and/or meta slowness (high contention
could result from meta slowness/hotspotting , and is more likely in a high
concurrency environment where lots of batch operations are being executed):
# In locateRegionInMeta , if the relevant region location is not cached,
userRegion lock acquisition and meta scan (if userRegionLock is able to be
acquired within the lock timeout) [may be retried up to
hbase.client.retries.number times|#L1012]. Operation timeout check is not done
in between retries, so even if one has meta timeout + meta scanner timeout <
operation timeout, retries could take the client beyond the operation timeout
before we exit out of locateRegionInMeta and an operation timeout check is done
if (meta operation timeout + meta scanner timeout) * region lookup attempts >
operation timeout.
Suppose we have operation timeout = meta timeout = 10sec and client retries =
2, and there is enough contention/meta slowness that userRegionLock cannot be
acquired for 1min, and we have a new thread running an operation that needs to
do a region lookup. For this operation, locateRegionInMeta will try to acquire
the userRegionLock 3 times , taking 3 * 10sec + some pause time in between
retries before we exit out of locateRegionInMeta and the operation times out
after >3x the configured 10sec operation/meta timeout.
# Without any retries, if one has (hbase.client.meta.operation.timeout ||
hbase.client.meta.scanner.timeout.period) > hbase.client.operation.timeout
(meta operation timeout default makes this easily possible - HBASE-28608) the
client operation timeout could be exceeded.
+Proposal+
I propose two changes:
# Doing an operation timeout check in between retrying userRegion lock
acquisition + meta scan (perhaps moving the retry logic + loop outside of the
locateRegionInMeta method?)
# Change userRegionLock timeout and meta scanner timeout to a dynamic values
that depend on the time remaining for the end to end operation. userRegionLock
acquisition and meta scan time are bounded by static values regardless of how
much time was already spent trying to do region location lookups or how much
time might be remaining to run the actual operations once all required region
locations are found.
If we were to use time remaining for the operation for the lock timeout, and
then set the meta scanner timeout to
min(hbase.client.meta.scanner.timeout.period, operation time remaining after
userRegionLock acquisition), that would provide a good upper bound on time
spent attempting to locate a region that should keep the operation closely
within the desired end to end timeout.
Dynamic userRegionLock and meta scanner timeouts would also remove some
complexity/dependence on client configurations in the locate region codepath
which should simplify the thought process behind choosing appropriate client
timeouts.
----
Branch-2 blocking client is effected, I am not yet sure and have not tested how
branch-2 AsyncTable is effected. Branch-3+ does not have userRegionLock, and
the sync client connection implementation is very
[different|https://github.com/apache/hbase/pull/6000#issuecomment-2210913557]
(thank you Duo for explaining).
This issue extends/develops on what was originally reported in the bottom of
HBASE-28358. HBASE-27490 is related work which greatly improved the upper bound
on region location resolution time for batch operations.
> Locating region can exceed client operation timeout
> ----------------------------------------------------
>
> Key: HBASE-28730
> URL: https://issues.apache.org/jira/browse/HBASE-28730
> Project: HBase
> Issue Type: Improvement
> Components: Client
> Affects Versions: 2.3.7, 2.6.0, 2.4.18, 2.5.9
> Reporter: Daniel Roudnitsky
> Assignee: Daniel Roudnitsky
> Priority: Major
> Labels: timeout
>
> I'll be referring to hbase.client.operation.timeout as 'operation timeout'
> and hbase.client.meta.operation.timeout as 'meta timeout'.
>
> In the branch-2 client there is a userRegionLock that a thread needs to
> acquire to run a meta scan to locate a region. userRegionLock acquisition
> time is bounded by the meta timeout (HBASE-24956) and once the lock is
> acquired the meta scan time is bounded by
> hbase.client.meta.scanner.timeout.period (HBASE-27078). The following
> describes two cases where resolving the region location for an operation can
> exceed the end to end operation timeout when there is contention around
> userRegionLock and/or meta slowness (high contention could result from meta
> slowness/hotspotting , and is more likely in a high concurrency environment
> where lots of batch operations are being executed):
> 1. In locateRegionInMeta , if the relevant region location is not cached,
> userRegion lock acquisition and meta scan (if userRegionLock is able to be
> acquired within the lock timeout) [may be retried up to
> hbase.client.retries.number times|#L1012]. Operation timeout check is not
> done in between retries, so even if one has meta timeout + meta scanner
> timeout < operation timeout, retries could take the client beyond the
> operation timeout before we exit out of locateRegionInMeta and an operation
> timeout check is done if (meta operation timeout + meta scanner timeout) *
> region lookup attempts > operation timeout.
> Suppose we have operation timeout = meta timeout = 10sec and client retries =
> 2, and there is enough contention/meta slowness that userRegionLock cannot be
> acquired for 1min, and we have a new thread running an operation that needs
> to do a region lookup. For this operation, locateRegionInMeta will try to
> acquire the userRegionLock 3 times , taking 3 * 10sec + some pause time in
> between retries before we exit out of locateRegionInMeta and the operation
> times out after >3x the configured 10sec operation/meta timeout.
> 2. Without any retries, if one has (hbase.client.meta.operation.timeout ||
> hbase.client.meta.scanner.timeout.period) > hbase.client.operation.timeout
> (meta operation timeout default makes this easily possible - HBASE-28608)
> the client operation timeout could be exceeded.
> +Proposal+
> I propose two changes:
> 1. Doing an operation timeout check in between retrying userRegion lock
> acquisition + meta scan (perhaps moving the retry logic + loop outside of the
> locateRegionInMeta method?)
> 2. Change userRegionLock timeout and meta scanner timeout to a dynamic values
> that depend on the time remaining for the end to end operation.
> userRegionLock acquisition and meta scan time are bounded by static values
> regardless of how much time was already spent trying to do region location
> lookups or how much time might be remaining to run the actual operations once
> all required region locations are found.
> If we were to use time remaining for the operation for the lock timeout, and
> then set the meta scanner timeout to
> min(hbase.client.meta.scanner.timeout.period, operation time remaining after
> userRegionLock acquisition), that would provide a good upper bound on time
> spent attempting to locate a region that should keep the operation closely
> within the desired end to end timeout.
> Dynamic userRegionLock and meta scanner timeouts would also remove some
> complexity/dependence on client configurations in the locate region codepath
> which should simplify the thought process behind choosing appropriate client
> timeouts.
> ----
> Branch-2 blocking client is effected, I am not yet sure and have not tested
> how branch-2 AsyncTable is effected. Branch-3+ does not have userRegionLock,
> and the sync client connection implementation is very
> [different|https://github.com/apache/hbase/pull/6000#issuecomment-2210913557]
> (thank you Duo for explaining).
> This issue extends/develops on what was originally reported in the bottom of
> HBASE-28358. HBASE-27490 is related work which greatly improved the upper
> bound on region location resolution time for batch operations.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)