gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-exchange] branch master updated: add locking to avoi


From: gnunet
Subject: [GNUnet-SVN] [taler-exchange] branch master updated: add locking to avoid transaction retries
Date: Wed, 05 Jun 2019 21:26:29 +0200

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 2f0015b8 add locking to avoid transaction retries
2f0015b8 is described below

commit 2f0015b80385364ffbacca71504a96a46db6f0e0
Author: Christian Grothoff <address@hidden>
AuthorDate: Wed Jun 5 21:26:27 2019 +0200

    add locking to avoid transaction retries
---
 src/exchange/taler-exchange-httpd_deposit.c        |  4 +--
 .../taler-exchange-httpd_reserve_withdraw.c        | 14 ++++-----
 src/exchangedb/plugin_exchangedb_postgres.c        | 34 +++++++++++++++++++---
 src/exchangedb/test_exchangedb.c                   |  7 +++++
 4 files changed, 46 insertions(+), 13 deletions(-)

diff --git a/src/exchange/taler-exchange-httpd_deposit.c 
b/src/exchange/taler-exchange-httpd_deposit.c
index 5a1bf496..5320c9c7 100644
--- a/src/exchange/taler-exchange-httpd_deposit.c
+++ b/src/exchange/taler-exchange-httpd_deposit.c
@@ -215,8 +215,8 @@ deposit_transaction (void *cls,
   TEH_plugin->free_coin_transaction_list (TEH_plugin->cls,
                                           tl);
   qs = TEH_plugin->insert_deposit (TEH_plugin->cls,
-                                  session,
-                                  deposit);
+                                   session,
+                                   deposit);
   if (GNUNET_DB_STATUS_HARD_ERROR == qs)
   {
     TALER_LOG_WARNING ("Failed to store /deposit information in database\n");
diff --git a/src/exchange/taler-exchange-httpd_reserve_withdraw.c 
b/src/exchange/taler-exchange-httpd_reserve_withdraw.c
index c988cde6..32d53980 100644
--- a/src/exchange/taler-exchange-httpd_reserve_withdraw.c
+++ b/src/exchange/taler-exchange-httpd_reserve_withdraw.c
@@ -59,7 +59,7 @@ reply_reserve_withdraw_insufficient_funds (struct 
MHD_Connection *connection,
   struct TALER_Amount balance;
 
   json_history = TEH_RESPONSE_compile_reserve_history (rh,
-                                                      &balance);
+                                                       &balance);
   if ((NULL == json_history)
       /* Address the case where the ptr is not null, but
        * it fails "internally" to dump as string (= corrupted).  */
@@ -180,9 +180,9 @@ struct WithdrawContext
  */
 static enum GNUNET_DB_QueryStatus
 withdraw_transaction (void *cls,
-                     struct MHD_Connection *connection,
-                     struct TALER_EXCHANGEDB_Session *session,
-                     int *mhd_ret)
+                      struct MHD_Connection *connection,
+                      struct TALER_EXCHANGEDB_Session *session,
+                      int *mhd_ret)
 {
   struct WithdrawContext *wc = cls;
   struct TALER_EXCHANGEDB_Reserve r;
@@ -197,9 +197,9 @@ withdraw_transaction (void *cls,
   wc->collectable.sig.rsa_signature = NULL;
 #endif
   qs = TEH_plugin->get_withdraw_info (TEH_plugin->cls,
-                                     session,
-                                     &wc->wsrd.h_coin_envelope,
-                                     &wc->collectable);
+                                      session,
+                                      &wc->wsrd.h_coin_envelope,
+                                      &wc->collectable);
   if (0 > qs)
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index 35b9aa57..9788c67a 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -739,6 +739,12 @@ postgres_prepare (PGconn *db_conn)
                             " WHERE reserve_pub=$1"
                             " FOR UPDATE;",
                             1),
+    /* Lock withdraw table; NOTE: we may want to eventually shard the
+       deposit table to avoid this lock being the main point of
+       contention limiting transaction performance. */
+    GNUNET_PQ_make_prepare ("lock_withdraw",
+                            "LOCK TABLE reserves_out;",
+                            0),
     /* Used in #postgres_insert_withdraw_info() to store
        the signature of a blinded coin with the blinded coin's
        details before returning it during /reserve/withdraw. We store
@@ -1039,7 +1045,12 @@ postgres_prepare (PGconn *db_conn)
                             " WHERE refund_serial_id>=$1"
                             " ORDER BY refund_serial_id ASC;",
                             1),
-
+    /* Lock deposit table; NOTE: we may want to eventually shard the
+       deposit table to avoid this lock being the main point of
+       contention limiting transaction performance. */
+    GNUNET_PQ_make_prepare ("lock_deposit",
+                            "LOCK TABLE deposits;",
+                            0),
     /* Store information about a /deposit the exchange is to execute.
        Used in #postgres_insert_deposit(). */
     GNUNET_PQ_make_prepare ("insert_deposit",
@@ -2380,6 +2391,9 @@ postgres_get_withdraw_info (void *cls,
                             const struct GNUNET_HashCode *h_blind,
                             struct TALER_EXCHANGEDB_CollectableBlindcoin 
*collectable)
 {
+  struct GNUNET_PQ_QueryParam no_params[] = {
+    GNUNET_PQ_query_param_end
+  };
   struct GNUNET_PQ_QueryParam params[] = {
     GNUNET_PQ_query_param_auto_from_type (h_blind),
     GNUNET_PQ_query_param_end
@@ -2399,12 +2413,17 @@ postgres_get_withdraw_info (void *cls,
                                 &collectable->withdraw_fee),
     GNUNET_PQ_result_spec_end
   };
+  enum GNUNET_DB_QueryStatus qs;
 
+  if (0 > (qs = GNUNET_PQ_eval_prepared_non_select (session->conn,
+                                                    "lock_withdraw",
+                                                    no_params)))
+    return qs;
   collectable->h_coin_envelope = *h_blind;
   return GNUNET_PQ_eval_prepared_singleton_select (session->conn,
-                                                  "get_withdraw_info",
-                                                  params,
-                                                  rs);
+                                                   "get_withdraw_info",
+                                                   params,
+                                                   rs);
 }
 
 
@@ -2876,6 +2895,9 @@ postgres_have_deposit (void *cls,
     GNUNET_PQ_query_param_auto_from_type (&deposit->merchant_pub),
     GNUNET_PQ_query_param_end
   };
+  struct GNUNET_PQ_QueryParam no_params[] = {
+    GNUNET_PQ_query_param_end
+  };
   struct TALER_EXCHANGEDB_Deposit deposit2;
   struct GNUNET_PQ_ResultSpec rs[] = {
     TALER_PQ_result_spec_amount ("amount_with_fee",
@@ -2892,6 +2914,10 @@ postgres_have_deposit (void *cls,
   };
   enum GNUNET_DB_QueryStatus qs;
 
+  if (0 > (qs = GNUNET_PQ_eval_prepared_non_select (session->conn,
+                                                    "lock_deposit",
+                                                    no_params)))
+    return qs;
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Getting deposits for coin %s\n",
               TALER_B2S (&deposit->coin.coin_pub));
diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c
index db40f365..cab05f08 100644
--- a/src/exchangedb/test_exchangedb.c
+++ b/src/exchangedb/test_exchangedb.c
@@ -1995,6 +1995,10 @@ run (void *cls)
 
   result = 10;
   deposit2 = deposit;
+  FAILIF (GNUNET_OK !=
+          plugin->start (plugin->cls,
+                         session,
+                         "test-2"));
   RND_BLK (&deposit2.merchant_pub); /* should fail if merchant is different */
   FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
           plugin->have_deposit (plugin->cls,
@@ -2010,6 +2014,9 @@ run (void *cls)
                                 GNUNET_YES));
   FAILIF (GNUNET_OK !=
          test_melting (session));
+  FAILIF (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS !=
+          plugin->commit (plugin->cls,
+                          session));
 
 
   /* test insert_refund! */

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]