postgresql源码学习(46)—— PostmasterMain 监听套接字与客户端认证
/*
* PostmasterMain -- Initialize process environment, fork child processes, etc.
*/
void
PostmasterMain(int argc, char *argv[])
{
...
/*
* Create a listening socket to be used by the postmaster, and listen on it.
*/
if ((PostmasterProcessPointer->sock = InitProcessServer(NULL, 0)) < 0)
ereport(FATAL,
(errcode(ERRCODE_OPERATING_SYSTEM),
errmsg("could not create IPC socket")));
...
/*
* Loop accepting connections. Exits only on error or exit signal.
*/
for (;;)
{
Port *port;
/*
* Accept a new connection request and process it. We repeat this loop
* for each new connection.
*/
port = ConnCreate(PostmasterProcessPointer->sock);
...
/*
* Perform authentication.
*/
if (!AuthenticateUser(port, NULL))
ereport(FATAL,
(errcode(ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION),
errmsg("authentication failed for username \"%s\"",
port->user_name)));
...
/*
* OK, we successfully authenticated. Now give the client an
* End-of-Startup marker, and start sending back commands.
*/
if (PG_PROTOCOL_MAJOR(FrontendProtocol) >= 3)
pq_putemptymessage('S');
...
/*
* Now we can report the connection to the collector, if it's available.
*/
if (IsUnderPostmaster)
pgstat_report_activity(port->database_name, port->user_name);
...
}
...
}
这段代码是PostgreSQL中的核心函数之一,用于初始化进程环境,创建和监听套接字以接受客户端连接,并处理用户认证。代码中包含了创建监听套接字、接受连接、认证用户,并向客户端发送启动标记的关键步骤。这为学习PostgreSQL源码提供了一个很好的示例,展示了服务端处理客户端连接和交互的核心逻辑。
评论已关闭