on-expiry now also receives a "reason" parameter when called

This commit is contained in:
Gered 2022-01-04 19:19:43 -05:00
parent 01a7a379c6
commit 1384c52d75
2 changed files with 14 additions and 10 deletions

View file

@ -91,7 +91,7 @@
(get key) (get key)
(get :value)) (get :value))
(when on-expiry (when on-expiry
(on-expiry key (:value existing-entry)) (on-expiry key (:value existing-entry) :expired)
nil))))) nil)))))
(write-session [_ key data] (write-session [_ key data]
@ -107,7 +107,7 @@
expired? (entry-expired? ttl existing-entry)] expired? (entry-expired? ttl existing-entry)]
(swap! session-atom process-write-entry key data refresh-on-write) (swap! session-atom process-write-entry key data refresh-on-write)
(if expired? (if expired?
(on-expiry key (:value existing-entry)))) (on-expiry key (:value existing-entry) :expired)))
; if there's no on-expiry listener, we can simply process the write ; if there's no on-expiry listener, we can simply process the write
(swap! session-atom process-write-entry key data refresh-on-write)) (swap! session-atom process-write-entry key data refresh-on-write))
key)) key))
@ -134,7 +134,9 @@
(when expired-keys (when expired-keys
(future (future
(doseq [expired-key expired-keys] (doseq [expired-key expired-keys]
(on-expiry expired-key (-> old (get expired-key) :value)))))))) (on-expiry expired-key
(-> old (get expired-key) :value)
:expired)))))))
(Thread/sleep sweep-interval) (Thread/sleep sweep-interval)
(recur))) (recur)))

View file

@ -238,7 +238,7 @@
(deftest expiry-listener-triggered-when-read-session-expires-entry (deftest expiry-listener-triggered-when-read-session-expires-entry
(let [expired (atom nil) (let [expired (atom nil)
as (aging-memory-store 1 {:on-expiry #(reset! expired [%1 %2])})] as (aging-memory-store 1 {:on-expiry #(reset! expired [%1 %2 %3])})]
(testing "before ttl elapses" (testing "before ttl elapses"
(write-session as "foo" {:foo 1}) (write-session as "foo" {:foo 1})
(is (= (read-session as "foo") {:foo 1})) (is (= (read-session as "foo") {:foo 1}))
@ -247,11 +247,11 @@
(testing "after ttl has elapsed" (testing "after ttl has elapsed"
(is (nil? @expired)) (is (nil? @expired))
(is (nil? (read-session as "foo"))) (is (nil? (read-session as "foo")))
(is (= ["foo" {:foo 1}] @expired))))) (is (= ["foo" {:foo 1} :expired] @expired)))))
(deftest expiry-listener-not-triggered-for-other-read-sessions-even-with-an-expired-entry (deftest expiry-listener-not-triggered-for-other-read-sessions-even-with-an-expired-entry
(let [expired (atom nil) (let [expired (atom nil)
as (aging-memory-store 1 {:on-expiry #(reset! expired [%1 %2])})] as (aging-memory-store 1 {:on-expiry #(reset! expired [%1 %2 %3])})]
(testing "before ttl elapses" (testing "before ttl elapses"
(write-session as "foo" {:foo 1}) (write-session as "foo" {:foo 1})
(write-session as "bar" {:bar 1}) (write-session as "bar" {:bar 1})
@ -272,11 +272,11 @@
(is (nil? @expired)) (is (nil? @expired))
(is (nil? (read-session as "foo"))) (is (nil? (read-session as "foo")))
(is (= (read-session as "bar") {:bar 1})) (is (= (read-session as "bar") {:bar 1}))
(is (= ["foo" {:foo 1}] @expired))))) (is (= ["foo" {:foo 1} :expired] @expired)))))
(deftest expiry-listener-triggered-when-write-session-overwrites-expired-entry (deftest expiry-listener-triggered-when-write-session-overwrites-expired-entry
(let [expired (atom nil) (let [expired (atom nil)
as (aging-memory-store 1 {:on-expiry #(reset! expired [%1 %2])})] as (aging-memory-store 1 {:on-expiry #(reset! expired [%1 %2 %3])})]
(testing "before ttl elapses" (testing "before ttl elapses"
(write-session as "foo" {:foo 1}) (write-session as "foo" {:foo 1})
(is (= (read-session as "foo") {:foo 1})) (is (= (read-session as "foo") {:foo 1}))
@ -286,13 +286,14 @@
(is (nil? @expired)) (is (nil? @expired))
(write-session as "foo" {:foo 2}) (write-session as "foo" {:foo 2})
(is (= (read-session as "foo") {:foo 2})) (is (= (read-session as "foo") {:foo 2}))
(is (= ["foo" {:foo 1}] @expired))))) (is (= ["foo" {:foo 1} :expired] @expired)))))
(deftest sweeper-thread-triggers-expiry-listeners-for-all-expired-entries (deftest sweeper-thread-triggers-expiry-listeners-for-all-expired-entries
(let [expired (atom {}) (let [expired (atom {})
as (aging-memory-store 1 {:sweep-interval 1 as (aging-memory-store 1 {:sweep-interval 1
:on-expiry #(swap! expired assoc %1 {:timestamp (System/currentTimeMillis) :on-expiry #(swap! expired assoc %1 {:timestamp (System/currentTimeMillis)
:value %2})})] :value %2
:reason %3})})]
(testing "before ttl elapses or sweeper thread runs" (testing "before ttl elapses or sweeper thread runs"
(write-session as "foo" {:foo 1}) (write-session as "foo" {:foo 1})
(write-session as "bar" {:bar 1}) (write-session as "bar" {:bar 1})
@ -309,6 +310,7 @@
(Thread/sleep 3000)) (Thread/sleep 3000))
(testing "after ttl elapses and sweeper thread has had enough time to run at least twice" (testing "after ttl elapses and sweeper thread has had enough time to run at least twice"
(is (= 3 (count @expired))) (is (= 3 (count @expired)))
(is (every? #(= :expired (:reason %)) (vals @expired)))
(let [foo-bar-time-diff (Math/abs (- (:timestamp (get @expired "foo")) (let [foo-bar-time-diff (Math/abs (- (:timestamp (get @expired "foo"))
(:timestamp (get @expired "bar")))) (:timestamp (get @expired "bar"))))
keep-time-diff (- (:timestamp (get @expired "keep")) keep-time-diff (- (:timestamp (get @expired "keep"))