gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r6496 - GNUnet/src/applications/dstore_mysql


From: gnunet
Subject: [GNUnet-SVN] r6496 - GNUnet/src/applications/dstore_mysql
Date: Sat, 1 Mar 2008 18:55:37 -0700 (MST)

Author: grothoff
Date: 2008-03-01 18:55:36 -0700 (Sat, 01 Mar 2008)
New Revision: 6496

Added:
   GNUnet/src/applications/dstore_mysql/dstore_quota_test.c
Modified:
   GNUnet/src/applications/dstore_mysql/Makefile.am
   GNUnet/src/applications/dstore_mysql/check.conf
   GNUnet/src/applications/dstore_mysql/dstore_mysql.c
   GNUnet/src/applications/dstore_mysql/dstore_test.c
Log:
dstore improvements

Modified: GNUnet/src/applications/dstore_mysql/Makefile.am
===================================================================
--- GNUnet/src/applications/dstore_mysql/Makefile.am    2008-03-02 01:37:06 UTC 
(rev 6495)
+++ GNUnet/src/applications/dstore_mysql/Makefile.am    2008-03-02 01:55:36 UTC 
(rev 6496)
@@ -9,7 +9,8 @@
   libgnunetmodule_dstore_mysql.la
 
 check_PROGRAMS = \
-  dstore_test
+  dstore_test \
+  dstore_quota_test
 
 TESTS = $(check_PROGRAMS)
 
@@ -35,3 +36,9 @@
 dstore_test_LDADD = \
  $(top_builddir)/src/server/libgnunetcore.la  \
  $(top_builddir)/src/util/libgnunetutil.la  
+
+dstore_quota_test_SOURCES = \
+ dstore_quota_test.c 
+dstore_quota_test_LDADD = \
+ $(top_builddir)/src/server/libgnunetcore.la  \
+ $(top_builddir)/src/util/libgnunetutil.la  

Modified: GNUnet/src/applications/dstore_mysql/check.conf
===================================================================
--- GNUnet/src/applications/dstore_mysql/check.conf     2008-03-02 01:37:06 UTC 
(rev 6495)
+++ GNUnet/src/applications/dstore_mysql/check.conf     2008-03-02 01:55:36 UTC 
(rev 6496)
@@ -46,3 +46,5 @@
 WEAKRANDOM = YES
 
 
+[DSTORE]
+QUOTA = 1

Modified: GNUnet/src/applications/dstore_mysql/dstore_mysql.c
===================================================================
--- GNUnet/src/applications/dstore_mysql/dstore_mysql.c 2008-03-02 01:37:06 UTC 
(rev 6495)
+++ GNUnet/src/applications/dstore_mysql/dstore_mysql.c 2008-03-02 01:55:36 UTC 
(rev 6496)
@@ -1,6 +1,6 @@
 /*
      This file is part of GNUnet.
-     (C) 2006, 2007 Christian Grothoff (and other contributing authors)
+     (C) 2006, 2007, 2008 Christian Grothoff (and other contributing authors)
 
      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
@@ -19,7 +19,7 @@
 */
 
 /**
- * @file applications/dstore_mysql/dstore.c
+ * @file applications/dstore_mysql/dstore_mysql.c
  * @brief MySQL based implementation of the dstore service
  * @author Christian Grothoff
  * @todo Indexes, statistics
@@ -61,10 +61,12 @@
 
 static unsigned int stat_dstore_size;
 
+static unsigned int stat_dstore_quota;
+
 /**
  * Estimate of the per-entry overhead (including indices).
  */
-#define OVERHEAD ((4+4+8+8*2+sizeof(GNUNET_HashCode)*2+32))
+#define OVERHEAD ((4*2+4*2+8*2+8*2+sizeof(GNUNET_HashCode)*5+8))
 
 struct GNUNET_BloomFilter *bloom;
 
@@ -81,22 +83,25 @@
 static MYSQL *dbf;
 
 
