This is an automated email from the ASF dual-hosted git repository.
ztao1987 pushed a commit to branch ztao
in repository https://gitbox.apache.org/repos/asf/hawq.git
The following commit(s) were added to refs/heads/ztao by this push:
new 3ae9cee HAWQ-1828. rm should reject request when unavailable segment
ratio exceeds rm_rejectrequest_nseg_limit
3ae9cee is described below
commit 3ae9ceea07beb91dff7a7cfdd847c7f6fdcd344c
Author: ztao1987 <[email protected]>
AuthorDate: Sat Jan 15 15:26:41 2022 +0800
HAWQ-1828. rm should reject request when unavailable segment ratio exceeds
rm_rejectrequest_nseg_limit
---
src/backend/resourcemanager/requesthandler.c | 17 +++++++++++++++--
1 file changed, 15 insertions(+), 2 deletions(-)
diff --git a/src/backend/resourcemanager/requesthandler.c
b/src/backend/resourcemanager/requesthandler.c
index 6edd98e..4b268b0 100644
--- a/src/backend/resourcemanager/requesthandler.c
+++ b/src/backend/resourcemanager/requesthandler.c
@@ -412,7 +412,16 @@ bool handleRMRequestAcquireResource(void **arg)
*--------------------------------------------------------------------------
*/
Assert(PRESPOOL->SlavesHostCount > 0);
- int rejectlimit = ceil(PRESPOOL->SlavesHostCount *
rm_rejectrequest_nseg_limit);
+ /*
+ * original check: unavailcount > rejectlimit cannot handle some
situations.
+ * int rejectlimit = ceil(PRESPOOL->SlavesHostCount *
rm_rejectrequest_nseg_limit);
+ * int unavailcount = PRESPOOL->SlavesHostCount -
PRESPOOL->AvailNodeCount;
+ * e.g. rm_rejectrequest_nseg_limit default 0.25
+ * a cluster with (1-3) nodes, 1 node down, rejectlimit=1,
unavailcount=1
+ * unavailcount > rejectlimit is false, the request won't be rejected.
+ * but the unavailable ratio varies from 33%~100% > 25%.
+ */
+ int rejectlimit = floor(PRESPOOL->SlavesHostCount *
rm_rejectrequest_nseg_limit);
int unavailcount = PRESPOOL->SlavesHostCount - PRESPOOL->AvailNodeCount;
if ( unavailcount > rejectlimit )
{
@@ -881,7 +890,11 @@ bool handleRMRequestAcquireResourceQuota(void **arg)
}
Assert(PRESPOOL->SlavesHostCount > 0);
- int rejectlimit = ceil(PRESPOOL->SlavesHostCount *
rm_rejectrequest_nseg_limit);
+ /*
+ * change from ceil to floor, reference to explanation in
+ * handleRMRequestAcquireResource
+ */
+ int rejectlimit = floor(PRESPOOL->SlavesHostCount *
rm_rejectrequest_nseg_limit);
int unavailcount = PRESPOOL->SlavesHostCount - PRESPOOL->AvailNodeCount;
if ( unavailcount > rejectlimit )
{