#include <mysql/mysql.h>
-#define DEBUG_DHTLOG GNUNET_NO
+#define DEBUG_DHTLOG GNUNET_YES
/**
* Maximum number of supported parameters for a prepared
*/
static MYSQL *conn;
-#define INSERT_QUERIES_STMT "INSERT INTO queries (trialuid, querytype, hops, dhtkeyuid, dhtqueryid, succeeded, nodeuid) "\
- "VALUES (?, ?, ?, ?, ?, ?, ?)"
+#define INSERT_QUERIES_STMT "INSERT INTO queries (trialuid, querytype, hops, dhtkeyuid, dhtqueryid, succeeded, nodeuid, time) "\
+ "VALUES (?, ?, ?, ?, ?, ?, ?, NOW())"
static struct StatementHandle *insert_query;
#define INSERT_ROUTES_STMT "INSERT INTO routes (trialuid, querytype, hops, dhtkeyuid, dhtqueryid, succeeded, nodeuid, from_node, to_node) "\
"VALUES (?, ?, ?)"
static struct StatementHandle *insert_node;
+#define INSERT_ROUNDS_STMT "INSERT INTO rounds (trialuid, round_type, round_count, starttime) "\
+ "VALUES (?, ?, ?, NOW())"
+
+static struct StatementHandle *insert_round;
+
+#define INSERT_ROUND_DETAILS_STMT "INSERT INTO rounds (trialuid, round_type, round_count, starttime, endtime, num_messages, num_messages_succeeded) "\
+ "VALUES (?, ?, ?, NOW(), NOW(), ?, ?)"
+
+static struct StatementHandle *insert_round_details;
+
#define INSERT_TRIALS_STMT "INSERT INTO trials"\
- "(starttime, numnodes, topology,"\
+ "(starttime, other_trial_identifier, numnodes, topology,"\
"topology_percentage, topology_probability,"\
"blacklist_topology, connect_topology, connect_topology_option,"\
"connect_topology_option_modifier, puts, gets, "\
"malicious_putters, malicious_droppers, malicious_get_frequency,"\
"malicious_put_frequency, stop_closest, stop_found, strict_kademlia, "\
"gets_succeeded, message) "\
- "VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
+ "VALUES (NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
static struct StatementHandle *insert_trial;
return GNUNET_SYSERR;
if (MRUNS ("CREATE TABLE IF NOT EXISTS `trials` ("
- "`trialuid` int(10) unsigned NOT NULL auto_increment,"
- "`numnodes` int(10) unsigned NOT NULL,"
- "`topology` int(10) NOT NULL,"
- "`starttime` datetime NOT NULL,"
- "`endtime` datetime NOT NULL,"
- "`puts` int(10) unsigned NOT NULL,"
- "`gets` int(10) unsigned NOT NULL,"
- "`concurrent` int(10) unsigned NOT NULL,"
- "`settle_time` int(10) unsigned NOT NULL,"
- "`totalConnections` int(10) unsigned NOT NULL,"
- "`message` text NOT NULL,"
- "`num_rounds` int(10) unsigned NOT NULL,"
- "`malicious_getters` int(10) unsigned NOT NULL,"
- "`malicious_putters` int(10) unsigned NOT NULL,"
- "`malicious_droppers` int(10) unsigned NOT NULL,"
- "`totalMessagesDropped` int(10) unsigned NOT NULL,"
- "`totalBytesDropped` int(10) unsigned NOT NULL,"
- "`topology_modifier` double NOT NULL,"
- "`logNMultiplier` double NOT NULL,"
- "`maxnetbps` bigint(20) unsigned NOT NULL,"
- "`unknownPeers` int(10) unsigned NOT NULL,"
- "PRIMARY KEY (`trialuid`),"
- "UNIQUE KEY `trialuid` (`trialuid`)"
- ") ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"))
+ "`trialuid` int(10) unsigned NOT NULL auto_increment,"
+ "`other_trial_identifier` int(10) unsigned NOT NULL default '0',"
+ "`numnodes` int(10) unsigned NOT NULL,"
+ "`topology` int(10) NOT NULL,"
+ "`blacklist_topology` int(11) NOT NULL,"
+ "`connect_topology` int(11) NOT NULL,"
+ "`connect_topology_option` int(11) NOT NULL,"
+ "`topology_percentage` float NOT NULL,"
+ "`topology_probability` float NOT NULL,"
+ "`connect_topology_option_modifier` float NOT NULL,"
+ "`starttime` datetime NOT NULL,"
+ "`endtime` datetime NOT NULL,"
+ "`puts` int(10) unsigned NOT NULL,"
+ "`gets` int(10) unsigned NOT NULL,"
+ "`concurrent` int(10) unsigned NOT NULL,"
+ "`settle_time` int(10) unsigned NOT NULL,"
+ "`totalConnections` int(10) unsigned NOT NULL,"
+ "`message` text NOT NULL,"
+ "`num_rounds` int(10) unsigned NOT NULL,"
+ "`malicious_getters` int(10) unsigned NOT NULL,"
+ "`malicious_putters` int(10) unsigned NOT NULL,"
+ "`malicious_droppers` int(10) unsigned NOT NULL,"
+ "`topology_modifier` double NOT NULL,"
+ "`malicious_get_frequency` int(10) unsigned NOT NULL,"
+ "`malicious_put_frequency` int(10) unsigned NOT NULL,"
+ "`stop_closest` int(10) unsigned NOT NULL,"
+ "`stop_found` int(10) unsigned NOT NULL,"
+ "`strict_kademlia` int(10) unsigned NOT NULL,"
+ "`gets_succeeded` int(10) unsigned NOT NULL,"
+ "PRIMARY KEY (`trialuid`),"
+ "UNIQUE KEY `trialuid` (`trialuid`)"
+ ") ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1"))
return GNUNET_SYSERR;
if (MRUNS ("CREATE TABLE IF NOT EXISTS `topology` ("
if (PINIT (insert_query, INSERT_QUERIES_STMT) ||
PINIT (insert_route, INSERT_ROUTES_STMT) ||
PINIT (insert_trial, INSERT_TRIALS_STMT) ||
+ PINIT (insert_round, INSERT_ROUNDS_STMT) ||
+ PINIT (insert_round, INSERT_ROUND_DETAILS_STMT) ||
PINIT (insert_stat, INSERT_STAT_STMT) ||
PINIT (insert_generic_stat, INSERT_GENERIC_STAT_STMT) ||
PINIT (insert_node, INSERT_NODES_STMT) ||
/**
* Run a prepared SELECT statement.
*
- * @param result_size number of elements in results array
+ * @param s handle to the statement we should execute
+ * @param result_size number of results in set
* @param results pointer to already initialized MYSQL_BIND
* array (of sufficient size) for passing results
* @param processor function to call on each result
* @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
* values (size + buffer-reference for pointers); terminated
* with "-1"
+ *
* @return GNUNET_SYSERR on error, otherwise
* the number of successfully affected (or queried) rows
*/
int
-prepared_statement_run_select (struct StatementHandle
- *s, unsigned int result_size,
+prepared_statement_run_select (struct StatementHandle *s,
+ unsigned int result_size,
MYSQL_BIND * results,
GNUNET_MysqlDataProcessor
processor, void *processor_cls,
rbind[0].buffer = dhtkeyuid;
GNUNET_CRYPTO_hash_to_enc (key, &encKey);
k_len = strlen ((char *) &encKey);
-
+#if DEBUG_DHTLOG
+ GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Searching for dhtkey `%s' in trial %llu\n", GNUNET_h2s(key), current_trial);
+#endif
if ((GNUNET_OK !=
prepared_statement_run_select (get_dhtkeyuid,
1,
/**
* Run a prepared statement that does NOT produce results.
*
+ * @param s handle to the statement we should execute
+ * @param insert_id NULL or address where to store the row ID of whatever
+ * was inserted (only for INSERT statements!)
* @param ... pairs and triplets of "MYSQL_TYPE_XXX" keys and their respective
* values (size + buffer-reference for pointers); terminated
* with "-1"
- * @param insert_id NULL or address where to store the row ID of whatever
- * was inserted (only for INSERT statements!)
+ *
* @return GNUNET_SYSERR on error, otherwise
* the number of successfully affected rows
*/
/*
* Inserts the specified trial into the dhttests.trials table
*
- * @param trialuid return the trialuid of the newly inserted trial
- * @param num_nodes how many nodes are in the trial
- * @param topology integer representing topology for this trial
- * @param blacklist_topology integer representing blacklist topology for this trial
- * @param connect_topology integer representing connect topology for this trial
- * @param connect_topology_option integer representing connect topology option
- * @param connect_topology_option_modifier float to modify connect option
- * @param topology_percentage percentage modifier for certain topologies
- * @param topology_probability probability modifier for certain topologies
- * @param puts number of puts to perform
- * @param gets number of gets to perform
- * @param concurrent number of concurrent requests
- * @param settle_time time to wait between creating topology and starting testing
- * @param num_rounds number of times to repeat the trial
- * @param malicious_getters number of malicious GET peers in the trial
- * @param malicious_putters number of malicious PUT peers in the trial
- * @param malicious_droppers number of malicious DROP peers in the trial
- * @param malicious_get_frequency how often malicious gets are sent
- * @param malicious_put_frequency how often malicious puts are sent
- * @param stop_closest stop forwarding PUTs if closest node found
- * @param stop_found stop forwarding GETs if data found
- * @param strict_kademlia test used kademlia routing algorithm
- * @param gets_succeeded how many gets did the test driver report success on
- * @param message string to put into DB for this trial
+ * @param trial_info struct containing the data to insert about this trial
*
* @return GNUNET_OK on success, GNUNET_SYSERR on failure
*/
-int add_trial (unsigned long long *trialuid, unsigned int num_nodes, unsigned int topology,
- unsigned int blacklist_topology, unsigned int connect_topology,
- unsigned int connect_topology_option, float connect_topology_option_modifier,
- float topology_percentage, float topology_probability,
- unsigned int puts, unsigned int gets, unsigned int concurrent, unsigned int settle_time,
- unsigned int num_rounds, unsigned int malicious_getters, unsigned int malicious_putters,
- unsigned int malicious_droppers, unsigned int malicious_get_frequency,
- unsigned int malicious_put_frequency, unsigned int stop_closest, unsigned int stop_found,
- unsigned int strict_kademlia, unsigned int gets_succeeded,
- char *message)
+int add_trial (struct GNUNET_DHTLOG_TrialInfo *trial_info)
{
MYSQL_STMT *stmt;
int ret;
unsigned long long m_len;
- m_len = strlen (message);
+ m_len = strlen (trial_info->message);
stmt = mysql_stmt_init(conn);
if (GNUNET_OK !=
- (ret = prepared_statement_run (insert_trial, trialuid,
- MYSQL_TYPE_LONG, &num_nodes, GNUNET_YES,
- MYSQL_TYPE_LONG, &topology, GNUNET_YES,
- MYSQL_TYPE_FLOAT, &topology_percentage,
- MYSQL_TYPE_FLOAT, &topology_probability,
- MYSQL_TYPE_LONG, &blacklist_topology, GNUNET_YES,
- MYSQL_TYPE_LONG, &connect_topology, GNUNET_YES,
- MYSQL_TYPE_LONG, &connect_topology_option, GNUNET_YES,
- MYSQL_TYPE_FLOAT, &connect_topology_option_modifier,
- MYSQL_TYPE_LONG, &puts, GNUNET_YES,
- MYSQL_TYPE_LONG, &gets, GNUNET_YES,
- MYSQL_TYPE_LONG, &concurrent, GNUNET_YES,
- MYSQL_TYPE_LONG, &settle_time, GNUNET_YES,
- MYSQL_TYPE_LONG, &num_rounds, GNUNET_YES,
- MYSQL_TYPE_LONG, &malicious_getters, GNUNET_YES,
- MYSQL_TYPE_LONG, &malicious_putters, GNUNET_YES,
- MYSQL_TYPE_LONG, &malicious_droppers, GNUNET_YES,
- MYSQL_TYPE_LONG, &malicious_get_frequency, GNUNET_YES,
- MYSQL_TYPE_LONG, &malicious_put_frequency, GNUNET_YES,
- MYSQL_TYPE_LONG, &stop_closest, GNUNET_YES,
- MYSQL_TYPE_LONG, &stop_found, GNUNET_YES,
- MYSQL_TYPE_LONG, &strict_kademlia, GNUNET_YES,
- MYSQL_TYPE_LONG, &gets_succeeded, GNUNET_YES,
- MYSQL_TYPE_BLOB, message, max_varchar_len +
+ (ret = prepared_statement_run (insert_trial, ¤t_trial,
+ MYSQL_TYPE_LONG, &trial_info->other_identifier, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->num_nodes, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->topology, GNUNET_YES,
+ MYSQL_TYPE_FLOAT, &trial_info->topology_percentage,
+ MYSQL_TYPE_FLOAT, &trial_info->topology_probability,
+ MYSQL_TYPE_LONG, &trial_info->blacklist_topology, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->connect_topology, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->connect_topology_option, GNUNET_YES,
+ MYSQL_TYPE_FLOAT, &trial_info->connect_topology_option_modifier,
+ MYSQL_TYPE_LONG, &trial_info->puts, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->gets, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->concurrent, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->settle_time, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->num_rounds, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->malicious_getters, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->malicious_putters, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->malicious_droppers, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->malicious_get_frequency, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->malicious_put_frequency, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->stop_closest, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->stop_found, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->strict_kademlia, GNUNET_YES,
+ MYSQL_TYPE_LONG, &trial_info->gets_succeeded, GNUNET_YES,
+ MYSQL_TYPE_BLOB, trial_info->message, max_varchar_len +
max_varchar_len, &m_len,
-1)))
{
return GNUNET_OK;
}
+/*
+ * Inserts the specified round into the dhttests.rounds table
+ *
+ * @param round_type the type of round that is being started
+ * @param round_count counter for the round (if applicable)
+ *
+ * @return GNUNET_OK on success, GNUNET_SYSERR on failure
+ */
+int add_round (unsigned int round_type, unsigned int round_count)
+{
+
+ MYSQL_STMT *stmt;
+ int ret;
+
+ stmt = mysql_stmt_init(conn);
+ ret = prepared_statement_run (insert_round,
+ NULL,
+ MYSQL_TYPE_LONGLONG, ¤t_trial, GNUNET_YES,
+ MYSQL_TYPE_LONG, &round_type, GNUNET_YES,
+ MYSQL_TYPE_LONG, &round_count, GNUNET_YES, -1);
+ mysql_stmt_close(stmt);
+ if (ret != GNUNET_OK)
+ return GNUNET_SYSERR;
+ return ret;
+}
+
+/*
+ * Inserts the specified round results into the
+ * dhttests.processed_round_details table
+ *
+ * @param round_type the type of round that is being started
+ * @param round_count counter for the round (if applicable)
+ * @param num_messages the total number of messages initiated
+ * @param num_messages_succeeded the number of messages that succeeded
+ *
+ * @return GNUNET_OK on success, GNUNET_SYSERR on failure
+ */
+int add_round_details (unsigned int round_type, unsigned int round_count,
+ unsigned int num_messages, unsigned int num_messages_succeeded)
+{
+ MYSQL_STMT *stmt;
+ int ret;
+
+ stmt = mysql_stmt_init(conn);
+ ret = prepared_statement_run (insert_round_details,
+ NULL,
+ MYSQL_TYPE_LONGLONG, ¤t_trial, GNUNET_YES,
+ MYSQL_TYPE_LONG, &round_type, GNUNET_YES,
+ MYSQL_TYPE_LONG, &round_count, GNUNET_YES,
+ MYSQL_TYPE_LONG, &num_messages, GNUNET_YES,
+ MYSQL_TYPE_LONG, &num_messages_succeeded, GNUNET_YES,
+ -1);
+ mysql_stmt_close(stmt);
+ if (ret != GNUNET_OK)
+ return GNUNET_SYSERR;
+ return ret;
+}
/*
* Inserts the specified stats into the dhttests.node_statistics table
return GNUNET_OK;
}
else if (ret == GNUNET_SYSERR)
- return GNUNET_SYSERR;
+ {
+#if DEBUG_DHTLOG
+ GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Failed to get dhtkeyuid!\n");
+#endif
+ }
if (GNUNET_OK !=
(ret = prepared_statement_run (insert_dhtkey,
/*
* Update dhttests.trials table with current server time as end time
*
- * @param trialuid trial to update
* @param gets_succeeded how many gets did the testcase report as successful
*
* @return GNUNET_OK on success, GNUNET_SYSERR on failure.
*/
int
-update_trials (unsigned long long trialuid,
- unsigned int gets_succeeded)
+update_trials (unsigned int gets_succeeded)
{
int ret;
(ret = prepared_statement_run (update_trial,
NULL,
MYSQL_TYPE_LONG, &gets_succeeded, GNUNET_YES,
- MYSQL_TYPE_LONGLONG, &trialuid, GNUNET_YES,
+ MYSQL_TYPE_LONGLONG, ¤t_trial, GNUNET_YES,
-1)))
{
if (ret == GNUNET_SYSERR)
/*
* Update dhttests.trials table with total connections information
*
- * @param trialuid the trialuid to update
* @param totalConnections the number of connections
*
* @return GNUNET_OK on success, GNUNET_SYSERR on failure.
*/
int
-add_connections (unsigned long long trialuid, unsigned int totalConnections)
+add_connections (unsigned int totalConnections)
{
int ret;
&totalConnections,
GNUNET_YES,
MYSQL_TYPE_LONGLONG,
- &trialuid, GNUNET_YES, -1)))
+ ¤t_trial, GNUNET_YES, -1)))
{
if (ret == GNUNET_SYSERR)
{
if (from_node != NULL)
get_node_uid (&from_uid, &from_node->hashPubKey);
- else
- from_uid = 0;
if (to_node != NULL)
get_node_uid (&to_uid, &to_node->hashPubKey);
}
if (ret > 0)
return GNUNET_OK;
- else
- return GNUNET_SYSERR;
- return GNUNET_OK;
+ return GNUNET_SYSERR;
+
}
/*
if (GNUNET_OK !=
(ret = prepared_statement_run (insert_topology,
NULL,
- MYSQL_TYPE_LONGLONG,
- ¤t_trial,
- GNUNET_YES,
- MYSQL_TYPE_LONG,
- &num_connections,
- GNUNET_YES, -1)))
+ MYSQL_TYPE_LONGLONG, ¤t_trial, GNUNET_YES,
+ MYSQL_TYPE_LONG, &num_connections, GNUNET_YES,
+ -1)))
{
if (ret == GNUNET_SYSERR)
{
}
if (ret > 0)
return GNUNET_OK;
- else
- return GNUNET_SYSERR;
- return GNUNET_OK;
+ return GNUNET_SYSERR;
}
/*
}
if (ret > 0)
return GNUNET_OK;
- else
- return GNUNET_SYSERR;
- return GNUNET_OK;
+ return GNUNET_SYSERR;
}
plugin->dhtlog_api = GNUNET_malloc(sizeof(struct GNUNET_DHTLOG_Handle));
plugin->dhtlog_api->insert_trial = &add_trial;
plugin->dhtlog_api->insert_stat = &add_stat;
+ plugin->dhtlog_api->insert_round = &add_round;
+ plugin->dhtlog_api->insert_round_details = &add_round_details;
plugin->dhtlog_api->add_generic_stat = &add_generic_stat;
plugin->dhtlog_api->insert_query = &add_query;
plugin->dhtlog_api->update_trial = &update_trials;
prepared_statement_close(insert_query);
prepared_statement_close(insert_route);
prepared_statement_close(insert_trial);
+ prepared_statement_close(insert_round);
+ prepared_statement_close(insert_round_details);
prepared_statement_close(insert_node);
prepared_statement_close(insert_dhtkey);
prepared_statement_close(update_trial);