-#define SELECT_VALUE_STMT "SELECT size, value FROM gn073dstore WHERE hash=? 
AND type=? AND expire >= ?"
+#define SELECT_VALUE_STMT "SELECT size, value FROM gn080dstore FORCE INDEX 
(hashidx) WHERE hash=? AND type=? AND expire >= ? LIMIT 1 OFFSET ?"
 static MYSQL_STMT *select_value;
 
-#define SELECT_OLD_VALUE_STMT "SELECT hash, type, expire, puttime, size, value 
FROM gn073dstore ORDER BY puttime ASC LIMIT 1"
+#define COUNT_VALUE_STMT "SELECT count(*) FROM gn080dstore FORCE INDEX 
(hashidx) WHERE hash=? AND type=? AND expire >= ?"
+static MYSQL_STMT *count_value;
+
+#define SELECT_OLD_VALUE_STMT "SELECT hash, vhash, type, size, value FROM 
gn080dstore FORCE INDEX (expireidx) ORDER BY puttime ASC LIMIT 1"
 static MYSQL_STMT *select_old_value;
 
-#define DELETE_VALUE_STMT "DELETE FROM gn073dstore WHERE hash = ? AND type = ? 
AND "\
-                          "expire = ? AND puttime = ? AND size = ? AND value = 
?"
+#define DELETE_VALUE_STMT "DELETE FROM gn080dstore WHERE hash = ? AND vhash = 
? AND type = ? AND "\
+                          "size = ? AND value = ?"
 static MYSQL_STMT *delete_value;
 
-#define INSERT_VALUE_STMT "INSERT INTO gn073dstore (puttime, expire, hash, 
type, size, value) "\
-                          "VALUES (?, ?, ?, ?, ?, ?)"
+#define INSERT_VALUE_STMT "INSERT INTO gn080dstore (size, type, puttime, 
expire, hash, vhash, value) "\
+                          "VALUES (?, ?, ?, ?, ?, ?, ?)"
 static MYSQL_STMT *insert_value;
 
