gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [taler-merchant] branch master updated: deal with soft erro


From: gnunet
Subject: [GNUnet-SVN] [taler-merchant] branch master updated: deal with soft errors by retrying in merchantdb (for tipping)
Date: Thu, 02 Nov 2017 14:19:18 +0100

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

grothoff pushed a commit to branch master
in repository merchant.

The following commit(s) were added to refs/heads/master by this push:
     new d4fe427  deal with soft errors by retrying in merchantdb (for tipping)
d4fe427 is described below

commit d4fe427d4974cfb0492e656dfd7217ff1b6056a8
Author: Christian Grothoff <address@hidden>
AuthorDate: Thu Nov 2 14:19:16 2017 +0100

    deal with soft errors by retrying in merchantdb (for tipping)
---
 src/backenddb/plugin_merchantdb_postgres.c | 82 ++++++++++++++++++++----------
 1 file changed, 55 insertions(+), 27 deletions(-)

diff --git a/src/backenddb/plugin_merchantdb_postgres.c 
b/src/backenddb/plugin_merchantdb_postgres.c
index f15374c..826ed69 100644
--- a/src/backenddb/plugin_merchantdb_postgres.c
+++ b/src/backenddb/plugin_merchantdb_postgres.c
@@ -28,6 +28,11 @@
 #include <taler/taler_json_lib.h>
 #include "taler_merchantdb_plugin.h"
 
+/**
+ * How often do we re-try if we run into a DB serialization error?
+ */
+#define MAX_RETRIES 3
+
 
 /**
  * Type of the "cls" argument given to each of the functions in
@@ -2631,8 +2636,13 @@ postgres_enable_tip_reserve (void *cls,
   enum GNUNET_DB_QueryStatus qs;
   struct GNUNET_TIME_Absolute new_expiration;
   struct TALER_Amount new_balance;
+  unsigned int retries;
 
+  retries = 0;
   check_connection (pg);
+ RETRY:
+  if (MAX_RETRIES < ++retries)
+    return GNUNET_DB_STATUS_SOFT_ERROR;
   if (GNUNET_OK !=
       postgres_start (pg))
   {
@@ -2659,6 +2669,8 @@ postgres_enable_tip_reserve (void *cls,
     {
       GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
       postgres_rollback (pg);
+      if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+        goto RETRY;
       return qs;
     }
     /* UUID already exists, we are done! */
@@ -2692,6 +2704,8 @@ postgres_enable_tip_reserve (void *cls,
   {
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
     postgres_rollback (pg);
+    if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+      goto RETRY;
     return qs;
   }
   if ( (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs) &&
@@ -2741,6 +2755,8 @@ postgres_enable_tip_reserve (void *cls,
     {
       GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
       postgres_rollback (pg);
+      if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+        goto RETRY;
       return qs;
     }
   }
@@ -2748,6 +2764,8 @@ postgres_enable_tip_reserve (void *cls,
   if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
     return GNUNET_DB_STATUS_SUCCESS_ONE_RESULT;
   GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
+  if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+    goto RETRY;
   return qs;
 }
 
@@ -2797,8 +2815,13 @@ postgres_authorize_tip (void *cls,
   };
   enum GNUNET_DB_QueryStatus qs;
   struct TALER_Amount new_balance;
+  unsigned int retries;
 
+  retries = 0;
   check_connection (pg);
+ RETRY:
+  if (MAX_RETRIES < ++retries)
+    return TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR;
   if (GNUNET_OK !=
       postgres_start (pg))
   {
@@ -2813,11 +2836,11 @@ postgres_authorize_tip (void *cls,
   {
     /* reserve unknown */
     postgres_rollback (pg);
+    if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+      goto RETRY;
     if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
       return TALER_EC_TIP_AUTHORIZE_RESERVE_NOT_ENABLED;
-    return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-      ? TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR
-      : TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR;
+    return TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR;
   }
   if (0 == GNUNET_TIME_absolute_get_remaining (old_expiration).rel_value_us)
   {
@@ -2849,9 +2872,9 @@ postgres_authorize_tip (void *cls,
     if (0 > qs)
     {
       postgres_rollback (pg);
-      return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-        ? TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR
-        : TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR;
+      if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+        goto RETRY;
+      return TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR;
     }
   }
   /* Generate and store tip ID */
@@ -2878,17 +2901,17 @@ postgres_authorize_tip (void *cls,
     if (0 > qs)
     {
       postgres_rollback (pg);
-      return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-        ? TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR
-        : TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR;
+      if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+        goto RETRY;
+      return TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR;
     }
   }
   qs = postgres_commit (pg);
   if (0 <= qs)
     return TALER_EC_NONE; /* success! */
-  return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-    ? TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR
-    : TALER_EC_TIP_AUTHORIZE_DB_SOFT_ERROR;
+  if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+    goto RETRY;
+  return TALER_EC_TIP_AUTHORIZE_DB_HARD_ERROR;
 }
 
 
@@ -2970,8 +2993,13 @@ postgres_pickup_tip (void *cls,
     GNUNET_PQ_result_spec_end
   };
   enum GNUNET_DB_QueryStatus qs;
+  unsigned int retries;
 
+  retries = 0;
   check_connection (pg);
+ RETRY:
+  if (MAX_RETRIES < ++retries)
+    return GNUNET_DB_STATUS_SOFT_ERROR;
   if (GNUNET_OK !=
       postgres_start (pg))
   {
@@ -2991,9 +3019,9 @@ postgres_pickup_tip (void *cls,
     postgres_rollback (pg);
     if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
       return TALER_EC_TIP_PICKUP_TIP_ID_UNKNOWN;
-    return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-      ? TALER_EC_TIP_PICKUP_DB_ERROR_HARD
-      : TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
+    if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+      goto RETRY;
+    return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
   }
 
   /* Check if pickup_id already exists */
@@ -3021,9 +3049,9 @@ postgres_pickup_tip (void *cls,
               0,
               sizeof (*reserve_priv));
       postgres_rollback (pg);
-      return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-        ? TALER_EC_TIP_PICKUP_DB_ERROR_HARD
-        : TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
+      if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+        goto RETRY;
+      return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
     }
     if (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs)
     {
@@ -3074,9 +3102,9 @@ postgres_pickup_tip (void *cls,
         memset (reserve_priv,
                 0,
                 sizeof (*reserve_priv));
-        return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-          ? TALER_EC_TIP_PICKUP_DB_ERROR_HARD
-          : TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
+        if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+          goto RETRY;
+        return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
       }
     }
 
@@ -3098,18 +3126,18 @@ postgres_pickup_tip (void *cls,
         memset (reserve_priv,
                 0,
                 sizeof (*reserve_priv));
-        return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-          ? TALER_EC_TIP_PICKUP_DB_ERROR_HARD
-          : TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
+        if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+          goto RETRY;
+        return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
       }
     }
   }
   qs = postgres_commit (pg);
   if (0 <= qs)
     return TALER_EC_NONE; /* success  */
-  return (GNUNET_DB_STATUS_HARD_ERROR == qs)
-    ? TALER_EC_TIP_PICKUP_DB_ERROR_HARD
-    : TALER_EC_TIP_PICKUP_DB_ERROR_SOFT;
+  if (GNUNET_DB_STATUS_SOFT_ERROR == qs)
+    goto RETRY;
+  return TALER_EC_TIP_PICKUP_DB_ERROR_HARD;
 }
 
 

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



reply via email to

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