Debug EOS:nodeos + mongo_db_plugin (4)

四个connection对象的声明如下:

fc::optional<boost::signals2::scoped_connection> accepted_block_connection; fc::optional<boost::signals2::scoped_connection> irreversible_block_connection; fc::optional<boost::signals2::scoped_connection> accepted_transaction_connection; fc::optional<boost::signals2::scoped_connection> applied_transaction_connection; queue

这段代码中涉及到四个函数分别是accepted_block,applied_irreversible_block,accepted_transaction,applied_transaction,他们都对应着对queue的操作,mongo_db_plugin_impl类成员定义了一下几种queue:

std::deque<chain::transaction_metadata_ptr> transaction_metadata_queue; std::deque<chain::transaction_metadata_ptr> transaction_metadata_process_queue; std::deque<chain::transaction_trace_ptr> transaction_trace_queue; std::deque<chain::transaction_trace_ptr> transaction_trace_process_queue; std::deque<chain::block_state_ptr> block_state_queue; std::deque<chain::block_state_ptr> block_state_process_queue; std::deque<chain::block_state_ptr> irreversible_block_state_queue; std::deque<chain::block_state_ptr> irreversible_block_state_process_queue;

queue是mongo_db_plugin自己定义的:

/** * 模板类Queue,可以匹配以上我们定义的多个queue类型。 * 模板类Entry,可以匹配block_state_ptr以及transaction_trace_ptr作为被存储实体类型。 */ template<typename Queue, typename Entry> void queue(boost::mutex& mtx, boost::condition_variable& condition, Queue& queue, const Entry& e, size_t queue_size) { int sleep_time = 100;//默认线程睡眠时间 size_t last_queue_size = 0; boost::mutex::scoped_lock lock(mtx);//mutex锁机制 if (queue.size() > queue_size) {//如果超过了我们设定的queue大小,则采取如下措施。 lock.unlock();//先解锁 condition.notify_one();// 见下文对condition的介绍 if (last_queue_size < queue.size()) {//说明queue的增加速度大于我们程序消费处理的速度 sleep_time += 100;//增加睡眠时间 } else { sleep_time -= 100;//说明queue的增加速度小于我们消费的速度,就要减少睡眠时间,尽快更新last_queue_size的值。 if (sleep_time < 0) sleep_time = 100; } last_queue_size = queue.size(); boost::this_thread::sleep_for(boost::chrono::milliseconds(sleep_time));//线程睡眠,睡眠的时间按照上面的机制定夺。 lock.lock();//上锁 } queue.emplace_back(e);//生效部分:插入到队列中去。 lock.unlock();//解锁 condition.notify_one(); } mongo_db_plugin_impl::wipe_database()

真正执行擦除mongo历史数据的函数,这个动作是由我们配置mongodb-wipe参数来指定。擦除的函数体如下:

void mongo_db_plugin_impl::wipe_database() { ilog("mongo db wipe_database"); // 定义的六张mongo的表类型,通过客户端连接获取到六张表的权限。 auto block_states = mongo_conn[db_name][block_states_col]; auto blocks = mongo_conn[db_name][blocks_col]; auto trans = mongo_conn[db_name][trans_col]; auto trans_traces = mongo_conn[db_name][trans_traces_col]; auto actions = mongo_conn[db_name][actions_col]; accounts = mongo_conn[db_name][accounts_col]; // 分别删除,执行drop动作。 block_states.drop(); blocks.drop(); trans.drop(); trans_traces.drop(); actions.drop(); accounts.drop(); } mongo_db_plugin_impl::init()

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wssjyw.html