-#define UPDATE_VALUE_STMT "UPDATE gn073dstore SET puttime=?, expire=? "\
-                          "WHERE hash=? AND type=? AND size=? AND value=?"
+#define UPDATE_VALUE_STMT "UPDATE gn080dstore FORCE INDEX (allidx) SET 
puttime=?, expire=? "\
+                          "WHERE hash=? AND vhash=? AND type=? AND size=?"
 static MYSQL_STMT *update_value;
 
 /**
@@ -124,11 +129,14 @@
   if (dbf == NULL)
     return GNUNET_SYSERR;
   PEND (select_value);
+  PEND (count_value);
   PEND (select_old_value);
   PEND (delete_value);
   PEND (insert_value);
   PEND (update_value);
+#undef PEND
   mysql_close (dbf);
+  payload = 0;
   dbf = NULL;
   return GNUNET_OK;
 }
@@ -188,16 +196,18 @@
       return GNUNET_SYSERR;
     }
 
-  mysql_query (dbf, "DROP TABLE gn073dstore");
+  mysql_query (dbf, "DROP TABLE gn080dstore");
   mysql_query (dbf,
-               "CREATE TEMPORARY TABLE gn073dstore ("
+               "CREATE TEMPORARY TABLE gn080dstore ("
                "  size INT(11) UNSIGNED NOT NULL DEFAULT 0,"
                "  type INT(11) UNSIGNED NOT NULL DEFAULT 0,"
                "  puttime BIGINT UNSIGNED NOT NULL DEFAULT 0,"
                "  expire BIGINT UNSIGNED NOT NULL DEFAULT 0,"
                "  hash BINARY(64) NOT NULL DEFAULT '',"
+               "  vhash BINARY(64) PRIMARY KEY,"
                "  value BLOB NOT NULL DEFAULT '',"
                "  INDEX hashidx (hash(64),type,expire),"
+               "  INDEX allidx (hash(64),vhash(64),type,size),"
                "  INDEX expireidx (puttime)" ") ENGINE=InnoDB");
   if (mysql_error (dbf)[0])
     {
@@ -220,10 +230,12 @@
              _("`%s' failed at %s:%d with error: %s"), "mysql_stmt_prepare", 
__FILE__, __LINE__, \
              mysql_stmt_error (a));  iclose(); return GNUNET_SYSERR; } }
   PINIT (select_value, SELECT_VALUE_STMT);
+  PINIT (count_value, COUNT_VALUE_STMT);
   PINIT (select_old_value, SELECT_OLD_VALUE_STMT);
   PINIT (delete_value, DELETE_VALUE_STMT);
   PINIT (insert_value, INSERT_VALUE_STMT);
   PINIT (update_value, UPDATE_VALUE_STMT);
+#undef PINIT
   return GNUNET_OK;
 }
 
@@ -235,12 +247,12 @@
 static int
 checkQuota ()
 {
-  MYSQL_BIND rbind[6];
+  MYSQL_BIND rbind[5];
   unsigned int v_size;
   unsigned int v_type;
-  GNUNET_CronTime v_puttime;
-  GNUNET_CronTime v_expire;
   GNUNET_HashCode v_key;
+  GNUNET_HashCode vhash;
+  unsigned long k_length;
   unsigned long h_length;
   unsigned long v_length;
 
@@ -252,30 +264,29 @@
                  "DStore above qutoa (have %llu, allowed %llu), will delete 
some data.\n",
                  payload, quota);
 #endif
+  k_length = sizeof (GNUNET_HashCode);
   h_length = sizeof (GNUNET_HashCode);
   v_length = GNUNET_MAX_BUFFER_SIZE;
 
   memset (rbind, 0, sizeof (rbind));
   rbind[0].buffer_type = MYSQL_TYPE_BLOB;
   rbind[0].buffer_length = sizeof (GNUNET_HashCode);
-  rbind[0].length = &h_length;
+  rbind[0].length = &k_length;
   rbind[0].buffer = &v_key;
-  rbind[1].buffer_type = MYSQL_TYPE_LONG;
-  rbind[1].is_unsigned = 1;
-  rbind[1].buffer = &v_type;
-  rbind[2].buffer_type = MYSQL_TYPE_LONGLONG;
+  rbind[1].buffer_type = MYSQL_TYPE_BLOB;
+  rbind[1].buffer_length = sizeof (GNUNET_HashCode);
+  rbind[1].length = &h_length;
+  rbind[1].buffer = &vhash;
+  rbind[2].buffer_type = MYSQL_TYPE_LONG;
   rbind[2].is_unsigned = 1;
-  rbind[2].buffer = &v_expire;
-  rbind[3].buffer_type = MYSQL_TYPE_LONGLONG;
+  rbind[2].buffer = &v_type;
+  rbind[3].buffer_type = MYSQL_TYPE_LONG;
   rbind[3].is_unsigned = 1;
-  rbind[3].buffer = &v_puttime;
-  rbind[4].buffer_type = MYSQL_TYPE_LONG;
-  rbind[4].is_unsigned = 1;
-  rbind[4].buffer = &v_size;
-  rbind[5].buffer_type = MYSQL_TYPE_BLOB;
-  rbind[5].buffer_length = GNUNET_MAX_BUFFER_SIZE;
-  rbind[5].length = &v_length;
-  rbind[5].buffer = GNUNET_malloc (GNUNET_MAX_BUFFER_SIZE);
+  rbind[3].buffer = &v_size;
+  rbind[4].buffer_type = MYSQL_TYPE_BLOB;
+  rbind[4].buffer_length = GNUNET_MAX_BUFFER_SIZE;
+  rbind[4].length = &v_length;
+  rbind[4].buffer = GNUNET_malloc (GNUNET_MAX_BUFFER_SIZE);
 
   GNUNET_mutex_lock (lock);
   mysql_thread_init ();
@@ -286,14 +297,14 @@
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_execute",
                      __FILE__, __LINE__, mysql_stmt_error (select_old_value));
-      GNUNET_free (rbind[5].buffer);
+      GNUNET_free (rbind[4].buffer);
       iclose ();
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
       return GNUNET_SYSERR;
     }
   GNUNET_GE_ASSERT (coreAPI->ectx,
-                    mysql_stmt_field_count (select_old_value) == 6);
+                    mysql_stmt_field_count (select_old_value) == 5);
   if (mysql_stmt_bind_result (select_old_value, rbind))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
@@ -301,21 +312,20 @@
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_bind_result",
                      __FILE__, __LINE__, mysql_stmt_error (select_old_value));
-      GNUNET_free (rbind[5].buffer);
+      GNUNET_free (rbind[4].buffer);
       iclose ();
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
       return GNUNET_SYSERR;
     }
-  if ((0 != mysql_stmt_fetch (select_old_value)) ||
-      (h_length != sizeof (GNUNET_HashCode)))
+  if (0 != mysql_stmt_fetch (select_old_value))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
                      GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
                      _("`%s' failed at %s:%d with error: %s\n"),
-                     "mysql_stmt_bind_result",
+                     "mysql_stmt_fetch",
                      __FILE__, __LINE__, mysql_stmt_error (select_old_value));
-      GNUNET_free (rbind[5].buffer);
+      GNUNET_free (rbind[4].buffer);
       mysql_stmt_reset (select_old_value);
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
@@ -329,12 +339,14 @@
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_bind_param",
                      __FILE__, __LINE__, mysql_stmt_error (delete_value));
-      GNUNET_free (rbind[5].buffer);
+      GNUNET_free (rbind[4].buffer);
       iclose ();
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
       return GNUNET_SYSERR;
     }
+  GNUNET_GE_BREAK(NULL, h_length == sizeof (GNUNET_HashCode));
+
   if (mysql_stmt_execute (delete_value))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
@@ -342,17 +354,19 @@
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_execute",
                      __FILE__, __LINE__, mysql_stmt_error (delete_value));
-      GNUNET_free (rbind[5].buffer);
+      GNUNET_free (rbind[4].buffer);
       iclose ();
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
       return GNUNET_SYSERR;
     }
-  GNUNET_free (rbind[5].buffer);
+  GNUNET_free (rbind[4].buffer);
   payload -= v_length + OVERHEAD;
   mysql_stmt_reset (delete_value);
   mysql_thread_end ();
   GNUNET_mutex_unlock (lock);
+  if (bloom != NULL)
+    GNUNET_bloomfilter_remove (bloom, &v_key);
   if (payload * 10 > quota * 9)
     return GNUNET_NO;
   return GNUNET_OK;
@@ -368,13 +382,16 @@
        unsigned int type,
        GNUNET_CronTime discard_time, unsigned int size, const char *data)
 {
-  MYSQL_BIND rbind[6];
+  MYSQL_BIND rbind[7];
   GNUNET_CronTime now;
+  unsigned long k_length;
   unsigned long h_length;
   unsigned long v_length;
+  GNUNET_HashCode vhash;
 
   if (size > MAX_CONTENT_SIZE)
     return GNUNET_SYSERR;
+  GNUNET_hash(data, size, &vhash);
   GNUNET_mutex_lock (lock);
   mysql_thread_init ();
   iopen ();
@@ -382,6 +399,7 @@
 
   /* first try UPDATE */
   h_length = sizeof (GNUNET_HashCode);
