gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: add logic to properly decrement


From: gnunet
Subject: [taler-exchange] branch master updated: add logic to properly decrement balance if missing deposit confirmations appear
Date: Thu, 02 Jan 2025 09:48:46 +0100

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 d442697a1 add logic to properly decrement balance if missing deposit 
confirmations appear
d442697a1 is described below

commit d442697a1f276471a15012c8eba802e725acfebc
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu Jan 2 09:48:29 2025 +0100

    add logic to properly decrement balance if missing deposit confirmations 
appear
---
 src/auditor/taler-helper-auditor-deposits.c | 181 ++++++++++++++++++++++------
 src/include/taler_auditordb_plugin.h        |   2 -
 2 files changed, 143 insertions(+), 40 deletions(-)

diff --git a/src/auditor/taler-helper-auditor-deposits.c 
b/src/auditor/taler-helper-auditor-deposits.c
index 4dccf983e..91b61652e 100644
--- a/src/auditor/taler-helper-auditor-deposits.c
+++ b/src/auditor/taler-helper-auditor-deposits.c
@@ -1,6 +1,6 @@
 /*
   This file is part of TALER
-  Copyright (C) 2016-2024 Taler Systems SA
+  Copyright (C) 2016-2025 Taler Systems SA
 
   TALER is free software; you can redistribute it and/or modify it under the
   terms of the GNU Affero Public License as published by the Free Software
@@ -59,6 +59,12 @@
  */
 static int global_ret;
 
+/**
+ * Row ID until which we have added up missing deposit confirmations
+ * in the total_missed_deposit_confirmations amount. Missing deposit
+ * confirmations above this value need to be added, and if any appear
+ * below this value we should subtract them from the reported amount.
+ */
 static TALER_ARL_DEF_PP (deposit_confirmation_serial_id);
 
 /**
@@ -74,9 +80,13 @@ static TALER_ARL_DEF_AB (total_missed_deposit_confirmations);
 
 /**
  * Should we run checks that only work for exchange-internal audits?
+ * Does nothing for this helper (present only for uniformity).
  */
 static int internal_checks;
 
+/**
+ * Handler to wake us up on new deposit confirmations.
+ */
 static struct GNUNET_DB_EventHandler *eh;
 
 /**
@@ -86,7 +96,7 @@ static const struct GNUNET_CONFIGURATION_Handle *cfg;
 
 /**
  * Success or failure of (exchange) database operations within
- * #test_dc.
+ * #test_dc and #recheck_dc.
  */
 static enum GNUNET_DB_QueryStatus eqs;
 
@@ -95,7 +105,7 @@ static enum GNUNET_DB_QueryStatus eqs;
  * Given a deposit confirmation from #TALER_ARL_adb, check that it is also
  * in #TALER_ARL_edb.  Update the deposit confirmation context accordingly.
  *
- * @param cls our `struct DepositConfirmationContext`
+ * @param cls NULL
  * @param dc the deposit confirmation we know
  * @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop iterating
  */
@@ -154,7 +164,6 @@ test_dc (void *cls,
                 GNUNET_h2s (&dc->h_contract_terms.hash));
     return GNUNET_OK; /* all coins found, all good */
   }
-  // FIXME: where do we *decrease* this amount if we get a DC later?
   TALER_ARL_amount_add (&TALER_ARL_USE_AB (total_missed_deposit_confirmations),
                         &TALER_ARL_USE_AB (total_missed_deposit_confirmations),
                         &dc->total_without_fee);
@@ -162,6 +171,80 @@ test_dc (void *cls,
 }
 
 
