gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: combine auto-commited transactio


From: gnunet
Subject: [taler-exchange] branch master updated: combine auto-commited transactions in refresh/reveal into one big transaction
Date: Thu, 12 May 2022 13:31:18 +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 35b4a51e combine auto-commited transactions in refresh/reveal into one 
big transaction
35b4a51e is described below

commit 35b4a51e14dc08e1aa6a00d8edca5eda75c3e3de
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu May 12 13:31:15 2022 +0200

    combine auto-commited transactions in refresh/reveal into one big 
transaction
---
 contrib/gana                                       |  2 +-
 .../taler-exchange-httpd_refreshes_reveal.c        | 51 +++++++++++++++++++---
 src/exchangedb/plugin_exchangedb_postgres.c        |  6 ++-
 src/include/taler_exchangedb_plugin.h              |  4 +-
 4 files changed, 52 insertions(+), 11 deletions(-)

diff --git a/contrib/gana b/contrib/gana
index 836cdc70..f6948ba8 160000
--- a/contrib/gana
+++ b/contrib/gana
@@ -1 +1 @@
-Subproject commit 836cdc706d849ec5965b3b7795fcefe95344a969
+Subproject commit f6948ba8fbcdfb648ed78ee81a392922ded36b99
diff --git a/src/exchange/taler-exchange-httpd_refreshes_reveal.c 
b/src/exchange/taler-exchange-httpd_refreshes_reveal.c
index 8b48e67f..bbccd568 100644
--- a/src/exchange/taler-exchange-httpd_refreshes_reveal.c
+++ b/src/exchange/taler-exchange-httpd_refreshes_reveal.c
@@ -444,6 +444,7 @@ resolve_refreshes_reveal_denominations (struct 
MHD_Connection *connection,
   MHD_RESULT ret;
   struct TEH_KeyStateHandle *ksh;
   uint64_t melt_serial_id;
+  enum GNUNET_DB_QueryStatus qs;
 
   memset (dks, 0, sizeof (dks));
   memset (rrcs, 0, sizeof (rrcs));
@@ -768,11 +769,20 @@ clean_age:
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "Signatures ready, starting DB interaction\n");
 
-  // FIXME: do all this (and the above) in ONE DB transaction!
-  /* Persist operation result in DB */
+  for (unsigned int r = 0; r<MAX_TRANSACTION_COMMIT_RETRIES; r++)
   {
-    enum GNUNET_DB_QueryStatus qs;
-
+    /* Persist operation result in DB */
+    if (GNUNET_OK !=
+        TEH_plugin->start (TEH_plugin->cls,
+                           "insert_refresh_reveal batch"))
+    {
+      GNUNET_break (0);
+      ret = TALER_MHD_reply_with_error (connection,
+                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                        TALER_EC_GENERIC_DB_START_FAILED,
+                                        NULL);
+      goto cleanup;
+    }
     for (unsigned int i = 0; i<rctx->num_fresh_coins; i++)
     {
       struct TALER_EXCHANGEDB_RefreshRevealedCoin *rrc = &rrcs[i];
@@ -786,18 +796,47 @@ clean_age:
                                             TALER_CNC_KAPPA - 1,
                                             rctx->transfer_privs,
                                             &rctx->gamma_tp);
+    if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+    {
+      TEH_plugin->rollback (TEH_plugin->cls);
+      continue;
+    }
     /* 0 == qs is ok, as we did not check for repeated requests */
-    if (0 > qs)
+    if (GNUNET_DB_STATUS_HARD_ERROR == qs)
     {
       GNUNET_break (0);
+      TEH_plugin->rollback (TEH_plugin->cls);
       ret = TALER_MHD_reply_with_error (connection,
                                         MHD_HTTP_INTERNAL_SERVER_ERROR,
                                         TALER_EC_GENERIC_DB_STORE_FAILED,
                                         "insert_refresh_reveal");
       goto cleanup;
     }
+    qs = TEH_plugin->commit (TEH_plugin->cls);
+    if (qs >= 0)
+      break;   /* success */
+    if (GNUNET_DB_STATUS_HARD_ERROR == qs)
+    {
+      GNUNET_break (0);
+      TEH_plugin->rollback (TEH_plugin->cls);
+      ret = TALER_MHD_reply_with_error (connection,
+                                        MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                        TALER_EC_GENERIC_DB_COMMIT_FAILED,
+                                        NULL);
+      goto cleanup;
+    }
+    TEH_plugin->rollback (TEH_plugin->cls);
+  }
+  if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+  {
+    GNUNET_break (0);
+    TEH_plugin->rollback (TEH_plugin->cls);
+    ret = TALER_MHD_reply_with_error (connection,
+                                      MHD_HTTP_INTERNAL_SERVER_ERROR,
+                                      TALER_EC_GENERIC_DB_SOFT_FAILURE,
+                                      NULL);
+    goto cleanup;
   }
-
   /* Generate final (positive) response */
   ret = reply_refreshes_reveal_success (connection,
                                         num_fresh_coins,
diff --git a/src/exchangedb/plugin_exchangedb_postgres.c 
b/src/exchangedb/plugin_exchangedb_postgres.c
index 1839b13b..4175678a 100644
--- a/src/exchangedb/plugin_exchangedb_postgres.c
+++ b/src/exchangedb/plugin_exchangedb_postgres.c
@@ -1263,7 +1263,8 @@ prepare_statements (struct PostgresClosure *pg)
       ") SELECT $1, $2, $3, "
       "         denominations_serial, $5, $6, $7, $8"
       "    FROM denominations"
-      "   WHERE denom_pub_hash=$4;",
+      "   WHERE denom_pub_hash=$4"
+      " ON CONFLICT DO NOTHING;",
       8),
     /* Obtain information about the coins created in a refresh
        operation, used in #postgres_get_refresh_reveal() */
@@ -1293,7 +1294,8 @@ prepare_statements (struct PostgresClosure *pg)
       "(melt_serial_id"
       ",transfer_pub"
       ",transfer_privs"
-      ") VALUES ($1, $2, $3);",
+      ") VALUES ($1, $2, $3)"
+      " ON CONFLICT DO NOTHING;",
       3),
     /* Used in #postgres_insert_refund() to store refund information */
     GNUNET_PQ_make_prepare (
diff --git a/src/include/taler_exchangedb_plugin.h 
b/src/include/taler_exchangedb_plugin.h
index f95ba75a..52e684f6 100644
--- a/src/include/taler_exchangedb_plugin.h
+++ b/src/include/taler_exchangedb_plugin.h
@@ -635,8 +635,8 @@ struct TALER_EXCHANGEDB_Reserve
 struct TALER_EXCHANGEDB_DenominationKeyMetaData
 {
   /**
- * Start time of the validity period for this key.
- */
+   * Start time of the validity period for this key.
+   */
   struct GNUNET_TIME_Timestamp start;
 
   /**

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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