+  k_length = sizeof (GNUNET_HashCode);
   v_length = size;
   memset (rbind, 0, sizeof (rbind));
   rbind[0].buffer_type = MYSQL_TYPE_LONGLONG;
@@ -392,18 +410,18 @@
   rbind[1].buffer = &discard_time;
   rbind[2].buffer_type = MYSQL_TYPE_BLOB;
   rbind[2].buffer_length = sizeof (GNUNET_HashCode);
-  rbind[2].length = &h_length;
+  rbind[2].length = &k_length;
   rbind[2].buffer = (void *) key;
-  rbind[3].buffer_type = MYSQL_TYPE_LONG;
-  rbind[3].is_unsigned = 1;
-  rbind[3].buffer = &type;
+  rbind[3].buffer_type = MYSQL_TYPE_BLOB;
+  rbind[3].buffer_length = sizeof (GNUNET_HashCode);
+  rbind[3].length = &h_length;
+  rbind[3].buffer = &vhash;
   rbind[4].buffer_type = MYSQL_TYPE_LONG;
   rbind[4].is_unsigned = 1;
-  rbind[4].buffer = &size;
-  rbind[5].buffer_type = MYSQL_TYPE_BLOB;
-  rbind[5].buffer_length = size;
-  rbind[5].length = &v_length;
-  rbind[5].buffer = (void *) data;
+  rbind[4].buffer = &type;
+  rbind[5].buffer_type = MYSQL_TYPE_LONG;
+  rbind[5].is_unsigned = 1;
+  rbind[5].buffer = &size;
 
   if (mysql_stmt_bind_param (update_value, rbind))
     {
@@ -427,6 +445,35 @@
   mysql_stmt_reset (update_value);
   /* now try INSERT */
 
+  h_length = sizeof (GNUNET_HashCode);
+  k_length = sizeof (GNUNET_HashCode);
+  v_length = size;
+  memset (rbind, 0, sizeof (rbind));
+  rbind[0].buffer_type = MYSQL_TYPE_LONG;
+  rbind[0].is_unsigned = 1;
+  rbind[0].buffer = &size;
+  rbind[1].buffer_type = MYSQL_TYPE_LONG;
+  rbind[1].is_unsigned = 1;
+  rbind[1].buffer = &type;
+  rbind[2].buffer_type = MYSQL_TYPE_LONGLONG;
+  rbind[2].is_unsigned = 1;
+  rbind[2].buffer = &now;
+  rbind[3].buffer_type = MYSQL_TYPE_LONGLONG;
+  rbind[3].is_unsigned = 1;
+  rbind[3].buffer = &discard_time;
+  rbind[4].buffer_type = MYSQL_TYPE_BLOB;
+  rbind[4].buffer_length = sizeof (GNUNET_HashCode);
+  rbind[4].length = &k_length;
+  rbind[4].buffer = (void *) key;
+  rbind[5].buffer_type = MYSQL_TYPE_BLOB;
+  rbind[5].buffer_length = sizeof (GNUNET_HashCode);
+  rbind[5].length = &h_length;
+  rbind[5].buffer = &vhash;
+  rbind[6].buffer_type = MYSQL_TYPE_BLOB;
+  rbind[6].buffer_length = size;
+  rbind[6].length = &v_length;
+  rbind[6].buffer = (void*) data;
+
   if (mysql_stmt_bind_param (insert_value, rbind))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
@@ -444,7 +491,7 @@
       GNUNET_GE_LOG (coreAPI->ectx,
                      GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
                      _("`%s' failed at %s:%d with error: %s\n"),
-                     "mysql_stmt_bind_param",
+                     "mysql_stmt_execute",
                      __FILE__, __LINE__, mysql_stmt_error (insert_value));
       iclose ();
       mysql_thread_end ();
@@ -477,13 +524,15 @@
 d_get (const GNUNET_HashCode * key,
        unsigned int type, GNUNET_ResultProcessor handler, void *closure)
 {
-  MYSQL_BIND qbind[3];
+  MYSQL_BIND qbind[4];
   MYSQL_BIND rbind[2];
   unsigned int v_size;
   unsigned long h_length;
   unsigned long v_length;
   GNUNET_CronTime now;
   unsigned int cnt;
+  unsigned long long total;
+  unsigned int off;
 
   GNUNET_mutex_lock (lock);
   if ((bloom != NULL) && (GNUNET_NO == GNUNET_bloomfilter_test (bloom, key)))
@@ -512,57 +561,145 @@
   qbind[2].is_unsigned = 1;
   qbind[2].buffer = &now;
 
+  total = -1;
+  memset (rbind, 0, sizeof (rbind));
+  rbind[0].buffer_type = MYSQL_TYPE_LONGLONG;
+  rbind[0].buffer = &total;
+  rbind[0].is_unsigned = GNUNET_YES;
+
   mysql_thread_init ();
   iopen ();
-  if (mysql_stmt_bind_param (select_value, qbind))
+
+  if (mysql_stmt_bind_param (count_value, qbind))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
                      GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_bind_param",
-                     __FILE__, __LINE__, mysql_stmt_error (select_value));
+                     __FILE__, __LINE__, mysql_stmt_error (count_value));
       iclose ();
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
       return GNUNET_SYSERR;
     }
