---
 bin/varnishd/cache/cache.h                |    2 +-
 bin/varnishd/cache/cache_ban.c            |    6 +++---
 bin/varnishd/storage/stevedore.c          |   13 +++++++++++--
 bin/varnishd/storage/storage.h            |    2 +-
 bin/varnishd/storage/storage_persistent.c |   18 ++++++++++++------
 5 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 4b29167..6a0d1a4 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -1060,7 +1060,7 @@ void STV_free(struct storage *st);
 void STV_open(void);
 void STV_close(void);
 void STV_Freestore(struct object *o);
-void STV_BanInfo(enum baninfo event, const uint8_t *ban, unsigned len);
+int STV_BanInfo(enum baninfo event, const uint8_t *ban, 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 57fadb9..21abf41 100644
--- a/bin/varnishd/cache/cache_ban.c
+++ b/bin/varnishd/cache/cache_ban.c
@@ -476,7 +476,7 @@ BAN_Insert(struct ban *b)
        else
                be = NULL;
 
-       STV_BanInfo(BI_NEW, b->spec, ln);       /* Notify stevedores */
+       AZ(STV_BanInfo(BI_NEW, b->spec, ln));   /* Notify stevedores */
        Lck_Unlock(&ban_mtx);
 
        if (be == NULL)
@@ -682,7 +682,7 @@ BAN_Compile(void)
        AZ(ban_shutdown);
 
        /* Notify stevedores */
-       STV_BanInfo(BI_NEW, ban_magic->spec, ban_len(ban_magic->spec));
+       AZ(STV_BanInfo(BI_NEW, ban_magic->spec, ban_len(ban_magic->spec)));
 
        ban_start = VTAILQ_FIRST(&ban_head);
        WRK_BgThread(&ban_thread, "ban-lurker", ban_lurker, NULL);
@@ -875,7 +875,7 @@ ban_cleantail(void)
                        VSC_C_main->bans--;
                        VSC_C_main->bans_deleted++;
                        VTAILQ_REMOVE(&ban_head, b, list);
-                       STV_BanInfo(BI_DROP, b->spec, ban_len(b->spec));
+                       AZ(STV_BanInfo(BI_DROP, b->spec, ban_len(b->spec)));
                } else {
                        b = NULL;
                }
diff --git a/bin/varnishd/storage/stevedore.c b/bin/varnishd/storage/stevedore.c
index 5262b70..be16057 100644
--- a/bin/varnishd/storage/stevedore.c
+++ b/bin/varnishd/storage/stevedore.c
@@ -453,14 +453,23 @@ STV_close(void)
                stv->close(stv);
 }
 
-void
+/*-------------------------------------------------------------------
+ * Notify the stevedores of BAN related events. A non-zero return
+ * value indicates that the stevedore is unable to persist the
+ * event.
+ */
+
+int
 STV_BanInfo(enum baninfo event, const uint8_t *ban, unsigned len)
 {
        struct stevedore *stv;
+       int r = 0;
 
        VTAILQ_FOREACH(stv, &stv_stevedores, list)
                if (stv->baninfo != NULL)
-                       stv->baninfo(stv, event, ban, len);
+                       r |= stv->baninfo(stv, event, ban, len);
+
+       return (r);
 }
 
 /*--------------------------------------------------------------------
diff --git a/bin/varnishd/storage/storage.h b/bin/varnishd/storage/storage.h
index e9971e7..cddf6ef 100644
--- a/bin/varnishd/storage/storage.h
+++ b/bin/varnishd/storage/storage.h
@@ -48,7 +48,7 @@ typedef struct object *storage_allocobj_f(struct stevedore *, 
struct busyobj *,
     struct objcore **, unsigned ltot, const struct stv_objsecrets *);
 typedef void storage_close_f(const struct stevedore *);
 typedef void storage_signal_close_f(const struct stevedore *);
-typedef void storage_baninfo_f(struct stevedore *, enum baninfo event,
+typedef int storage_baninfo_f(struct stevedore *, enum baninfo event,
     const uint8_t *ban, unsigned len);
 
 /* Prototypes for VCL variable responders */
diff --git a/bin/varnishd/storage/storage_persistent.c 
b/bin/varnishd/storage/storage_persistent.c
index e2cf429..d02ae88 100644
--- a/bin/varnishd/storage/storage_persistent.c
+++ b/bin/varnishd/storage/storage_persistent.c
@@ -68,41 +68,47 @@ static VTAILQ_HEAD(,smp_sc) silos = 
VTAILQ_HEAD_INITIALIZER(silos);
  * Add bans to silos
  */
 
-static void
+static int
 smp_appendban(struct smp_sc *sc, struct smp_signspace *spc,
     uint32_t len, const uint8_t *ban)
 {
 
        (void)sc;
-       assert(SIGNSPACE_FREE(spc) >=  len);
+       if (SIGNSPACE_FREE(spc) < len)
+               return (-1);
 
        memcpy(SIGNSPACE_FRONT(spc), ban, len);
        smp_append_signspace(spc, len);
+
+       return (0);
 }
 
 /* Trust that cache_ban.c takes care of locking */
 
-static void
+static int
 smp_baninfo(struct stevedore *stv, enum baninfo event,
            const uint8_t *ban, unsigned len)
 {
        struct smp_sc *sc;
+       int r = 0;
 
        CAST_OBJ_NOTNULL(sc, stv->priv, SMP_SC_MAGIC);
 
        if (!(sc->flags & SMP_SC_OPENED))
                /* Ignore ban events until we have been opened */
-               return;
+               return (0);
 
        switch (event) {
        case BI_NEW:
-               smp_appendban(sc, &sc->ban1, len, ban);
-               smp_appendban(sc, &sc->ban2, len, ban);
+               r |= smp_appendban(sc, &sc->ban1, len, ban);
+               r |= smp_appendban(sc, &sc->ban2, len, ban);
                break;
        default:
                /* Ignored */
                break;
        }
+
+       return (r);
 }
 
 /*--------------------------------------------------------------------
-- 
1.7.10.4


_______________________________________________
varnish-dev mailing list
[email protected]
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to