From 15de71a29f22caee6b15956b162e1e5a0f5f4f3e Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sun, 19 Dec 2010 18:22:20 +0000 Subject: [PATCH] LRN patch from SVN 1630 --- src/datastore/perf_datastore_api.c | 8 +- src/datastore/perf_plugin_datastore.c | 8 +- src/datastore/plugin_datastore_sqlite.c | 108 ++++++++++++++---- src/datastore/test_datastore_api.c | 8 +- src/datastore/test_datastore_api_management.c | 8 +- src/util/crypto_hash.c | 2 +- 6 files changed, 117 insertions(+), 25 deletions(-) diff --git a/src/datastore/perf_datastore_api.c b/src/datastore/perf_datastore_api.c index 1f7c828e0..e5dc67b44 100644 --- a/src/datastore/perf_datastore_api.c +++ b/src/datastore/perf_datastore_api.c @@ -407,13 +407,17 @@ int main (int argc, char *argv[]) { int ret; - const char *pos; + char *pos; char dir_name[128]; /* determine name of plugin to use */ plugin_name = argv[0]; while (NULL != (pos = strstr(plugin_name, "_"))) plugin_name = pos+1; + if (NULL != (pos = strstr(plugin_name, "."))) + pos[0] = 0; + else + pos = (char *) plugin_name; GNUNET_snprintf (dir_name, sizeof (dir_name), @@ -428,6 +432,8 @@ main (int argc, char *argv[]) #endif NULL); ret = check (); + if (pos != plugin_name) + pos[0] = '.'; #if REPORT_ID fprintf (stderr, "\n"); #endif diff --git a/src/datastore/perf_plugin_datastore.c b/src/datastore/perf_plugin_datastore.c index c55fb6258..facf7be67 100644 --- a/src/datastore/perf_plugin_datastore.c +++ b/src/datastore/perf_plugin_datastore.c @@ -415,13 +415,17 @@ int main (int argc, char *argv[]) { int ret; - const char *pos; + char *pos; char dir_name[128]; /* determine name of plugin to use */ plugin_name = argv[0]; while (NULL != (pos = strstr(plugin_name, "_"))) plugin_name = pos+1; + if (NULL != (pos = strstr(plugin_name, "."))) + pos[0] = 0; + else + pos = (char *) plugin_name; GNUNET_snprintf (dir_name, sizeof (dir_name), @@ -436,6 +440,8 @@ main (int argc, char *argv[]) #endif NULL); ret = check (); + if (pos != plugin_name) + pos[0] = '.'; GNUNET_DISK_directory_remove (dir_name); return ret; diff --git a/src/datastore/plugin_datastore_sqlite.c b/src/datastore/plugin_datastore_sqlite.c index 457f75c45..1b8382537 100644 --- a/src/datastore/plugin_datastore_sqlite.c +++ b/src/datastore/plugin_datastore_sqlite.c @@ -28,7 +28,7 @@ #include "gnunet_datastore_plugin.h" #include -#define DEBUG_SQLITE GNUNET_YES +#define DEBUG_SQLITE GNUNET_NO /** @@ -104,6 +104,11 @@ struct Plugin */ sqlite3 *dbh; + /** + * Precompiled SQL for deletion. + */ + sqlite3_stmt *delRow; + /** * Precompiled SQL for update. */ @@ -145,9 +150,16 @@ sq_prepare (sqlite3 * dbh, const char *zSql, sqlite3_stmt ** ppStmt) { char *dummy; - return sqlite3_prepare_v2 (dbh, - zSql, - strlen (zSql), ppStmt, (const char **) &dummy); + int result; + result = sqlite3_prepare_v2 (dbh, + zSql, + strlen (zSql), ppStmt, (const char **) &dummy); +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "Prepared %p: %d\n", *ppStmt, result); +#endif + return result; } @@ -324,12 +336,16 @@ database_setup (const struct GNUNET_CONFIGURATION_Handle *cfg, "INSERT INTO gn080 (size, type, prio, " "anonLevel, expire, hash, vhash, value) VALUES " "(?, ?, ?, ?, ?, ?, ?, ?)", - &plugin->insertContent) != SQLITE_OK)) + &plugin->insertContent) != SQLITE_OK) || + (sq_prepare (plugin->dbh, + "DELETE FROM gn080 WHERE _ROWID_ = ?", + &plugin->delRow) != SQLITE_OK)) { LOG_SQLITE (plugin, NULL, GNUNET_ERROR_TYPE_ERROR, "precompiling"); return GNUNET_SYSERR; } + return GNUNET_OK; } @@ -342,11 +358,36 @@ database_setup (const struct GNUNET_CONFIGURATION_Handle *cfg, static void database_shutdown (struct Plugin *plugin) { + int result; + if (plugin->delRow != NULL) + sqlite3_finalize (plugin->delRow); if (plugin->updPrio != NULL) sqlite3_finalize (plugin->updPrio); if (plugin->insertContent != NULL) sqlite3_finalize (plugin->insertContent); - sqlite3_close (plugin->dbh); + result = sqlite3_close(plugin->dbh); + while (result == SQLITE_BUSY) + { + sqlite3_stmt *stmt; + GNUNET_log_from (GNUNET_ERROR_TYPE_WARNING, + "sqlite", + _("Tried to close sqlite without finalizing all prepared statements.\n")); + for (stmt = sqlite3_next_stmt(plugin->dbh, NULL); stmt != NULL; stmt = sqlite3_next_stmt(plugin->dbh, NULL)) + { +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", "Closing statement %p\n", stmt); +#endif + result = sqlite3_finalize(stmt); +#if DEBUG_SQLITE + if (result != SQLITE_OK) + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "Failed to close statement %p: %d\n", stmt, result); +#endif + } + result = sqlite3_close(plugin->dbh); + } GNUNET_free_non_null (plugin->fn); } @@ -362,26 +403,23 @@ static int delete_by_rowid (struct Plugin* plugin, unsigned long long rid) { - sqlite3_stmt *stmt; - if (sq_prepare (plugin->dbh, - "DELETE FROM gn080 WHERE _ROWID_ = ?", &stmt) != SQLITE_OK) + sqlite3_bind_int64 (plugin->delRow, 1, rid); + if (SQLITE_DONE != sqlite3_step (plugin->delRow)) { LOG_SQLITE (plugin, NULL, GNUNET_ERROR_TYPE_ERROR | - GNUNET_ERROR_TYPE_BULK, "sq_prepare"); + GNUNET_ERROR_TYPE_BULK, "sqlite3_step"); + if (SQLITE_OK != sqlite3_reset (plugin->delRow)) + LOG_SQLITE (plugin, NULL, + GNUNET_ERROR_TYPE_ERROR | + GNUNET_ERROR_TYPE_BULK, "sqlite3_reset"); return GNUNET_SYSERR; } - sqlite3_bind_int64 (stmt, 1, rid); - if (SQLITE_DONE != sqlite3_step (stmt)) - { + if (SQLITE_OK != sqlite3_reset (plugin->delRow)) LOG_SQLITE (plugin, NULL, GNUNET_ERROR_TYPE_ERROR | - GNUNET_ERROR_TYPE_BULK, "sqlite3_step"); - sqlite3_finalize (stmt); - return GNUNET_SYSERR; - } - sqlite3_finalize (stmt); + GNUNET_ERROR_TYPE_BULK, "sqlite3_reset"); return GNUNET_OK; } @@ -1167,7 +1205,7 @@ sqlite_plugin_iter_migration_order (void *cls, * Call sqlite using the already prepared query to get * the next result. * - * @param cls not used + * @param cls context with the prepared query * @param nc context with the prepared query * @return GNUNET_OK on success, GNUNET_SYSERR on error, GNUNET_NO if * there are no more results @@ -1185,6 +1223,10 @@ all_next_prepare (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Asked to clean up iterator state.\n"); #endif + nc = (struct NextContext *)cls; + if (nc->stmt) + sqlite3_finalize (nc->stmt); + nc->stmt = NULL; return GNUNET_SYSERR; } plugin = nc->plugin; @@ -1241,7 +1283,7 @@ sqlite_plugin_iter_all_now (void *cls, nc->iter_cls = iter_cls; nc->stmt = stmt; nc->prep = &all_next_prepare; - nc->prep_cls = NULL; + nc->prep_cls = nc; sqlite_next_request (nc, GNUNET_NO); } @@ -1595,10 +1637,26 @@ libgnunet_plugin_datastore_sqlite_done (void *cls) struct GNUNET_DATASTORE_PluginFunctions *api = cls; struct Plugin *plugin = api->cls; +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "sqlite plugin is doneing\n"); +#endif + if (plugin->next_task != GNUNET_SCHEDULER_NO_TASK) { +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "Canceling next task\n"); +#endif GNUNET_SCHEDULER_cancel (plugin->next_task); plugin->next_task = GNUNET_SCHEDULER_NO_TASK; +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "Prep'ing next task\n"); +#endif plugin->next_task_nc->prep (plugin->next_task_nc->prep_cls, NULL); GNUNET_free (plugin->next_task_nc); plugin->next_task_nc = NULL; @@ -1606,6 +1664,11 @@ libgnunet_plugin_datastore_sqlite_done (void *cls) fn = NULL; if (plugin->drop_on_shutdown) fn = GNUNET_strdup (plugin->fn); +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "Shutting down database\n"); +#endif database_shutdown (plugin); plugin->env = NULL; GNUNET_free (api); @@ -1617,6 +1680,11 @@ libgnunet_plugin_datastore_sqlite_done (void *cls) fn); GNUNET_free (fn); } +#if DEBUG_SQLITE + GNUNET_log_from (GNUNET_ERROR_TYPE_DEBUG, + "sqlite", + "sqlite plugin is finished doneing\n"); +#endif return NULL; } diff --git a/src/datastore/test_datastore_api.c b/src/datastore/test_datastore_api.c index 06abc0c0f..2edc9a6ec 100644 --- a/src/datastore/test_datastore_api.c +++ b/src/datastore/test_datastore_api.c @@ -678,13 +678,17 @@ int main (int argc, char *argv[]) { int ret; - const char *pos; + char *pos; char dir_name[128]; /* determine name of plugin to use */ plugin_name = argv[0]; while (NULL != (pos = strstr(plugin_name, "_"))) plugin_name = pos+1; + if (NULL != (pos = strstr(plugin_name, "."))) + pos[0] = 0; + else + pos = (char *) plugin_name; GNUNET_snprintf (dir_name, sizeof (dir_name), @@ -699,6 +703,8 @@ main (int argc, char *argv[]) #endif NULL); ret = check (); + if (pos != plugin_name) + pos[0] = '.'; GNUNET_DISK_directory_remove (dir_name); return ret; } diff --git a/src/datastore/test_datastore_api_management.c b/src/datastore/test_datastore_api_management.c index d17d8fbc8..8d71fed90 100644 --- a/src/datastore/test_datastore_api_management.c +++ b/src/datastore/test_datastore_api_management.c @@ -388,13 +388,17 @@ main (int argc, char *argv[]) { int ret; - const char *pos; + char *pos; char dir_name[128]; /* determine name of plugin to use */ plugin_name = argv[0]; while (NULL != (pos = strstr(plugin_name, "_"))) plugin_name = pos+1; + if (NULL != (pos = strstr(plugin_name, "."))) + pos[0] = 0; + else + pos = (char *) plugin_name; GNUNET_snprintf (dir_name, sizeof (dir_name), @@ -409,6 +413,8 @@ main (int argc, char *argv[]) #endif NULL); ret = check (); + if (pos != plugin_name) + pos[0] = '.'; GNUNET_DISK_directory_remove (dir_name); return ret; } diff --git a/src/util/crypto_hash.c b/src/util/crypto_hash.c index 9e5af4ab5..0cbc4289c 100644 --- a/src/util/crypto_hash.c +++ b/src/util/crypto_hash.c @@ -141,7 +141,7 @@ file_hash_task (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) size_t delta; fhc->task = GNUNET_SCHEDULER_NO_TASK; - GNUNET_assert (fhc->offset < fhc->fsize); + GNUNET_assert (fhc->offset <= fhc->fsize); delta = fhc->bsize; if (fhc->fsize - fhc->offset < delta) delta = fhc->fsize - fhc->offset; -- 2.25.1