P2PServer: log time it took to relay a block

pull/253/head
SChernykh 2023-03-21 10:58:32 +01:00
parent d41a441e98
commit b6c1b1a6d7
5 changed files with 32 additions and 12 deletions

View File

@ -741,7 +741,10 @@ void P2PServer::broadcast(const PoolBlock& block, const PoolBlock* parent)
return; return;
} }
Broadcast* data = new Broadcast(); Broadcast* data = new Broadcast{};
data->id = block.m_sidechainId;
data->received_timestamp = block.m_receivedTimestamp;
int outputs_offset, outputs_blob_size; int outputs_offset, outputs_blob_size;
const std::vector<uint8_t> mainchain_data = block.serialize_mainchain_data(nullptr, nullptr, &outputs_offset, &outputs_blob_size); const std::vector<uint8_t> mainchain_data = block.serialize_mainchain_data(nullptr, nullptr, &outputs_offset, &outputs_blob_size);
@ -857,13 +860,6 @@ void P2PServer::on_broadcast()
return; return;
} }
ON_SCOPE_LEAVE([&broadcast_queue]()
{
for (const Broadcast* data : broadcast_queue) {
delete data;
}
});
for (P2PClient* client = static_cast<P2PClient*>(m_connectedClientsList->m_next); client != m_connectedClientsList; client = static_cast<P2PClient*>(client->m_next)) { for (P2PClient* client = static_cast<P2PClient*>(m_connectedClientsList->m_next); client != m_connectedClientsList; client = static_cast<P2PClient*>(client->m_next)) {
if (!client->is_good()) { if (!client->is_good()) {
continue; continue;
@ -936,6 +932,12 @@ void P2PServer::on_broadcast()
} }
} }
} }
for (const Broadcast* data : broadcast_queue) {
const double t = static_cast<double>(microseconds_since_epoch() - data->received_timestamp) * 1e-3;
LOGINFO(5, "Block " << data->id << " took " << t << " ms to process and relay to other peers");
delete data;
}
} }
uint64_t P2PServer::get_random64() uint64_t P2PServer::get_random64()
@ -995,7 +997,7 @@ int P2PServer::external_listen_port() const
return params.m_p2pExternalPort ? params.m_p2pExternalPort : m_listenPort; return params.m_p2pExternalPort ? params.m_p2pExternalPort : m_listenPort;
} }
int P2PServer::deserialize_block(const uint8_t* buf, uint32_t size, bool compact) int P2PServer::deserialize_block(const uint8_t* buf, uint32_t size, bool compact, uint64_t received_timestamp)
{ {
int result; int result;
@ -1010,6 +1012,7 @@ int P2PServer::deserialize_block(const uint8_t* buf, uint32_t size, bool compact
m_lookForMissingBlocks = true; m_lookForMissingBlocks = true;
} }
m_block->m_receivedTimestamp = received_timestamp;
return result; return result;
} }
@ -1928,11 +1931,13 @@ bool P2PServer::P2PClient::on_block_response(const uint8_t* buf, uint32_t size,
return true; return true;
} }
const uint64_t received_timestamp = microseconds_since_epoch();
P2PServer* server = static_cast<P2PServer*>(m_owner); P2PServer* server = static_cast<P2PServer*>(m_owner);
MutexLock lock(server->m_blockLock); MutexLock lock(server->m_blockLock);
const int result = server->deserialize_block(buf, size, false); const int result = server->deserialize_block(buf, size, false, received_timestamp);
if (result != 0) { if (result != 0) {
LOGWARN(3, "peer " << static_cast<char*>(m_addrString) << " sent an invalid block, error " << result); LOGWARN(3, "peer " << static_cast<char*>(m_addrString) << " sent an invalid block, error " << result);
return false; return false;
@ -1973,11 +1978,13 @@ bool P2PServer::P2PClient::on_block_broadcast(const uint8_t* buf, uint32_t size,
return false; return false;
} }
const uint64_t received_timestamp = microseconds_since_epoch();
P2PServer* server = static_cast<P2PServer*>(m_owner); P2PServer* server = static_cast<P2PServer*>(m_owner);
MutexLock lock(server->m_blockLock); MutexLock lock(server->m_blockLock);
const int result = server->deserialize_block(buf, size, compact); const int result = server->deserialize_block(buf, size, compact, received_timestamp);
if (result != 0) { if (result != 0) {
LOGWARN(3, "peer " << static_cast<char*>(m_addrString) << " sent an invalid block, error " << result); LOGWARN(3, "peer " << static_cast<char*>(m_addrString) << " sent an invalid block, error " << result);
return false; return false;

View File

@ -163,7 +163,7 @@ public:
void set_max_outgoing_peers(uint32_t n) { m_maxOutgoingPeers = std::min(std::max(n, 10U), 450U); } void set_max_outgoing_peers(uint32_t n) { m_maxOutgoingPeers = std::min(std::max(n, 10U), 450U); }
void set_max_incoming_peers(uint32_t n) { m_maxIncomingPeers = std::min(std::max(n, 10U), 450U); } void set_max_incoming_peers(uint32_t n) { m_maxIncomingPeers = std::min(std::max(n, 10U), 450U); }
int deserialize_block(const uint8_t* buf, uint32_t size, bool compact); int deserialize_block(const uint8_t* buf, uint32_t size, bool compact, uint64_t received_timestamp);
const PoolBlock* get_block() const { return m_block; } const PoolBlock* get_block() const { return m_block; }
private: private:
@ -226,6 +226,9 @@ private:
struct Broadcast struct Broadcast
{ {
hash id;
uint64_t received_timestamp;
std::vector<uint8_t> blob; std::vector<uint8_t> blob;
std::vector<uint8_t> pruned_blob; std::vector<uint8_t> pruned_blob;
std::vector<uint8_t> compact_blob; std::vector<uint8_t> compact_blob;

View File

@ -53,6 +53,7 @@ PoolBlock::PoolBlock()
, m_wantBroadcast(false) , m_wantBroadcast(false)
, m_precalculated(false) , m_precalculated(false)
, m_localTimestamp(seconds_since_epoch()) , m_localTimestamp(seconds_since_epoch())
, m_receivedTimestamp(0)
{ {
} }
@ -102,6 +103,7 @@ PoolBlock& PoolBlock::operator=(const PoolBlock& b)
m_precalculated = b.m_precalculated; m_precalculated = b.m_precalculated;
m_localTimestamp = seconds_since_epoch(); m_localTimestamp = seconds_since_epoch();
m_receivedTimestamp = b.m_receivedTimestamp;
return *this; return *this;
} }
@ -266,6 +268,7 @@ void PoolBlock::reset_offchain_data()
m_precalculated = false; m_precalculated = false;
m_localTimestamp = seconds_since_epoch(); m_localTimestamp = seconds_since_epoch();
m_receivedTimestamp = 0;
} }
bool PoolBlock::get_pow_hash(RandomX_Hasher_Base* hasher, uint64_t height, const hash& seed_hash, hash& pow_hash) bool PoolBlock::get_pow_hash(RandomX_Hasher_Base* hasher, uint64_t height, const hash& seed_hash, hash& pow_hash)

View File

@ -133,6 +133,7 @@ struct PoolBlock
bool m_precalculated; bool m_precalculated;
uint64_t m_localTimestamp; uint64_t m_localTimestamp;
uint64_t m_receivedTimestamp;
std::vector<uint8_t> serialize_mainchain_data(size_t* header_size = nullptr, size_t* miner_tx_size = nullptr, int* outputs_offset = nullptr, int* outputs_blob_size = nullptr, const uint32_t* nonce = nullptr, const uint32_t* extra_nonce = nullptr) const; std::vector<uint8_t> serialize_mainchain_data(size_t* header_size = nullptr, size_t* miner_tx_size = nullptr, int* outputs_offset = nullptr, int* outputs_blob_size = nullptr, const uint32_t* nonce = nullptr, const uint32_t* extra_nonce = nullptr) const;
std::vector<uint8_t> serialize_sidechain_data() const; std::vector<uint8_t> serialize_sidechain_data() const;

View File

@ -227,6 +227,12 @@ FORCEINLINE uint64_t seconds_since_epoch()
return duration_cast<seconds>(steady_clock::now().time_since_epoch()).count(); return duration_cast<seconds>(steady_clock::now().time_since_epoch()).count();
} }
FORCEINLINE uint64_t microseconds_since_epoch()
{
using namespace std::chrono;
return duration_cast<microseconds>(steady_clock::now().time_since_epoch()).count();
}
uint64_t bsr_reference(uint64_t x); uint64_t bsr_reference(uint64_t x);
#ifdef HAVE_BUILTIN_CLZLL #ifdef HAVE_BUILTIN_CLZLL