Fix batch timing reporting; reduce block processing size

Batch timing was being reported as 0s, even though it is taking up the
vast majority of the time as of the HF block.

Reduce the block processing size to 500 blocks at a time rather than
1000.

Change when we print status updates to print once duration passes a 10s
threshold rather than every 10*1000 blocks.

This latter change probably also makes oxend more reliable on
low-powered servers because it also guards the systemd status update
message (which is needed to give us more watchdog time).
This commit is contained in:
Jason Rhinelander 2022-06-17 12:55:54 -03:00
parent b324193dc3
commit 0ed150012e
No known key found for this signature in database
GPG Key ID: C4992CE7A88D4262
1 changed files with 20 additions and 12 deletions

View File

@ -34,6 +34,7 @@
#include <cstdio>
#include <oxenc/endian.h>
#include <sodium.h>
#include <fmt/core.h>
#include "common/rules.h"
#include "common/hex.h"
@ -330,12 +331,12 @@ bool Blockchain::load_missing_blocks_into_oxen_subsystems()
if (total_blocks > 1)
MGINFO("Loading blocks into oxen subsystems, scanning blockchain from height: " << start_height << " to: " << end_height << " (snl: " << snl_height << ", ons: " << ons_height << ", sqlite: " << sqlite_height << ")");
using clock = std::chrono::steady_clock;
using work_time = std::chrono::duration<float>;
int64_t constexpr BLOCK_COUNT = 1000;
auto work_start = clock::now();
auto scan_start = work_start;
work_time ons_duration{}, snl_duration{}, sqlite_duration{}, ons_iteration_duration{}, snl_iteration_duration{}, sqlite_iteration_duration{};
using clock = std::chrono::steady_clock;
using dseconds = std::chrono::duration<double>;
int64_t constexpr BLOCK_COUNT = 500;
auto work_start = clock::now();
auto scan_start = work_start;
dseconds ons_duration{}, snl_duration{}, sqlite_duration{}, ons_iteration_duration{}, snl_iteration_duration{}, sqlite_iteration_duration{};
std::vector<cryptonote::block> blocks;
std::vector<cryptonote::transaction> txs;
@ -346,11 +347,16 @@ bool Blockchain::load_missing_blocks_into_oxen_subsystems()
block_count > 0;
block_count -= BLOCK_COUNT, index++)
{
if (index > 0 && (index % 10 == 0))
auto duration = dseconds{clock::now() - work_start};
if (duration >= 10s)
{
m_service_node_list.store();
auto duration = work_time{clock::now() - work_start};
MGINFO("... scanning height " << start_height + (index * BLOCK_COUNT) << " (" << duration.count() << "s) (snl: " << snl_iteration_duration.count() << "s; ons: " << ons_iteration_duration.count() << "s; sqlite: " << sqlite_iteration_duration.count() << "s)");
MGINFO(fmt::format("... scanning height {} ({:.3f}s) (snl: {:.3f}s, ons: {:.3f}s, batch: {:.3f}s)",
start_height + (index * BLOCK_COUNT),
duration.count(),
snl_iteration_duration.count(),
ons_iteration_duration.count(),
sqlite_iteration_duration.count()));
#ifdef ENABLE_SYSTEMD
// Tell systemd that we're doing something so that it should let us continue starting up
// (giving us 120s until we have to send the next notification):
@ -361,7 +367,9 @@ bool Blockchain::load_missing_blocks_into_oxen_subsystems()
ons_duration += ons_iteration_duration;
snl_duration += snl_iteration_duration;
sqlite_duration += sqlite_iteration_duration;
ons_iteration_duration = snl_iteration_duration = {};
ons_iteration_duration = 0s;
snl_iteration_duration = 0s;
sqlite_iteration_duration = 0s;
}
blocks.clear();
@ -427,8 +435,8 @@ bool Blockchain::load_missing_blocks_into_oxen_subsystems()
if (total_blocks > 1)
{
auto duration = work_time{clock::now() - scan_start};
MGINFO("Done recalculating oxen subsystems (" << duration.count() << "s) (snl: " << snl_duration.count() << "s; ons: " << ons_duration.count() << "s)" << "s; sqlite: " << sqlite_duration.count() << "s)");
MGINFO(fmt::format("Done recalculating oxen subsystems in {:.2f}s ({:.2f}s snl; {:.2f}s ons; {:.2f}s batch)",
dseconds{clock::now() - scan_start}.count(), snl_duration.count(), ons_duration.count(), sqlite_duration.count()));
}
if (total_blocks > 0)