Skip to content

Commit b20cfda

Browse files
authored
Merge pull request #2722 from cloudnoize/elerer/pruning_metrics
V4 - Optimizing recovery, removing redundant measurements and adding metrics
2 parents 4292227 + f78a423 commit b20cfda

File tree

15 files changed

+135
-86
lines changed

15 files changed

+135
-86
lines changed

bftengine/include/bftengine/IRequestHandler.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include <deque>
2323
#include "OpenTracing.hpp"
2424
#include "TimeService.hpp"
25-
#include "ISystemResourceEntity.hpp"
2625
#include "PersistentStorageImp.hpp"
2726

2827
namespace concord::reconfiguration {
@@ -55,9 +54,7 @@ class IRequestsHandler {
5554
};
5655

5756
static std::shared_ptr<IRequestsHandler> createRequestsHandler(
58-
std::shared_ptr<IRequestsHandler> userReqHandler,
59-
const std::shared_ptr<concord::cron::CronTableRegistry> &,
60-
concord::performance::ISystemResourceEntity &);
57+
std::shared_ptr<IRequestsHandler> userReqHandler, const std::shared_ptr<concord::cron::CronTableRegistry> &);
6158
typedef std::deque<ExecutionRequest> ExecutionRequestsQueue;
6259

6360
virtual void execute(ExecutionRequestsQueue &requests,

bftengine/src/bftengine/BFTEngine.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -287,9 +287,8 @@ IReplica::IReplicaPtr IReplica::createNewRoReplica(const ReplicaConfig &replicaC
287287

288288
std::shared_ptr<IRequestsHandler> IRequestsHandler::createRequestsHandler(
289289
std::shared_ptr<IRequestsHandler> userReqHandler,
290-
const std::shared_ptr<concord::cron::CronTableRegistry> &cronTableRegistry,
291-
concord::performance::ISystemResourceEntity &resourceEntity) {
292-
auto reqHandler = new bftEngine::RequestHandler(resourceEntity);
290+
const std::shared_ptr<concord::cron::CronTableRegistry> &cronTableRegistry) {
291+
auto reqHandler = new bftEngine::RequestHandler();
293292
reqHandler->setUserRequestHandler(userReqHandler);
294293
reqHandler->setCronTableRegistry(cronTableRegistry);
295294
return std::shared_ptr<IRequestsHandler>(reqHandler);

bftengine/src/bftengine/RequestHandler.cpp

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,14 +183,7 @@ void RequestHandler::execute(IRequestsHandler::ExecutionRequestsQueue& requests,
183183
return;
184184
}
185185
if (userRequestsHandler_) {
186-
// Do not measure pre-exec and read requests.
187-
auto isPost =
188-
(requests.size() > 0 && !(requests.back().flags & (bftEngine::PRE_PROCESS_FLAG | bftEngine::READ_ONLY_FLAG)));
189-
ISystemResourceEntity::scopedDurMeasurment m(
190-
resourceEntity_, ISystemResourceEntity::type::post_execution_utilization, isPost);
191186
userRequestsHandler_->execute(requests, timestamp, batchCid, parent_span);
192-
// the size of the queue resembles how many requests have passed consensus.
193-
resourceEntity_.addMeasurement({ISystemResourceEntity::type::transactions_accumulated, requests.size(), 0, 0});
194187
}
195188
return;
196189
}

bftengine/src/bftengine/RequestHandler.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@ namespace bftEngine {
2525
class RequestHandler : public IRequestsHandler {
2626
public:
2727
RequestHandler(
28-
concord::performance::ISystemResourceEntity &resourceEntity,
29-
std::shared_ptr<concordMetrics::Aggregator> aggregator_ = std::make_shared<concordMetrics::Aggregator>())
30-
: resourceEntity_(resourceEntity) {
28+
std::shared_ptr<concordMetrics::Aggregator> aggregator_ = std::make_shared<concordMetrics::Aggregator>()) {
3129
using namespace concord::reconfiguration;
3230
reconfig_handler_.push_back(std::make_shared<ReconfigurationHandler>());
3331
for (const auto &rh : reconfig_handler_) {
@@ -74,7 +72,6 @@ class RequestHandler : public IRequestsHandler {
7472
std::shared_ptr<IRequestsHandler> userRequestsHandler_;
7573
concord::reconfiguration::Dispatcher reconfig_dispatcher_;
7674
std::shared_ptr<concord::cron::CronTableRegistry> cron_table_registry_;
77-
concord::performance::ISystemResourceEntity &resourceEntity_;
7875
};
7976

8077
} // namespace bftEngine

kvbc/include/kvbc_adapter/replica_adapter.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
#include "db_interfaces.h"
2828
#include "bcstatetransfer/SimpleBCStateTransfer.hpp"
2929
#include "state_snapshot_interface.hpp"
30-
#include "ISystemResourceEntity.hpp"
3130
#include "replica_adapter_auxilliary_types.hpp"
3231
#include "categorization/kv_blockchain.h"
3332
#include "v4blockchain/v4_blockchain.h"
@@ -51,7 +50,7 @@ class ReplicaBlockchain : public IBlocksDeleter,
5150
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
5251
// IBlocksDeleter implementation
5352
void deleteGenesisBlock() override final { return deleter_->deleteGenesisBlock(); }
54-
BlockId deleteBlocksUntil(BlockId until) override final { return deleter_->deleteBlocksUntil(until); }
53+
BlockId deleteBlocksUntil(BlockId until) override final;
5554
void deleteLastReachableBlock() override final { return deleter_->deleteLastReachableBlock(); }
5655

5756
// Helper method, not part of the interface
@@ -277,6 +276,7 @@ class ReplicaBlockchain : public IBlocksDeleter,
277276
mutable concordMetrics::GaugeHandle add_block_duration;
278277
mutable concordMetrics::GaugeHandle multiget_latest_duration;
279278
mutable concordMetrics::GaugeHandle multiget_version_duration;
279+
mutable concordMetrics::GaugeHandle delete_blocks_until_duration;
280280
mutable concordMetrics::CounterHandle get_counter;
281281
mutable concordMetrics::CounterHandle multiget_lat_version_counter;
282282
};

kvbc/include/kvbc_adapter/v4blockchain/blocks_deleter_adapter.hpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include "db_interfaces.h"
1919
#include "v4blockchain/v4_blockchain.h"
2020
#include "kvbc_adapter/replica_adapter_auxilliary_types.hpp"
21-
#include "resources-manager/ISystemResourceEntity.hpp"
2221
#include "performance_handler.h"
2322
#include "diagnostics.h"
2423

@@ -27,8 +26,7 @@ namespace concord::kvbc::adapter::v4blockchain {
2726
class BlocksDeleterAdapter : public IBlocksDeleter {
2827
public:
2928
virtual ~BlocksDeleterAdapter() { kvbc_ = nullptr; }
30-
explicit BlocksDeleterAdapter(std::shared_ptr<concord::kvbc::v4blockchain::KeyValueBlockchain> &kvbc,
31-
const std::optional<aux::AdapterAuxTypes> &aux_types = std::nullopt);
29+
explicit BlocksDeleterAdapter(std::shared_ptr<concord::kvbc::v4blockchain::KeyValueBlockchain> &kvbc);
3230

3331
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
3432
// IBlocksDeleter implementation
@@ -39,7 +37,6 @@ class BlocksDeleterAdapter : public IBlocksDeleter {
3937

4038
private:
4139
concord::kvbc::v4blockchain::KeyValueBlockchain *kvbc_{nullptr};
42-
std::shared_ptr<concord::performance::ISystemResourceEntity> replica_resources_;
4340

4441
struct Recorders {
4542
static constexpr uint64_t MAX_VALUE_MICROSECONDS = 2ULL * 1000ULL * 1000ULL; // 2 seconds

kvbc/include/v4blockchain/detail/latest_keys.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,12 +148,15 @@ class LatestKeys {
148148
bool* /*value_changed*/) const override;
149149
};
150150

151+
void setDeletedKeysMetric(concordMetrics::CounterHandle* m) { deleted_keys_ = m; }
152+
151153
private:
152154
// This filter is used to delete stale on update keys if their version is smaller than the genesis block
153155
// It's being called by RocksDB on compaction
154156

155157
std::shared_ptr<concord::storage::rocksdb::NativeClient> native_client_;
156158
v4blockchain::detail::Categories category_mapping_;
159+
concordMetrics::CounterHandle* deleted_keys_{nullptr};
157160
};
158161

159162
} // namespace concord::kvbc::v4blockchain::detail

kvbc/include/v4blockchain/v4_blockchain.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ class KeyValueBlockchain {
158158
// path - the path of the blockchain db.
159159
struct BlockchainRecovery {
160160
BlockchainRecovery(const std::string &path, const std::optional<kvbc::BlockId> &block_id_at_chkpnt);
161-
static std::shared_ptr<storage::rocksdb::NativeClient> getRecoveryDB(const std::string &path, bool is_chkpnt);
161+
static std::shared_ptr<storage::rocksdb::NativeClient> getRecoveryDB(const std::string &path,
162+
bool is_chkpnt,
163+
bool read_only);
162164
static void removeRecoveryDB(const std::string &path, bool is_chkpnt);
163165
static std::string getPath(const std::string &path, bool is_chkpnt);
164166
};
@@ -267,12 +269,12 @@ class KeyValueBlockchain {
267269
std::map<kvbc::BlockId, const ::rocksdb::Snapshot *> chkpnt_snap_shots_;
268270
// const ::rocksdb::Snapshot *chkpoint_snap_shot_{nullptr};
269271
util::ThreadPool thread_pool_{1};
270-
std::optional<kvbc::BlockId> chkpnt_block_id_;
271272

272273
// Metrics
273274
std::shared_ptr<concordMetrics::Aggregator> aggregator_;
274275
concordMetrics::Component v4_metrics_comp_;
275276
concordMetrics::GaugeHandle blocks_deleted_;
277+
concordMetrics::CounterHandle deleted_keys_;
276278

277279
public:
278280
void setAggregator(std::shared_ptr<concordMetrics::Aggregator> aggregator) {

kvbc/src/Replica.cpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ Status Replica::initInternals() {
6262
if (replicaConfig_.isReadOnly) {
6363
LOG_INFO(logger,
6464
"ReadOnly Replica Status:" << KVLOG(getLastBlockNum(), getLastBlockId(), getLastReachableBlockNum()));
65-
auto requestHandler =
66-
bftEngine::IRequestsHandler::createRequestsHandler(m_cmdHandler, cronTableRegistry_, replicaResources_);
65+
auto requestHandler = bftEngine::IRequestsHandler::createRequestsHandler(m_cmdHandler, cronTableRegistry_);
6766
requestHandler->setReconfigurationHandler(std::make_shared<pruning::ReadOnlyReplicaPruningHandler>(*this));
6867
m_replicaPtr = bftEngine::IReplica::createNewRoReplica(
6968
replicaConfig_, requestHandler, m_stateTransfer, m_ptrComm, m_metadataStorage);
@@ -124,10 +123,9 @@ class KvbcRequestHandler : public bftEngine::RequestHandler {
124123
const std::shared_ptr<IRequestsHandler> &user_req_handler,
125124
const std::shared_ptr<concord::cron::CronTableRegistry> &cron_table_registry,
126125
adapter::ReplicaBlockchain &blockchain,
127-
std::shared_ptr<concordMetrics::Aggregator> aggregator_,
128-
ISystemResourceEntity &resourceEntity) {
126+
std::shared_ptr<concordMetrics::Aggregator> aggregator_) {
129127
return std::shared_ptr<KvbcRequestHandler>{
130-
new KvbcRequestHandler{user_req_handler, cron_table_registry, blockchain, aggregator_, resourceEntity}};
128+
new KvbcRequestHandler{user_req_handler, cron_table_registry, blockchain, aggregator_}};
131129
}
132130

133131
public:
@@ -150,9 +148,8 @@ class KvbcRequestHandler : public bftEngine::RequestHandler {
150148
KvbcRequestHandler(const std::shared_ptr<IRequestsHandler> &user_req_handler,
151149
const std::shared_ptr<concord::cron::CronTableRegistry> &cron_table_registry,
152150
adapter::ReplicaBlockchain &blockchain,
153-
std::shared_ptr<concordMetrics::Aggregator> aggregator_,
154-
ISystemResourceEntity &resourceEntity)
155-
: bftEngine::RequestHandler(resourceEntity, aggregator_), blockchain_{blockchain} {
151+
std::shared_ptr<concordMetrics::Aggregator> aggregator_)
152+
: bftEngine::RequestHandler(aggregator_), blockchain_{blockchain} {
156153
setUserRequestHandler(user_req_handler);
157154
setCronTableRegistry(cron_table_registry);
158155
}
@@ -304,8 +301,7 @@ void Replica::saveReconfigurationCmdToResPages(const std::string &key) {
304301

305302
void Replica::createReplicaAndSyncState() {
306303
ConcordAssertNE(m_kvBlockchain, nullptr);
307-
auto requestHandler =
308-
KvbcRequestHandler::create(m_cmdHandler, cronTableRegistry_, *m_kvBlockchain, aggregator_, replicaResources_);
304+
auto requestHandler = KvbcRequestHandler::create(m_cmdHandler, cronTableRegistry_, *m_kvBlockchain, aggregator_);
309305
registerReconfigurationHandlers(requestHandler);
310306
m_replicaPtr = bftEngine::IReplica::createNewReplica(
311307
replicaConfig_,

kvbc/src/kvbc_adapter/replica_adapter.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ ReplicaBlockchain::ReplicaBlockchain(
5454
add_block_duration{metrics_comp_.RegisterGauge("AddBlockDurationMicro", 0)},
5555
multiget_latest_duration{metrics_comp_.RegisterGauge("MultigetLatestDurationMicro", 0)},
5656
multiget_version_duration{metrics_comp_.RegisterGauge("MultigetLatestVersionDurationMicro", 0)},
57+
delete_blocks_until_duration{metrics_comp_.RegisterGauge("AccumulatedDeleteBlocksUntilDurationMicro", 0)},
5758
get_counter{metrics_comp_.RegisterCounter("GetCounter")},
5859
multiget_lat_version_counter{metrics_comp_.RegisterCounter("MultiGetLatestVersionCounter")} {
5960
metrics_comp_.Register();
@@ -85,7 +86,7 @@ ReplicaBlockchain::ReplicaBlockchain(
8586
if (aux_types.has_value()) {
8687
v4_kvbc_->setAggregator(aux_types->aggregator_);
8788
}
88-
up_deleter_ = std::make_unique<concord::kvbc::adapter::v4blockchain::BlocksDeleterAdapter>(v4_kvbc_, aux_types);
89+
up_deleter_ = std::make_unique<concord::kvbc::adapter::v4blockchain::BlocksDeleterAdapter>(v4_kvbc_);
8990
up_reader_ = std::make_unique<concord::kvbc::adapter::v4blockchain::BlocksReaderAdapter>(v4_kvbc_);
9091
up_adder_ = std::make_unique<concord::kvbc::adapter::v4blockchain::BlocksAdderAdapter>(v4_kvbc_);
9192
up_app_state_ = std::make_unique<concord::kvbc::adapter::v4blockchain::AppStateAdapter>(v4_kvbc_);
@@ -107,4 +108,14 @@ ReplicaBlockchain::ReplicaBlockchain(
107108
ConcordAssertNE(db_chkpt_, nullptr);
108109
}
109110

111+
BlockId ReplicaBlockchain::deleteBlocksUntil(BlockId until) {
112+
auto prev_dur = delete_blocks_until_duration.Get().Get();
113+
auto start = std::chrono::steady_clock::now();
114+
auto id = deleter_->deleteBlocksUntil(until);
115+
auto dur = std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - start).count();
116+
delete_blocks_until_duration.Get().Set(prev_dur + dur);
117+
metrics_comp_.UpdateAggregator();
118+
return id;
119+
}
120+
110121
} // namespace concord::kvbc::adapter

0 commit comments

Comments
 (0)