The Age reported on response objects is calculated from the last
request timestamp taken. For a cache hit that hasn't been on a
waitinglist, that will be the Start timestamp. This opens a race where
the requests' last timestamp could be before the objects t_origin.

Truncate the Age to zero rather than assert in that case.

Fixes: #1486
---
 bin/varnishd/cache/cache_req_fsm.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/bin/varnishd/cache/cache_req_fsm.c 
b/bin/varnishd/cache/cache_req_fsm.c
index 2518422..af5d76b 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -117,10 +117,15 @@ cnt_deliver(struct worker *wrk, struct req *req)
        /* We base Age calculation upon the last timestamp taken during
           client request processing. This gives some inaccuracy, but
           since Age is only full second resolution that shouldn't
-          matter. */
-       assert(req->t_prev > req->obj->exp.t_origin);
-       http_PrintfHeader(req->resp, "Age: %.0f",
-           req->t_prev - req->obj->exp.t_origin);
+          matter. (Last request timestamp could be a Start timestamp
+          taken before the object entered into cache leading to negative
+          age. Truncate to zero in that case).
+       */
+       if (req->t_prev > req->obj->exp.t_origin)
+               http_PrintfHeader(req->resp, "Age: %.0f",
+                   req->t_prev - req->obj->exp.t_origin);
+       else
+               http_PrintfHeader(req->resp, "Age: %.0f", 0.);
 
        http_SetHeader(req->resp, "Via: 1.1 varnish (v4)");
 
-- 
1.9.2


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

Reply via email to