From 505e12b0e2ae1918ca53c58cd74802c19edd5818 Mon Sep 17 00:00:00 2001 From: "Ruslan (The BadAss SysMan) Laishev" <ruslan.laishev@demlabs.net> Date: Tue, 15 Mar 2022 13:55:02 +0300 Subject: [PATCH] A small refactoring to reduce diagnostic output. Added new configuration option in the section "resources": dap_global_db_track_history=true|false (default is false) dap_common.h: Added new macro debug_if(cond, log_level, format, ...) is supposed to be used instead of giant construction like: if ( debug_flag ) log_it(L_DEBUG, "bla-bla-bla"); --- dap-sdk/core/include/dap_common.h | 6 +- modules/global-db/dap_chain_global_db.c | 57 +++++++++++-------- .../global-db/dap_chain_global_db_driver.c | 27 ++++----- .../dap_chain_global_db_driver_cdb.c | 7 +-- .../dap_chain_global_db_driver_sqlite.c | 3 +- .../include/dap_chain_global_db_driver.h | 2 +- .../include/dap_chain_global_db_driver_cdb.h | 2 +- .../dap_chain_global_db_driver_sqlite.h | 2 +- 8 files changed, 57 insertions(+), 49 deletions(-) diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h index 7e4f3c69e8..6dcdcd59b2 100755 --- a/dap-sdk/core/include/dap_common.h +++ b/dap-sdk/core/include/dap_common.h @@ -280,7 +280,7 @@ typedef int dap_spinlock_t; * @brief The log_level enum */ -typedef enum dap_log_level { +typedef enum dap_log_level { L_DEBUG = 0, L_INFO = 1, @@ -289,7 +289,7 @@ typedef enum dap_log_level { L_DAP = 4, L_WARNING = 5, L_ATT = 6, - L_ERROR = 7, + L_ERROR = 7, L_CRITICAL = 8, L_TOTAL, @@ -454,6 +454,8 @@ char *dap_log_get_item(time_t a_start_time, int a_limit); DAP_PRINTF_ATTR(3, 4) void _log_it( const char * log_tag, enum dap_log_level, const char * format, ... ); #define log_it( _log_level, ...) _log_it( LOG_TAG, _log_level, ##__VA_ARGS__) +#define debug_if( flg, lvl, ...) _log_it( ((flg) ? LOG_TAG : NULL), (lvl), ##__VA_ARGS__) + const char * log_error(void); void dap_log_level_set(enum dap_log_level ll); diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c index e874bb9723..1f630e4409 100644 --- a/modules/global-db/dap_chain_global_db.c +++ b/modules/global-db/dap_chain_global_db.c @@ -76,9 +76,12 @@ typedef struct sync_group_item // Tacked group callbacks static sync_group_item_t *s_sync_group_items = NULL; static sync_group_item_t *s_sync_group_extra_items = NULL; -static bool s_track_history = false; -static bool s_db_drvmode_async = false; +static int s_track_history = 0; + +int s_db_drvmode_async , /* Set a kind of processing requests to DB: + <> 0 - Async mode should be used */ + s_dap_global_db_debug_more; /* Enable extensible debug output */ /** * @brief Adds a group name for synchronization. @@ -153,16 +156,16 @@ dap_list_t *dap_chain_db_get_sync_extra_groups() * @param obj a pointer to the structure * @return (none) */ -void dap_chain_global_db_obj_clean(dap_global_db_obj_t *obj) +void dap_chain_global_db_obj_clean(dap_global_db_obj_t *a_obj) { - if(!obj) + if(!a_obj) return; - DAP_DELETE(obj->key); - DAP_DELETE(obj->value); + DAP_DELETE(a_obj->key); + DAP_DELETE(a_obj->value); - obj->key = NULL; - obj->value = NULL; + a_obj->key = NULL; + a_obj->value = NULL; } /** @@ -170,10 +173,10 @@ void dap_chain_global_db_obj_clean(dap_global_db_obj_t *obj) * @param obj a pointer to the object * @return (none) */ -void dap_chain_global_db_obj_delete(dap_global_db_obj_t *obj) +void dap_chain_global_db_obj_delete(dap_global_db_obj_t *a_obj) { - dap_chain_global_db_obj_clean(obj); - DAP_DELETE(obj); + dap_chain_global_db_obj_clean(a_obj); + DAP_DELETE(a_obj); } /** @@ -213,14 +216,18 @@ int dap_chain_global_db_init(dap_config_t * g_config) s_db_drvmode_async = dap_config_get_item_bool(g_config, "resources", "dap_global_db_drvmode_async"); log_it(L_NOTICE,"DB Driver Async mode: %s", s_db_drvmode_async ? "ON": "OFF"); + s_dap_global_db_debug_more = dap_config_get_item_bool(g_config, "resources", "dap_global_db_drvmode_async"); + + //debug_if(s_dap_global_db_debug_more, L_DEBUG, "Just a test for %d", 135); + lock(); - int res = dap_db_driver_init(l_driver_name, l_storage_path, s_db_drvmode_async); + int res = dap_db_driver_init(l_driver_name, l_storage_path); unlock(); if( res != 0 ) log_it(L_CRITICAL, "Hadn't initialized db driver \"%s\" on path \"%s\"", l_driver_name, l_storage_path); else - log_it(L_NOTICE,"GlobalDB initialized"); + log_it(L_NOTICE, "GlobalDB initialized"); return res; } @@ -232,35 +239,39 @@ int dap_chain_global_db_init(dap_config_t * g_config) */ void dap_chain_global_db_deinit(void) { +sync_group_item_t *l_item = NULL, *l_item_tmp = NULL, + *l_add_item = NULL, *l_add_item_tmp = NULL; + lock(); dap_db_driver_deinit(); - //dap_db_deinit(); unlock(); - sync_group_item_t * l_item = NULL, *l_item_tmp = NULL; + HASH_ITER(hh, s_sync_group_items, l_item, l_item_tmp) { DAP_DELETE(l_item->group_name_for_history); DAP_DELETE(l_item); } - sync_group_item_t * l_add_item = NULL, *l_add_item_tmp = NULL; + HASH_ITER(hh, s_sync_group_extra_items, l_add_item, l_add_item_tmp) { DAP_DELETE(l_add_item->group_mask); DAP_DELETE(l_add_item->group_name_for_history); DAP_DELETE(l_add_item); } - s_sync_group_items = NULL; + s_sync_group_items = NULL; } /** * @brief Flushes a database cahce to disk. * @return 0 */ -int dap_chain_global_db_flush(void){ +int dap_chain_global_db_flush(void) +{ lock(); int res = dap_db_driver_flush(); unlock(); + return res; } @@ -303,11 +314,11 @@ dap_store_obj_t* dap_chain_global_db_obj_gr_get(const char *a_key, size_t *a_dat /** * @brief Gets an object value from database by a_key and a_group. - * + * * @param a_key an object key string * @param a_data_len_out a length of values that were gotten * @param a_group a group name string - * @return If successful, returns a pointer to the object value. + * @return If successful, returns a pointer to the object value. */ uint8_t * dap_chain_global_db_gr_get(const char *a_key, size_t *a_data_len_out, const char *a_group) { @@ -346,7 +357,7 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_len_out) * @param a_timestamp an object time stamp * @return True if successful, false otherwise. */ -static bool global_db_gr_del_add(const char *a_key, const char *a_group, time_t a_timestamp) +static int global_db_gr_del_add(const char *a_key, const char *a_group, time_t a_timestamp) { dap_store_obj_t store_data = {0}; char l_group[DAP_DB_K_MAXGRPLEN]; @@ -372,7 +383,7 @@ int l_res = 0; * @param a_group a group name string, for example "kelvin-testnet.nodes" * @return If successful, returns true; otherwise, false. */ -static bool global_db_gr_del_del(const char *a_key, const char *a_group) +static int global_db_gr_del_del(const char *a_key, const char *a_group) { dap_store_obj_t store_data = {0}; char l_group[DAP_DB_K_MAXGRPLEN]; @@ -386,7 +397,7 @@ int l_res = 0; store_data.group = l_group; lock(); - if(dap_chain_global_db_driver_is(store_data.group, store_data.key)) + if ( dap_chain_global_db_driver_is(store_data.group, store_data.key) ) l_res = dap_chain_global_db_driver_delete(&store_data, 1); unlock(); diff --git a/modules/global-db/dap_chain_global_db_driver.c b/modules/global-db/dap_chain_global_db_driver.c index d3157eee24..8182bb9ebf 100644 --- a/modules/global-db/dap_chain_global_db_driver.c +++ b/modules/global-db/dap_chain_global_db_driver.c @@ -24,6 +24,8 @@ * MODIFICATION HISTORY: * * 24-FEB-2022 RRL Added Async I/O functionality for DB request processing + * + * 15-MAR-2022 RRL Some cosmetic changes to reduce a diagnostic output. */ #include <stddef.h> @@ -58,8 +60,9 @@ static char s_used_driver [32]; /* N static dap_db_driver_callbacks_t s_drv_callback; /* A set of interface routines for the selected DB Driver at startup time */ -static int s_db_drvmode_async = 0; /* Set a kind of processing requests to DB: +extern int s_db_drvmode_async , /* Set a kind of processing requests to DB: <> 0 - Async mode should be used */ + s_dap_global_db_debug_more; /* Enable extensible debug output */ static pthread_mutex_t s_db_reqs_list_lock = PTHREAD_MUTEX_INITIALIZER; /* Lock to coordinate access to the <s_db_reqs_queue> */ static dap_slist_t s_db_reqs_list = {0}; /* A queue of request to DB - maintained in */ @@ -71,11 +74,9 @@ static dap_slist_t s_db_reqs_list = {0}; /* A * @param driver_name a string determining a type of database driver: * "Ñdb", "sqlite" ("sqlite3") or "pgsql" * @param a_filename_db a path to a database file - * @param db_drvmode_async a flag to switch DB Engine to "Async" mode * @return Returns 0, if successful; otherwise <0. */ -int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db, - bool db_drvmode_async) +int dap_db_driver_init(const char *a_driver_name, const char *a_filename_db) { int l_ret = -1; @@ -85,7 +86,7 @@ int l_ret = -1; // Fill callbacks with zeros memset(&s_drv_callback, 0, sizeof(dap_db_driver_callbacks_t)); - if ( (s_db_drvmode_async = db_drvmode_async) ) /* Set a kind of processing requests to DB: <> 0 - Async mode should be used */ + if ( s_db_drvmode_async ) /* Set a kind of processing requests to DB: <> 0 - Async mode should be used */ { s_db_reqs_list.head = s_db_reqs_list.tail = NULL; s_db_reqs_list.nr = 0; @@ -104,9 +105,9 @@ int l_ret = -1; if(!dap_strcmp(s_used_driver, "ldb")) l_ret = -1; else if(!dap_strcmp(s_used_driver, "sqlite") || !dap_strcmp(s_used_driver, "sqlite3") ) - l_ret = dap_db_driver_sqlite_init(l_db_path_ext, &s_drv_callback, db_drvmode_async); + l_ret = dap_db_driver_sqlite_init(l_db_path_ext, &s_drv_callback); else if(!dap_strcmp(s_used_driver, "cdb")) - l_ret = dap_db_driver_cdb_init(l_db_path_ext, &s_drv_callback, db_drvmode_async); + l_ret = dap_db_driver_cdb_init(l_db_path_ext, &s_drv_callback); #ifdef DAP_CHAIN_GDB_ENGINE_MDBX else if(!dap_strcmp(s_used_driver, "mdbx")) @@ -131,12 +132,12 @@ void dap_db_driver_deinit(void) { log_it(L_NOTICE, "DeInit for %s ...", s_used_driver); - if ( s_db_drvmode_async ) /* Let's finishing outstanding DB request ... */ + if ( s_db_drvmode_async ) /* Let's finishing outstanding DB request ... */ { for ( int i = 7; i-- && s_db_reqs_list.nr; ) { log_it(L_WARNING, "Let's finished outstanding DB requests (%d) ... ", s_db_reqs_list.nr); - for ( int j = 3; (j = sleep(j)); ); /* Hibernate for 3 seconds ... */ + for ( int j = 3; (j = sleep(j)); ); /* Hibernate for 3 seconds ... */ } log_it(L_INFO, "Number of outstanding DB requests: %d", s_db_reqs_list.nr); @@ -254,7 +255,7 @@ dap_store_obj_t *l_store_obj_cur; if(!a_store_obj || !a_store_count) return -1; - log_it(L_DEBUG, "[%p] Process DB Request ...", a_store_obj); + debug_if(s_dap_global_db_debug_more, L_DEBUG, "[%p] Process DB Request ...", a_store_obj); l_store_obj_cur = a_store_obj; /* We have to use a power of the address's incremental arithmetic */ l_ret = 0; /* Preset return code to OK */ @@ -275,7 +276,7 @@ dap_store_obj_t *l_store_obj_cur; if(a_store_count > 1 && s_drv_callback.transaction_end) s_drv_callback.transaction_end(); - log_it(L_DEBUG, "[%p] Finished DB Request (code %d)", a_store_obj, l_ret); + debug_if(s_dap_global_db_debug_more, L_DEBUG, "[%p] Finished DB Request (code %d)", a_store_obj, l_ret); return l_ret; } @@ -287,7 +288,7 @@ dap_store_obj_t *l_store_obj_cur; dap_worker_t *l_dap_worker; size_t l_store_obj_cnt; - log_it(L_DEBUG, "Entering, %d entries in the queue ...", s_db_reqs_list.nr); + debug_if(s_dap_global_db_debug_more, L_DEBUG, "Entering, %d entries in the queue ...", s_db_reqs_list.nr); assert ( !pthread_mutex_lock(&s_db_reqs_list_lock) ); /* Get exclusive access to the request list */ @@ -368,7 +369,7 @@ dap_worker_t *l_dap_worker; else l_ret = dap_proc_queue_add_callback(l_dap_worker, s_dap_driver_req_exec, NULL); } - log_it(L_DEBUG, "[%p] DB Request has been enqueued (code %d)", l_store_obj_cur, l_ret); + debug_if(s_dap_global_db_debug_more, L_DEBUG, "[%p] DB Request has been enqueued (code %d)", l_store_obj_cur, l_ret); return l_ret; } diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c index 0aa6bd3506..0ce7d72601 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -67,8 +67,6 @@ static pcdb_instance s_cdb = NULL; static pthread_mutex_t cdb_mutex = PTHREAD_MUTEX_INITIALIZER; /** A read-write lock for working with a CDB instanse. */ static pthread_rwlock_t cdb_rwlock = PTHREAD_RWLOCK_INITIALIZER; -/** Mode of request processing */ -static bool s_db_drvmode_async = false; /** * @brief Serialize key and val to a item @@ -243,8 +241,7 @@ ERR: * @param a_db_drvmode_async * @return 0 if success, -1 if Ñouldn't open db directory, -2 if dap_cdb_init_group() returns NULL. */ -int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_drv_callback, - bool a_db_drvmode_async) +int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_drv_callback) { s_cdb_path = dap_strdup(a_cdb_path); if(s_cdb_path[strlen(s_cdb_path)] == '/') { @@ -288,8 +285,6 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_ } } - s_db_drvmode_async = a_db_drvmode_async; /* DB Driver mode: Async/Sync */ - a_drv_callback->read_last_store_obj = dap_db_driver_cdb_read_last_store_obj; a_drv_callback->apply_store_obj = dap_db_driver_cdb_apply_store_obj; a_drv_callback->read_store_obj = dap_db_driver_cdb_read_store_obj; diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c index 1975f4dea5..a0ab013e02 100644 --- a/modules/global-db/dap_chain_global_db_driver_sqlite.c +++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c @@ -126,8 +126,7 @@ static void s_sqlite_free_connection(sqlite3 *a_conn) * @param a_drv_callback a pointer to a structure of callback functions * @return If successful returns 0, else a code < 0. */ -int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback, - bool db_drvmode_async) +int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback) { int l_ret = -1; diff --git a/modules/global-db/include/dap_chain_global_db_driver.h b/modules/global-db/include/dap_chain_global_db_driver.h index 443ca4aced..e6f9451b98 100644 --- a/modules/global-db/include/dap_chain_global_db_driver.h +++ b/modules/global-db/include/dap_chain_global_db_driver.h @@ -83,7 +83,7 @@ typedef struct dap_db_driver_callbacks { } dap_db_driver_callbacks_t; -int dap_db_driver_init(const char *driver_name, const char *a_filename_db, bool a_db_drvmode_async); +int dap_db_driver_init(const char *driver_name, const char *a_filename_db); void dap_db_driver_deinit(void); dap_store_obj_t* dap_store_obj_copy(dap_store_obj_t *a_store_obj, size_t a_store_count); diff --git a/modules/global-db/include/dap_chain_global_db_driver_cdb.h b/modules/global-db/include/dap_chain_global_db_driver_cdb.h index 891ebbcf0f..948d0ada5f 100644 --- a/modules/global-db/include/dap_chain_global_db_driver_cdb.h +++ b/modules/global-db/include/dap_chain_global_db_driver_cdb.h @@ -38,7 +38,7 @@ typedef struct _cdb_record { char *val; } cdb_record, *pcdb_record; -int dap_db_driver_cdb_init(const char *, dap_db_driver_callbacks_t *, bool); +int dap_db_driver_cdb_init(const char *, dap_db_driver_callbacks_t *); int dap_db_driver_cdb_deinit(); int dap_db_driver_cdb_flush(void); diff --git a/modules/global-db/include/dap_chain_global_db_driver_sqlite.h b/modules/global-db/include/dap_chain_global_db_driver_sqlite.h index bc3679adbe..aa5e50219b 100644 --- a/modules/global-db/include/dap_chain_global_db_driver_sqlite.h +++ b/modules/global-db/include/dap_chain_global_db_driver_sqlite.h @@ -29,7 +29,7 @@ #define DAP_SQLITE_POOL_COUNT 16 -int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback, bool db_drvmode_async); +int dap_db_driver_sqlite_init(const char *a_filename_db, dap_db_driver_callbacks_t *a_drv_callback); int dap_db_driver_sqlite_deinit(void); sqlite3* dap_db_driver_sqlite_open(const char *a_filename_utf8, int a_flags, char **error_message); -- GitLab