示例#1
0
WdInfo *
wd_is_alive_master(void)
{
	WdInfo * master = NULL;

	master = wd_is_exist_master();
	if (master != NULL)
	{
		if (wd_ping_pgpool(master) != WD_OK)
		{
			master = NULL;
		}
	}
	return master;
}
示例#2
0
WdInfo *
wd_is_alive_master(void)
{
	WdInfo * master = NULL;

	master = wd_is_exist_master();
	if (master != NULL)
	{
		if (!strcmp(pool_config->wd_lifecheck_method, MODE_HEARTBEAT) ||
		    (!strcmp(pool_config->wd_lifecheck_method, MODE_QUERY) &&
			 wd_ping_pgpool(master) == WD_OK))
		{
			return master;
		}
	}
	return NULL;
}
示例#3
0
/*
 * if master exists and it is contactable return true,
 * otherwise return false
 */
bool
wd_is_contactable_master(void)
{
    WdInfo * master = NULL;

    if (WD_MYSELF->status == WD_MASTER)
        return true;

    /* for updating contactable flag */
    wd_update_info();

    master = wd_is_exist_master();
    if (master != NULL)
    {
        return master->is_contactable;
    }

    return false;
}
示例#4
0
/*
 * if master exists and it is alive actually return the master,
 * otherwise return NULL
 */
WdInfo *
wd_is_alive_master(void)
{
    WdInfo * master = NULL;

    if (WD_MYSELF->status == WD_MASTER)
        return WD_MYSELF;

    master = wd_is_exist_master();
    if (master != NULL)
    {
        if ((!strcmp(pool_config->wd_lifecheck_method, MODE_HEARTBEAT)) ||
                (!strcmp(pool_config->wd_lifecheck_method, MODE_QUERY)
                 && wd_ping_pgpool(master) == WD_OK))
        {
            return master;
        }
    }

    pool_debug("wd_is_alive_master: alive master not found");

    return NULL;
}
示例#5
0
int
wd_init(void)
{
	struct timeval tv;
	WdInfo * p;

	/* set startup time */
	gettimeofday(&tv, NULL);

	/* allocate watchdog list */
	if (WD_List == NULL)
	{
		WD_List = pool_shared_memory_create(sizeof(WdInfo) * MAX_WATCHDOG_NUM);
		if (WD_List == NULL)
		{
			pool_error("wd_init: failed to allocate watchdog list");
			return WD_NG;
		}
		memset(WD_List, 0, sizeof(WdInfo) * MAX_WATCHDOG_NUM);
	}

	/* allocate node list */
	if (WD_Node_List == NULL)
	{
		WD_Node_List = pool_shared_memory_create(sizeof(unsigned char) * MAX_NUM_BACKENDS);
		if (WD_Node_List == NULL)
		{
			pool_error("wd_init: failed to allocate node list");
			return WD_NG;
		}
		memset(WD_Node_List, 0, sizeof(unsigned char) * MAX_NUM_BACKENDS);
	}

	/* initialize interlock */
	if (wd_init_interlock() != WD_OK)
	{
		pool_error("wd_init: wd_init_interlock failed");
		return WD_NG;
	}

	/* set myself to watchdog list */
	wd_set_wd_list(pool_config->wd_hostname, pool_config->port,
	               pool_config->wd_port, pool_config->delegate_IP,
				   &tv, WD_NORMAL);

	/* set other pgpools to watchdog list */
	wd_add_wd_list(pool_config->other_wd);

	/* reset time value */
	p = WD_List;
	while (p->status != WD_END)
	{
		WD_TIME_INIT(p->hb_send_time);
		WD_TIME_INIT(p->hb_last_recv_time);

		p++;
	}

	/* check upper connection */
	if (strlen(pool_config->trusted_servers) &&
		wd_is_upper_ok(pool_config->trusted_servers) != WD_OK)
	{
		pool_error("wd_init: failed to connect trusted server");
		return WD_NG;
	}

	/* send startup packet */
	if (wd_startup() == WD_NG)
	{
		pool_error("wd_init: failed to start watchdog");
		return WD_NG;
	}

	/* check existence of master pgpool */
	if (wd_is_exist_master() == NULL)
	{
		if (strlen(pool_config->delegate_IP) != 0 &&
		    !wd_is_unused_ip(pool_config->delegate_IP))
		{
			pool_error("wd_init: delegate_IP %s already exists", pool_config->delegate_IP);
			return WD_NG;
		}

		/* escalate to delegate_IP holder */
		wd_escalation();
	}

	pool_log("wd_init: start watchdog");
	return WD_OK;	
}
示例#6
0
文件: wd_init.c 项目: alanpy/pgpool2
void
wd_init(void)
{
	struct timeval tv;
	WdInfo * p;

	/* set startup time */
	gettimeofday(&tv, NULL);

	/* allocate watchdog list */
	if (WD_List == NULL)
	{
		WD_List = pool_shared_memory_create(sizeof(WdInfo) * MAX_WATCHDOG_NUM);
		memset(WD_List, 0, sizeof(WdInfo) * MAX_WATCHDOG_NUM);

		ereport(DEBUG1,
				(errmsg("WD_List: sizeof(WdInfo) (%zu) * MAX_WATCHDOG_NUM (%d) = %zu bytes requested for shared memory",
						sizeof(WdInfo),
						MAX_WATCHDOG_NUM,
						sizeof(WdInfo) * MAX_WATCHDOG_NUM)));
	}

	/* allocate node list */
	if (WD_Node_List == NULL)
	{
		WD_Node_List = pool_shared_memory_create(sizeof(unsigned char) * MAX_NUM_BACKENDS);
		memset(WD_Node_List, 0, sizeof(unsigned char) * MAX_NUM_BACKENDS);

		ereport(DEBUG1,
				(errmsg("WD_Node_List: sizeof(unsigned char) (%zu) * MAX_NUM_BACKENDS (%d) = %zu bytes requested for shared memory",
						sizeof(unsigned char),
						MAX_WATCHDOG_NUM,
						sizeof(unsigned char) * MAX_NUM_BACKENDS)));
	}

	/* initialize interlock */
	wd_init_interlock();

	/* set myself to watchdog list */
	wd_set_wd_list(pool_config->wd_hostname, pool_config->port,
	               pool_config->wd_port, pool_config->delegate_IP,
				   &tv, WD_NORMAL);

	/* set other pgpools to watchdog list */
	wd_add_wd_list(pool_config->other_wd);

	/* reset time value */
	p = WD_List;
	while (p->status != WD_END)
	{
		WD_TIME_INIT(p->hb_send_time);
		WD_TIME_INIT(p->hb_last_recv_time);

		p++;
	}

	/* check upper connection */
	if (strlen(pool_config->trusted_servers) &&
		wd_is_upper_ok(pool_config->trusted_servers) != WD_OK)
	{
		ereport(ERROR,
			(errmsg("failed to initialize watchdog, failed to connect to trusted server")));
	}
	/* send startup packet */
	if (wd_startup() == WD_NG)
	{
		ereport(ERROR,
				(errmsg("failed to initialize watchdog, startup failed")));
	}
	/* check existence of master pgpool */
	if (wd_is_exist_master() == NULL)
	{
		if (strlen(pool_config->delegate_IP) != 0 &&
		    !wd_is_unused_ip(pool_config->delegate_IP))
		{
			ereport(ERROR,
				(errmsg("failed to initialize watchdog, delegate_IP \"%s\" already exists", pool_config->delegate_IP)));
		}
		/* escalate to delegate_IP holder */
		wd_escalation();
	}
	ereport(LOG,
		(errmsg("watchdog started")));
}