From 96465b6062f1221d77819deaaa846f4931120d10 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Wed, 6 Oct 2021 19:28:06 +0300 Subject: [PATCH] [*] PGSQL driver debugged --- .../dap_chain_global_db_driver_pgsql.c | 34 ++++++++++++------- .../dap_chain_global_db_driver_pgsql.h | 1 + modules/net/dap_chain_net.c | 2 +- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/modules/global-db/dap_chain_global_db_driver_pgsql.c b/modules/global-db/dap_chain_global_db_driver_pgsql.c index fa5e6e8fd6..14d1029971 100644 --- a/modules/global-db/dap_chain_global_db_driver_pgsql.c +++ b/modules/global-db/dap_chain_global_db_driver_pgsql.c @@ -52,7 +52,7 @@ static pthread_rwlock_t s_db_rwlock = PTHREAD_RWLOCK_INITIALIZER; static PGconn *s_pgsql_get_connection(void) { - if (pthread_rwlock_rdlock(s&_db_rwlock) == EDEADLK) { + if (pthread_rwlock_rdlock(&s_db_rwlock) == EDEADLK) { return s_trans_conn; } PGconn *l_ret = NULL; @@ -69,7 +69,7 @@ static PGconn *s_pgsql_get_connection(void) static void s_pgsql_free_connection(PGconn *a_conn) { - if (pthread_rwlock_rdlock(s&_db_rwlock) == EDEADLK) { + if (pthread_rwlock_rdlock(&s_db_rwlock) == EDEADLK) { return; } for (int i = 0; i < DAP_PGSQL_POOL_COUNT; i++) { @@ -224,7 +224,7 @@ int dap_db_driver_pgsql_end_transaction(void) { if (s_trans_conn) return -1; - PGresult *l_res = PQexec(l_trans_conn, "COMMIT"); + PGresult *l_res = PQexec(s_trans_conn, "COMMIT"); if (PQresultStatus(l_res) != PGRES_COMMAND_OK) { log_it(L_ERROR, "End transaction failed with message: \"%s\"", PQresultErrorMessage(l_res)); } @@ -372,14 +372,15 @@ dap_store_obj_t *dap_db_driver_pgsql_read_store_obj(const char *a_group, const c s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - log_it(L_ERROR, "Read objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); + if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + log_it(L_ERROR, "Read objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); return NULL; } // parse reply size_t l_count = PQntuples(l_res); - dap_store_obj_t *l_obj = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * l_count); + dap_store_obj_t *l_obj = l_count ? DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * l_count) : NULL; for (int i = 0; i < l_count; i++) { // fill currrent item dap_store_obj_t *l_obj_cur = l_obj + i; @@ -410,12 +411,16 @@ dap_store_obj_t *dap_db_driver_pgsql_read_last_store_obj(const char *a_group) s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - log_it(L_ERROR, "Read last object failed with message: \"%s\"", PQresultErrorMessage(l_res)); + if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + log_it(L_ERROR, "Read last object failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); return NULL; } - dap_store_obj_t *l_obj = DAP_NEW_Z(dap_store_obj_t); - s_pgsql_fill_object(a_group, l_obj, l_res, 0); + dap_store_obj_t *l_obj = NULL; + if (PQntuples(l_res)) { + l_obj = DAP_NEW_Z(dap_store_obj_t); + s_pgsql_fill_object(a_group, l_obj, l_res, 0); + } PQclear(l_res); return l_obj; } @@ -448,14 +453,15 @@ dap_store_obj_t *dap_db_driver_pgsql_read_cond_store_obj(const char *a_group, ui s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - log_it(L_ERROR, "Conditional read objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); + if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + log_it(L_ERROR, "Conditional read objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); return NULL; } // parse reply size_t l_count = PQntuples(l_res); - dap_store_obj_t *l_obj = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * l_count); + dap_store_obj_t *l_obj = l_count ? DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(dap_store_obj_t) * l_count) : NULL; for (int i = 0; i < l_count; i++) { // fill currrent item dap_store_obj_t *l_obj_cur = l_obj + i; @@ -491,7 +497,7 @@ dap_list_t *dap_db_driver_pgsql_get_groups_by_mask(const char *a_group_mask) for (int i = 0; i < PQntuples(l_res); i++) { char *l_table_name = (char *)PQgetvalue(l_res, i, 0); if(!dap_fnmatch(a_group_mask, l_table_name, 0)) - l_ret_list = dap_list_prepend(l_ret_list, l_table_name); + l_ret_list = dap_list_prepend(l_ret_list, dap_strdup(l_table_name)); } PQclear(l_res); return l_ret_list; @@ -512,7 +518,8 @@ size_t dap_db_driver_pgsql_read_count_store(const char *a_group, uint64_t a_id) s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - log_it(L_ERROR, "Count objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); + if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + log_it(L_ERROR, "Count objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); return 0; } @@ -535,7 +542,8 @@ bool dap_db_driver_pgsql_is_obj(const char *a_group, const char *a_key) s_pgsql_free_connection(l_conn); DAP_DELETE(l_query_str); if (PQresultStatus(l_res) != PGRES_TUPLES_OK) { - log_it(L_ERROR, "Count objects failed with message: \"%s\"", PQresultErrorMessage(l_res)); + if (strcmp(PQresultErrorField(l_res, PG_DIAG_SQLSTATE), PGSQL_INVALID_TABLE)) + log_it(L_ERROR, "Existance check of object failed with message: \"%s\"", PQresultErrorMessage(l_res)); PQclear(l_res); return 0; } diff --git a/modules/global-db/include/dap_chain_global_db_driver_pgsql.h b/modules/global-db/include/dap_chain_global_db_driver_pgsql.h index d6c3beb800..78fb58e3da 100644 --- a/modules/global-db/include/dap_chain_global_db_driver_pgsql.h +++ b/modules/global-db/include/dap_chain_global_db_driver_pgsql.h @@ -7,6 +7,7 @@ #define DAP_PGSQL_DBHASHNAME_LEN 8 #define DAP_PGSQL_POOL_COUNT 16 +#define PGSQL_INVALID_TABLE "42P01" int dap_db_driver_pgsql_init(const char *a_filename_dir, dap_db_driver_callbacks_t *a_drv_callback); int dap_db_driver_pgsql_deinit(); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 36a29d7c35..9e72b93607 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -296,7 +296,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n pthread_mutex_lock( &PVT(a_net)->state_mutex_cond); // Preventing call of state_go_to before wait cond will be armed // set flag for sync PVT(a_net)->flags |= F_DAP_CHAIN_NET_GO_SYNC; - //PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO; + PVT(a_net)->flags |= F_DAP_CHAIN_NET_SYNC_FROM_ZERO; #ifndef _WIN32 pthread_cond_signal( &PVT(a_net)->state_proc_cond ); #else -- GitLab