-  if (mysql_stmt_execute (select_value))
+  if (mysql_stmt_execute (count_value))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
                      GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_execute",
-                     __FILE__, __LINE__, mysql_stmt_error (select_value));
+                     __FILE__, __LINE__, mysql_stmt_error (count_value));
       iclose ();
       GNUNET_mutex_unlock (lock);
       mysql_thread_end ();
       return GNUNET_SYSERR;
     }
+  
 
-  memset (rbind, 0, sizeof (rbind));
-  rbind[0].buffer_type = MYSQL_TYPE_LONG;
-  rbind[0].is_unsigned = 1;
-  rbind[0].buffer = &v_size;
-  rbind[1].buffer_type = MYSQL_TYPE_BLOB;
-  rbind[1].buffer_length = GNUNET_MAX_BUFFER_SIZE;
-  rbind[1].length = &v_length;
-  rbind[1].buffer = GNUNET_malloc (GNUNET_MAX_BUFFER_SIZE);
-  if (mysql_stmt_bind_result (select_value, rbind))
+  if (mysql_stmt_bind_result (count_value, rbind))
     {
       GNUNET_GE_LOG (coreAPI->ectx,
                      GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
                      _("`%s' failed at %s:%d with error: %s\n"),
                      "mysql_stmt_bind_result",
-                     __FILE__, __LINE__, mysql_stmt_error (select_value));
+                     __FILE__, __LINE__, mysql_stmt_error (count_value));
       iclose ();
       mysql_thread_end ();
       GNUNET_mutex_unlock (lock);