+/**
+ * Given a previously missing deposit confirmation from #TALER_ARL_adb, check
+ * *again* whether it is now in #TALER_ARL_edb.  Update the deposit
+ * confirmation context accordingly.
+ *
+ * @param cls NULL
+ * @param dc the deposit confirmation we know
+ * @return #GNUNET_OK to continue to iterate, #GNUNET_SYSERR to stop iterating
+ */
+static enum GNUNET_GenericReturnValue
+recheck_dc (void *cls,
+            const struct TALER_AUDITORDB_DepositConfirmation *dc)
+{
+  bool missing = false;
+  enum GNUNET_DB_QueryStatus qs;
+
+  (void) cls;
+  for (unsigned int i = 0; i < dc->num_coins; i++)
+  {
+    struct GNUNET_TIME_Timestamp exchange_timestamp;
+    struct TALER_Amount deposit_fee;
+
+    qs = TALER_ARL_edb->have_deposit2 (TALER_ARL_edb->cls,
+                                       &dc->h_contract_terms,
+                                       &dc->h_wire,
+                                       &dc->coin_pubs[i],
+                                       &dc->merchant,
+                                       dc->refund_deadline,
+                                       &deposit_fee,
+                                       &exchange_timestamp);
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Status for deposit confirmation %llu-%u is %d on re-check\n",
+                (unsigned long long) dc->row_id,
+                i,
+                qs);
+    missing |= (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs);
+    if (qs < 0)
+    {
+      GNUNET_break (0); /* DB error, complain */
+      eqs = qs;
+      return GNUNET_SYSERR;
+    }
+  }
+  if (! missing)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                "Deleting matching deposit confirmation %llu\n",
+                (unsigned long long) dc->row_id);
+    qs = TALER_ARL_adb->delete_generic (
+      TALER_ARL_adb->cls,
+      TALER_AUDITORDB_DEPOSIT_CONFIRMATION,
+      dc->row_id);
+    if (qs < 0)
+    {
+      GNUNET_break (0); /* DB error, complain */
+      eqs = qs;
+      return GNUNET_SYSERR;
+    }
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                "Previously missing deposit %s appeared in exchange 
database\n",
+                GNUNET_h2s (&dc->h_contract_terms.hash));
+    /* It appeared, so *reduce* total missing balance */
+    TALER_ARL_amount_subtract (&TALER_ARL_USE_AB (
+                                 total_missed_deposit_confirmations),
+                               &TALER_ARL_USE_AB (
+                                 total_missed_deposit_confirmations),
+                               &dc->total_without_fee);
+    return GNUNET_OK; /* all coins found, all good */
+  }
+  /* still missing, no change to totalmissing balance */
+  return GNUNET_OK;
+}
+
+
 /**
  * Check that the deposit-confirmations that were reported to
  * us by merchants are also in the exchange's database.
@@ -173,6 +256,10 @@ static enum GNUNET_DB_QueryStatus
 analyze_deposit_confirmations (void *cls)
 {
   enum GNUNET_DB_QueryStatus qs;
+  bool had_pp;
+  bool had_bal;
+  bool had_missing;
+  uint64_t pp;
 
   (void) cls;
   qs = TALER_ARL_adb->get_auditor_progress (
@@ -184,17 +271,19 @@ analyze_deposit_confirmations (void *cls)
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
     return qs;
   }
-  if (GNUNET_DB_STATUS_SUCCESS_NO_RESULTS == qs)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
-                "First analysis using deposit auditor, starting audit from 
scratch\n");
-  }
-  else
+  had_pp = (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs);
+  if (had_pp)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                 "Resuming deposit confirmation audit at %llu\n",
                 (unsigned long long) TALER_ARL_USE_PP (
                   deposit_confirmation_serial_id));
+    pp = TALER_ARL_USE_PP (deposit_confirmation_serial_id);
+  }
+  else
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_MESSAGE,
+                "First analysis using deposit auditor, starting audit from 
scratch\n");
   }
   qs = TALER_ARL_adb->get_balance (
     TALER_ARL_adb->cls,
@@ -205,10 +294,13 @@ analyze_deposit_confirmations (void *cls)
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
     return qs;
   }
+  had_bal = (GNUNET_DB_STATUS_SUCCESS_ONE_RESULT == qs);
+  had_missing = ! TALER_amount_is_zero (
+    &TALER_ARL_USE_AB (total_missed_deposit_confirmations));
   qs = TALER_ARL_adb->get_deposit_confirmations (
     TALER_ARL_adb->cls,
     INT64_MAX,
-    0,
+    TALER_ARL_USE_PP (deposit_confirmation_serial_id),
     true, /* return suppressed */
     &test_dc,
     NULL);
