r3937 - trunk/varnish-cache/bin/varnishd
phk at projects.linpro.no
phk at projects.linpro.no
Mon Mar 16 13:19:58 CET 2009
Author: phk
Date: 2009-03-16 13:19:58 +0100 (Mon, 16 Mar 2009)
New Revision: 3937
Modified:
trunk/varnish-cache/bin/varnishd/storage_persistent.c
Log:
Append bans to silo. Read them back in when we start.
Modified: trunk/varnish-cache/bin/varnishd/storage_persistent.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/storage_persistent.c 2009-03-16 11:58:51 UTC (rev 3936)
+++ trunk/varnish-cache/bin/varnishd/storage_persistent.c 2009-03-16 12:19:58 UTC (rev 3937)
@@ -536,21 +536,102 @@
*/
static void
-smp_appendban(struct smp_sc *sc, double t0, const char *ban)
+smp_appendban(struct smp_sc *sc, struct smp_signctx *ctx, double t0, uint32_t flags, uint32_t len, const char *ban)
{
+ uint8_t *ptr, *ptr2;
+
fprintf(stderr, "silo %p BAN %g %s\n", sc, t0, ban);
+ ptr = ptr2 = SIGN_END(ctx);
+
+ memcpy(ptr, "BAN", 4);
+ ptr += 4;
+
+ memcpy(ptr, &t0, sizeof t0);
+ ptr += sizeof t0;
+
+ memcpy(ptr, &flags, sizeof flags);
+ ptr += sizeof flags;
+
+ memcpy(ptr, &len, sizeof len);
+ ptr += sizeof len;
+
+ memcpy(ptr, ban, len);
+ ptr += len;
+
+ smp_append_sign(ctx, ptr2, ptr - ptr2);
}
void
SMP_NewBan(double t0, const char *ban)
{
struct smp_sc *sc;
+ uint32_t l = strlen(ban) + 1;
- VTAILQ_FOREACH(sc, &silos, list)
- smp_appendban(sc, t0, ban);
+ VTAILQ_FOREACH(sc, &silos, list) {
+ smp_appendban(sc, &sc->ban1, t0, 0, l, ban);
+ smp_appendban(sc, &sc->ban2, t0, 0, l, ban);
+ }
}
/*--------------------------------------------------------------------
+ * Attempt to open and read in a ban list
+ */
+
+static int
+smp_open_bans(struct smp_sc *sc, struct smp_signctx *ctx)
+{
+ uint8_t *ptr, *pe;
+ double t0;
+ uint32_t flags, length;
+ int i, retval = 0;
+
+ (void)sc;
+ i = smp_chk_sign(ctx);
+ if (i)
+ return (i);
+ ptr = SIGN_DATA(ctx);
+ pe = ptr + ctx->ss->length;
+
+ while (ptr < pe) {
+ if (memcmp(ptr, "BAN", 4)) {
+ retval = 1001;
+ break;
+ }
+ ptr += 4;
+
+ memcpy(&t0, ptr, sizeof t0);
+ ptr += sizeof t0;
+
+ memcpy(&flags, ptr, sizeof flags);
+ ptr += sizeof flags;
+ if (flags != 0) {
+ retval = 1002;
+ break;
+ }
+
+ memcpy(&length, ptr, sizeof length);
+ ptr += sizeof length;
+ if (ptr + length > pe) {
+ retval = 1003;
+ break;
+ }
+
+ if (ptr[length - 1] != '\0') {
+ retval = 1004;
+ break;
+ }
+
+fprintf(stderr, "BAN {%g %u %u \"%s\"}\n", t0, flags, length, ptr);
+
+ ptr += length;
+ }
+ assert(ptr <= pe);
+ if (retval)
+fprintf(stderr, "BAN read failed: %d\n", retval);
+ return (retval);
+}
+
+/*--------------------------------------------------------------------
* Update objects
*/
@@ -817,14 +898,16 @@
sc->ident = SIGN_DATA(&sc->idn);
- /* XXX: read in bans */
+ /* We attempt ban1 first, and if that fails, try ban2 */
+ if (smp_open_bans(sc, &sc->ban1))
+ AZ(smp_open_bans(sc, &sc->ban2));
- /*
- * We attempt seg1 first, and if that fails, try seg2
- */
+ /* We attempt seg1 first, and if that fails, try seg2 */
if (smp_open_segs(sc, &sc->seg1))
AZ(smp_open_segs(sc, &sc->seg2));
+ /* XXX: save segments to ensure consistency between seg1 & seg2 ? */
+
/* Open a new segment, so we are ready to write */
smp_new_seg(sc);
More information about the varnish-commit
mailing list