博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对 pcp_pool_status的分析
阅读量:5864 次
发布时间:2019-06-19

本文共 2174 字,大约阅读时间需要 7 分钟。

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,如需转载请自行联系原作者
你可能感兴趣的文章
intellij idea下用maven安装ssm修改setting.xml的文件位置
查看>>
Windows 7及以上操作系统无法访问网络位置的问题
查看>>
Windows下 .rtf 批量转换 .doc
查看>>
MySQL: Can’t create table **** (errno: 121)的解决方法
查看>>
帝国CMS 7 搜索关键词高亮处理
查看>>
组合,聚合,关联,依赖,实现,泛化 ---UML关系
查看>>
COMMAND 模式
查看>>
Activiti使用maven alfresco仓库问题处理
查看>>
新开源时代iMatrix平台版本也在升级
查看>>
1069
查看>>
php字母大小写转换
查看>>
史上最详细的Android Studio系列教程一--下载和安装
查看>>
SkinMagic库界面美化
查看>>
如何打包发布基于Qt4 Windows的软件
查看>>
php框架Laravel 5 中文文档 gitbook版
查看>>
关于在google浏览器与firefox、ie下:line-height 单位讨论?
查看>>
TextInputLayout简单说使用
查看>>
sgu 170
查看>>
Oracle PL/SQL常用函数列表
查看>>
MyBaties自动生成表结构
查看>>