Reset relay retry if last retry was over an hour ago.

This commit is contained in:
Robert C. Martin 2023-02-11 09:07:49 -06:00
parent 844577fd65
commit d4f5d47da5
4 changed files with 43 additions and 11 deletions

View File

@ -1,5 +1,24 @@
(ns more-speech.nostr.protocol-spec
(:require [speclj.core :refer :all]
[more-speech.nostr.protocol :refer :all]))
[more-speech.nostr.protocol :refer :all]
[more-speech.nostr.util :as util]))
(describe "nothing")
(declare now)
(describe "protocol utilities"
(with-stubs)
(with now 100)
(it "increments relay retries on un-retried relays"
(with-redefs [util/get-now (stub :get-now {:return @now})]
(should= {"relay" {:retries 1, :retry-time @now}}
(increment-relay-retry {"relay" {}} "relay"))))
(it "increments relay retries on retried relays"
(with-redefs [util/get-now (stub :get-now {:return @now})]
(should= {"relay" {:retries 3, :retry-time @now}}
(increment-relay-retry {"relay" {:retries 2 :retry-time (dec @now)}} "relay"))))
(it "resets relay retries on relays that haven't been retried in over an hour"
(with-redefs [util/get-now (stub :get-now {:return @now})]
(should= {"relay" {:retries 1, :retry-time @now}}
(increment-relay-retry {"relay" {:retries 10 :retry-time (- @now 3600001)}} "relay"))))
)

View File

@ -9,10 +9,9 @@
(it "can be made"
(should= {::relay/type ::ws-relay/websocket
::ws-relay/url "url"
::ws-relay/recv-f :some-f
::ws-relay/socket nil
::ws-relay/open? false}
(ws-relay/make "url" :some-f)))
::ws-relay/callbacks :some-callbacks
::ws-relay/socket nil}
(ws-relay/make "url" :some-callbacks)))
(it "can open and close"
(pending "be nice to relay.damus.io")

View File

@ -96,17 +96,28 @@
(when (some? open-relay)
(swap! relays assoc-in [url :connection] open-relay))))
(defn increment-relay-retry
"used in a swap!, increments retries counter unless the last retry was over an hour ago
and then resets to 1"
[relays url]
(let [relay (get relays url)
retries (get relay :retries 0)
last-retry-time (get relay :retry-time 0)
now (util/get-now)
time-since-last-retry (- now last-retry-time)
retries (if (> time-since-last-retry 3600000) 1 (inc retries))
relays (assoc-in relays [url :retries] retries)
relays (assoc-in relays [url :retry-time] now)]
relays))
(defn handle-close [relay]
(let [url (::ws-relay/url relay)
now (quot (System/currentTimeMillis) 1000)
minutes-10 600
date (- now minutes-10)
inc-retry (fn [relays url]
(let [retries (get-in relays [url :retries] 0)]
(assoc-in relays [url :retries] (inc retries))))]
date (- now minutes-10)]
(prn 'relay-closed url)
(swap! relays assoc-in [url :connection] nil)
(swap! relays inc-retry url)
(swap! relays increment-relay-retry url)
(future
(let [retries (get-in @relays [url :retries])
seconds-to-wait (min 300 (* retries 10))]

View File

@ -81,3 +81,6 @@
key-bytes (byte-array 32)
_ (.nextBytes gen key-bytes)]
key-bytes))
(defn get-now []
(System/currentTimeMillis))