后台连接池的管理
Atlas为每个后台设置了一个pools,pools是一个数组,每一个线程都对应pools里的一个pool,一个pool管理着一个线程跟这个后台的连接。主要的数据结构如下:
struct chassis_private {
lua_scope *sc;
network_backends_t *backends; //管理后台组
};
typedef struct {
GPtrArray *backends; //后台组,里面的多个network_backend_t结构
GMutex *backends_mutex;
g_wrr_poll *global_wrr; //权重管理
guint event_thread_count; //开启的线程数
} network_backends_t;
typedef struct {
guint max_weight; //最大权重
guint cur_weight; //当前选用后台的权重
guint next_ndx; //下一个后台标号
} g_wrr_poll;
typedef struct {
network_address *addr; //后台地址
backend_state_t state; /**< UP or DOWN */ //后台的状态
backend_type_t type; /**< ReadWrite or ReadOnly */ //后台的类型
GPtrArray *pools; //管理这个后台的所有连接,有event_thread_count个network_connection_pool
guint connected_clients; /**< number of open connections to this backend for SQF */ //连接到这个后台的用户数
GString *uuid; /**< the UUID of the backend */
guint weight; //后台的权重值,用于调节负载,权重越大,负载将越多
} network_backend_t;
typedef GQueue network_connection_pool; //pool是一个队列,里面有多network_connection_pool_entry,每一个entry里面有一个空闲连接sock
typedef struct {
netw