/* * GetPreferredReplicationNode * Pick any Datanode from given list, however fetch a preferred node first. */ List * GetPreferredReplicationNode(List *relNodes) { /* * Try to find the first node in given list relNodes * that is in the list of preferred nodes */ if (num_preferred_data_nodes != 0) { ListCell *item; foreach(item, relNodes) { int relation_nodeid = lfirst_int(item); int i; for (i = 0; i < num_preferred_data_nodes; i++) { #ifdef XCP char nodetype = PGXC_NODE_DATANODE; int nodeid = PGXCNodeGetNodeId(preferred_data_node[i], &nodetype); #else int nodeid = PGXCNodeGetNodeId(preferred_data_node[i], PGXC_NODE_DATANODE); #endif /* OK, found one */ if (nodeid == relation_nodeid) return lappend_int(NULL, nodeid); } }
/* * GetAnyDataNode * Pick any data node from given set, but try a preferred node */ int GetAnyDataNode(Bitmapset *nodes) { Bitmapset *preferred = NULL; int i, nodeid; int nmembers = 0; int members[NumDataNodes]; for (i = 0; i < num_preferred_data_nodes; i++) { char ntype = PGXC_NODE_DATANODE; nodeid = PGXCNodeGetNodeId(preferred_data_node[i], &ntype); /* OK, found one */ if (bms_is_member(nodeid, nodes)) preferred = bms_add_member(preferred, nodeid); } /* * If no preferred data nodes or they are not in the desired set, pick up * from the original set. */ if (bms_is_empty(preferred)) preferred = bms_copy(nodes); /* * Load balance. * We can not get item from the set, convert it to array */ while ((nodeid = bms_first_member(preferred)) >= 0) members[nmembers++] = nodeid; bms_free(preferred); /* If there is a single member nothing to balance */ if (nmembers == 1) return members[0]; /* * In general, the set may contain any number of nodes, and if we save * previous returned index for load balancing the distribution won't be * flat, because small set will probably reset saved value, and lower * indexes will be picked up more often. * So we just get a random value from 0..nmembers-1. */ return members[((unsigned int) random()) % nmembers]; }
/* * GetAnyDataNode * Pick any Datanode from given list, but try a preferred node */ List * GetAnyDataNode(List *relNodes) { /* * Try to find the first node in given list relNodes * that is in the list of preferred nodes */ if (num_preferred_data_nodes != 0) { ListCell *item; foreach(item, relNodes) { int relation_nodeid = lfirst_int(item); int i; for (i = 0; i < num_preferred_data_nodes; i++) { int nodeid = PGXCNodeGetNodeId(preferred_data_node[i], PGXC_NODE_DATANODE); /* OK, found one */ if (nodeid == relation_nodeid) return lappend_int(NULL, nodeid); } }