[master] 9c7c796a0 Make registration of stevedore implementations dynamic.
Poul-Henning Kamp
phk at FreeBSD.org
Fri Jun 3 08:07:09 UTC 2022
commit 9c7c796a086d39ccd1c2766a285a3852c780b92c
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Fri Jun 3 08:05:34 2022 +0000
Make registration of stevedore implementations dynamic.
diff --git a/bin/varnishd/mgt/mgt.h b/bin/varnishd/mgt/mgt.h
index 4d54c86c0..61eafbd83 100644
--- a/bin/varnishd/mgt/mgt.h
+++ b/bin/varnishd/mgt/mgt.h
@@ -219,7 +219,7 @@ char **MGT_NamedArg(const char *, const char **, const char *);
/* stevedore_mgt.c */
extern const char *mgt_stv_h2_rxbuf;
void STV_Config(const char *spec);
-void STV_Config_Transient(void);
+void STV_Config_Final(void);
void STV_Init(void);
/* mgt_vcc.c */
diff --git a/bin/varnishd/mgt/mgt_main.c b/bin/varnishd/mgt/mgt_main.c
index cc09cb06f..c0bd55914 100644
--- a/bin/varnishd/mgt/mgt_main.c
+++ b/bin/varnishd/mgt/mgt_main.c
@@ -851,8 +851,8 @@ main(int argc, char * const *argv)
if (!arg_list_count("s"))
STV_Config(s_arg);
- /* Configure Transient storage, if user did not */
- STV_Config_Transient();
+ /* Configure CLI and Transient storage, if user did not */
+ STV_Config_Final();
mgt_vcl_init();
diff --git a/bin/varnishd/storage/mgt_stevedore.c b/bin/varnishd/storage/mgt_stevedore.c
index e646d2669..b62248365 100644
--- a/bin/varnishd/storage/mgt_stevedore.c
+++ b/bin/varnishd/storage/mgt_stevedore.c
@@ -48,6 +48,9 @@
VTAILQ_HEAD(stevedore_head, stevedore);
+static struct stevedore_head proto_stevedores =
+ VTAILQ_HEAD_INITIALIZER(proto_stevedores);
+
static struct stevedore_head pre_stevedores =
VTAILQ_HEAD_INITIALIZER(pre_stevedores);
@@ -146,32 +149,56 @@ smp_fake_init(struct stevedore *parent, int ac, char * const *av)
static const struct stevedore smp_fake_stevedore = {
.magic = STEVEDORE_MAGIC,
- .name = "deprecated_persistent",
+ .name = "persistent",
.init = smp_fake_init,
};
#endif
/*--------------------------------------------------------------------
- * Parse a stevedore argument on the form:
- * [ name '=' ] strategy [ ',' arg ] *
+ * Register a stevedore implementation by name.
+ * VEXTs get to do this first, and since the list is searched front to
+ * back a VEXT stevedore which inadvisably wants to steal "default" or
+ * the name of another stevedore implementation can do so.
*/
-static const struct choice STV_choice[] = {
- { "file", &smf_stevedore },
- { "malloc", &sma_stevedore },
- { "debug", &smd_stevedore },
+void
+STV_Register(const struct stevedore *cstv, const char *altname)
+{
+ struct stevedore *stv;
+
+ CHECK_OBJ_NOTNULL(cstv, STEVEDORE_MAGIC);
+ ALLOC_OBJ(stv, STEVEDORE_MAGIC);
+ AN(stv);
+ *stv = *cstv;
+ if (altname != NULL)
+ stv->ident = altname;
+ else
+ stv->ident = stv->name;
+ VTAILQ_INSERT_TAIL(&proto_stevedores, stv, list);
+}
+
+static void
+STV_Register_The_Usual_Suspects(void)
+{
+ STV_Register(&smf_stevedore, NULL);
+ STV_Register(&sma_stevedore, NULL);
+ STV_Register(&smd_stevedore, NULL);
#ifdef WITH_PERSISTENT_STORAGE
- { "deprecated_persistent", &smp_stevedore },
- { "persistent", &smp_fake_stevedore },
+ STV_Register(&smp_stevedore, NULL);
+ STV_Register(&smp_fake_stevedore, NULL);
#endif
#if defined(HAVE_UMEM_H)
- { "umem", &smu_stevedore },
- { "default", &smu_stevedore },
+ STV_Register(&smu_stevedore, NULL);
+ STV_Register(&smu_stevedore, "default");
#else
- { "default", &sma_stevedore },
+ STV_Register(&sma_stevedore, "default");
#endif
- { NULL, NULL }
-};
+}
+
+/*--------------------------------------------------------------------
+ * Parse a stevedore argument on the form:
+ * [ name '=' ] strategy [ ',' arg ] *
+ */
void
STV_Config(const char *spec)
@@ -197,7 +224,8 @@ STV_Config(const char *spec)
VTAILQ_FOREACH(stv, &pre_stevedores, list)
if (!strcmp(stv->ident, ident))
- ARGV_ERR("(-s %s) '%s' is already defined\n", spec, ident);
+ ARGV_ERR("(-s %s) '%s' is already defined\n",
+ spec, ident);
ALLOC_OBJ(stv, STEVEDORE_MAGIC);
AN(stv);
@@ -210,16 +238,15 @@ STV_Config(const char *spec)
/*--------------------------------------------------------------------*/
void
-STV_Config_Transient(void)
+STV_Config_Final(void)
{
struct stevedore *stv;
ASSERT_MGT();
VCLS_AddFunc(mgt_cls, MCF_AUTH, cli_stv);
- STV_Foreach(stv) {
+ STV_Foreach(stv)
if (!strcmp(stv->ident, TRANSIENT_STORAGE))
return;
- }
STV_Config(TRANSIENT_STORAGE "=default");
}
@@ -236,6 +263,7 @@ STV_Init(void)
const struct stevedore *stv2;
int ac;
+ STV_Register_The_Usual_Suspects();
while (!VTAILQ_EMPTY(&pre_stevedores)) {
stv = VTAILQ_FIRST(&pre_stevedores);
VTAILQ_REMOVE(&pre_stevedores, stv, list);
@@ -248,7 +276,12 @@ STV_Init(void)
for (ac = 0; av[ac + 2] != NULL; ac++)
continue;
- stv2 = MGT_Pick(STV_choice, av[1], "storage");
+ VTAILQ_FOREACH(stv2, &proto_stevedores, list)
+ if (!strcmp(stv2->ident, av[1]))
+ break;
+ if (stv2 == NULL)
+ ARGV_ERR("Unknown stevedore method \"%s\"\n", av[1]);
+
CHECK_OBJ_NOTNULL(stv2, STEVEDORE_MAGIC);
*stv = *stv2;
AN(stv->name);
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index 882ab82b8..c4ff0af5d 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -124,6 +124,8 @@ extern struct stevedore *stv_h2_rxbuf;
/*--------------------------------------------------------------------*/
+void STV_Register(const struct stevedore *, const char *altname);
+
#define STV_Foreach(arg) for (arg = NULL; STV__iter(&arg);)
int STV__iter(struct stevedore ** const );
More information about the varnish-commit
mailing list