gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] 02/02: NAMESTORE: Towards proper transactional locks


From: gnunet
Subject: [gnunet] 02/02: NAMESTORE: Towards proper transactional locks
Date: Fri, 23 Sep 2022 09:39:31 +0200

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

martin-schanzenbach pushed a commit to branch master
in repository gnunet.

commit e0e36b6feba6cbcbbb3516d3a9de4d6fd0199825
Author: Martin Schanzenbach <schanzen@gnunet.org>
AuthorDate: Fri Sep 23 16:39:21 2022 +0900

    NAMESTORE: Towards proper transactional locks
---
 src/include/gnunet_namestore_service.h          |  10 +
 src/namestore/Makefile.am                       |  12 +-
 src/namestore/gnunet-service-namestore.c        |   6 +-
 src/namestore/plugin_namestore_postgres.c       |  26 +-
 src/namestore/test_namestore_api_edit_records.c | 404 ++++++++++++++++++++++++
 src/namestore/test_namestore_api_postgres.conf  |   2 +-
 src/namestore/test_namestore_api_tx_rollback.c  | 268 ++++++++++++++++
 src/pq/pq.c                                     |   4 +-
 src/pq/pq_exec.c                                |   4 +-
 9 files changed, 715 insertions(+), 21 deletions(-)

diff --git a/src/include/gnunet_namestore_service.h 
b/src/include/gnunet_namestore_service.h
index 68aeebef8..0788bc8b4 100644
--- a/src/include/gnunet_namestore_service.h
+++ b/src/include/gnunet_namestore_service.h
@@ -453,6 +453,16 @@ GNUNET_NAMESTORE_transaction_commit (struct 
GNUNET_NAMESTORE_Handle *h,
                                      cont,
                                      void *cont_cls);
 
+struct GNUNET_NAMESTORE_QueueEntry *
+GNUNET_NAMESTORE_records_edit (
+  struct GNUNET_NAMESTORE_Handle *h,
+  const struct GNUNET_IDENTITY_PrivateKey *pkey,
+  const char *label,
+  GNUNET_SCHEDULER_TaskCallback error_cb,
+  void *error_cb_cls,
+  GNUNET_NAMESTORE_RecordMonitor rm,
+  void *rm_cls);
+
 #if 0                           /* keep Emacsens' auto-indent happy */
 {
 #endif
diff --git a/src/namestore/Makefile.am b/src/namestore/Makefile.am
index e3c1825d3..b71896894 100644
--- a/src/namestore/Makefile.am
+++ b/src/namestore/Makefile.am
@@ -58,7 +58,8 @@ POSTGRES_TESTS = test_plugin_namestore_postgres \
  test_namestore_api_monitoring_existing_postgres \
  test_namestore_api_zone_to_name_postgres \
  perf_namestore_api_zone_iteration_postgres \
- test_namestore_api_tx_rollback_postgres
+ test_namestore_api_tx_rollback_postgres \
+ test_namestore_api_edit_records_postgres
 endif
 
 if HAVE_SQLITE
@@ -442,7 +443,14 @@ test_namestore_api_tx_rollback_postgres_LDADD = \
   $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
   $(top_builddir)/src/util/libgnunetutil.la
 
-
+test_namestore_api_edit_records_postgres_SOURCES = \
+ test_namestore_api_edit_records.c
+test_namestore_api_edit_records_postgres_LDADD = \
+  $(top_builddir)/src/testing/libgnunettesting.la \
+  $(top_builddir)/src/identity/libgnunetidentity.la \
+  libgnunetnamestore.la \
+  $(top_builddir)/src/gnsrecord/libgnunetgnsrecord.la \
+  $(top_builddir)/src/util/libgnunetutil.la
 
 test_namestore_api_zone_iteration_sqlite_SOURCES = \
  test_namestore_api_zone_iteration.c
diff --git a/src/namestore/gnunet-service-namestore.c 
b/src/namestore/gnunet-service-namestore.c
index 100f155fa..c1d7b8753 100644
--- a/src/namestore/gnunet-service-namestore.c
+++ b/src/namestore/gnunet-service-namestore.c
@@ -1428,7 +1428,7 @@ handle_record_lookup (void *cls, const struct 
LabelLookupMessage *ll_msg)
   rlc.res_rd = NULL;
   rlc.rd_ser_len = 0;
   rlc.nick = get_nick_record (nc, &ll_msg->zone);
-  if (GNUNET_YES == ntohl (ll_msg->is_edit_request))
+  if (GNUNET_YES != ntohl (ll_msg->is_edit_request))
     res = nc->GSN_database->lookup_records (nc->GSN_database->cls,
                                             &ll_msg->zone,
                                             conv_name,
@@ -1451,7 +1451,9 @@ handle_record_lookup (void *cls, const struct 
LabelLookupMessage *ll_msg)
   llr_msg->rd_count = htons (rlc.res_rd_count);
   llr_msg->rd_len = htons (rlc.rd_ser_len);
   res_name = (char *) &llr_msg[1];
-  if ((GNUNET_YES == rlc.found) && (GNUNET_OK == res))
+  if (GNUNET_OK != res)
+   llr_msg->found = htons (GNUNET_SYSERR);
+  else if (GNUNET_YES == rlc.found)
     llr_msg->found = htons (GNUNET_YES);
   else
     llr_msg->found = htons (GNUNET_NO);
diff --git a/src/namestore/plugin_namestore_postgres.c 
b/src/namestore/plugin_namestore_postgres.c
index 2d4c5d089..510d24496 100644
--- a/src/namestore/plugin_namestore_postgres.c
+++ b/src/namestore/plugin_namestore_postgres.c
@@ -153,7 +153,7 @@ database_setup (struct Plugin *plugin)
                               2),
       GNUNET_PQ_make_prepare ("edit_set",
                               "SELECT seq,record_count,record_data,label "
-                              "FROM ns098records WHERE zone_private_key=$1 AND 
label=$2 FOR UPDATE",
+                              "FROM ns098records WHERE zone_private_key=$1 AND 
label=$2 FOR UPDATE NOWAIT",
                               2),
       GNUNET_PQ_PREPARED_STATEMENT_END
     };
