Swoole内核中和连接关闭有关的各种标志位

我们来总结一下Swoole内核中和连接关闭有关的各种标志位。

swoole::Connection结构里面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
struct Connection {
//--------------------------------------------------------------
/**
* server is actively close the connection
*/
uint8_t close_actively;
uint8_t closed;
uint8_t close_queued;
uint8_t closing;
uint8_t close_reset;
uint8_t peer_closed;
/**
* protected connection, cannot be closed by heartbeat thread.
*/
uint8_t protect;
//--------------------------------------------------------------
uint8_t close_notify;
uint8_t close_force;
//--------------------------------------------------------------

/**
* received time with last data
*/
time_t last_time;

#ifdef SW_BUFFER_RECV_TIME
/**
* received time(microseconds) with last data
*/
double last_time_usec;
#endif
};

其中,

close_actively代表服务器主动关闭了连接。

closing代表服务器将要调用onClose回调函数(但还未调用)。

closed代表服务器已经调用完了onClose回调函数。

close_queued代表关闭连接的事件已经在排队了,一旦服务器要发送给客户端的数据发送完了,就会关闭对应的连接。这个东西是挂在对应的socketout_buffer上的chunk上面。

close_reset代表要暴力关闭连接,不会等待send_buffer的数据发送完之后关闭连接,所以这种关闭模式会产生RST分节。

peer_closed代表客户端主动关闭了连接。

protect用来设置客户端连接为保护状态,不被心跳线程切断。

close_notify心跳线程设置这个标志位,用来通知reactor线程关闭连接。

close_forcereactor线程从管道里面收到SW_SERVER_EVENT_CLOSE_FORCE类型的数据的时候,reactor线程会去设置这个标志位。

last_time代表这个连接最后一次收到数据的时间,单位是毫秒。

last_time_usec代表这个连接最后一次收到数据的时间,单位是微秒。

理解这些标志位,对于处理一些连接泄漏的问题,会非常的有帮助。一旦某个进程连接泄漏了,我们可以attach进这个进程里面,然后选一个泄漏的Connection,看看这些标志位哪些是不正常的,就可以大概找到泄漏的原因。