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; }
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"))); }