Esempio n. 1
0
/*
 * 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);
			}
		}
Esempio n. 2
0
/*
 * 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];
}
Esempio n. 3
0
/*
 * 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);
            }
        }