From e7c52a115ad96bf08857fc52f9fc3627177087df Mon Sep 17 00:00:00 2001 From: Tomas Vondra Date: Sun, 11 Jun 2017 15:30:59 +0200 Subject: [PATCH] Randomize the choice of the initial ROUNDROBIN node With roundrobin node, the initial node was always set to the first node in the list. That works fine when inserting many rows at once (e.g. with INSERT SELECT), but with single-row inserts this puts all data on the first node, resulting in unbalanced distribution. This randomizes the choice of the initial node, so that with single-row inserts the ROUNDROBIN behaves a bit like RANDOM distribution. This also removes unnecessary srand() call from RelationBuildLocator(), located after a call to rand(). --- src/backend/pgxc/locator/locator.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/backend/pgxc/locator/locator.c b/src/backend/pgxc/locator/locator.c index 2a87f40c42..9c8e0507f3 100644 --- a/src/backend/pgxc/locator/locator.c +++ b/src/backend/pgxc/locator/locator.c @@ -680,7 +680,6 @@ RelationBuildLocator(Relation rel) */ offset = compute_modulo(abs(rand()), list_length(relationLocInfo->rl_nodeList)); - srand(time(NULL)); relationLocInfo->roundRobinNode = relationLocInfo->rl_nodeList->head; /* initialize */ for (j = 0; j < offset && relationLocInfo->roundRobinNode->next != NULL; j++) relationLocInfo->roundRobinNode = relationLocInfo->roundRobinNode->next; @@ -1008,7 +1007,8 @@ createLocator(char locatorType, RelationAccessType accessType, Assert(false); break; } - locator->roundRobinNode = -1; + /* randomize choice of the initial node */ + locator->roundRobinNode = (abs(rand()) % locator->nodeCount) - 1; } else { -- 2.39.5