-      GNUNET_free (rbind[1].buffer);
       return GNUNET_SYSERR;
     }
+  if (0 != mysql_stmt_fetch (count_value))
+    {
+      GNUNET_GE_LOG (coreAPI->ectx,
+                     GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+                     _("`%s' failed at %s:%d with error: %s\n"),
+                     "mysql_stmt_fetch",
+                     __FILE__, __LINE__, mysql_stmt_error (count_value));
+      mysql_stmt_reset (count_value);
+      iclose ();
+      GNUNET_mutex_unlock (lock);
+      mysql_thread_end ();
+      return GNUNET_SYSERR;
+    }
+  if (-1 == total)
+    {
+      GNUNET_GE_LOG (coreAPI->ectx,
+                     GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+                     _("`%s' failed at %s:%d with error: %s\n"),
+                     "mysql_stmt_fetch",
+                     __FILE__, __LINE__, mysql_stmt_error (count_value));
+      iclose ();
+      GNUNET_mutex_unlock (lock);
+      mysql_thread_end ();
+      return GNUNET_SYSERR;
+    }
+  mysql_stmt_reset (count_value);
+  if ((handler == NULL) || (total == 0))
+    {
+      GNUNET_mutex_unlock (lock);
+      mysql_thread_end ();
+      return (int) total;
+    }
+
+  off = GNUNET_random_u32 (GNUNET_RANDOM_QUALITY_WEAK, total);
+  qbind[3].buffer_type = MYSQL_TYPE_LONG;
+  qbind[3].is_unsigned = 1;
+  qbind[3].buffer = &off;
+
   cnt = 0;
