Pgpool-II带了很多的 pcp命令,据说有一个 什么 management server;
所以就想研究一下。
当初用 pg_md5命令:pg_md5 postgres 得到一个乱七八糟的字符串:
e8a48653851e28c69d0506508fb27fc5
拷贝到了 pcp.conf 最后一行:
postgres:e8a48653851e28c69d0506508fb27fc5
启动pgpool以后,再开另外一个终端:
pcp_pool_status -d 10 localhost postgres postgres ,会报告一堆各个后台数据库节点的信息。
pcp_pool_status是一个独立的客户端程序。在pgpool中对它进行相应的是谁呢:
初步分析,是 pcp_child.c 中的 pcp_do_accept 函数(它在 pcp_do_child的循环中运行)
经过运行验证,果真如此:
复制代码
static PCP_CONNECTION *
pcp_do_accept(int unix_fd, int inet_fd){
PCP_CONNECTION *pc = NULL;
fd_set readmask;
int fds;
struct sockaddr addr;
socklen_t addrlen;
int fd = 0;
int afd;
int inet = 0;
set_ps_display("PCP: wait for connection request", false);
FD_ZERO(&readmask);
FD_SET(unix_fd, &readmask);
if (inet_fd)
FD_SET(inet_fd, &readmask);
fds = select(Max(unix_fd, inet_fd)+1, &readmask, NULL, NULL, NULL);
if (fds == -1){
if (errno == EAGAIN || errno == EINTR)
return NULL;
pool_error("pcp_child: select() failed. reason: %s", strerror(errno));
return NULL;
}
if (FD_ISSET(unix_fd, &readmask)){
fd = unix_fd;
}
if (FD_ISSET(inet_fd, &readmask)){
fd = inet_fd;
inet++;
}
addrlen = sizeof(addr);
afd = accept(fd, &addr, &addrlen);
if (afd < 0){
/*
* "Resource temporarily unavailable" (EAGAIN or EWOULDBLOCK)
* can be silently ignored.
*/
if (errno != EAGAIN && errno != EWOULDBLOCK)
pool_error("pcp_child: accept() failed. reason: %s", strerror(errno));
return NULL;
}
if (pcp_got_sighup){
pool_get_config(get_config_file_name(), RELOAD_CONFIG);
pcp_got_sighup = 0;
}
pool_debug("I am PCP %d accept fd %d", getpid(), afd);
if (inet){
int on = 1;
if (setsockopt(afd, IPPROTO_TCP, TCP_NODELAY,
(char *) &on,
sizeof(on)) < 0)
{
pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));
close(afd);
return NULL;
}
if (setsockopt(afd, SOL_SOCKET, SO_KEEPALIVE,
(char *) &on,
sizeof(on)) < 0)
{
pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));
close(afd);
return NULL;
}
}
if ((pc = pcp_open(afd)) == NULL){
close(afd);
return NULL;
}
return pc;
}
复制代码
afd = accept(fd, &addr, &addrlen);这一句,会给出和客户端通信的返回值。
标签: pgpoool-II, pcp_pool_status
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/15/2639843.html,如需转载请自行联系原作者