From 1cbba4bec1551a4662029e2899e5120cc4793c4b Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Mon, 2 May 2016 06:36:58 +0200 Subject: fixing #4462: avoid temporary schemata altogether --- src/exchange-tools/taler-exchange-dbinit.c | 3 +- src/exchange-tools/taler-exchange-reservemod.c | 3 +- src/exchange/taler-exchange-aggregator.c | 10 +-- src/exchange/taler-exchange-httpd.c | 22 +----- src/exchange/taler-exchange-httpd.h | 5 -- src/exchange/taler-exchange-httpd_db.c | 27 +++---- src/exchange/taler-exchange-httpd_keystate.c | 3 +- src/exchange/test_taler_exchange_aggregator.c | 10 +-- src/exchangedb/perf_taler_exchangedb_interpreter.c | 15 ++-- src/exchangedb/plugin_exchangedb_postgres.c | 85 +++++++++------------- src/exchangedb/test_exchangedb.c | 23 ++++-- src/include/taler_exchangedb_plugin.h | 15 ++-- 12 files changed, 82 insertions(+), 139 deletions(-) (limited to 'src') diff --git a/src/exchange-tools/taler-exchange-dbinit.c b/src/exchange-tools/taler-exchange-dbinit.c index f936e64d6..e51f5a21a 100644 --- a/src/exchange-tools/taler-exchange-dbinit.c +++ b/src/exchange-tools/taler-exchange-dbinit.c @@ -54,8 +54,7 @@ run (void *cls, return; } if (GNUNET_OK != - plugin->create_tables (plugin->cls, - GNUNET_NO)) + plugin->create_tables (plugin->cls)) { fprintf (stderr, "Failed to initialize database.\n"); diff --git a/src/exchange-tools/taler-exchange-reservemod.c b/src/exchange-tools/taler-exchange-reservemod.c index de3e57f1f..2aeb951ce 100644 --- a/src/exchange-tools/taler-exchange-reservemod.c +++ b/src/exchange-tools/taler-exchange-reservemod.c @@ -73,8 +73,7 @@ run_transaction (const struct TALER_ReservePublicKeyP *reserve_pub, int ret; struct TALER_EXCHANGEDB_Session *session; - session = plugin->get_session (plugin->cls, - GNUNET_NO); + session = plugin->get_session (plugin->cls); if (NULL == session) { fprintf (stderr, diff --git a/src/exchange/taler-exchange-aggregator.c b/src/exchange/taler-exchange-aggregator.c index 57eab8138..4732e4e18 100644 --- a/src/exchange/taler-exchange-aggregator.c +++ b/src/exchange/taler-exchange-aggregator.c @@ -173,7 +173,7 @@ static struct AggregationUnit *au; static int global_ret; /** - * #GNUNET_YES if we are in test mode and are using temporary tables. + * #GNUNET_YES if we are in test mode and should exit when idle. */ static int test_mode; @@ -518,8 +518,7 @@ run_aggregation (void *cls) return; GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Checking for ready deposits to aggregate\n"); - if (NULL == (session = db_plugin->get_session (db_plugin->cls, - test_mode))) + if (NULL == (session = db_plugin->get_session (db_plugin->cls))) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to obtain database session!\n"); @@ -891,8 +890,7 @@ run_transfers (void *cls) tc = GNUNET_SCHEDULER_get_task_context (); if (0 != (tc->reason & GNUNET_SCHEDULER_REASON_SHUTDOWN)) return; - if (NULL == (session = db_plugin->get_session (db_plugin->cls, - test_mode))) + if (NULL == (session = db_plugin->get_session (db_plugin->cls))) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Failed to obtain database session!\n"); @@ -987,7 +985,7 @@ main (int argc, "wireformat to use, overrides WIREFORMAT option in [exchange] section", 1, &GNUNET_GETOPT_set_filename, &exchange_wireformat}, {'t', "test", NULL, - "run in test mode with temporary tables", 0, + "run in test mode and exit when idle", 0, &GNUNET_GETOPT_set_one, &test_mode}, GNUNET_GETOPT_OPTION_VERSION (VERSION "-" VCS_VERSION), GNUNET_GETOPT_OPTION_END diff --git a/src/exchange/taler-exchange-httpd.c b/src/exchange/taler-exchange-httpd.c index 11f2e1c9d..5f9f51422 100644 --- a/src/exchange/taler-exchange-httpd.c +++ b/src/exchange/taler-exchange-httpd.c @@ -80,11 +80,6 @@ struct TALER_MasterPublicKeyP TMH_master_public_key; */ struct TALER_EXCHANGEDB_Plugin *TMH_plugin; -/** - * Are we running in test mode? - */ -int TMH_test_mode; - /** * Default timeout in seconds for HTTP requests. */ @@ -466,9 +461,7 @@ exchange_serve_process_config () { GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Running in TEST mode! Database contents will not persist!\n"); - TMH_test_mode = GNUNET_YES; - TMH_plugin->create_tables (TMH_plugin->cls, - GNUNET_YES); + TMH_plugin->create_tables (TMH_plugin->cls); } { @@ -906,19 +899,6 @@ main (int argc, MHD_stop_daemon (mydaemon); break; } - - if (GNUNET_YES == TMH_test_mode) - { - struct TALER_EXCHANGEDB_Session *session; - - session = TMH_plugin->get_session (TMH_plugin->cls, - GNUNET_YES); - if (NULL == session) - GNUNET_break (0); - else - TMH_plugin->drop_temporary (TMH_plugin->cls, - session); - } TALER_EXCHANGEDB_plugin_unload (TMH_plugin); TMH_VALIDATION_done (); return (GNUNET_SYSERR == ret) ? 1 : 0; diff --git a/src/exchange/taler-exchange-httpd.h b/src/exchange/taler-exchange-httpd.h index 236df9e19..54e382f52 100644 --- a/src/exchange/taler-exchange-httpd.h +++ b/src/exchange/taler-exchange-httpd.h @@ -43,11 +43,6 @@ extern int TMH_exchange_connection_close; */ extern struct GNUNET_CONFIGURATION_Handle *cfg; -/** - * Are we running in test mode? - */ -extern int TMH_test_mode; - /** * Main directory with exchange data. */ diff --git a/src/exchange/taler-exchange-httpd_db.c b/src/exchange/taler-exchange-httpd_db.c index 4b6b458ce..237a1aa7c 100644 --- a/src/exchange/taler-exchange-httpd_db.c +++ b/src/exchange/taler-exchange-httpd_db.c @@ -160,8 +160,7 @@ TMH_DB_execute_deposit (struct MHD_Connection *connection, struct TALER_EXCHANGEDB_DenominationKeyIssueInformation *dki; int ret; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -278,8 +277,7 @@ TMH_DB_execute_reserve_status (struct MHD_Connection *connection, struct TALER_EXCHANGEDB_ReserveHistory *rh; int res; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -524,8 +522,7 @@ TMH_DB_execute_reserve_withdraw (struct MHD_Connection *connection, GNUNET_CRYPTO_hash (blinded_msg, blinded_msg_len, &h_blind); - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -725,8 +722,7 @@ TMH_DB_execute_refresh_melt (struct MHD_Connection *connection, int res; unsigned int i; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -1237,8 +1233,7 @@ TMH_DB_execute_refresh_reveal (struct MHD_Connection *connection, unsigned int j; unsigned int off; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -1465,8 +1460,7 @@ TMH_DB_execute_refresh_link (struct MHD_Connection *connection, int res; unsigned int i; - if (NULL == (ctx.session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (ctx.session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -1528,8 +1522,7 @@ TMH_DB_execute_admin_add_incoming (struct MHD_Connection *connection, struct TALER_EXCHANGEDB_Session *session; int ret; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -1713,8 +1706,7 @@ TMH_DB_execute_wire_deposits (struct MHD_Connection *connection, struct TALER_EXCHANGEDB_Session *session; struct TMH_WireDepositDetail *wdd; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); @@ -1879,8 +1871,7 @@ TMH_DB_execute_deposit_wtid (struct MHD_Connection *connection, struct DepositWtidContext ctx; struct TALER_EXCHANGEDB_Session *session; - if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode))) + if (NULL == (session = TMH_plugin->get_session (TMH_plugin->cls))) { GNUNET_break (0); return TMH_RESPONSE_reply_internal_db_error (connection); diff --git a/src/exchange/taler-exchange-httpd_keystate.c b/src/exchange/taler-exchange-httpd_keystate.c index 5d564d864..2f5069d4a 100644 --- a/src/exchange/taler-exchange-httpd_keystate.c +++ b/src/exchange/taler-exchange-httpd_keystate.c @@ -250,8 +250,7 @@ reload_keys_denom_iter (void *cls, GNUNET_CRYPTO_hash_context_read (ctx->hash_context, &denom_key_hash, sizeof (struct GNUNET_HashCode)); - session = TMH_plugin->get_session (TMH_plugin->cls, - TMH_test_mode); + session = TMH_plugin->get_session (TMH_plugin->cls); if (NULL == session) return GNUNET_SYSERR; /* Try to insert DKI into DB until we succeed; note that if the DB diff --git a/src/exchange/test_taler_exchange_aggregator.c b/src/exchange/test_taler_exchange_aggregator.c index d9052ec7d..d38d07906 100644 --- a/src/exchange/test_taler_exchange_aggregator.c +++ b/src/exchange/test_taler_exchange_aggregator.c @@ -285,8 +285,8 @@ shutdown_action (void *cls) GNUNET_OS_process_destroy (aggregator_proc); aggregator_proc = NULL; } - plugin->drop_temporary (plugin->cls, - session); + plugin->drop_tables (plugin->cls, + session); TALER_EXCHANGEDB_plugin_unload (plugin); plugin = NULL; } @@ -1106,8 +1106,7 @@ run (void *cls) plugin = TALER_EXCHANGEDB_plugin_load (cfg); if (GNUNET_OK != - plugin->create_tables (plugin->cls, - GNUNET_YES)) + plugin->create_tables (plugin->cls)) { GNUNET_break (0); TALER_EXCHANGEDB_plugin_unload (plugin); @@ -1115,8 +1114,7 @@ run (void *cls) result = 77; return; } - session = plugin->get_session (plugin->cls, - GNUNET_YES); + session = plugin->get_session (plugin->cls); GNUNET_assert (NULL != session); fake_issue (&issue); dpk.rsa_public_key = coin_pub; diff --git a/src/exchangedb/perf_taler_exchangedb_interpreter.c b/src/exchangedb/perf_taler_exchangedb_interpreter.c index 897a06eed..cb805a0b3 100644 --- a/src/exchangedb/perf_taler_exchangedb_interpreter.c +++ b/src/exchangedb/perf_taler_exchangedb_interpreter.c @@ -1369,7 +1369,7 @@ interpret (struct PERF_TALER_EXCHANGEDB_interpreter_state *state) break; case PERF_TALER_EXCHANGEDB_CMD_NEW_SESSION: - state->session = state->plugin->get_session (state->plugin->cls, GNUNET_YES); + state->session = state->plugin->get_session (state->plugin->cls); break; case PERF_TALER_EXCHANGEDB_CMD_START_TRANSACTION: @@ -1816,8 +1816,7 @@ PERF_TALER_EXCHANGEDB_interpret (struct TALER_EXCHANGEDB_Plugin *db_plugin, ret = cmd_init (cmd); if (GNUNET_SYSERR == ret) return ret; - state.session = db_plugin->get_session (db_plugin->cls, - GNUNET_YES); + state.session = db_plugin->get_session (db_plugin->cls); GNUNET_assert (NULL != state.session); ret = interpret (&state); cmd_clean (cmd); @@ -1943,8 +1942,7 @@ PERF_TALER_EXCHANGEDB_run_benchmark (const char *benchmark_name, "Error connectiong to the database\n"); return GNUNET_NO; } - ret = plugin->create_tables (plugin->cls, - GNUNET_YES); + ret = plugin->create_tables (plugin->cls); if (GNUNET_OK != ret) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, @@ -1981,10 +1979,9 @@ PERF_TALER_EXCHANGEDB_run_benchmark (const char *benchmark_name, { struct TALER_EXCHANGEDB_Session *session; - session = plugin->get_session (plugin->cls, - GNUNET_YES); - ret = plugin->drop_temporary (plugin->cls, - session); + session = plugin->get_session (plugin->cls); + ret = plugin->drop_tables (plugin->cls, + session); if (GNUNET_OK != ret) { GNUNET_log (GNUNET_ERROR_TYPE_ERROR, diff --git a/src/exchangedb/plugin_exchangedb_postgres.c b/src/exchangedb/plugin_exchangedb_postgres.c index ad5b5d982..1cc64ce4d 100644 --- a/src/exchangedb/plugin_exchangedb_postgres.c +++ b/src/exchangedb/plugin_exchangedb_postgres.c @@ -29,15 +29,6 @@ #include "plugin_exchangedb_common.c" -/** - * For testing / experiments, we set the Postgres schema to - * #TALER_TEMP_SCHEMA_NAME so we can easily purge everything - * associated with a test. We *also* should use the database - * "talercheck" instead of "taler" for testing, but we're doing - * both: better safe than sorry. - */ -#define TALER_TEMP_SCHEMA_NAME "taler_temporary" - /** * Log a query error. * @@ -138,39 +129,48 @@ struct PostgresClosure -/** - * Set the given connection to use a temporary schema - * - * @param db the database connection - * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon error - */ -static int -set_temporary_schema (PGconn *db) -{ - SQLEXEC_(db, - "CREATE SCHEMA IF NOT EXISTS " TALER_TEMP_SCHEMA_NAME ";" - "SET search_path to " TALER_TEMP_SCHEMA_NAME ";"); - return GNUNET_OK; - SQLEXEC_fail: - return GNUNET_SYSERR; -} - /** - * Drop the temporary taler schema. This is only useful for testcases + * Drop all Taler tables. This should only be used by testcases. * * @param cls the `struct PostgresClosure` with the plugin-specific state * @param session database session to use * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ static int -postgres_drop_temporary (void *cls, - struct TALER_EXCHANGEDB_Session *session) +postgres_drop_tables (void *cls, + struct TALER_EXCHANGEDB_Session *session) { GNUNET_log (GNUNET_ERROR_TYPE_INFO, - "Dropping temporary tables\n"); + "Dropping ALL tables\n"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS prewire;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS aggregation_tracking;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS deposits;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_out;"); SQLEXEC_ (session->conn, - "DROP SCHEMA " TALER_TEMP_SCHEMA_NAME " CASCADE;"); + "DROP TABLE IF EXISTS refresh_commit_coin;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_commit_link;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_order;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_melts;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS refresh_sessions;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS known_coins;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS reserves_out;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS reserves_in;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS reserves;"); + SQLEXEC_ (session->conn, + "DROP TABLE IF EXISTS denominations;"); return GNUNET_OK; SQLEXEC_fail: return GNUNET_SYSERR; @@ -215,12 +215,10 @@ pq_notice_processor_cb (void *arg, * Create the necessary tables if they are not present * * @param cls the `struct PostgresClosure` with the plugin-specific state - * @param temporary should we use a temporary schema * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ static int -postgres_create_tables (void *cls, - int temporary) +postgres_create_tables (void *cls) { struct PostgresClosure *pc = cls; PGconn *conn; @@ -239,12 +237,6 @@ postgres_create_tables (void *cls, PQsetNoticeProcessor (conn, &pq_notice_processor_cb, NULL); - if ( (GNUNET_YES == temporary) && - (GNUNET_SYSERR == set_temporary_schema (conn))) - { - PQfinish (conn); - return GNUNET_SYSERR; - } #define SQLEXEC(sql) SQLEXEC_(conn, sql); #define SQLEXEC_INDEX(sql) SQLEXEC_IGNORE_ERROR_(conn, sql); /* Denomination table for holding the publicly available information of @@ -1200,13 +1192,10 @@ db_conn_destroy (void *cls) * Connect to the db if the connection does not exist yet. * * @param cls the `struct PostgresClosure` with the plugin-specific state - * @param temporary #GNUNET_YES to use a temporary schema; #GNUNET_NO to use the - * database default one * @return the database connection, or NULL on error */ static struct TALER_EXCHANGEDB_Session * -postgres_get_session (void *cls, - int temporary) +postgres_get_session (void *cls) { struct PostgresClosure *pc = cls; PGconn *db_conn; @@ -1229,12 +1218,6 @@ postgres_get_session (void *cls, PQsetNoticeProcessor (db_conn, &pq_notice_processor_cb, NULL); - if ( (GNUNET_YES == temporary) && - (GNUNET_SYSERR == set_temporary_schema(db_conn)) ) - { - GNUNET_break (0); - return NULL; - } if (GNUNET_OK != postgres_prepare (db_conn)) { @@ -4243,7 +4226,7 @@ libtaler_plugin_exchangedb_postgres_init (void *cls) plugin = GNUNET_new (struct TALER_EXCHANGEDB_Plugin); plugin->cls = pg; plugin->get_session = &postgres_get_session; - plugin->drop_temporary = &postgres_drop_temporary; + plugin->drop_tables = &postgres_drop_tables; plugin->create_tables = &postgres_create_tables; plugin->start = &postgres_start; plugin->commit = &postgres_commit; diff --git a/src/exchangedb/test_exchangedb.c b/src/exchangedb/test_exchangedb.c index 16ee95f9c..2ef7f5d72 100644 --- a/src/exchangedb/test_exchangedb.c +++ b/src/exchangedb/test_exchangedb.c @@ -663,18 +663,27 @@ run (void *cls) result = 77; return; } + if (NULL != + (session = plugin->get_session (plugin->cls))) + { + if (GNUNET_OK != + plugin->drop_tables (plugin->cls, + session)) + { + result = 77; + goto drop; + } + } if (GNUNET_OK != - plugin->create_tables (plugin->cls, - GNUNET_YES)) + plugin->create_tables (plugin->cls)) { result = 77; goto drop; } if (NULL == - (session = plugin->get_session (plugin->cls, - GNUNET_YES))) + (session = plugin->get_session (plugin->cls))) { - result = 3; + result = 77; goto drop; } RND_BLK (&reserve_pub); @@ -934,8 +943,8 @@ run (void *cls) rh = NULL; if (NULL != session) GNUNET_break (GNUNET_OK == - plugin->drop_temporary (plugin->cls, - session)); + plugin->drop_tables (plugin->cls, + session)); if (NULL != dkp) destroy_denom_key_pair (dkp); if (NULL != cbc.sig.rsa_signature) diff --git a/src/include/taler_exchangedb_plugin.h b/src/include/taler_exchangedb_plugin.h index 45553634c..ebcfe3757 100644 --- a/src/include/taler_exchangedb_plugin.h +++ b/src/include/taler_exchangedb_plugin.h @@ -717,36 +717,31 @@ struct TALER_EXCHANGEDB_Plugin * Connect to the db if the connection does not exist yet. * * @param cls the @e cls of this struct with the plugin-specific state - * @param temporary #GNUNET_YES to use a temporary schema; #GNUNET_NO to use the - * database default one * @param the database connection, or NULL on error */ struct TALER_EXCHANGEDB_Session * - (*get_session) (void *cls, - int temporary); + (*get_session) (void *cls); /** - * Drop the temporary taler schema. This is only useful for testcases. + * Drop the Taler tables. This should only be used in testcases. * * @param cls the @e cls of this struct with the plugin-specific state * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ int - (*drop_temporary) (void *cls, - struct TALER_EXCHANGEDB_Session *db); + (*drop_tables) (void *cls, + struct TALER_EXCHANGEDB_Session *db); /** * Create the necessary tables if they are not present * * @param cls the @e cls of this struct with the plugin-specific state - * @param temporary should we use a temporary schema * @return #GNUNET_OK upon success; #GNUNET_SYSERR upon failure */ int - (*create_tables) (void *cls, - int temporary); + (*create_tables) (void *cls); /** -- cgit v1.2.3