Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • cellframe/libdap-chain-net
1 result
Show changes
Commits on Source (3)
......@@ -106,7 +106,7 @@ typedef struct dap_chain_net_pvt{
pthread_cond_t state_proc_cond;
#else
HANDLE state_proc_cond;
#endif
#endif
pthread_mutex_t state_mutex_cond;
pthread_mutex_t state_mutex;
dap_chain_node_role_t node_role;
......@@ -225,7 +225,7 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n
pthread_cond_signal( &PVT(a_net)->state_proc_cond );
#else
SetEvent( PVT(a_net)->state_proc_cond );
#endif
#endif
pthread_mutex_unlock( &PVT(a_net)->state_mutex_cond);
return 0;
}
......@@ -1095,7 +1095,7 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply)
}
int ret = dap_chain_node_cli_cmd_values_parse_net_chain( &arg_index, argc, argv, a_str_reply, NULL, &l_net );
if ( l_net ) {
const char *l_sync_str = NULL;
const char *l_links_str = NULL;
......@@ -1764,6 +1764,18 @@ void dap_chain_net_deinit()
{
}
dap_chain_net_t **dap_chain_net_list(size_t *a_size)
{
*a_size = HASH_COUNT(s_net_items);
dap_chain_net_t **l_net_list = DAP_NEW_SIZE(dap_chain_net_t *, (*a_size) * sizeof(dap_chain_net_t *));
dap_chain_net_item_t *l_current_item, *l_tmp;
int i = 0;
HASH_ITER(hh, s_net_items, l_current_item, l_tmp) {
l_net_list[i++] = l_current_item->chain_net;
}
return l_net_list;
}
/**
* @brief dap_chain_net_by_name
* @param a_name
......
......@@ -148,5 +148,6 @@ DAP_STATIC_INLINE char * dap_chain_net_get_gdb_group_mempool(dap_chain_t * l_cha
dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type);
char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type);
dap_chain_net_t **dap_chain_net_list(size_t *a_size);
dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_node_addr_t a_node_addr);
/*
* Authors:
* Dmitriy A. Gearasimov <naeper@demlabs.net>
* Dmitriy A. Gerasimov <naeper@demlabs.net>
* DeM Labs Inc. https://demlabs.net
This file is part of DAP (Deus Applications Prototypes) the open source project
......@@ -39,6 +39,7 @@
#include <netinet/in.h>
#endif
#include "utlist.h"
#include "dap_hash.h"
#include "rand/dap_rand.h"
#include "dap_chain_net.h"
......@@ -118,11 +119,6 @@ bool dap_chain_node_alias_delete(dap_chain_net_t * a_net,const char *a_alias)
return res;
}
/**
* Calculate size of struct dap_chain_node_info_t
*/
......@@ -241,3 +237,85 @@ dap_chain_node_info_t* dap_chain_node_info_read( dap_chain_net_t * a_net,dap_cha
return node_info;
}*/
int dap_chain_node_mempool_process(dap_chain_t *a_chain)
{
char *l_gdb_group_mempool = NULL;
if (!a_chain) {
return -1;
}
l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(a_chain);
size_t l_objs_size = 0;
dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size);
if (l_objs_size) {
for (size_t i = 0; i < l_objs_size; i++) {
dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value;
if (l_datum->header.type_id != DAP_CHAIN_DATUM_TX) {
continue;
}
if (a_chain->callback_datums_pool_proc(a_chain, &l_datum, 1) != 1) {
continue;
} // Delete processed objects
dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool);
}
dap_chain_global_db_objs_delete(l_objs, l_objs_size);
}
DAP_DELETE(l_gdb_group_mempool);
return 0;
}
void dap_chain_node_mempool_periodic()
{
size_t l_net_count;
dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count);
for (int i = 0; i < l_net_count; i++) {
dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net_list[i]);
dap_chain_t *l_chain;
switch (l_role.enums) {
case NODE_ROLE_ROOT:
case NODE_ROLE_MASTER:
case NODE_ROLE_ROOT_MASTER:
case NODE_ROLE_CELL_MASTER: {
DL_FOREACH(l_net_list[i]->pub.chains, l_chain) {
for(uint16_t i = 0; i < l_chain->datum_types_count; i++) {
if(l_chain->datum_types[i] == CHAIN_TYPE_TX)
dap_chain_node_mempool_process(l_chain);
}
}
} break;
default:
break;
}
}
DAP_DELETE(l_net_list);
}
static void *s_mempool_timer = NULL;
/**
* @brief dap_chain_node_mempool_init
* @return
*/
int dap_chain_node_mempool_init()
{
if ( dap_config_get_item_bool_default( g_config, "mempool", "auto_proc", true) ){
s_mempool_timer = dap_interval_timer_create(DAP_CHAIN_NODE_MEMPOOL_INTERVAL, dap_chain_node_mempool_periodic);
if (s_mempool_timer) {
return 0;
} else {
return -1;
}
}else
return 0;
}
/**
* @brief dap_chain_node_mempool_deinit
*/
void dap_chain_node_mempool_deinit()
{
if (s_mempool_timer) {
dap_interval_timer_delete(s_mempool_timer);
s_mempool_timer = NULL;
}
}
/*
* Authors:
* Dmitriy A. Gearasimov <naeper@demlabs.net>
* Dmitriy A. Gerasimov <naeper@demlabs.net>
* DeM Labs Inc. https://demlabs.net
This file is part of DAP (Deus Applications Prototypes) the open source project
......@@ -42,6 +42,8 @@
#include "dap_common.h"
#include "dap_chain_common.h"
#include "dap_chain_global_db.h"
#include "dap_chain.h"
#include "dap_chain_net.h"
typedef struct dap_chain_net dap_chain_net_t;
/**
......@@ -95,6 +97,8 @@ typedef struct dap_chain_node_publ{
dap_chain_node_info_t node_info;
} DAP_ALIGN_PACKED dap_chain_node_publ_t;
#define DAP_CHAIN_NODE_MEMPOOL_INTERVAL 1000 // milliseconds
/**
* Calculate size of struct dap_chain_node_info_t
*/
......@@ -137,4 +141,6 @@ inline static char* dap_chain_node_addr_to_hash_str(dap_chain_node_addr_t *addre
return a_key;
}
int dap_chain_node_mempool_process(dap_chain_t *a_chain);
int dap_chain_node_mempool_init();
void dap_chain_node_mempool_deinit();
File mode changed from 100755 to 100644
......@@ -2027,8 +2027,9 @@ int com_mempool_list(int argc, char ** argv, void *arg_func, char ** a_str_reply
if (l_gdb_group_mempool_tmp)
DAP_DELETE(l_gdb_group_mempool_tmp);
// only one time if group defined
if(l_gdb_group_mempool)
if(l_gdb_group_mempool) {
break;
}
}
dap_chain_node_cli_set_reply_text(a_str_reply, l_str_tmp->str);
dap_string_free(l_str_tmp, false);
......@@ -2061,21 +2062,19 @@ int com_mempool_delete(int argc, char ** argv, void *arg_func, char ** a_str_rep
return -1;
}
if(l_chain && l_net) {
if(l_chain && l_net) { // UNUSED(l_net)
const char * l_datum_hash_str = NULL;
dap_chain_node_cli_find_option_val(argv, arg_index, argc, "-datum", &l_datum_hash_str);
if(l_datum_hash_str) {
char * l_datum_hash_str2 = strdup(l_datum_hash_str);
char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_chain);
if(dap_chain_global_db_gr_del( dap_strdup(l_datum_hash_str2), l_gdb_group_mempool)) {
if(dap_chain_global_db_gr_del(strdup(l_datum_hash_str), l_gdb_group_mempool)) {
dap_chain_node_cli_set_reply_text(a_str_reply, "Datum %s deleted", l_datum_hash_str);
DAP_DELETE( l_datum_hash_str2);
return 0;
} else {
dap_chain_node_cli_set_reply_text(a_str_reply, "Error! Can't find datum %s", l_datum_hash_str);
DAP_DELETE( l_datum_hash_str2);
return -4;
}
DAP_DELETE(l_gdb_group_mempool);
} else {
dap_chain_node_cli_set_reply_text(a_str_reply, "Error! %s requires -datum <datum hash> option", argv[0]);
return -3;
......@@ -2154,6 +2153,7 @@ int com_mempool_proc(int argc, char ** argv, void *arg_func, char ** a_str_reply
l_objs_processed += l_is_processed;
l_procecced[i] = l_is_processed;
}
DAP_DELETE(l_datums);
// Delete processed objects
size_t l_objs_processed_tmp = (l_objs_processed > 15) ? min(l_objs_processed, 10) : l_objs_processed;
size_t l_objs_processed_cur = 0;
......