---
bin/varnishd/cache/cache.h | 1 +
bin/varnishd/cache/cache_ban.c | 27 +++++++++++++++++++++++++--
bin/varnishd/storage/stevedore.c | 16 ++++++++++++++++
bin/varnishd/storage/storage.h | 3 +++
bin/varnishd/storage/storage_persistent.c | 21 +++++++++++++++++++++
5 files changed, 66 insertions(+), 2 deletions(-)
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 6a0d1a4..f97f8a7 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1061,6 +1061,7 @@ void STV_open(void);
void STV_close(void);
void STV_Freestore(struct object *o);
int STV_BanInfo(enum baninfo event, const uint8_t *ban, unsigned len);
+void STV_BanExport(const uint8_t *bans, unsigned len);
/* storage_synth.c */
struct vsb *SMS_Makesynth(struct object *obj);
diff --git a/bin/varnishd/cache/cache_ban.c b/bin/varnishd/cache/cache_ban.c
index 21abf41..4e912ee 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -566,6 +566,28 @@ BAN_RefBan(struct objcore *oc, double t0, const struct ban
*tail)
}
/*--------------------------------------------------------------------
+ * Compile a full ban list and export this area to the stevedores for
+ * persistence.
+ */
+
+static void
+ban_export(void)
+{
+ struct ban *b;
+ struct vsb vsb;
+
+ /* XXX: Use the ban entry size measurements to hit the target
+ * and avoid multiple allocations */
+ VSB_new(&vsb, NULL, 64 * VSC_C_main->bans, VSB_AUTOEXTEND);
+ VTAILQ_FOREACH_REVERSE(b, &ban_head, banhead_s, list) {
+ VSB_bcat(&vsb, b->spec, ban_len(b->spec));
+ }
+ VSB_finish(&vsb);
+ STV_BanExport((const uint8_t *)VSB_data(&vsb), VSB_len(&vsb));
+ VSB_delete(&vsb);
+}
+
+/*--------------------------------------------------------------------
* Put a skeleton ban in the list, unless there is an identical,
* time & condition, ban already in place.
*
@@ -681,8 +703,9 @@ BAN_Compile(void)
ASSERT_CLI();
AZ(ban_shutdown);
- /* Notify stevedores */
- AZ(STV_BanInfo(BI_NEW, ban_magic->spec, ban_len(ban_magic->spec)));
+ /* All bans have been read from all persistent stevedores. Export
+ the compiled list */
+ ban_export();
ban_start = VTAILQ_FIRST(&ban_head);
WRK_BgThread(&ban_thread, "ban-lurker", ban_lurker, NULL);
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index be16057..63400eb 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -472,6 +472,22 @@ STV_BanInfo(enum baninfo event, const uint8_t *ban,
unsigned len)
return (r);
}
+/*-------------------------------------------------------------------
+ * Export a complete ban list to the stevedores for persistence.
+ * The stevedores should clear any previous ban lists and replace
+ * them with this list.
+ */
+
+void
+STV_BanExport(const uint8_t *bans, unsigned len)
+{
+ struct stevedore *stv;
+
+ VTAILQ_FOREACH(stv, &stv_stevedores, list)
+ if (stv->banexport != NULL)
+ stv->banexport(stv, bans, len);
+}
+
/*--------------------------------------------------------------------
* VRT functions for stevedores
*/
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index cddf6ef..4a69bb0 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -50,6 +50,8 @@ typedef void storage_close_f(const struct stevedore *);
typedef void storage_signal_close_f(const struct stevedore *);
typedef int storage_baninfo_f(struct stevedore *, enum baninfo event,
const uint8_t *ban, unsigned len);
+typedef void storage_banexport_f(struct stevedore *, const uint8_t *bans,
+ unsigned len);
/* Prototypes for VCL variable responders */
#define VRTSTVTYPE(ct) typedef ct storage_var_##ct(const struct stevedore *);
@@ -74,6 +76,7 @@ struct stevedore {
storage_allocobj_f *allocobj; /* --//-- */
storage_signal_close_f *signal_close; /* --//-- */
storage_baninfo_f *baninfo; /* --//-- */
+ storage_banexport_f *banexport; /* --//-- */
struct lru *lru;
diff --git a/bin/varnishd/storage/storage_persistent.c
b/bin/varnishd/storage/storage_persistent.c
index d02ae88..37bcea3 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -111,6 +111,26 @@ smp_baninfo(struct stevedore *stv, enum baninfo event,
return (r);
}
+static void
+smp_banexport_spc(struct smp_signspace *spc, const uint8_t *bans, unsigned len)
+{
+ smp_reset_signspace(spc);
+ assert(SIGNSPACE_FREE(spc) >= len);
+ memcpy(SIGNSPACE_DATA(spc), bans, len);
+ smp_append_signspace(spc, len);
+ smp_sync_sign(&spc->ctx);
+}
+
+static void
+smp_banexport(struct stevedore *stv, const uint8_t *bans, unsigned len)
+{
+ struct smp_sc *sc;
+
+ CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC);
+ smp_banexport_spc(&sc->ban1, bans, len);
+ smp_banexport_spc(&sc->ban2, bans, len);
+}
+
/*--------------------------------------------------------------------
* Attempt to open and read in a ban list
*/
@@ -586,6 +606,7 @@ const struct stevedore smp_stevedore = {
.free = smp_free,
.signal_close = smp_signal_close,
.baninfo = smp_baninfo,
+ .banexport = smp_banexport,
};
/*--------------------------------------------------------------------
--
1.7.10.4
_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev