Skip to content

Commit

Permalink
vcp: Poll dying connection pools asynchronously
Browse files Browse the repository at this point in the history
Before, we would wait in a blocking loop for
connection pools to be freed before deleting
them for good.

This commit transforms this blocking loop into a
CLI hook that will delete the freed connection
pools at each trigger.

Refs varnishcache#4064

Better diff with the --ignore-all-space option.
  • Loading branch information
cartoush committed Sep 27, 2024
1 parent 45faed2 commit d1fae69
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 11 deletions.
1 change: 1 addition & 0 deletions bin/varnishd/cache/cache_cli.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,7 @@ cli_cb_before(const struct cli *cli)
VSL(SLT_CLI, NO_VXID, "Rd %s", VSB_data(cli->cmd));
Lck_Lock(&cli_mtx);
VCL_Poll();
VCP_RelPoll();
}

static void
Expand Down
45 changes: 34 additions & 11 deletions bin/varnishd/cache/cache_conn_pool.c
Original file line number Diff line number Diff line change
Expand Up @@ -107,13 +107,18 @@ struct conn_pool {

static struct lock conn_pools_mtx;

static VRBT_HEAD(vrb, conn_pool) conn_pools = VRBT_INITIALIZER(&conn_pools);
VRBT_HEAD(vrb, conn_pool);
VRBT_GENERATE_REMOVE_COLOR(vrb, conn_pool, entry, static)
VRBT_GENERATE_REMOVE(vrb, conn_pool, entry, static)
VRBT_GENERATE_FIND(vrb, conn_pool, entry, vcp_cmp, static)
VRBT_GENERATE_INSERT_COLOR(vrb, conn_pool, entry, static)
VRBT_GENERATE_INSERT_FINISH(vrb, conn_pool, entry, static)
VRBT_GENERATE_INSERT(vrb, conn_pool, entry, vcp_cmp, static)
VRBT_GENERATE_NEXT(vrb, conn_pool, entry, static);
VRBT_GENERATE_MINMAX(vrb, conn_pool, entry, static);

static struct vrb conn_pools = VRBT_INITIALIZER(&conn_pools);
static struct vrb dead_pools = VRBT_INITIALIZER(&dying_cps);

/*--------------------------------------------------------------------
*/
Expand Down Expand Up @@ -249,17 +254,35 @@ VCP_Rel(struct conn_pool **cpp)
(void)shutdown(pfd->fd, SHUT_RDWR);
cp->n_kill++;
}
while (cp->n_kill) {
Lck_Unlock(&cp->mtx);
(void)usleep(20000);
Lck_Lock(&cp->mtx);
}

Lck_Lock(&conn_pools_mtx);
VRBT_INSERT(vrb, &dead_pools, cp);
Lck_Unlock(&conn_pools_mtx);
Lck_Unlock(&cp->mtx);
Lck_Delete(&cp->mtx);
AZ(cp->n_conn);
AZ(cp->n_kill);
free(cp->endpoint);
FREE_OBJ(cp);
}

void
VCP_RelPoll(void)
{
struct conn_pool *cp, *cp2;

ASSERT_CLI();
Lck_Lock(&conn_pools_mtx);
VRBT_FOREACH_SAFE(cp, vrb, &dead_pools, cp2) {
CHECK_OBJ_NOTNULL(cp, CONN_POOL_MAGIC);
if (cp->n_kill > 0)
continue;
VRBT_REMOVE(vrb, &dead_pools, cp);
Lck_Unlock(&conn_pools_mtx);

Lck_Delete(&cp->mtx);
AZ(cp->n_conn);
AZ(cp->n_kill);
free(cp->endpoint);
FREE_OBJ(cp);
Lck_Lock(&conn_pools_mtx);
}
Lck_Unlock(&conn_pools_mtx);
}

/*--------------------------------------------------------------------
Expand Down
1 change: 1 addition & 0 deletions bin/varnishd/cache/cache_varnishd.h
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,7 @@ void VSL_Flush(struct vsl_log *, int overflow);
struct conn_pool;
void VCP_Init(void);
void VCP_Panic(struct vsb *, struct conn_pool *);
void VCP_RelPoll(void);

/* cache_backend_probe.c */
void VBP_Init(void);
Expand Down

0 comments on commit d1fae69

Please sign in to comment.