Load balance remote subplan execution by choosing a node randomly instead of
authorPavan Deolasee <[email protected]>
Tue, 19 Jul 2016 12:10:20 +0000 (17:40 +0530)
committerPavan Deolasee <[email protected]>
Wed, 20 Jul 2016 06:51:07 +0000 (12:21 +0530)
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

src/backend/nodes/bitmapset.c
src/backend/optimizer/plan/createplan.c
src/include/nodes/bitmapset.h

index a9c3b4ba5f42e484232e407d3b2f7ababe587e14..2cf77f0a74093ae8e50d36a3e4c0ff064d13d342 100644 (file)
@@ -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
index 8d1e5730cb1968a2895de97016a718b500e1d45d..a86b52e9ec81ddd143f61de3e574a5b1e64a596a 100644 (file)
@@ -4108,7 +4108,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;
                }
index 3a556eed0ac66fa7bc320bb190829510108e12de..5db5535225c32cba1a694407201a20559fc64339 100644 (file)
@@ -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 */