-  while (0 == mysql_stmt_fetch (select_value))
+  while (cnt < total)
     {
+      off = (off + 1) % total;
+      if (mysql_stmt_bind_param (select_value, qbind))
+       {
+         GNUNET_GE_LOG (coreAPI->ectx,
+                        GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+                        _("`%s' failed at %s:%d with error: %s\n"),
+                        "mysql_stmt_bind_param",
+                        __FILE__, __LINE__, mysql_stmt_error (select_value));
+         iclose ();
+         mysql_thread_end ();
+         GNUNET_mutex_unlock (lock);
+         return GNUNET_SYSERR;
+       }
+      if (mysql_stmt_execute (select_value))
+       {
+         GNUNET_GE_LOG (coreAPI->ectx,
+                        GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+                        _("`%s' failed at %s:%d with error: %s\n"),
+                        "mysql_stmt_execute",
+                        __FILE__, __LINE__, mysql_stmt_error (select_value));
+         iclose ();
+         GNUNET_mutex_unlock (lock);
+         mysql_thread_end ();
+         return GNUNET_SYSERR;
+       }
+      memset (rbind, 0, sizeof (rbind));
+      rbind[0].buffer_type = MYSQL_TYPE_LONG;
+      rbind[0].is_unsigned = 1;
+      rbind[0].buffer = &v_size;
+      rbind[1].buffer_type = MYSQL_TYPE_BLOB;
+      rbind[1].buffer_length = GNUNET_MAX_BUFFER_SIZE;
+      rbind[1].length = &v_length;
+      rbind[1].buffer = GNUNET_malloc (GNUNET_MAX_BUFFER_SIZE);
+      if (mysql_stmt_bind_result (select_value, rbind))
+       {
+         GNUNET_GE_LOG (coreAPI->ectx,
+                        GNUNET_GE_ERROR | GNUNET_GE_BULK | GNUNET_GE_USER,
+                        _("`%s' failed at %s:%d with error: %s\n"),
+                        "mysql_stmt_bind_result",
+                        __FILE__, __LINE__, mysql_stmt_error (select_value));
+         iclose ();
+         mysql_thread_end ();
+         GNUNET_mutex_unlock (lock);
+         GNUNET_free (rbind[1].buffer);
+         return GNUNET_SYSERR;
+       }
+      if (0 != mysql_stmt_fetch (select_value))
+       {
+         GNUNET_GE_BREAK(NULL, 0);
+         break;
+       }
       if (v_length != v_size)
         {
           GNUNET_GE_BREAK (NULL, 0);
@@ -572,7 +709,8 @@
           GNUNET_free (rbind[1].buffer);
           return cnt;
         }
-      handler (key, type, v_size, rbind[1].buffer, closure);
+      if (GNUNET_OK != handler (key, type, v_size, rbind[1].buffer, closure))
+       break;
       cnt++;
     }
   mysql_stmt_reset (select_value);
@@ -658,7 +796,12 @@
     }
   stats = capi->request_service ("stats");
   if (stats != NULL)
