Skip to content
This repository was archived by the owner on Dec 12, 2022. It is now read-only.

Commit 4a3a1cf

Browse files
committed
Implement backoff retry
1 parent cc7a0ef commit 4a3a1cf

1 file changed

Lines changed: 30 additions & 8 deletions

File tree

src/district/server/smart_contracts.cljs

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -261,20 +261,42 @@
261261
identity)]
262262
(transform-fn (remove-log-indexes sorted-logs))))
263263

264+
(defn get-events-with-retry [contract-instance contract event from to ch-logs retry-count]
265+
(web3-eth/get-past-events contract-instance
266+
event
267+
{:from-block from
268+
:to-block to}
269+
(fn [error events]
270+
(if (and error (< retry-count 10))
271+
(do
272+
(let [wait-time (int (* 500 (inc retry-count) (inc (rand))))]
273+
(log/info "Error fetching events. Retrying" {:retry-count retry-count
274+
:contract contract
275+
:event event
276+
:from from
277+
:to to
278+
:error error
279+
:wait-time wait-time})
280+
(js/setTimeout
281+
(fn []
282+
(get-events-with-retry contract-instance contract event from to ch-logs (inc retry-count)))
283+
wait-time)))
284+
(let [logs (->> events
285+
web3-helpers/js->cljkk
286+
(map (partial enrich-event-log contract contract-instance)))]
287+
(async/put! ch-logs (if error [(with-meta {:err error} {:error? true})] logs)))))))
288+
264289
(defn chunk->logs [transform-fn from-block skip-log-indexes events ignore-forward? [from to] ch-output]
265290
">! to ch-output for chunk [from to]: final sorted, skipped and transformed logs as async/ch."
266291
(let [sort-and-skip-logs' (partial sort-and-skip-logs transform-fn from-block skip-log-indexes)
267292
ch-logs (async/chan 1)
268293
event->logs (fn [[k [contract event]] ch-logs-output]
269294
(let [contract-instance (instance-from-arg contract {:ignore-forward? ignore-forward?})]
270-
(web3-eth/get-past-events contract-instance
271-
event
272-
{:from-block from
273-
:to-block to}
274-
(fn [error events]
275-
(let [logs (map (partial enrich-event-log contract contract-instance)
276-
(web3-helpers/js->cljkk events))]
277-
(async/put! ch-logs-output (or logs [(with-meta {:err error} {:error? true})])))))))]
295+
(log/debug "Processing chunk of blocks" {:contract contract
296+
:event event
297+
:from from
298+
:to to})
299+
(get-events-with-retry contract-instance contract event from to ch-logs-output 0)))]
278300
(go-loop [all-logs []
279301
[event & rest-events] events]
280302
(if event

0 commit comments

Comments
 (0)