diff options
author | Pavan Deolasee | 2016-07-19 12:10:20 +0000 |
---|---|---|
committer | Pavan Deolasee | 2016-10-18 10:07:23 +0000 |
commit | 01a9347a362b8c2c3aa8aee74910adb48eed5efd (patch) | |
tree | 84efb603ccd79e1dfa50e9f74cd7defbfa40f2bd | |
parent | 0bd54c394394ae10bf5e2c1a68ced91481cee500 (diff) |
Load balance remote subplan execution by choosing a node randomly instead of
always picking up the first node.
When planner has a choice of executing a subplan on any of the remote nodes,
it always used to execute the subplan on the first node. That can cause
excessive load/number of connections on that node. This patch fixes that by
choosing a node randomly from the list of available nodes
-rw-r--r-- | src/backend/nodes/bitmapset.c | 19 | ||||
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 2 | ||||
-rw-r--r-- | src/include/nodes/bitmapset.h | 4 |
3 files changed, 24 insertions, 1 deletions
diff --git a/src/backend/nodes/bitmapset.c b/src/backend/nodes/bitmapset.c index a9c3b4ba5f..2cf77f0a74 100644 --- a/src/backend/nodes/bitmapset.c +++ b/src/backend/nodes/bitmapset.c @@ -967,3 +967,22 @@ bms_hash_value(const Bitmapset *a) return DatumGetUInt32(hash_any((const unsigned char *) a->words, (lastword + 1) * sizeof(bitmapword))); } + +#ifdef XCP +/* + * bms_any_member - return any member from the set randomly + * + * Returns -1 if set is empty. NB: set is destructively modified! + * + * CAUTION: this destroys the content of "inputset". + */ +int +bms_any_member(Bitmapset *a) +{ + int member; + int random = abs(rand()) % bms_num_members(a); + for (member = 0; member < random; member++) + bms_first_member(a); + return bms_first_member(a); +} +#endif diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index 460cf496ca..817c4a6305 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -4089,7 +4089,7 @@ make_remotesubplan(PlannerInfo *root, if (bms_num_members(tmpset) > 1) { /* get one execution node TODO: load balancing */ - nodenum = bms_first_member(tmpset); + nodenum = bms_any_member(tmpset); node->nodeList = list_make1_int(nodenum); node->execOnAll = true; } diff --git a/src/include/nodes/bitmapset.h b/src/include/nodes/bitmapset.h index 3a556eed0a..5db5535225 100644 --- a/src/include/nodes/bitmapset.h +++ b/src/include/nodes/bitmapset.h @@ -95,4 +95,8 @@ extern int bms_next_member(const Bitmapset *a, int prevbit); /* support for hashtables using Bitmapsets as keys: */ extern uint32 bms_hash_value(const Bitmapset *a); +#ifdef XCP +extern int bms_any_member(Bitmapset *a); +#endif + #endif /* BITMAPSET_H */ |