From f5b73b342b4a6cae1bb15340e5da7330e29319c1 Mon Sep 17 00:00:00 2001 From: Paul J Stevens Date: Sat, 5 Mar 2016 18:43:12 +0100 Subject: [PATCH 06/33] simplify log_query_time duration logic --- src/dm_db.c | 16 ++++++++-------- src/dm_misc.c | 12 ++++++++++++ src/dm_misc.h | 2 ++ test/check_dbmail_db.c | 27 +++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git src/dm_db.c src/dm_db.c index bfe9601..429d0ae 100644 --- src/dm_db.c +++ src/dm_db.c @@ -354,14 +354,14 @@ void db_con_clear(Connection_T c) void log_query_time(char *query, struct timeval before, struct timeval after) { - double elapsed = ((double)after.tv_sec + ((double)after.tv_usec / 1000000)) - ((double)before.tv_sec + ((double)before.tv_usec / 1000000)); - TRACE(TRACE_DATABASE, "last query took [%.3f] seconds", elapsed); - if (elapsed > (double)db_params.query_time_warning) - TRACE(TRACE_WARNING, "slow query [%s] took [%.3f] seconds", query, elapsed); - else if (elapsed > (double)db_params.query_time_notice) - TRACE(TRACE_NOTICE, "slow query [%s] took [%.3f] seconds", query, elapsed); - else if (elapsed > (double)db_params.query_time_info) - TRACE(TRACE_INFO, "slow query [%s] took [%.3f] seconds", query, elapsed); + unsigned int elapsed = (unsigned int)diff_time(before, after); + TRACE(TRACE_DATABASE, "last query took [%d] seconds", elapsed); + if (elapsed > db_params.query_time_warning) + TRACE(TRACE_WARNING, "slow query [%s] took [%d] seconds", query, elapsed); + else if (elapsed > db_params.query_time_notice) + TRACE(TRACE_NOTICE, "slow query [%s] took [%d] seconds", query, elapsed); + else if (elapsed > db_params.query_time_info) + TRACE(TRACE_INFO, "slow query [%s] took [%d] seconds", query, elapsed); return; } diff --git src/dm_misc.c src/dm_misc.c index 1294930..e27ef34 100644 --- src/dm_misc.c +++ src/dm_misc.c @@ -2422,4 +2422,16 @@ void uint64_free(void *data) mempool_push(small_pool, data, sizeof(uint64_t)); } +/* + * calculate the difference between two timeval values + * as number of seconds, using default rounding + */ +int diff_time(struct timeval before, struct timeval after) +{ + int tbefore = before.tv_sec * 1000000 + before.tv_usec; + int tafter = after.tv_sec * 1000000 + after.tv_usec; + int tdiff = tafter - tbefore; + return (int)rint((double)tdiff/1000000); +} + diff --git src/dm_misc.h src/dm_misc.h index a5dd04f..9660dfa 100644 --- src/dm_misc.h +++ src/dm_misc.h @@ -178,4 +178,6 @@ gchar * get_crlf_encoded_opt(const gchar *string, int dots); void strip_crlf(char *buffer); void uint64_free(void *); +int diff_time(struct timeval before, struct timeval after); + #endif diff --git test/check_dbmail_db.c test/check_dbmail_db.c index 47c34be..e6cb170 100644 --- test/check_dbmail_db.c +++ test/check_dbmail_db.c @@ -414,6 +414,32 @@ START_TEST(test_db_get_sql) } END_TEST +START_TEST(test_diff_time) +{ + struct timeval before, after; + int diff; + + before.tv_sec = 1; before.tv_usec = 0; + after.tv_sec = 2; after.tv_usec = 0; + diff = diff_time(before, after); + fail_unless(diff == 1); + + before.tv_sec = 1; before.tv_usec = 1000000 - 1; + after.tv_sec = 2; after.tv_usec = 0; + diff = diff_time(before, after); + fail_unless(diff == 0); + + before.tv_sec = 1; before.tv_usec = 500001; + after.tv_sec = 2; after.tv_usec = 0; + diff = diff_time(before, after); + fail_unless(diff == 0); + + before.tv_sec = 1; before.tv_usec = 499999; + after.tv_sec = 2; after.tv_usec = 0; + diff = diff_time(before, after); + fail_unless(diff == 1); +} +END_TEST Suite *dbmail_db_suite(void) { @@ -435,6 +461,7 @@ Suite *dbmail_db_suite(void) tcase_add_test(tc_db, test_mailbox_match_new); tcase_add_test(tc_db, test_db_findmailbox_by_regex); tcase_add_test(tc_db, test_db_get_sql); + tcase_add_test(tc_db, test_diff_time); return s; } -- 2.10.1 (Apple Git-78)