gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] r10767 - in gnunet: . src/datastore


From: gnunet
Subject: [GNUnet-SVN] r10767 - in gnunet: . src/datastore
Date: Sat, 3 Apr 2010 12:38:02 +0200

Author: grothoff
Date: 2010-04-03 12:38:02 +0200 (Sat, 03 Apr 2010)
New Revision: 10767

Modified:
   gnunet/TODO
   gnunet/src/datastore/gnunet-service-datastore.c
   gnunet/src/datastore/plugin_datastore_sqlite.c
Log:
fix datastore quota management -- especially if stats is not working

Modified: gnunet/TODO
===================================================================
--- gnunet/TODO 2010-04-02 21:31:25 UTC (rev 10766)
+++ gnunet/TODO 2010-04-03 10:38:02 UTC (rev 10767)
@@ -6,13 +6,8 @@
     sessions even if no connections exist for a while! (likely related...)
   - transport reports bw quota violations on slow systems (core or
     transport issue? tracking issue or actual violation?)
-* DATASTORE: [CG]
-  - utilization can (easily, restart?) go out of control (very large), causing
-    content expiration job to go crazy and delete everything!
 * FS: [CG]
-  - on some systems, keyword search does not find locally published content
-    (need testcase of command-line tools! - also good to cover getopt API!)
-    [could be related to datastore issue above!]
+  - Need testcase of command-line tools! - also good to cover getopt API!
   - 2-peer download is still too slow (why? testcases fail on slow systems!)
 * WWW:
   - Get IPv6 hooked up [AK, after April 12th]

Modified: gnunet/src/datastore/gnunet-service-datastore.c
===================================================================
--- gnunet/src/datastore/gnunet-service-datastore.c     2010-04-02 21:31:25 UTC 
(rev 10766)
+++ gnunet/src/datastore/gnunet-service-datastore.c     2010-04-03 10:38:02 UTC 
(rev 10767)
@@ -297,7 +297,6 @@
 {
   struct GNUNET_TIME_Absolute now;
 
-  expired_kill_task = GNUNET_SCHEDULER_NO_TASK;
   if (key == NULL) 
     {
       expired_kill_task 
@@ -343,6 +342,7 @@
 delete_expired (void *cls,
                const struct GNUNET_SCHEDULER_TaskContext *tc)
 {
+  expired_kill_task = GNUNET_SCHEDULER_NO_TASK;
   plugin->api->iter_ascending_expiration (plugin->api->cls, 
                                          0,
                                          &expired_processor,

Modified: gnunet/src/datastore/plugin_datastore_sqlite.c
===================================================================
--- gnunet/src/datastore/plugin_datastore_sqlite.c      2010-04-02 21:31:25 UTC 
(rev 10766)
+++ gnunet/src/datastore/plugin_datastore_sqlite.c      2010-04-03 10:38:02 UTC 
(rev 10767)
@@ -29,7 +29,7 @@
 #include "plugin_datastore.h"
 #include <sqlite3.h>
 
-#define DEBUG_SQLITE GNUNET_NO
+#define DEBUG_SQLITE GNUNET_YES
 
 /**
  * After how many payload-changing operations
@@ -159,6 +159,11 @@
    * Should the database be dropped on shutdown?
    */
   int drop_on_shutdown;
+
+  /**
+   * Did we get an answer from statistics?
+   */
+  int stats_worked;
 };
 
 
@@ -285,9 +290,13 @@
                        "PRAGMA synchronous=OFF", NULL, NULL, ENULL));
   CHECK (SQLITE_OK ==
          sqlite3_exec (plugin->dbh,
+                       "PRAGMA auto_vacuum=INCREMENTAL", NULL, NULL, ENULL));
+  CHECK (SQLITE_OK ==
+         sqlite3_exec (plugin->dbh,
                        "PRAGMA count_changes=OFF", NULL, NULL, ENULL));
   CHECK (SQLITE_OK ==
-         sqlite3_exec (plugin->dbh, "PRAGMA page_size=4092", NULL, NULL, 
ENULL));
+         sqlite3_exec (plugin->dbh, 
+                      "PRAGMA page_size=4092", NULL, NULL, ENULL));
 
   CHECK (SQLITE_OK == sqlite3_busy_timeout (plugin->dbh, BUSY_TIMEOUT_MS));
 
