[master] 33ceb67d5 shard director: improve assertions on parameters
Nils Goroll
nils.goroll at uplex.de
Mon Jan 18 15:18:07 UTC 2021
commit 33ceb67d532381a071feee3f43dcb5e6694f4ec1
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Mon Jan 18 12:38:22 2021 +0100
shard director: improve assertions on parameters
We use shard_param_task_{r,l} on (struct sharddir *) and (struct
vmod_directors_shard_param *), so the id parameter is (const void *).
Yet we still want to make sure that we always retrieve the intended
PRIV_TASK, and we can by simply asserting that the vcl_name attribute
matches.
Note that a simple pointer comparison is sufficient here because,
unltimately, the PRIV_TASK vcl_name is always that of a vmod object,
assigned by the constructor.
This brings back the "who" parameter from
9ea2f29f9be641e0569214326f2974baa8960077, but used differently.
diff --git a/vmod/vmod_directors_shard.c b/vmod/vmod_directors_shard.c
index 4222f92c6..ce52bb5e8 100644
--- a/vmod/vmod_directors_shard.c
+++ b/vmod/vmod_directors_shard.c
@@ -159,18 +159,18 @@ shard_param_stack(struct vmod_directors_shard_param *p,
const struct vmod_directors_shard_param *pa, const char *who);
static const struct vmod_directors_shard_param *
-shard_param_task_r(VRT_CTX, const void *id,
+shard_param_task_r(VRT_CTX, const void *id, const char *who,
const struct vmod_directors_shard_param *pa);
static struct vmod_directors_shard_param *
-shard_param_task_l(VRT_CTX, const void *id,
+shard_param_task_l(VRT_CTX, const void *id, const char *who,
const struct vmod_directors_shard_param *pa);
static const struct vmod_directors_shard_param *
shard_param_blob(VCL_BLOB blob);
static const struct vmod_directors_shard_param *
-vmod_shard_param_read(VRT_CTX, const void *id,
+vmod_shard_param_read(VRT_CTX, const void *id, const char *who,
const struct vmod_directors_shard_param *p,
struct vmod_directors_shard_param *pstk);
@@ -643,10 +643,10 @@ vmod_shard_backend(VRT_CTX, struct vmod_directors_shard *vshard,
}
if (ctx->method & SHARD_VCL_TASK_BEREQ) {
- pp = shard_param_task_l(ctx, shardd, shardd->param);
+ pp = shard_param_task_l(ctx, shardd, shardd->name,
+ shardd->param);
if (pp == NULL)
return (NULL);
- pp->vcl_name = shardd->name;
}
AN(pp);
@@ -699,7 +699,8 @@ vmod_shard_resolve(VRT_CTX, VCL_BACKEND dir)
CHECK_OBJ_NOTNULL(dir, DIRECTOR_MAGIC);
CAST_OBJ_NOTNULL(shardd, dir->priv, SHARDDIR_MAGIC);
- pp = vmod_shard_param_read(ctx, shardd, shardd->param, pstk);
+ pp = vmod_shard_param_read(ctx, shardd, shardd->name,
+ shardd->param, pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return (sharddir_pick_be(ctx, shardd,
@@ -871,7 +872,7 @@ shard_param_stack(struct vmod_directors_shard_param *p,
}
static const struct vmod_directors_shard_param *
-shard_param_task_r(VRT_CTX, const void *id,
+shard_param_task_r(VRT_CTX, const void *id, const char *who,
const struct vmod_directors_shard_param *pa)
{
const struct vmod_directors_shard_param *p;
@@ -888,13 +889,14 @@ shard_param_task_r(VRT_CTX, const void *id,
if (task) {
CAST_OBJ_NOTNULL(p, task->priv, VMOD_SHARD_SHARD_PARAM_MAGIC);
assert(p->scope == SCOPE_TASK);
+ assert(who == p->vcl_name);
return (p);
}
if (id == pa || pa->scope != SCOPE_VCL)
return (pa);
- return (shard_param_task_r(ctx, pa, pa));
+ return (shard_param_task_r(ctx, pa, pa->vcl_name, pa));
}
/*
@@ -902,7 +904,7 @@ shard_param_task_r(VRT_CTX, const void *id,
* if id != pa and pa has VCL scope, also get a task scoped param struct for pa
*/
static struct vmod_directors_shard_param *
-shard_param_task_l(VRT_CTX, const void *id,
+shard_param_task_l(VRT_CTX, const void *id, const char *who,
const struct vmod_directors_shard_param *pa)
{
struct vmod_directors_shard_param *p;
@@ -917,30 +919,31 @@ shard_param_task_l(VRT_CTX, const void *id,
task = VRT_priv_task(ctx, task_id);
if (task == NULL) {
- shard_fail(ctx, pa->vcl_name, "%s", "no priv_task");
+ shard_fail(ctx, who, "%s", "no priv_task");
return (NULL);
}
if (task->priv) {
CAST_OBJ_NOTNULL(p, task->priv, VMOD_SHARD_SHARD_PARAM_MAGIC);
assert(p->scope == SCOPE_TASK);
+ assert(who == p->vcl_name);
return (p);
}
p = WS_Alloc(ctx->ws, sizeof *p);
if (p == NULL) {
- shard_fail(ctx, pa->vcl_name, "%s", "WS_Alloc failed");
+ shard_fail(ctx, who, "%s", "WS_Alloc failed");
return (NULL);
}
task->priv = p;
INIT_OBJ(p, VMOD_SHARD_SHARD_PARAM_MAGIC);
- p->vcl_name = pa->vcl_name;
+ p->vcl_name = who;
p->scope = SCOPE_TASK;
if (id == pa || pa->scope != SCOPE_VCL)
p->defaults = pa;
else
- p->defaults = shard_param_task_l(ctx, pa, pa);
+ p->defaults = shard_param_task_l(ctx, pa, pa->vcl_name, pa);
return (p);
}
@@ -957,7 +960,7 @@ shard_param_prep(VRT_CTX, struct vmod_directors_shard_param *p,
"in vcl_init and in backend/pipe context", who);
return (NULL);
} else if (ctx->method & SHARD_VCL_TASK_BEREQ)
- p = shard_param_task_l(ctx, p, p);
+ p = shard_param_task_l(ctx, p, p->vcl_name, p);
else
assert(ctx->method & VCL_MET_TASK_H);
@@ -991,7 +994,7 @@ vmod_shard_param_clear(VRT_CTX,
}
static const struct vmod_directors_shard_param *
-vmod_shard_param_read(VRT_CTX, const void *id,
+vmod_shard_param_read(VRT_CTX, const void *id, const char *who,
const struct vmod_directors_shard_param *p,
struct vmod_directors_shard_param *pstk)
{
@@ -1001,7 +1004,7 @@ vmod_shard_param_read(VRT_CTX, const void *id,
CHECK_OBJ_NOTNULL(p, VMOD_SHARD_SHARD_PARAM_MAGIC);
if (ctx->method == 0 || (ctx->method & SHARD_VCL_TASK_BEREQ))
- p = shard_param_task_r(ctx, id, p);
+ p = shard_param_task_r(ctx, id, who, p);
CHECK_OBJ_NOTNULL(p, VMOD_SHARD_SHARD_PARAM_MAGIC);
pp = shard_param_stack(pstk, p, p->vcl_name);
@@ -1016,7 +1019,7 @@ vmod_shard_param_get_by(VRT_CTX,
struct vmod_directors_shard_param pstk;
const struct vmod_directors_shard_param *pp;
- pp = vmod_shard_param_read(ctx, p, p, &pstk);
+ pp = vmod_shard_param_read(ctx, p, p->vcl_name, p, &pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return (default_by(pp->by));
}
@@ -1028,7 +1031,7 @@ vmod_shard_param_get_key(VRT_CTX,
struct vmod_directors_shard_param pstk;
const struct vmod_directors_shard_param *pp;
- pp = vmod_shard_param_read(ctx, p, p, &pstk);
+ pp = vmod_shard_param_read(ctx, p, p->vcl_name, p, &pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return ((VCL_INT)shard_get_key(ctx, pp));
}
@@ -1039,7 +1042,7 @@ vmod_shard_param_get_alt(VRT_CTX,
struct vmod_directors_shard_param pstk;
const struct vmod_directors_shard_param *pp;
- pp = vmod_shard_param_read(ctx, p, p, &pstk);
+ pp = vmod_shard_param_read(ctx, p, p->vcl_name, p, &pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return (pp->alt);
}
@@ -1051,7 +1054,7 @@ vmod_shard_param_get_warmup(VRT_CTX,
struct vmod_directors_shard_param pstk;
const struct vmod_directors_shard_param *pp;
- pp = vmod_shard_param_read(ctx, p, p, &pstk);
+ pp = vmod_shard_param_read(ctx, p, p->vcl_name, p, &pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return (pp->warmup);
}
@@ -1063,7 +1066,7 @@ vmod_shard_param_get_rampup(VRT_CTX,
struct vmod_directors_shard_param pstk;
const struct vmod_directors_shard_param *pp;
- pp = vmod_shard_param_read(ctx, p, p, &pstk);
+ pp = vmod_shard_param_read(ctx, p, p->vcl_name, p, &pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return (pp->rampup);
}
@@ -1075,7 +1078,7 @@ vmod_shard_param_get_healthy(VRT_CTX,
struct vmod_directors_shard_param pstk;
const struct vmod_directors_shard_param *pp;
- pp = vmod_shard_param_read(ctx, p, p, &pstk);
+ pp = vmod_shard_param_read(ctx, p, p->vcl_name, p, &pstk);
CHECK_OBJ_NOTNULL(pp, VMOD_SHARD_SHARD_PARAM_MAGIC);
return (default_healthy(pp->healthy));
}
More information about the varnish-commit
mailing list