From dd400ba9ad7aaab901055dee5a3f94e4d386aee7 Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Tue, 22 Dec 2020 16:20:13 +0700
Subject: [PATCH] [*] Fixed double lock [*] Some more fixes with debug output

---
 CMakeLists.txt                              |  2 +-
 dap-sdk/net/core/dap_worker.c               |  2 +-
 modules/chain/dap_chain_ledger.c            |  2 -
 modules/channel/chain/dap_stream_ch_chain.c |  2 +
 modules/net/dap_chain_net.c                 | 63 ++++++++++++++++++++-
 modules/net/dap_chain_node_client.c         |  9 +--
 6 files changed, 70 insertions(+), 10 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 887d2abad9..8e9b4502ac 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 2.8)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.6-89")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.6-90")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 set(DAPSDK_MODULES "")
 
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index 2f157b2dd2..f33dd00378 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -403,7 +403,7 @@ void *dap_worker_thread(void *arg)
                     }
                     else if (  (! l_flag_rdhup || !l_flag_error ) && (!(l_cur->flags& DAP_SOCK_CONNECTING )) ) {
                         log_it(L_DEBUG, "EPOLLIN triggered but nothing to read");
-                        dap_events_socket_set_readable_unsafe(l_cur,false);
+                        //dap_events_socket_set_readable_unsafe(l_cur,false);
                     }
                 }
             }
diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c
index 829f72ad5c..c131dd4f3a 100644
--- a/modules/chain/dap_chain_ledger.c
+++ b/modules/chain/dap_chain_ledger.c
@@ -1787,8 +1787,6 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t
                 break;
             }
         }
-        pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock);
-
     }
 
 
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index cad808a43c..dcb1527bd5 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -202,6 +202,7 @@ static void s_sync_out_chains_first_worker_callback(dap_worker_t *a_worker, void
 
     dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
     l_ch_chain->state = CHAIN_STATE_SYNC_CHAINS;
+    l_ch_chain->request_atom_iter = l_sync_request->chain.request_atom_iter;
     dap_chain_node_addr_t l_node_addr = {};
     dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id);
     l_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
@@ -233,6 +234,7 @@ static void s_sync_out_chains_last_worker_callback(dap_worker_t *a_worker, void
     }
 
     dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
+    l_ch_chain->request_atom_iter = l_sync_request->chain.request_atom_iter;
     // last packet
     dap_stream_ch_chain_sync_request_t l_request = {0};
     if (s_debug_chain_sync )
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 6aa49a7a8c..089f36a895 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -180,7 +180,18 @@ static const char * c_net_states[]={
 
 static dap_chain_net_t * s_net_new(const char * a_id, const char * a_name , const char * a_node_role);
 inline static const char * s_net_state_to_str(dap_chain_net_state_t l_state);
+
+
+// Node link callbacks
+static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_client, void * a_arg);
+static void s_node_link_callback_disconnected(dap_chain_node_client_t * a_node_client, void * a_arg);
+static void s_node_link_callback_stage(dap_chain_node_client_t * a_node_client,dap_client_stage_t a_stage, void * a_arg);
+static void s_node_link_callback_error(dap_chain_node_client_t * a_node_client, int a_error, void * a_arg);
+
 static int s_net_states_proc(dap_chain_net_t * a_net);
+
+
+
 static void * s_net_check_thread ( void * a_net);
 static void s_net_check_thread_start( dap_chain_net_t * a_net );
 static void s_net_proc_kill( dap_chain_net_t * a_net );
@@ -371,6 +382,52 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net)
      }
 }
 
+/**
+ * @brief s_node_link_callback_connected
+ * @param a_node_client
+ * @param a_arg
+ */
+static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_client, void * a_arg)
+{
+    dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
+}
+
+/**
+ * @brief s_node_link_callback_disconnected
+ * @param a_node_client
+ * @param a_arg
+ */
+static void s_node_link_callback_disconnected(dap_chain_node_client_t * a_node_client, void * a_arg)
+{
+    dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
+
+}
+
+/**
+ * @brief s_node_link_callback_stage
+ * @param a_node_client
+ * @param a_stage
+ * @param a_arg
+ */
+static void s_node_link_callback_stage(dap_chain_node_client_t * a_node_client,dap_client_stage_t a_stage, void * a_arg)
+{
+    dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
+
+}
+
+/**
+ * @brief s_node_link_callback_error
+ * @param a_node_client
+ * @param a_error
+ * @param a_arg
+ */
+static void s_node_link_callback_error(dap_chain_node_client_t * a_node_client, int a_error, void * a_arg)
+{
+    dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg;
+
+}
+
+
 /**
  * @brief s_net_states_proc
  * @param l_net
@@ -494,10 +551,12 @@ static int s_net_states_proc(dap_chain_net_t *a_net)
             log_it(L_DEBUG, "%s.state: NET_STATE_LINKS_CONNECTING",a_net->pub.name);
             for (dap_list_t *l_tmp = l_pvt_net->links_info; l_tmp; l_tmp = dap_list_next(l_tmp)) {
                 dap_chain_node_info_t *l_link_info = (dap_chain_node_info_t *)l_tmp->data;
-                dap_chain_node_client_t *l_node_client = dap_chain_node_client_connect(l_link_info);
+                dap_chain_node_client_t *l_node_client = dap_chain_node_client_create_n_connect(l_link_info,"CN",s_node_link_callback_connected,
+                                                                                                s_node_link_callback_disconnected,s_node_link_callback_stage,
+                                                                                                s_node_link_callback_error,NULL);
                 if (l_node_client) {
                     // wait connected
-                    int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, 10000 );
+                    int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, 20000 );
                     if (res == 0 ) {
                         log_it(L_DEBUG, "Established connection with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address));
                         l_pvt_net->links = dap_list_append(l_pvt_net->links, l_node_client);
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 06c6d20328..c5b1d9da96 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -126,7 +126,7 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
         pthread_mutex_lock(&l_node_client->wait_mutex);
         l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED;
 #ifndef _WIN32
-        pthread_cond_signal(&l_node_client->wait_cond);
+        pthread_cond_broadcast(&l_node_client->wait_cond);
 #else
         SetEvent( l_node_client->wait_cond );
 #endif
@@ -145,7 +145,7 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg)
         l_node_client->state = NODE_CLIENT_STATE_ERROR;
 
 #ifndef _WIN32
-        pthread_cond_signal(&l_node_client->wait_cond);
+        pthread_cond_broadcast(&l_node_client->wait_cond);
 #else
         SetEvent( l_node_client->wait_cond );
 #endif
@@ -463,11 +463,12 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_node_i
     {
         struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_info->hdr.ext_addr_v4 };
         inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen);
-    }
-    else
+        log_it(L_DEBUG, "Connect to %s address",host);
+    } else
     {
         struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_info->hdr.ext_addr_v6 };
         inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen);
+        log_it(L_DEBUG, "Connect to %s address",host);
     }
     // address not defined
     if(!strcmp(host, "::")) {
-- 
GitLab