@@ -642,7 +651,11 @@
   if ( (ret == GNUNET_NO) &&
        (GNUNET_OK == delete_by_rowid (plugin, rowid)) )
     {
-      plugin->payload -= (size + GNUNET_DATASTORE_ENTRY_OVERHEAD);
+      if (plugin->payload >= size + GNUNET_DATASTORE_ENTRY_OVERHEAD)
+       plugin->payload -= (size + GNUNET_DATASTORE_ENTRY_OVERHEAD);
+      else
+       GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                   _("Datastore payload inaccurate, please fix and 
restart!\n"));
       plugin->lastSync++; 
 #if DEBUG_SQLITE
       if (ret == GNUNET_NO)
@@ -651,7 +664,7 @@
                         "Removed entry %llu (%u bytes), new payload is %llu\n",
                         (unsigned long long) rowid,
                         size + GNUNET_DATASTORE_ENTRY_OVERHEAD,
-                        (unsigned long long) plugin->payload);
+                        plugin->payload);
 #endif
       if (plugin->lastSync >= MAX_STAT_SYNC_LAG)
        sync_stats (plugin);
@@ -779,7 +792,7 @@
                   "sqlite",
                   "Stored new entry (%u bytes), new payload is %llu\n",
                   size + GNUNET_DATASTORE_ENTRY_OVERHEAD,
-                  (unsigned long long) plugin->payload);
+                  plugin->payload);
 #endif
   if (plugin->lastSync >= MAX_STAT_SYNC_LAG)
     sync_stats (plugin);
@@ -1566,13 +1579,15 @@
                 int is_persistent)
 {
   struct Plugin *plugin = cls;
+
+  plugin->stats_worked = GNUNET_YES;
   plugin->payload += value;
 #if DEBUG_SQLITE
   GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG,
                   "sqlite",
                   "Notification from statistics about existing payload (%llu), 
new payload is %llu\n",
                   value,
-                  (unsigned long long) plugin->payload);
+                  plugin->payload);
 #endif
   return GNUNET_OK;
 }
@@ -1583,7 +1598,35 @@
                   int success)
 {
   struct Plugin *plugin = cls;
+  sqlite3_stmt *stmt;
+  uint64_t pages;
+  uint64_t free_pages;
+
   plugin->stat_get = NULL;
+  if (plugin->stats_worked == GNUNET_NO)
+    {
+      CHECK (SQLITE_OK ==
+            sq_prepare (plugin->dbh,
+                        "PRAGMA page_count",
+                        &stmt));
+      CHECK (SQLITE_ROW ==
+            sqlite3_step (stmt));
+      pages = sqlite3_column_int64 (stmt, 0);
+      sqlite3_finalize (stmt);
+      CHECK (SQLITE_OK ==
+            sq_prepare (plugin->dbh,
+                        "PRAGMA freelist_count",
+                        &stmt));
+      CHECK (SQLITE_ROW ==
+            sqlite3_step (stmt));
+      free_pages = sqlite3_column_int64 (stmt, 0);
+      sqlite3_finalize (stmt);
+      GNUNET_log (GNUNET_ERROR_TYPE_INFO,
+                 _("Using sqlite page utilization to estimate payload (%llu 
pages total, %llu free)\n"),
+                 (unsigned long long) pages,
+                 (unsigned long long) free_pages);
+      plugin->payload = (pages - free_pages) * 4092LL;
+    }
 }
                                         
 
@@ -1610,7 +1653,7 @@
   plugin.stat_get = GNUNET_STATISTICS_get (plugin.statistics,
                                           "datastore-sqlite",
                                           QUOTA_STAT_NAME,
-                                          GNUNET_TIME_UNIT_MINUTES,
+                                          GNUNET_TIME_UNIT_SECONDS,
                                           &process_stat_done,
                                           &process_stat_in,
                                           &plugin);
@@ -1635,6 +1678,9 @@
   api->drop = &sqlite_plugin_drop;
   GNUNET_log_from (GNUNET_ERROR_TYPE_INFO,
                    "sqlite", _("Sqlite database running\n"));
+  fprintf (stderr,
+          "Initial payload: %llu\n",
+          plugin.payload);
   return api;
 }
 





reply via email to

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