接着 ListenSocket的研究(二) 一文,进一步进行分析,改动postmaster.c的ServerLoop函数代码如下:
复制代码
if (selres > 0)
{
int i;
for (i = 0; i < MAXLISTEN; i++)
{
if (ListenSocket[i] == PGINVALID_SOCKET)
break;
if (FD_ISSET(ListenSocket[i], &rmask))
{
fprintf(stderr,
"In ServerLoop, ListenSocket[%d] is dealed ok by FD_ISSET.\n", i);
Port *port;
port = ConnCreate(ListenSocket[i]);
if (port)
{
BackendStartup(port);
StreamClose(port->sock);
ConnFree(port);
}
/*added by gaojian begin*/
}else{
fprintf(stderr,
"ListenSocket[%d] is dealed by FD_ISSET
with failed result.\n", i);
/*added by gaojian end*/
}
}
}
复制代码
启动服务器端后,显示信息:
ListenSocket[0]:3
ListenSocket[1]:4
然后,再开一个终端运行psql,此时服务器端所属的终端显示:
ListenSocket[0] is deal ok with FD_ISSET
ListenSocket[1] is deal by FD_ISSET with failed result.
也就是说客户端来一个请求的时候,只影响到ListenSocket数组中的一个元素;所以会激活一个backend。再开一个终端,仍然是同样的信息。那么ListenSocekt[1]应该算作备用。
本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/20/2601033.html,如需转载请自行联系原作者