summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavan Deolasee2016-07-19 12:10:20 +0000
committerPavan Deolasee2016-10-18 10:07:23 +0000
commit01a9347a362b8c2c3aa8aee74910adb48eed5efd (patch)
tree84efb603ccd79e1dfa50e9f74cd7defbfa40f2bd
parent0bd54c394394ae10bf5e2c1a68ced91481cee500 (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.c19
-rw-r--r--src/backend/optimizer/plan/createplan.c2
-rw-r--r--src/include/nodes/bitmapset.h4
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 */