diff --git a/scalardb/src/scalardb/transfer.clj b/scalardb/src/scalardb/transfer.clj index 03b9819..e7ea196 100644 --- a/scalardb/src/scalardb/transfer.clj +++ b/scalardb/src/scalardb/transfer.clj @@ -14,9 +14,7 @@ Result) (com.scalar.db.io IntValue Key) - (com.scalar.db.exception.storage ExecutionException) - (com.scalar.db.exception.transaction CrudException - UnknownTransactionStatusException))) + (com.scalar.db.exception.transaction UnknownTransactionStatusException))) (def ^:private ^:const TABLE "transfer") (def ^:private ^:const ACCOUNT_ID "account_id") @@ -127,19 +125,16 @@ (assoc op :type :fail :error {:results results}))))) (defn- read-record - "Read a record with a transaction. If read fails, this function returns nil." + "Read a record with a transaction. If read fails, an exception is thrown." [tx storage i] - (try - ;; Need Storage API to read the transaction metadata - (let [tx-result (.get tx (prepare-get i)) - result (.get storage (prepare-get i))] - ;; Put the same balance to check conflicts with in-flight transactions - (->> (calc-new-balance tx-result 0) - (prepare-put i) - (.put tx)) - result) - (catch CrudException _ nil) - (catch ExecutionException _ nil))) + ;; Need Storage API to read the transaction metadata + (let [tx-result (.get tx (prepare-get i)) + result (.get storage (prepare-get i))] + ;; Put the same balance to check conflicts with in-flight transactions + (->> (calc-new-balance tx-result 0) + (prepare-put i) + (.put tx)) + result)) (defn read-all-with-retry [test n] @@ -150,15 +145,16 @@ (scalar/prepare-transaction-service! test) (scalar/prepare-storage-service! test)) test - (let [tx (scalar/start-transaction test) - results (doall (map #(read-record tx @(:storage test) %) (range n)))] - (try + (try + (let [tx (scalar/start-transaction test) + results (doall (map #(read-record tx @(:storage test) %) + (range n)))] (.commit tx) - (if (some nil? results) nil results) - (catch Exception e - ;; The transaction conflicted - (warn (.getMessage e)) - nil))))) + results) + (catch Exception e + ;; The transaction conflicted + (warn (.getMessage e)) + nil)))) (defrecord TransferClient [initialized? n initial-balance max-txs] client/Client diff --git a/scalardb/src/scalardb/transfer_append.clj b/scalardb/src/scalardb/transfer_append.clj index 4de723d..9197376 100644 --- a/scalardb/src/scalardb/transfer_append.clj +++ b/scalardb/src/scalardb/transfer_append.clj @@ -13,8 +13,7 @@ Scan$Ordering Scan$Ordering$Order Result) - (com.scalar.db.exception.transaction CrudException - UnknownTransactionStatusException) + (com.scalar.db.exception.transaction UnknownTransactionStatusException) (com.scalar.db.io IntValue Key))) @@ -129,30 +128,29 @@ :start-fail)) (defn- scan-records + "Scan records with a transaction. If the scan fails, an exception is thrown." [tx id] - (try - (let [results (.scan tx (prepare-scan id))] - ;; Put the same balance to check conflicts with in-flight transactions - (->> (prepare-put id - (-> results first calc-new-age) - (-> results first (calc-new-balance 0))) - (.put tx)) - results) - (catch CrudException _ nil))) + (let [results (.scan tx (prepare-scan id))] + ;; Put the same balance to check conflicts with in-flight transactions + (->> (prepare-put id + (-> results first calc-new-age) + (-> results first (calc-new-balance 0))) + (.put tx)) + results)) (defn scan-all-records-with-retry [test n] (scalar/check-transaction-connection! test) (scalar/with-retry scalar/prepare-transaction-service! test - (let [tx (scalar/start-transaction test) - results (doall (map #(scan-records tx %) (range n)))] - (try + (try + (let [tx (scalar/start-transaction test) + results (doall (map #(scan-records tx %) (range n)))] (.commit tx) - (if (some nil? results) nil results) - (catch Exception e - ;; The transaction conflicted - (warn (.getMessage e)) - nil))))) + results) + (catch Exception e + ;; The transaction conflicted + (warn (.getMessage e)) + nil)))) (defrecord TransferClient [initialized? n initial-balance max-txs] client/Client diff --git a/scalardb/test/scalardb/core_test.clj b/scalardb/test/scalardb/core_test.clj index 5c39604..00d00de 100644 --- a/scalardb/test/scalardb/core_test.clj +++ b/scalardb/test/scalardb/core_test.clj @@ -25,7 +25,9 @@ (condp = column "tx_id" (Optional/of (TextValue. column id)) "tx_created_at" (Optional/of (BigIntValue. column (long 1566376246))) - "tx_state" (Optional/of (IntValue. column (Integer/parseInt id))))))) + "tx_state" (Optional/of (IntValue. column (Integer/parseInt id))) + ;; for the coordinator table + "tx_child_ids" (Optional/empty))))) (def mock-db (reify