@@ -328,6 +328,8 @@ parse_result_call_iterator (void *cls,
 
   if (NULL == pc->iter)
     return; /* no need to do more work */
+  LOG (GNUNET_ERROR_TYPE_DEBUG,
+       "Got %d results from PQ.\n", num_results);
   for (unsigned int i = 0; i < num_results; i++)
   {
     uint64_t serial;
@@ -412,12 +414,12 @@ parse_result_call_iterator (void *cls,
  */
 static int
 lookup_records (void *cls,
-                                   const struct
-                                   GNUNET_IDENTITY_PrivateKey *zone,
-                                   const char *label,
-                                   GNUNET_NAMESTORE_RecordIterator iter,
-                                   void *iter_cls,
-                                   const char* method)
+                const struct
+                GNUNET_IDENTITY_PrivateKey *zone,
+                const char *label,
+                GNUNET_NAMESTORE_RecordIterator iter,
+                void *iter_cls,
+                const char*method)
 {
   struct Plugin *plugin = cls;
   struct GNUNET_PQ_QueryParam params[] = {
@@ -481,11 +483,11 @@ namestore_postgres_lookup_records (void *cls,
  */
 static int
 namestore_postgres_edit_records (void *cls,
-                                   const struct
-                                   GNUNET_IDENTITY_PrivateKey *zone,
-                                   const char *label,
-                                   GNUNET_NAMESTORE_RecordIterator iter,
-                                   void *iter_cls)
+                                 const struct
+                                 GNUNET_IDENTITY_PrivateKey *zone,
+                                 const char *label,
+                                 GNUNET_NAMESTORE_RecordIterator iter,
+                                 void *iter_cls)
 {
   return lookup_records (cls, zone, label, iter, iter_cls, "edit_set");
 }
diff --git a/src/namestore/test_namestore_api_edit_records.c 
b/src/namestore/test_namestore_api_edit_records.c
new file mode 100644
index 000000000..c1c64ee9c
--- /dev/null
+++ b/src/namestore/test_namestore_api_edit_records.c
@@ -0,0 +1,404 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2022 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @file namestore/test_namestore_api_edit_records.c
+ * @brief testcase for namestore_api.c: Multiple clients work with record set.
+ */
+#include "platform.h"
+#include "gnunet_namestore_service.h"
+#include "gnunet_testing_lib.h"
+#include "gnunet_dnsparser_lib.h"
+
+#define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT
+
+#define TEST_RECORD_DATALEN 123
+
+#define TEST_RECORD_DATA 'a'
+
+#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 100)
+
+
+static struct GNUNET_NAMESTORE_Handle *nsh;
+
+static struct GNUNET_NAMESTORE_Handle *nsh2;
+
+static struct GNUNET_SCHEDULER_Task *endbadly_task;
+
+static struct GNUNET_IDENTITY_PrivateKey privkey;
+
+static struct GNUNET_IDENTITY_PublicKey pubkey;
+
+static int res;
+
+static int removed;
+
+static struct GNUNET_NAMESTORE_QueueEntry *nsqe;
+
+static int nonce = 0;
+
+static void
+cleanup ()
+{
+  if (NULL != nsh)
+  {
+    GNUNET_NAMESTORE_disconnect (nsh);
+    nsh = NULL;
+  }
+  GNUNET_SCHEDULER_shutdown ();
+}
+
+
+/**
+ * Re-establish the connection to the service.
+ *
+ * @param cls handle to use to re-connect.
+ */
+static void
+endbadly (void *cls)
+{
+  if (NULL != nsqe)
+  {
+    GNUNET_NAMESTORE_cancel (nsqe);
+    nsqe = NULL;
+  }
+  cleanup ();
+  res = 1;
+}
+
+
+static void
+end (void *cls)
+{
+  cleanup ();
+  res = 0;
+}
+
+static void
+lookup_it (void *cls,
+           const struct GNUNET_IDENTITY_PrivateKey *zone,
+           const char *label,
+           unsigned int rd_count,
+           const struct GNUNET_GNSRECORD_Data *rd)
+{
+  GNUNET_assert (0 == rd_count);
+  GNUNET_SCHEDULER_add_now (&end, NULL);
+}
+
+static void
+fail_cb (void *cls)
+{
+  if (endbadly_task != NULL)
+    GNUNET_SCHEDULER_cancel (endbadly_task);
+  endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
+  return;
+}
+
+static void
+remove_cont (void *cls,
+             int32_t success,
+             const char *emsg)
+{
+  nsqe = NULL;
+  if (GNUNET_YES != success)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _ ("Unable to roll back: `%s'\n"),
+                emsg);
+    if (NULL != endbadly_task)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly,
+                                              NULL);
+    return;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Rolled back, perform lookup\n");
+  removed = GNUNET_YES;
+  if (NULL != endbadly_task)
+    GNUNET_SCHEDULER_cancel (endbadly_task);
+  GNUNET_SCHEDULER_add_now (&end, NULL);
+}
+
+static void
+fail_cb_lock (void *cls);
+
+static void
+edit_cont_b (void *cls,
+             const struct GNUNET_IDENTITY_PrivateKey *zone,
+             const char *label,
+             unsigned int rd_count,
+             const struct GNUNET_GNSRECORD_Data *rd)
+{
+  const char *name = cls;
+  /**
+   * We should probably never get here right at first.
+   * We may want to change the blocking of nsh2 so that we do get this
+   * eventually instead of the error callback above when locked.
+   */
+  if (0 == nonce)
+  {
+    if (endbadly_task != NULL)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
+    return;
+
+  }
+  /* Abort transaction for B */
+  nsqe = GNUNET_NAMESTORE_transaction_rollback (nsh2, remove_cont,
+                                                (void *) name);
+}
+
+
+static void
+commit_cont_a (void *cls,
+               int32_t success,
+               const char *emsg)
+{
+  const char *name = cls;
+
+  GNUNET_assert (NULL != cls);
+  nsqe = NULL;
+  if (GNUNET_SYSERR == success)
+  {
+    GNUNET_break (0);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Namestore could not store record: `%s'\n",
+                emsg);
+    if (endbadly_task != NULL)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
+    return;
+  }
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Name store added record for `%s': %s\n",
+              name,
+              (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
+  /**
+   * Try again for B
+   */
+  nsqe = GNUNET_NAMESTORE_records_edit (nsh2,
+                                        &privkey,
+                                        name,
+                                        &fail_cb_lock,
+                                        (void *) name,
+                                        &edit_cont_b,
+                                        (void *) name);
+
+  GNUNET_assert (NULL != nsqe);
+}
+
+static void
+fail_cb_lock (void *cls)
+{
+  const char *name = cls;
+  if (1 == nonce)
+  {
+    if (endbadly_task != NULL)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
+    return;
+  }
+  nonce = 1;
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Failed to aquire additional lock\n");
+  /* Now, we stop the transaction for B */
+  nsqe = GNUNET_NAMESTORE_transaction_commit (nsh, commit_cont_a,
+                                              (void *) name);
+}
+
+
+static void
+begin_cont_b (void *cls,
+              int32_t success,
+              const char *emsg)
+{
+  const char *name = cls;
+
+  GNUNET_assert (success == GNUNET_YES);
+  /** Now, we expect this to "hang" let's see how this behaves in practice. */
+  nsqe = GNUNET_NAMESTORE_records_edit (nsh2,
+                                        &privkey,
+                                        name,
+                                        &fail_cb_lock,
+                                        (void *) name,
+                                        &edit_cont_b,
+                                        (void *) name);
+
+  GNUNET_assert (NULL != nsqe);
+}
+
+
+static void
+edit_cont (void *cls,
+           const struct GNUNET_IDENTITY_PrivateKey *zone,
+           const char *label,
+           unsigned int rd_count,
+           const struct GNUNET_GNSRECORD_Data *rd)
+{
+  const char *name = cls;
+
+  GNUNET_assert (1 == rd_count);
+  /* Now, we start a transaction for B */
+  nsqe = GNUNET_NAMESTORE_transaction_begin (nsh2, begin_cont_b, (void *) 
name);
+}
+
+
+static void
+begin_cont (void *cls,
+            int32_t success,
+            const char *emsg)
+{
+  const char *name = cls;
+
+  GNUNET_assert (success == GNUNET_YES);
+  nsqe = GNUNET_NAMESTORE_records_edit (nsh,
+                                        &privkey,
+                                        name,
+                                        &fail_cb,
+                                        (void *) name,
+                                        &edit_cont,
+                                        (void *) name);
+
+  GNUNET_assert (NULL != nsqe);
+}
+
+static void
+preload_cont (void *cls,
+              int32_t success,
+              const char *emsg)
+{
+  const char *name = cls;
+
+  GNUNET_assert (NULL != cls);
+  nsqe = NULL;
+  if (GNUNET_SYSERR == success)
+  {
+    GNUNET_break (0);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Namestore could not store record: `%s'\n",
+                emsg);
+    if (endbadly_task != NULL)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
+    return;
+  }
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Name store added record for `%s': %s\n",
+              name,
+              (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
+  /* We start transaction for A */
+  nsqe = GNUNET_NAMESTORE_transaction_begin (nsh, begin_cont, (void *) name);
+
+}
+
+
+static void
+run (void *cls,
+     const struct GNUNET_CONFIGURATION_Handle *cfg,
+     struct GNUNET_TESTING_Peer *peer)
+{
+  struct GNUNET_GNSRECORD_Data rd;
+  const char *name = "dummy";
+
+  endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
+                                                &endbadly,
+                                                NULL);
+  nsh = GNUNET_NAMESTORE_connect (cfg);
+  nsh2 = GNUNET_NAMESTORE_connect (cfg);
+  GNUNET_break (NULL != nsh);
+  GNUNET_break (NULL != nsh2);
+
+  privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+  GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+  GNUNET_IDENTITY_key_get_public (&privkey,
+                                  &pubkey);
+
+  removed = GNUNET_NO;
+
+  rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us;
+  rd.record_type = TEST_RECORD_TYPE;
+  rd.data_size = TEST_RECORD_DATALEN;
+  rd.data = GNUNET_malloc (TEST_RECORD_DATALEN);
+  rd.flags = 0;
+  memset ((char *) rd.data,
+          'a',
+          TEST_RECORD_DATALEN);
+  nsqe = GNUNET_NAMESTORE_records_store (nsh,
+                                         &privkey,
+                                         name,
+                                         1,
+                                         &rd,
+                                         &preload_cont,
+                                         (void *) name);
+  GNUNET_assert (NULL != nsqe);
+  GNUNET_free_nz ((void *) rd.data);
+
+  /*nsqe = GNUNET_NAMESTORE_transaction_commit (nsh, commit_cont);
+  nsqe = GNUNET_NAMESTORE_transaction_rollback (nsh, rollback_cont); Must also 
happen on disconnect
+  nsqe = GNUNET_NAMESTORE_records_edit (nsh,
+                                        &privkey,
+                                        name,
+                                        1,
+                                        &rd,
+                                        &edit_cont,
+                                        (void *) name);
+  nsqe = GNUNET_NAMESTORE_records_insert_bulk (nsh,
+                                               count,
+                                               &rd,
+                                               &
+  nsqe = GNUNET_NAMESTORE_records_store (nsh,
+                                         &privkey,
+                                         name,
+                                         1,
+                                         &rd,
+                                         &put_cont,
+                                         (void *) name);*/
+  GNUNET_assert (NULL != nsqe);
+}
+
+
+#include "test_common.c"
+
+
+int
+main (int argc, char *argv[])
+{
+  const char *plugin_name;
+  char *cfg_name;
+
+  SETUP_CFG (plugin_name, cfg_name);
+  res = 1;
+  if (0 !=
+      GNUNET_TESTING_peer_run ("test-namestore-api-remove",
+                               cfg_name,
+                               &run,
+                               NULL))
+  {
+    res = 1;
+  }
+  GNUNET_DISK_purge_cfg_dir (cfg_name,
+                             "GNUNET_TEST_HOME");
+  GNUNET_free (cfg_name);
+  return res;
+}
+
+
+/* end of test_namestore_api_remove.c */
diff --git a/src/namestore/test_namestore_api_postgres.conf 
b/src/namestore/test_namestore_api_postgres.conf
index 93ef935b5..c648a6ab9 100644
--- a/src/namestore/test_namestore_api_postgres.conf
+++ b/src/namestore/test_namestore_api_postgres.conf
@@ -6,4 +6,4 @@ DATABASE = postgres
 
 [namestore-postgres]
 CONFIG = connect_timeout=10 dbname=gnunetcheck
-TEMPORARY_TABLE = YES
+TEMPORARY_TABLE = NO
diff --git a/src/namestore/test_namestore_api_tx_rollback.c 
b/src/namestore/test_namestore_api_tx_rollback.c
new file mode 100644
index 000000000..ccfd8d701
--- /dev/null
+++ b/src/namestore/test_namestore_api_tx_rollback.c
@@ -0,0 +1,268 @@
+/*
+     This file is part of GNUnet.
+     Copyright (C) 2022 GNUnet e.V.
+
+     GNUnet is free software: you can redistribute it and/or modify it
+     under the terms of the GNU Affero General Public License as published
+     by the Free Software Foundation, either version 3 of the License,
+     or (at your option) any later version.
+
+     GNUnet is distributed in the hope that it will be useful, but
+     WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+     Affero General Public License for more details.
+
+     You should have received a copy of the GNU Affero General Public License
+     along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+     SPDX-License-Identifier: AGPL3.0-or-later
+ */
+/**
+ * @file namestore/test_namestore_api_tx_rollback.c
+ * @brief testcase for namestore_api_tx_rollback.c to: rollback changes in TX
+ */
+#include "platform.h"
+#include "gnunet_namestore_service.h"
+#include "gnunet_testing_lib.h"
+#include "gnunet_dnsparser_lib.h"
+
+#define TEST_RECORD_TYPE GNUNET_DNSPARSER_TYPE_TXT
+
+#define TEST_RECORD_DATALEN 123
+
+#define TEST_RECORD_DATA 'a'
+
+#define TIMEOUT GNUNET_TIME_relative_multiply (GNUNET_TIME_UNIT_SECONDS, 100)
+
+
+static struct GNUNET_NAMESTORE_Handle *nsh;
+
+static struct GNUNET_SCHEDULER_Task *endbadly_task;
+
+static struct GNUNET_IDENTITY_PrivateKey privkey;
+
+static struct GNUNET_IDENTITY_PublicKey pubkey;
+
+static int res;
+
+static int removed;
+
+static struct GNUNET_NAMESTORE_QueueEntry *nsqe;
+
+
+static void
+cleanup ()
+{
+  if (NULL != nsh)
+  {
+    GNUNET_NAMESTORE_disconnect (nsh);
+    nsh = NULL;
+  }
+  GNUNET_SCHEDULER_shutdown ();
+}
+
+
+/**
+ * Re-establish the connection to the service.
+ *
+ * @param cls handle to use to re-connect.
+ */
+static void
+endbadly (void *cls)
+{
+  if (NULL != nsqe)
+  {
+    GNUNET_NAMESTORE_cancel (nsqe);
+    nsqe = NULL;
+  }
+  cleanup ();
+  res = 1;
+}
+
+
+static void
+end (void *cls)
+{
+  cleanup ();
+  res = 0;
+}
+
+static void
+lookup_it (void *cls,
+           const struct GNUNET_IDENTITY_PrivateKey *zone,
+           const char *label,
+           unsigned int rd_count,
+           const struct GNUNET_GNSRECORD_Data *rd)
+{
+  GNUNET_assert (0 == rd_count);
+  GNUNET_SCHEDULER_add_now (&end, NULL);
+}
+
+static void
+fail_cb (void *cls)
+{
+  GNUNET_assert (0);
+}
+
+static void
+remove_cont (void *cls,
+             int32_t success,
+             const char *emsg)
+{
+  nsqe = NULL;
+  if (GNUNET_YES != success)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                _ ("Unable to roll back: `%s'\n"),
+                emsg);
+    if (NULL != endbadly_task)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly,
+                                              NULL);
+    return;
+  }
+  GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+              "Rolled back, perform lookup\n");
+  removed = GNUNET_YES;
+  if (NULL != endbadly_task)
+    GNUNET_SCHEDULER_cancel (endbadly_task);
+  /* FIXME not actually doing lookup here */
+  nsqe = GNUNET_NAMESTORE_records_lookup (nsh,
+                                          &privkey,
+                                          (char*) cls,
+                                          &fail_cb,
+                                          NULL,
+                                          &lookup_it,
+                                          NULL);
+}
+
+
+static void
+put_cont (void *cls,
+          int32_t success,
+          const char *emsg)
+{
+  const char *name = cls;
+
+  GNUNET_assert (NULL != cls);
+  nsqe = NULL;
+  if (GNUNET_SYSERR == success)
+  {
+    GNUNET_break (0);
+    GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                "Namestore could not store record: `%s'\n",
+                emsg);
+    if (endbadly_task != NULL)
+      GNUNET_SCHEDULER_cancel (endbadly_task);
+    endbadly_task = GNUNET_SCHEDULER_add_now (&endbadly, NULL);
+    return;
+  }
+
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Name store added record for `%s': %s\n",
+              name,
+              (success == GNUNET_OK) ? "SUCCESS" : "FAIL");
+  nsqe = GNUNET_NAMESTORE_transaction_rollback (nsh, remove_cont,
+                                                (void *) name);
+}
+
+static void
+begin_cont (void *cls,
+            int32_t success,
+            const char *emsg)
+{
+  struct GNUNET_GNSRECORD_Data rd;
+  const char *name = cls;
+
+  GNUNET_assert (success == GNUNET_YES);
+  privkey.type = htonl (GNUNET_GNSRECORD_TYPE_PKEY);
+  GNUNET_CRYPTO_ecdsa_key_create (&privkey.ecdsa_key);
+  GNUNET_IDENTITY_key_get_public (&privkey,
+                                  &pubkey);
+
+  removed = GNUNET_NO;
+
+  rd.expiration_time = GNUNET_TIME_absolute_get ().abs_value_us;
+  rd.record_type = TEST_RECORD_TYPE;
+  rd.data_size = TEST_RECORD_DATALEN;
+  rd.data = GNUNET_malloc (TEST_RECORD_DATALEN);
+  rd.flags = 0;
+  memset ((char *) rd.data,
+          'a',
+          TEST_RECORD_DATALEN);
+  nsqe = GNUNET_NAMESTORE_records_store (nsh,
+                                         &privkey,
+                                         name,
+                                         1,
+                                         &rd,
+                                         &put_cont,
+                                         (void *) name);
+  GNUNET_assert (NULL != nsqe);
+  GNUNET_free_nz ((void *) rd.data);
+}
+
+static void
+run (void *cls,
+     const struct GNUNET_CONFIGURATION_Handle *cfg,
+     struct GNUNET_TESTING_Peer *peer)
+{
+  struct GNUNET_GNSRECORD_Data rd;
+  const char *name = "dummy";
+
+  endbadly_task = GNUNET_SCHEDULER_add_delayed (TIMEOUT,
+                                                &endbadly,
+                                                NULL);
+  nsh = GNUNET_NAMESTORE_connect (cfg);
+  GNUNET_break (NULL != nsh);
+  nsqe = GNUNET_NAMESTORE_transaction_begin (nsh, begin_cont, (void *) name);
+  /*nsqe = GNUNET_NAMESTORE_transaction_commit (nsh, commit_cont);
+  nsqe = GNUNET_NAMESTORE_transaction_rollback (nsh, rollback_cont); Must also 
happen on disconnect
+  nsqe = GNUNET_NAMESTORE_records_edit (nsh,
+                                        &privkey,
+                                        name,
+                                        1,
+                                        &rd,
+                                        &edit_cont,
+                                        (void *) name);
+  nsqe = GNUNET_NAMESTORE_records_insert_bulk (nsh,
+                                               count,
+                                               &rd,
+                                               &
+  nsqe = GNUNET_NAMESTORE_records_store (nsh,
+                                         &privkey,
+                                         name,
+                                         1,
+                                         &rd,
+                                         &put_cont,
+                                         (void *) name);*/
+  GNUNET_assert (NULL != nsqe);
+}
+
+
+#include "test_common.c"
+
+
+int
+main (int argc, char *argv[])
+{
+  const char *plugin_name;
+  char *cfg_name;
+
+  SETUP_CFG (plugin_name, cfg_name);
+  res = 1;
+  if (0 !=
+      GNUNET_TESTING_peer_run ("test-namestore-api-remove",
+                               cfg_name,
+                               &run,
+                               NULL))
+  {
+    res = 1;
+  }
+  GNUNET_DISK_purge_cfg_dir (cfg_name,
+                             "GNUNET_TEST_HOME");
+  GNUNET_free (cfg_name);
+  return res;
+}
+
+
+/* end of test_namestore_api_remove.c */
diff --git a/src/pq/pq.c b/src/pq/pq.c
index 130ff355f..c8deb8193 100644
--- a/src/pq/pq.c
+++ b/src/pq/pq.c
@@ -97,9 +97,9 @@ GNUNET_PQ_exec_prepared (struct GNUNET_PQ_Context *db,
                           1);
     GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
                      "pq",
-                     "Execution of prepared SQL statement `%s' finished 
(%d)\n",
+                     "Execution of prepared SQL statement `%s' finished 
(%s)\n",
                      name,
-                     PGRES_COMMAND_OK == PQresultStatus (res));
+                     PQresStatus (PQresultStatus (res)));
     if ( (PGRES_COMMAND_OK != PQresultStatus (res)) &&
          (CONNECTION_OK != (status = PQstatus (db->conn))) )
     {
diff --git a/src/pq/pq_exec.c b/src/pq/pq_exec.c
index dcde331b6..62dd577ad 100644
--- a/src/pq/pq_exec.c
+++ b/src/pq/pq_exec.c
@@ -87,10 +87,10 @@ GNUNET_PQ_exec_statements (struct GNUNET_PQ_Context *db,
     result = PQexec (db->conn,
                      es[i].sql);
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Running statement `%s' on %p finished (%d)\n",
+                "Running statement `%s' on %p finished (%s)\n",
                 es[i].sql,
                 db,
-                PGRES_COMMAND_OK == PQresultStatus (result));
+                PQresStatus (PQresultStatus (result)));
     if ((GNUNET_NO == es[i].ignore_errors) &&
         (PGRES_COMMAND_OK != PQresultStatus (result)))
     {

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