Add exception handling inside doseq in scheduler tasks

This commit is contained in:
Vitaliy Vlasov 2018-02-26 17:14:08 +02:00 committed by Tetiana Churikova
parent cd44e15969
commit 6fac1eee9a

View File

@ -15,43 +15,50 @@
[clj-time.periodic :refer [periodic-seq]] [clj-time.periodic :refer [periodic-seq]]
[chime :refer [chime-at]])) [chime :refer [chime-at]]))
(defn update-issue-contract-address (defn update-issue-contract-address
"For each pending deployment: gets transaction receipt, updates db "For each pending deployment: gets transaction receipt, updates db
state (contract-address, comment-id) and posts github comment" state (contract-address, comment-id) and posts github comment"
[] []
(log/info "In update-issue-contract-address")
(doseq [{issue-id :issue_id (doseq [{issue-id :issue_id
transaction-hash :transaction_hash} (issues/list-pending-deployments)] transaction-hash :transaction_hash} (issues/list-pending-deployments)]
(log/debug "pending deployment:" transaction-hash) (log/info "pending deployment:" transaction-hash)
(when-let [receipt (eth/get-transaction-receipt transaction-hash)] (try
(log/info "update-issue-contract-address: transaction receipt for issue #" (when-let [receipt (eth/get-transaction-receipt transaction-hash)]
issue-id ": " receipt) (log/info "update-issue-contract-address: transaction receipt for issue #"
(if-let [contract-address (multisig/find-created-multisig-address receipt)] issue-id ": " receipt)
(let [issue (issues/update-contract-address issue-id contract-address) (if-let [contract-address (multisig/find-created-multisig-address receipt)]
{owner :owner (let [issue (issues/update-contract-address issue-id contract-address)
repo :repo {owner :owner
comment-id :comment_id repo :repo
issue-number :issue_number} issue comment-id :comment_id
balance-eth-str (eth/get-balance-eth contract-address 6) issue-number :issue_number} issue
balance-eth (read-string balance-eth-str)] balance-eth-str (eth/get-balance-eth contract-address 6)
(log/info "Updating comment image") balance-eth (read-string balance-eth-str)]
(bounties/update-bounty-comment-image issue-id (log/info "Updating comment image")
owner (bounties/update-bounty-comment-image issue-id
repo owner
issue-number repo
contract-address issue-number
balance-eth contract-address
balance-eth-str balance-eth
{}) balance-eth-str
(log/info "Updating comment") {})
(github/update-comment owner (log/info "Updating comment")
repo (github/update-comment owner
comment-id repo
issue-number comment-id
contract-address issue-number
balance-eth contract-address
balance-eth-str balance-eth
{})) balance-eth-str
(log/error "Failed to find contract address in tx logs"))))) {}))
(log/error "Failed to find contract address in tx logs")))
(catch Throwable ex
(do (log/error "update-issue-contract-address exception:" ex)
(clojure.stacktrace/print-stack-trace ex)))))
(log/info "Exit update-issue-contract-address"))
(defn deploy-contract [owner-address issue-id] (defn deploy-contract [owner-address issue-id]
@ -85,6 +92,7 @@
(defn self-sign-bounty (defn self-sign-bounty
"Walks through all issues eligible for bounty payout and signs corresponding transaction" "Walks through all issues eligible for bounty payout and signs corresponding transaction"
[] []
(log/info "In self-sign-bounty")
(doseq [{contract-address :contract_address (doseq [{contract-address :contract_address
issue-id :issue_id issue-id :issue_id
payout-address :payout_address payout-address :payout_address
@ -94,35 +102,42 @@
issue-number :issue_number issue-number :issue_number
balance-eth :balance_eth balance-eth :balance_eth
tokens :tokens tokens :tokens
winner-login :winner_login} (db-bounties/pending-bounties) winner-login :winner_login} (db-bounties/pending-bounties)]
:let [value (eth/get-balance-hex contract-address)]] (try
(if (empty? payout-address) (let [value (eth/get-balance-hex contract-address)]
(do (if (empty? payout-address)
(log/error "Cannot sign pending bounty - winner has no payout address") (do
(github/update-merged-issue-comment owner (log/error "Cannot sign pending bounty - winner has no payout address")
repo (github/update-merged-issue-comment owner
comment-id repo
contract-address comment-id
(eth-decimal->str balance-eth) contract-address
tokens (eth-decimal->str balance-eth)
winner-login tokens
true)) winner-login
(let [execute-hash (multisig/send-all contract-address payout-address)] true))
(log/info "Payout self-signed, called sign-all(" contract-address payout-address ") tx:" execute-hash) (let [execute-hash (multisig/send-all contract-address payout-address)]
(db-bounties/update-execute-hash issue-id execute-hash) (log/info "Payout self-signed, called sign-all(" contract-address payout-address ") tx:" execute-hash)
(db-bounties/update-winner-login issue-id winner-login) (db-bounties/update-execute-hash issue-id execute-hash)
(github/update-merged-issue-comment owner (db-bounties/update-winner-login issue-id winner-login)
repo (github/update-merged-issue-comment owner
comment-id repo
contract-address comment-id
(eth-decimal->str balance-eth) contract-address
tokens (eth-decimal->str balance-eth)
winner-login tokens
false))))) winner-login
false))))
(catch Throwable ex
(do (log/error "self-sign-bounty exception:" ex)
(clojure.stacktrace/print-stack-trace ex)))))
(log/info "Exit self-sign-bounty")
)
(defn update-confirm-hash (defn update-confirm-hash
"Gets transaction receipt for each pending payout and updates DB confirm_hash with tranaction ID of commiteth bot account's confirmation." "Gets transaction receipt for each pending payout and updates DB confirm_hash with tranaction ID of commiteth bot account's confirmation."
[] []
(log/info "In update-confirm-hash")
(doseq [{issue-id :issue_id (doseq [{issue-id :issue_id
execute-hash :execute_hash} (db-bounties/pending-payouts)] execute-hash :execute_hash} (db-bounties/pending-payouts)]
(log/info "pending payout:" execute-hash) (log/info "pending payout:" execute-hash)
@ -130,7 +145,8 @@
(log/info "execution receipt for issue #" issue-id ": " receipt) (log/info "execution receipt for issue #" issue-id ": " receipt)
(when-let [confirm-hash (multisig/find-confirmation-tx-id receipt)] (when-let [confirm-hash (multisig/find-confirmation-tx-id receipt)]
(log/info "confirm hash:" confirm-hash) (log/info "confirm hash:" confirm-hash)
(db-bounties/update-confirm-hash issue-id confirm-hash))))) (db-bounties/update-confirm-hash issue-id confirm-hash))))
(log/info "Exit update-confirm-hash"))
(defn update-watch-hash (defn update-watch-hash
@ -154,6 +170,7 @@
(defn update-payout-receipt (defn update-payout-receipt
"Gets transaction receipt for each confirmed payout and updates payout_hash" "Gets transaction receipt for each confirmed payout and updates payout_hash"
[] []
(log/info "In update-payout-receipt")
(doseq [{issue-id :issue_id (doseq [{issue-id :issue_id
payout-hash :payout_hash payout-hash :payout_hash
contract-address :contract_address contract-address :contract_address
@ -167,32 +184,38 @@
payee-login :payee_login payee-login :payee_login
updated :updated} (db-bounties/confirmed-payouts)] updated :updated} (db-bounties/confirmed-payouts)]
(log/debug "confirmed payout:" payout-hash) (log/debug "confirmed payout:" payout-hash)
(if-let [receipt (eth/get-transaction-receipt payout-hash)] (try
(let [contract-tokens (multisig/token-balances contract-address) (if-let [receipt (eth/get-transaction-receipt payout-hash)]
contract-eth-balance (eth/get-balance-wei contract-address)] (let [contract-tokens (multisig/token-balances contract-address)
(if (or contract-eth-balance (eth/get-balance-wei contract-address)]
(some #(> (second %) 0.0) contract-tokens) (if (or
(> contract-eth-balance 0)) (some #(> (second %) 0.0) contract-tokens)
(do (> contract-eth-balance 0))
(log/info "Contract still has funds") (do
(when (multisig/is-confirmed? contract-address confirm-id) (log/info "Contract still has funds")
(log/info "Detected bounty with funds and confirmed payout, calling executeTransaction") (when (multisig/is-confirmed? contract-address confirm-id)
(let [execute-tx-hash (multisig/execute-tx contract-address confirm-id)] (log/info "Detected bounty with funds and confirmed payout, calling executeTransaction")
(log/info "execute tx:" execute-tx-hash)))) (let [execute-tx-hash (multisig/execute-tx contract-address confirm-id)]
(log/info "execute tx:" execute-tx-hash))))
(do (do
(log/info "Payout has succeeded, saving payout receipt for issue #" issue-id ": " receipt) (log/info "Payout has succeeded, saving payout receipt for issue #" issue-id ": " receipt)
(db-bounties/update-payout-receipt issue-id receipt) (db-bounties/update-payout-receipt issue-id receipt)
(github/update-paid-issue-comment owner (github/update-paid-issue-comment owner
repo repo
comment-id comment-id
contract-address contract-address
(eth-decimal->str balance-eth) (eth-decimal->str balance-eth)
tokens tokens
payee-login)))) payee-login))))
(when (older-than-3h? updated) (when (older-than-3h? updated)
(log/info "Resetting payout hash for issue" issue-id "as it has not been mined in 3h") (log/info "Resetting payout hash for issue" issue-id "as it has not been mined in 3h")
(db-bounties/reset-payout-hash issue-id))))) (db-bounties/reset-payout-hash issue-id)))
(catch Throwable ex
(do (log/error "update-payout-receipt exception:" ex)
(clojure.stacktrace/print-stack-trace ex)))))
(log/info "Exit update-payout-receipt")
)
(defn abs (defn abs
"(abs n) is the absolute value of n" "(abs n) is the absolute value of n"
@ -213,17 +236,24 @@
(defn update-bounty-token-balances (defn update-bounty-token-balances
"Helper function for updating internal ERC20 token balances to token multisig contract. Will be called periodically for all open bounty contracts." "Helper function for updating internal ERC20 token balances to token multisig contract. Will be called periodically for all open bounty contracts."
[issue-id bounty-addr watch-hash] [issue-id bounty-addr watch-hash]
(log/info "In update-bounty-token-balances for issue" issue-id)
(doseq [[tla token-data] (token-data/as-map)] (doseq [[tla token-data] (token-data/as-map)]
(let [balance (multisig/token-balance bounty-addr tla)] (try
(when (> balance 0) (let [balance (multisig/token-balance bounty-addr tla)]
(do (when (> balance 0)
(log/debug "bounty at" bounty-addr "has" balance "of token" tla) (do
(let [internal-balance (multisig/token-balance-in-bounty bounty-addr tla)] (log/info "bounty at" bounty-addr "has" balance "of token" tla)
(when (and (nil? watch-hash) (let [internal-balance (multisig/token-balance-in-bounty bounty-addr tla)]
(not= balance internal-balance)) (when (and (nil? watch-hash)
(log/info "balances not in sync, calling watch") (not= balance internal-balance))
(let [hash (multisig/watch-token bounty-addr tla)] (log/info "balances not in sync, calling watch")
(db-bounties/update-watch-hash issue-id hash))))))))) (let [hash (multisig/watch-token bounty-addr tla)]
(db-bounties/update-watch-hash issue-id hash)))))))
(catch Throwable ex
(do (log/error "update-bounty-token-balances exception:" ex)
(clojure.stacktrace/print-stack-trace ex)))))
(log/info "Exit update-bounty-token-balances"))
(defn update-contract-internal-balances (defn update-contract-internal-balances
"It is required in our current smart contract to manually update it's internal balance when some tokens have been added." "It is required in our current smart contract to manually update it's internal balance when some tokens have been added."
@ -263,6 +293,7 @@
(defn update-balances (defn update-balances
[] []
(log/info "In update-balances")
(doseq [{contract-address :contract_address (doseq [{contract-address :contract_address
owner :owner owner :owner
repo :repo repo :repo
@ -271,43 +302,48 @@
db-balance-eth :balance_eth db-balance-eth :balance_eth
db-tokens :tokens db-tokens :tokens
issue-number :issue_number} (db-bounties/open-bounty-contracts)] issue-number :issue_number} (db-bounties/open-bounty-contracts)]
(when comment-id (try
(let [balance-eth-str (eth/get-balance-eth contract-address 6) (when comment-id
balance-eth (read-string balance-eth-str) (let [balance-eth-str (eth/get-balance-eth contract-address 6)
token-balances (multisig/token-balances contract-address)] balance-eth (read-string balance-eth-str)
(log/debug "update-balances" balance-eth token-balances (multisig/token-balances contract-address)]
balance-eth-str token-balances owner repo issue-number) (log/debug "update-balances" balance-eth
balance-eth-str token-balances owner repo issue-number)
(when (or (when (or
(not (float= db-balance-eth balance-eth)) (not (float= db-balance-eth balance-eth))
(not= db-tokens token-balances)) (not= db-tokens token-balances))
(log/debug "balances differ") (log/debug "balances differ")
(log/debug "ETH (db):" db-balance-eth (type db-balance-eth) ) (log/debug "ETH (db):" db-balance-eth (type db-balance-eth) )
(log/debug "ETH (chain):" balance-eth (type balance-eth) ) (log/debug "ETH (chain):" balance-eth (type balance-eth) )
(log/debug "ETH cmp:" (float= db-balance-eth balance-eth)) (log/debug "ETH cmp:" (float= db-balance-eth balance-eth))
(log/debug "tokens (db):" db-tokens (type db-tokens) (type (:SNT db-tokens))) (log/debug "tokens (db):" db-tokens (type db-tokens) (type (:SNT db-tokens)))
(log/debug "tokens (chain):" token-balances (type token-balances) (type (:SNT token-balances))) (log/debug "tokens (chain):" token-balances (type token-balances) (type (:SNT token-balances)))
(log/debug "tokens cmp:" (= db-tokens token-balances)) (log/debug "tokens cmp:" (= db-tokens token-balances))
(issues/update-eth-balance contract-address balance-eth) (issues/update-eth-balance contract-address balance-eth)
(issues/update-token-balances contract-address token-balances) (issues/update-token-balances contract-address token-balances)
(bounties/update-bounty-comment-image issue-id (bounties/update-bounty-comment-image issue-id
owner owner
repo repo
issue-number issue-number
contract-address contract-address
balance-eth balance-eth
balance-eth-str balance-eth-str
token-balances) token-balances)
(github/update-comment owner (github/update-comment owner
repo repo
comment-id comment-id
issue-number issue-number
contract-address contract-address
balance-eth balance-eth
balance-eth-str balance-eth-str
token-balances) token-balances)
(update-issue-usd-value contract-address)))))) (update-issue-usd-value contract-address))))
(catch Throwable ex
(do (log/error "update-balances exception:" ex)
(clojure.stacktrace/print-stack-trace ex)))))
(log/info "Exit update-balances"))
(defn wrap-in-try-catch [func] (defn wrap-in-try-catch [func]
@ -323,7 +359,7 @@
(defn run-1-min-interval-tasks [time] (defn run-1-min-interval-tasks [time]
(do (do
(log/debug "run-1-min-interval-tasks" time) (log/info "run-1-min-interval-tasks" time)
;; TODO: disabled for now. looks like it may cause extraneus ;; TODO: disabled for now. looks like it may cause extraneus
;; contract deployments and costs ;; contract deployments and costs
(run-tasks (run-tasks