From 659cb1373898edbf67319d3db9764b456df91250 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 19 Feb 2012 16:52:45 -0500 Subject: [PATCH] Cope with edge-case where a stale RRSET wasn't being freshened --- zonedb.rkt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/zonedb.rkt b/zonedb.rkt index 58f5be4..7d7f329 100644 --- a/zonedb.rkt +++ b/zonedb.rkt @@ -79,9 +79,14 @@ (define resource (struct-copy rr resource0 [ttl 0])) (define name (rr-name resource)) (define old-expirymap (hash-ref db name hash)) - (if (hash-has-key? old-expirymap resource) ;; don't update TTLs if entry exists - db - (hash-set db name (hash-set old-expirymap resource expiry)))) + (define old-expiry (hash-ref old-expirymap resource 0)) + (cond + [(infinite-lifetime? old-expiry) ;; don't update TTL: the existing record should live forever + db] + [(or (infinite-lifetime? expiry) (> expiry old-expiry)) ;; update TTL + (hash-set db name (hash-set old-expirymap resource expiry))] + [else ;; old record finite-lifetime but expiring after the new expiry: leave it alone + db])) ;; Maybe CompiledZone -> (values CompiledZone Timers) (define (incorporate-complete-answer ans db)