-    stat_dstore_size = stats->create (gettext_noop ("# bytes in dstore"));
+    {
+      stat_dstore_size = stats->create (gettext_noop ("# bytes in dstore"));
+      stat_dstore_quota = stats->create (gettext_noop ("# max bytes allowed in 
dstore"));
+      stats->set(stat_dstore_quota,
+                quota);
+    }
   return &api;
 }
 

Added: GNUnet/src/applications/dstore_mysql/dstore_quota_test.c
===================================================================
--- GNUnet/src/applications/dstore_mysql/dstore_quota_test.c                    
        (rev 0)
+++ GNUnet/src/applications/dstore_mysql/dstore_quota_test.c    2008-03-02 
01:55:36 UTC (rev 6496)
@@ -0,0 +1,115 @@
+/*
+     This file is part of GNUnet.
+     (C) 2006, 2008 Christian Grothoff (and other contributing authors)
+
+     GNUnet is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published
+     by the Free Software Foundation; either version 2, 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
+     General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with GNUnet; see the file COPYING.  If not, write to the
+     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+     Boston, MA 02111-1307, USA.
+*/
+/*
+ * @file applications/dstore/dstore_quota_test.c
+ * @brief Test for the dstore implementations.
+ * @author Nils Durner
+ */
+
+#include "platform.h"
+#include "gnunet_util.h"
+#include "gnunet_protocols.h"
+#include "gnunet_dstore_service.h"
+#include "core.h"
+
+#define ASSERT(x) do { if (! (x)) { printf("Error at %s:%d\n", __FILE__, 
__LINE__); goto FAILURE;} } while (0)
+
+/**
+ * Quota is 1 MB.  Each iteration of the test puts in about 1 MB of
+ * data.  We do 10 iterations. Afterwards we check that the data from
+ * the first 5 iterations has all been discarded and that at least
+ * some of the data from the last iteration is still there.
+ */
+static int
+test (GNUNET_Dstore_ServiceAPI * api)
+{
+  GNUNET_HashCode k;
+  GNUNET_HashCode n;
+  unsigned int i;
+  unsigned int j;
+  char buf[3200];
+
+  memset(buf, 1, sizeof(buf));
+  memset (&k, 0, sizeof (GNUNET_HashCode));
+  for (i = 0; i < 10; i++)
+    {
+      fprintf(stderr, ".");
+      GNUNET_hash (&k, sizeof (GNUNET_HashCode), &n);
+      for (j=i;j<sizeof(buf);j+=10)
+       {
+         buf[j] = i;
+         ASSERT (GNUNET_OK == api->put (&k,
+                                        i,
+                                        GNUNET_get_time() + 30 * 
GNUNET_CRON_MINUTES,
+                                        j,
+                                        buf));
+         ASSERT (0 != api->get (&k, i, NULL, NULL));
+       }
+      k = n;
+    }
+  fprintf(stderr, "\n");
+  memset (&k, 0, sizeof (GNUNET_HashCode));
+  for (i = 0; i < 10; i++)
+    {
+      fprintf(stderr, ".");
+      GNUNET_hash (&k, sizeof (GNUNET_HashCode), &n);
+      if (i < 5)
+       ASSERT (0 == api->get (&k, i, NULL, NULL));
+      if (i == 9)
+       ASSERT (0 != api->get (&k, i, NULL, NULL));
+      k = n;
+    }
+  fprintf(stderr, "\n");
+  return GNUNET_OK;
+FAILURE:
+  return GNUNET_SYSERR;
+}
+
+int
+main (int argc, char *argv[])
+{
+  GNUNET_Dstore_ServiceAPI *api;
+  int ok;
+  struct GNUNET_GC_Configuration *cfg;
+  struct GNUNET_CronManager *cron;
+
+  cfg = GNUNET_GC_create ();
+  if (-1 == GNUNET_GC_parse_configuration (cfg, "check.conf"))
+    {
+      GNUNET_GC_free (cfg);
+      return -1;
+    }
+  cron = GNUNET_cron_create (NULL);
+  GNUNET_CORE_init (NULL, cfg, cron, NULL);
+  api = GNUNET_CORE_request_service ("dstore");
+  if (api != NULL)
+    {
+      ok = test (api);
+      GNUNET_CORE_release_service (api);
+    }
+  else
+    ok = GNUNET_SYSERR;
+  GNUNET_CORE_done ();
+  if (ok == GNUNET_SYSERR)
+    return 1;
+  return 0;
+}
+
+/* end of dstore_quota_test.c */


Property changes on: GNUnet/src/applications/dstore_mysql/dstore_quota_test.c
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: GNUnet/src/applications/dstore_mysql/dstore_test.c
===================================================================
--- GNUnet/src/applications/dstore_mysql/dstore_test.c  2008-03-02 01:37:06 UTC 
(rev 6495)
+++ GNUnet/src/applications/dstore_mysql/dstore_test.c  2008-03-02 01:55:36 UTC 
(rev 6496)
@@ -33,7 +33,7 @@
 
 static int error;
 
-static void
+static int
 checkIt (const GNUNET_HashCode * key,
          unsigned int type, unsigned int size, const char *data, void *cls)
 {
@@ -47,6 +47,7 @@
       printf ("ERROR: Invalid data\n");
       error = 3;
     }
+  return GNUNET_OK;
 }
 
 /**





reply via email to

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