---
 bin/varnishd/cache/cache.h        |    1 +
 bin/varnishd/cache/cache_expire.c |   59 +++++++++++++++++++++++++++++++++++++
 2 files changed, 60 insertions(+)

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 15db84c..7533782 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -790,6 +790,7 @@ void EXP_Init(void);
 void EXP_Rearm(const struct object *o);
 int EXP_Touch(struct objcore *oc);
 int EXP_NukeOne(struct busyobj *, struct lru *lru);
+void EXP_NukeLRU(struct worker *wrk, struct vsl_log *vsl, struct lru *lru);
 
 /* cache_fetch.c */
 struct storage *FetchStorage(struct busyobj *, ssize_t sz);
diff --git a/bin/varnishd/cache/cache_expire.c 
b/bin/varnishd/cache/cache_expire.c
index 3d18d78..524d565 100644
--- a/bin/varnishd/cache/cache_expire.c
+++ b/bin/varnishd/cache/cache_expire.c
@@ -460,6 +460,65 @@ EXP_NukeOne(struct busyobj *bo, struct lru *lru)
 }
 
 /*--------------------------------------------------------------------
+ * Nukes an entire LRU
+ */
+
+#define NUKEBUF 10
+
+void
+EXP_NukeLRU(struct worker *wrk, struct vsl_log *vsl, struct lru *lru)
+{
+       struct objcore *oc;
+       struct objcore *oc_array[NUKEBUF];
+       struct object *o;
+       int i, n;
+       double t;
+
+       CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+       CHECK_OBJ_NOTNULL(lru, LRU_MAGIC);
+
+       t = VTIM_real();
+       Lck_Lock(&lru->mtx);
+       while (!VTAILQ_EMPTY(&lru->lru_head)) {
+               Lck_Lock(&exp_mtx);
+               n = 0;
+               while (n < NUKEBUF) {
+                       oc = VTAILQ_FIRST(&lru->lru_head);
+                       if (oc == NULL)
+                               break;
+                       CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
+                       assert(oc_getlru(oc) == lru);
+
+                       /* Remove from the LRU and binheap */
+                       VTAILQ_REMOVE(&lru->lru_head, oc, lru_list);
+                       assert(oc->timer_idx != BINHEAP_NOIDX);
+                       binheap_delete(exp_heap, oc->timer_idx);
+                       assert(oc->timer_idx == BINHEAP_NOIDX);
+
+                       oc_array[n++] = oc;
+                       VSC_C_main->n_lru_nuked++;
+               }
+               assert(n > 0);
+               Lck_Unlock(&exp_mtx);
+               Lck_Unlock(&lru->mtx);
+
+               for (i = 0; i < n; i++) {
+                       oc = oc_array[i];
+                       o = oc_getobj(&wrk->stats, oc);
+                       VSLb(vsl, SLT_ExpKill, "%u %.0f LRU",
+                            oc_getxid(&wrk->stats, oc), EXP_Ttl(NULL, o) - t);
+                       EXP_Set_ttl(&o->exp, 0.);
+                       (void)HSH_Deref(&wrk->stats, oc, NULL);
+               }
+
+               Lck_Lock(&lru->mtx);
+       }
+       Lck_Unlock(&lru->mtx);
+
+       WRK_SumStat(wrk);
+}
+
+/*--------------------------------------------------------------------
  * BinHeap helper functions for objcore.
  */
 
-- 
1.7.9.5


_______________________________________________
varnish-dev mailing list
varnish-dev@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-dev

Reply via email to