1
0
Fork 0
forked from lthn/blockchain

time sync issues detection: WIP

This commit is contained in:
sowle 2019-06-07 11:07:51 +03:00
parent 5995c0ca7f
commit be51d8ecd7
7 changed files with 47 additions and 10 deletions

View file

@ -32,10 +32,12 @@ namespace currency
m_blockchain_storage(m_mempool),
m_miner(this, m_blockchain_storage),
m_miner_address(boost::value_initialized<account_public_address>()),
m_starter_message_showed(false)
m_starter_message_showed(false),
m_stop_handler(nullptr)
{
set_currency_protocol(pprotocol);
}
//-----------------------------------------------------------------------------------
void core::set_currency_protocol(i_currency_protocol* pprotocol)
{
if(pprotocol)
@ -46,6 +48,11 @@ namespace currency
m_mempool.set_protocol(m_pprotocol);
}
//-----------------------------------------------------------------------------------
void core::set_stop_handler(i_stop_handler *handler)
{
m_stop_handler = handler;
}
//-----------------------------------------------------------------------------------
bool core::set_checkpoints(checkpoints&& chk_pts)
{
return m_blockchain_storage.set_checkpoints(std::move(chk_pts));

View file

@ -81,6 +81,8 @@ namespace currency
size_t get_alternative_blocks_count();
void set_currency_protocol(i_currency_protocol* pprotocol);
void set_stop_handler(i_stop_handler *handler);
i_stop_handler* get_stop_handler() const { return m_stop_handler; }
bool set_checkpoints(checkpoints&& chk_pts);
bool get_pool_transactions(std::list<transaction>& txs);
@ -138,6 +140,7 @@ namespace currency
blockchain_storage m_blockchain_storage;
tx_memory_pool m_mempool;
i_currency_protocol* m_pprotocol;
i_stop_handler* m_stop_handler;
critical_section m_incoming_tx_lock;
miner m_miner;
account_public_address m_miner_address;

View file

@ -127,7 +127,19 @@ namespace currency
// for outgoing connections -- check time difference
if (!context.m_is_income)
add_time_delta_and_check_time_sync(context.m_time_delta);
{
if (!add_time_delta_and_check_time_sync(context.m_time_delta))
{
// serious time sync problem detected
std::shared_ptr<i_stop_handler> ish(m_core.get_stop_handler());
if (ish != nullptr)
{
// this is a daemon -- stop immediately
ish->stop_handling();
return true;
}
}
}
if(context.m_state == currency_connection_context::state_synchronizing)
return true;
@ -679,8 +691,7 @@ namespace currency
{
std::list<relay_que_entry> local_que;
{
std::unique_lock<std::mutex> lk(m_relay_que_lock);
//m_relay_que_cv.wait(lk);
CRITICAL_REGION_LOCAL(m_relay_que_lock);
local_que.swap(m_relay_que);
}
if (local_que.size())
@ -788,7 +799,7 @@ namespace currency
template<class t_core>
bool t_currency_protocol_handler<t_core>::add_time_delta_and_check_time_sync(int64_t time_delta)
{
std::unique_lock<std::mutex> lk(m_time_deltas_lock);
CRITICAL_REGION_LOCAL(m_time_deltas_lock);
m_time_deltas.push_back(time_delta);
while (m_time_deltas.size() > TIME_SYNC_DELTA_RING_BUFFER_SIZE)
@ -834,7 +845,7 @@ namespace currency
template<class t_core>
bool t_currency_protocol_handler<t_core>::get_last_time_sync_difference(int64_t& last_median2local_time_difference, int64_t& last_ntp2local_time_difference)
{
std::unique_lock<std::mutex> lk(m_time_deltas_lock);
CRITICAL_REGION_LOCAL(m_time_deltas_lock);
last_median2local_time_difference = m_last_median2local_time_difference;
last_ntp2local_time_difference = m_last_ntp2local_time_difference;
@ -896,7 +907,7 @@ namespace currency
{
#ifdef ASYNC_RELAY_MODE
{
std::unique_lock<std::mutex> lk(m_relay_que_lock);
CRITICAL_REGION_LOCAL(m_relay_que_lock);
m_relay_que.push_back(AUTO_VAL_INIT(relay_que_entry()));
m_relay_que.back().first = arg;
m_relay_que.back().second = exclude_context;

View file

@ -36,4 +36,14 @@ namespace currency
}
};
/************************************************************************/
/* */
/************************************************************************/
struct i_stop_handler
{
virtual void stop_handling() = 0;
};
}

View file

@ -167,6 +167,7 @@ int main(int argc, char* argv[])
cprotocol.set_p2p_endpoint(&p2psrv);
ccore.set_currency_protocol(&cprotocol);
daemon_cmmands_handler dch(p2psrv, rpc_server);
ccore.set_stop_handler(&dch);
//ccore.get_blockchain_storage().get_attachment_services_manager().add_service(&offers_service);
std::shared_ptr<currency::stratum_server> stratum_server_ptr;
if (stratum_enabled)

View file

@ -20,7 +20,7 @@
PUSH_WARNINGS
DISABLE_VS_WARNINGS(4100)
class daemon_cmmands_handler
class daemon_cmmands_handler : public currency::i_stop_handler
{
typedef nodetool::node_server<currency::t_currency_protocol_handler<currency::core> > srv_type;
srv_type& m_srv;
@ -75,7 +75,8 @@ public:
return true;
}
void stop_handling()
// interface currency::i_stop_handler
virtual void stop_handling() override
{
m_cmd_binder.stop_handling();
}

View file

@ -116,7 +116,11 @@ namespace currency
//conditional values
if (req.flags&COMMAND_RPC_GET_INFO_FLAG_NET_TIME_DELTA_MEDIAN)
res.net_time_delta_median = m_p2p.get_payload_object().get_net_time_delta_median();
{
int64_t last_median2local_time_diff, last_ntp2local_time_diff;
if (!m_p2p.get_payload_object().get_last_time_sync_difference(last_median2local_time_diff, last_ntp2local_time_diff))
res.net_time_delta_median = 1;
}
if (req.flags&COMMAND_RPC_GET_INFO_FLAG_CURRENT_NETWORK_HASHRATE_50)
res.current_network_hashrate_50 = m_core.get_blockchain_storage().get_current_hashrate(50);
if (req.flags&COMMAND_RPC_GET_INFO_FLAG_CURRENT_NETWORK_HASHRATE_350)