MINOR: queue: add a pointer to the server and the proxy in the queue

A queue is specific to a server or a proxy, so we don't need to place
this distinction inside all pendconns, it can be in the queue itself.
This commit adds the relevant fields "px" and "sv" into the struct
queue, and initializes them accordingly.
This commit is contained in:
Willy Tarreau 2021-06-23 16:11:02 +02:00
parent df3b0cbe31
commit cdc83e0192
4 changed files with 12 additions and 3 deletions

View File

@ -41,6 +41,8 @@ struct pendconn {
struct queue { struct queue {
struct eb_root head; /* queued pendconnds */ struct eb_root head; /* queued pendconnds */
struct proxy *px; /* the proxy we're waiting for, never NULL in queue */
struct server *sv; /* the server we are waiting for, may be NULL if don't care */
__decl_thread(HA_SPINLOCK_T lock); /* for manipulations in the tree */ __decl_thread(HA_SPINLOCK_T lock); /* for manipulations in the tree */
unsigned int idx; /* current queuing index */ unsigned int idx; /* current queuing index */
unsigned int length; /* number of entries */ unsigned int length; /* number of entries */

View File

@ -109,11 +109,18 @@ static inline int queue_limit_offset(int offset)
return offset; return offset;
} }
static inline void queue_init(struct queue *queue) /* initialize the queue <queue> for proxy <px> and server <sv>. A server's
* always has both a valid proxy and a valid server. A proxy's queue only
* has a valid proxy and NULL for the server queue. This is how they're
* distinguished during operations.
*/
static inline void queue_init(struct queue *queue, struct proxy *px, struct server *sv)
{ {
queue->head = EB_ROOT; queue->head = EB_ROOT;
queue->length = 0; queue->length = 0;
queue->idx = 0; queue->idx = 0;
queue->px = px;
queue->sv = sv;
HA_SPIN_INIT(&queue->lock); HA_SPIN_INIT(&queue->lock);
} }

View File

@ -1292,7 +1292,7 @@ void init_new_proxy(struct proxy *p)
{ {
memset(p, 0, sizeof(struct proxy)); memset(p, 0, sizeof(struct proxy));
p->obj_type = OBJ_TYPE_PROXY; p->obj_type = OBJ_TYPE_PROXY;
queue_init(&p->queue); queue_init(&p->queue, p, NULL);
LIST_INIT(&p->acl); LIST_INIT(&p->acl);
LIST_INIT(&p->http_req_rules); LIST_INIT(&p->http_req_rules);
LIST_INIT(&p->http_res_rules); LIST_INIT(&p->http_res_rules);

View File

@ -2160,7 +2160,7 @@ struct server *new_server(struct proxy *proxy)
srv->obj_type = OBJ_TYPE_SERVER; srv->obj_type = OBJ_TYPE_SERVER;
srv->proxy = proxy; srv->proxy = proxy;
queue_init(&srv->queue); queue_init(&srv->queue, proxy, srv);
LIST_APPEND(&servers_list, &srv->global_list); LIST_APPEND(&servers_list, &srv->global_list);
LIST_INIT(&srv->srv_rec_item); LIST_INIT(&srv->srv_rec_item);
LIST_INIT(&srv->ip_rec_item); LIST_INIT(&srv->ip_rec_item);