@@ -225,21 +317,16 @@ analyze_deposit_confirmations (void *cls)
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
               "Analyzed %d deposit confirmations\n",
               (int) qs);
-  qs = TALER_ARL_adb->insert_auditor_progress (
-    TALER_ARL_adb->cls,
-    TALER_ARL_SET_PP (deposit_confirmation_serial_id),
-    NULL);
-  if (0 > qs)
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                "Failed to update auditor DB, not recording progress\n");
-    GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
-    return qs;
-  }
-  qs = TALER_ARL_adb->update_auditor_progress (
-    TALER_ARL_adb->cls,
-    TALER_ARL_SET_PP (deposit_confirmation_serial_id),
-    NULL);
+  if (had_pp)
+    qs = TALER_ARL_adb->update_auditor_progress (
+      TALER_ARL_adb->cls,
+      TALER_ARL_SET_PP (deposit_confirmation_serial_id),
+      NULL);
+  else
+    qs = TALER_ARL_adb->insert_auditor_progress (
+      TALER_ARL_adb->cls,
+      TALER_ARL_SET_PP (deposit_confirmation_serial_id),
+      NULL);
   if (0 > qs)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
@@ -247,21 +334,39 @@ analyze_deposit_confirmations (void *cls)
     GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
     return qs;
   }
-  qs = TALER_ARL_adb->insert_balance (
-    TALER_ARL_adb->cls,
-    TALER_ARL_SET_AB (total_missed_deposit_confirmations),
-    NULL);
-  if (0 > qs)
+  if (had_bal && had_pp && had_missing)
   {
+    qs = TALER_ARL_adb->get_deposit_confirmations (
+      TALER_ARL_adb->cls,
+      -INT64_MAX,
+      pp + 1, /* previous iteration went up to 'pp', try missing again */
+      true, /* return suppressed */
+      &recheck_dc,
+      NULL);
+    if (0 > qs)
+    {
+      GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
+      return qs;
+    }
+    if (0 > eqs)
+    {
+      GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == eqs);
+      return eqs;
+    }
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
-                "Failed to update auditor DB, not recording progress\n");
-    GNUNET_break (GNUNET_DB_STATUS_SOFT_ERROR == qs);
-    return qs;
+                "Re-analyzed %d deposit confirmations\n",
+                (int) qs);
   }
-  qs = TALER_ARL_adb->update_balance (
-    TALER_ARL_adb->cls,
-    TALER_ARL_SET_AB (total_missed_deposit_confirmations),
-    NULL);
+  if (had_bal)
+    qs = TALER_ARL_adb->update_balance (
+      TALER_ARL_adb->cls,
+      TALER_ARL_SET_AB (total_missed_deposit_confirmations),
+      NULL);
+  else
+    qs = TALER_ARL_adb->insert_balance (
+      TALER_ARL_adb->cls,
+      TALER_ARL_SET_AB (total_missed_deposit_confirmations),
+      NULL);
   if (0 > qs)
   {
     GNUNET_log (GNUNET_ERROR_TYPE_INFO,
diff --git a/src/include/taler_auditordb_plugin.h 
b/src/include/taler_auditordb_plugin.h
index 5a5d33e9d..1ac337a75 100644
--- a/src/include/taler_auditordb_plugin.h
+++ b/src/include/taler_auditordb_plugin.h
@@ -1263,8 +1263,6 @@ struct TALER_AUDITORDB_Plugin
     void *cb_cls);
 
 
-  // MARK: CRUD
-
   /**
    * Get information about arithmetic inconsistencies from the database.
    *

-- 
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]