Pgpool-II带了很多的 pcp命令,据说有一个 什么 management server;
当初用 pg_md5命令:pg_md5 postgres 得到一个乱七八糟的字符串:
e8a48653851e28c69d0506508fb27fc5
postgres:e8a48653851e28c69d0506508fb27fc5
pcp_pool_status -d 10 localhost postgres postgres ,会报告一堆各个后台数据库节点的信息。
pcp_pool_status是一个独立的客户端程序。在pgpool中对它进行相应的是谁呢:
初步分析,是 pcp_child.c 中的 pcp_do_accept 函数(它在 pcp_do_child的循环中运行)
pcp_do_accept(int unix_fd, int inet_fd){
PCP_CONNECTION *pc = NULL;
set_ps_display("PCP: wait for connection request", false);
FD_SET(unix_fd, &readmask);
FD_SET(inet_fd, &readmask);
fds = select(Max(unix_fd, inet_fd)+1, &readmask, NULL, NULL, NULL);
if (errno == EAGAIN || errno == EINTR)
pool_error("pcp_child: select() failed. reason: %s", strerror(errno));
if (FD_ISSET(unix_fd, &readmask)){
if (FD_ISSET(inet_fd, &readmask)){
afd = accept(fd, &addr, &addrlen);
* "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));
pool_get_config(get_config_file_name(), RELOAD_CONFIG);
pool_debug("I am PCP %d accept fd %d", getpid(), afd);
if (setsockopt(afd, IPPROTO_TCP, TCP_NODELAY,
pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));
if (setsockopt(afd, SOL_SOCKET, SO_KEEPALIVE,
pool_error("pcp_child: setsockopt() failed: %s", strerror(errno));
if ((pc = pcp_open(afd)) == NULL){
afd = accept(fd, &addr, &addrlen);这一句,会给出和客户端通信的返回值。
标签: pgpoool-II, pcp_pool_status
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/08/15/2639843.html,如需转载请自行联系原作者