diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 37b0b25d47ec8e6019c5961ad0ebcb3e57401e71..d18a5063bafbf8177e08607c1cefbce9ebf4ba3b 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -298,6 +298,7 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c if (!a_arg) { return; } + dap_chain_node_mempool_autoproc_notify(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len); dap_chain_net_sync_gdb_broadcast(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len); if (s_srv_callback_notify) { s_srv_callback_notify(a_arg, a_op_code, a_prefix, a_group, a_key, a_value, a_value_len); diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index 749937380ec332edeabf35a7b4b59ca6087787c6..22484d478b6ae9870866abafc8c1b1719b48faba 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -239,53 +239,38 @@ 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, dap_chain_node_role_t a_role) +bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum) { - char *l_gdb_group_mempool = NULL; - if (!a_chain) { - return -1; + bool l_need_process = false; + for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) { + if (a_datum->header.type_id == a_chain->autoproc_datum_types[j]) { + l_need_process = true; + break; + } } - 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; - bool l_need_process = false; - for (uint16_t j = 0; j < a_chain->autoproc_datum_types_count; j++) { - if (l_datum->header.type_id == a_chain->autoproc_datum_types[j]) { - l_need_process = true; - break; - } + if (!l_need_process) + return false; + if (a_datum->header.type_id == DAP_CHAIN_DATUM_TX) { + dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)a_datum->data; + dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL); + // Is not it a base transaction? + if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) { + if (a_role.enums == NODE_ROLE_ROOT) { + return false; } - if (!l_need_process) - continue; - if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { - dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; - dap_chain_tx_in_t *l_tx_in = (dap_chain_tx_in_t *)dap_chain_datum_tx_item_get(l_tx, NULL, TX_ITEM_TYPE_IN, NULL); - // Is not it a base transaction? - if (l_tx_in && !dap_hash_fast_is_blank(&l_tx_in->header.tx_prev_hash)) { - if (a_role.enums == NODE_ROLE_ROOT) { - 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; + if (a_chain->callback_datums_pool_proc(a_chain, &a_datum, 1) != 1) { + return false; + } + return true; } -void dap_chain_node_mempool_periodic(void *a_param) +static bool s_mempool_auto = false; + +bool dap_chain_node_mempool_autoproc_init() { - UNUSED(a_param); uint16_t l_net_count; - bool l_mempool_auto; bool l_mempool_auto_default = false; dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); for (uint16_t i = 0; i < l_net_count; i++) { @@ -299,44 +284,67 @@ void dap_chain_node_mempool_periodic(void *a_param) l_mempool_auto_default = true; break; default: - l_mempool_auto_default = false; + break; } - - l_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default); - if (l_mempool_auto) { + s_mempool_auto = dap_config_get_item_bool_default(g_config, "mempool", "auto_proc", l_mempool_auto_default); + if (s_mempool_auto) { dap_chain_t *l_chain; DL_FOREACH(l_net_list[i]->pub.chains, l_chain) { - dap_chain_node_mempool_process(l_chain, l_role); + if (!l_chain) { + continue; + } + char *l_gdb_group_mempool = NULL; + l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(l_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 (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) { + // 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); } } } DAP_DELETE(l_net_list); + return s_mempool_auto; } -static void *s_mempool_timer = NULL; - /** - * @brief dap_chain_node_mempool_init - * @return + * @brief dap_chain_node_mempool_deinit */ -int dap_chain_node_mempool_init() +void dap_chain_node_mempool_autoproc_deinit() { - s_mempool_timer = dap_interval_timer_create(DAP_CHAIN_NODE_MEMPOOL_INTERVAL, dap_chain_node_mempool_periodic, 0); - if (s_mempool_timer) { - return 0; - } else { - return -1; - } + s_mempool_auto = false; } -/** - * @brief dap_chain_node_mempool_deinit - */ -void dap_chain_node_mempool_deinit() +void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group, + const char *a_key, const void *a_value, const size_t a_value_len) { - if (s_mempool_timer) { - dap_interval_timer_delete(s_mempool_timer); - s_mempool_timer = NULL; + UNUSED(a_prefix); + UNUSED(a_value_len); + if (!a_arg || !a_value || !s_mempool_auto || a_op_code != 'a') { + return; + } + dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; + dap_chain_t *l_chain; + DL_FOREACH(l_net->pub.chains, l_chain) { + if (!l_chain) { + continue; + } + char *l_gdb_group_str = dap_chain_net_get_gdb_group_mempool(l_chain); + if (!strcmp(a_group, l_gdb_group_str)) { + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)a_value; + dap_chain_node_role_t l_role = dap_chain_net_get_role(l_net); + if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) { + dap_chain_global_db_gr_del(dap_strdup(a_key), l_gdb_group_str); + } + } + DAP_DELETE(l_gdb_group_str); } } - diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 78931e2864782a8b0b015598f505bda2635dc3b0..0277aefb71f3b59b11f3e64c2ad20cb77556bdd0 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -141,6 +141,8 @@ 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, dap_chain_node_role_t a_role); -int dap_chain_node_mempool_init(); -void dap_chain_node_mempool_deinit(); +bool dap_chain_node_mempool_process(dap_chain_t *a_chain, dap_chain_node_role_t a_role, dap_chain_datum_t *a_datum); +bool dap_chain_node_mempool_autoproc_init(); +void dap_chain_node_mempool_autoproc_deinit(); +void dap_chain_node_mempool_autoproc_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group, + const char *a_key, const void *a_value, const size_t a_value_len); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index 948ec9a6d09a74172d4f099fd38fac44fb9d430a..8aba700a30215b038b580b8d0ee49744bd6684e3 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -514,10 +514,9 @@ void dap_chain_net_srv_order_dump_to_string(dap_chain_net_srv_order_t *a_order,d static void s_srv_order_callback_notify(void *a_arg, const char a_op_code, const char *a_prefix, const char *a_group, const char *a_key, const void *a_value, const size_t a_value_len) { - (void) a_op_code; UNUSED(a_prefix); UNUSED(a_value_len); - if (!a_arg || !a_value || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { + if (!a_arg || !a_value || a_op_code != 'a' || !dap_config_get_item_bool_default(g_config, "srv", "order_signed_only", false)) { return; } dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg;