Skip to content

Commit c1204d4

Browse files
tarunkumar21c@gmail.comtarunkumar21c@gmail.com
authored andcommitted
Fixed review comments
1 parent babbc5a commit c1204d4

File tree

6 files changed

+73
-133
lines changed

6 files changed

+73
-133
lines changed

bftengine/include/bcstatetransfer/SimpleBCStateTransfer.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -193,19 +193,21 @@ inline std::ostream &operator<<(std::ostream &os, const Config &c) {
193193
c.cVal,
194194
c.numReplicas,
195195
c.numRoReplicas,
196+
c.numFnReplicas,
196197
c.pedanticChecks,
197198
c.isReadOnly,
199+
c.isFullNode,
198200
c.maxChunkSize,
199201
c.maxNumberOfChunksInBatch,
200202
c.maxBlockSize,
201203
c.maxPendingDataFromSourceReplica,
202204
c.maxNumOfReservedPages,
203205
c.sizeOfReservedPage,
204-
c.gettingMissingBlocksSummaryWindowSize,
205-
c.minPrePrepareMsgsForPrimaryAwareness,
206-
c.fetchRangeSize);
206+
c.gettingMissingBlocksSummaryWindowSize);
207207
os << ",";
208-
os << KVLOG(c.RVT_K,
208+
os << KVLOG(c.minPrePrepareMsgsForPrimaryAwareness,
209+
c.fetchRangeSize,
210+
c.RVT_K,
209211
c.refreshTimerMs,
210212
c.checkpointSummariesRetransmissionTimeoutMs,
211213
c.maxAcceptableMsgDelayMs,
@@ -218,11 +220,9 @@ inline std::ostream &operator<<(std::ostream &os, const Config &c) {
218220
c.sourcePerformanceSnapshotFrequencySec,
219221
c.runInSeparateThread,
220222
c.enableReservedPages,
221-
c.enableSourceBlocksPreFetch,
222-
c.enableSourceSelectorPrimaryAwareness,
223-
c.enableStoreRvbDataDuringCheckpointing);
223+
c.enableSourceBlocksPreFetch);
224224
os << ",";
225-
os << KVLOG(c.numFnReplicas, c.isFullNode);
225+
os << KVLOG(c.enableSourceSelectorPrimaryAwareness, c.enableStoreRvbDataDuringCheckpointing);
226226
return os;
227227
}
228228
// creates an instance of the state transfer module.

bftengine/src/bftengine/ClientsManager.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,8 @@ ClientsManager::ClientsManager(const std::set<NodeIdType>& proxyClients,
217217
ConcordAssert(maxNumOfReqsPerClient_ > 0);
218218
reservedPagesPerRequest_ = reservedPagesPerRequest(sizeOfReservedPage(), maxReplySize_);
219219
reservedPagesPerClient_ = reservedPagesPerClient(sizeOfReservedPage(), maxReplySize_, maxNumOfReqsPerClient_);
220-
for (NodeIdType i = 0; i < ReplicaConfig::instance().numReplicas + ReplicaConfig::instance().numRoReplicas +
221-
ReplicaConfig::instance().numFnReplicas;
222-
i++) {
220+
const auto& config = ReplicaConfig::instance();
221+
for (NodeIdType i{}; i < config.numReplicas + config.numRoReplicas + config.numFnReplicas; ++i) {
223222
clientIds_.insert(i);
224223
}
225224
clientIds_.insert(proxyClients_.begin(), proxyClients_.end());

bftengine/src/bftengine/FullNodeReplica.cpp

100755100644
Lines changed: 54 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Concord
22
//
3-
// Copyright (c) 2018, 2019 VMware, Inc. All Rights Reserved.
3+
// Copyright (c) 2023 VMware, Inc. All Rights Reserved.
44
//
55
// This product is licensed to you under the Apache 2.0 license (the "License"). You may not use this product except in
66
// compliance with the Apache 2.0 License.
@@ -13,8 +13,8 @@
1313
#include <functional>
1414
#include <bitset>
1515

16-
#include <bftengine/Replica.hpp>
17-
#include <messages/StateTransferMsg.hpp>
16+
#include "bftengine/Replica.hpp"
17+
#include "messages/StateTransferMsg.hpp"
1818
#include "FullNodeReplica.hpp"
1919

2020
#include "log/logger.hpp"
@@ -33,32 +33,31 @@
3333
#include "communication/StateControl.hpp"
3434

3535
using concordUtil::Timers;
36+
using namespace std::placeholders;
37+
38+
// Note : The changes in files are inclined with RO replica SateTransfer behavior, all the class functions are inherited
39+
// from ReadOnlyReplica. As we know for timebeing StateTransfer functionality is a temporary solution for FullNode,
40+
// until the ASP/BSP is implemented the functions in this class needs to be changed based on the required accordingly.
3641

3742
namespace bftEngine::impl {
3843

3944
FullNodeReplica::FullNodeReplica(const ReplicaConfig &config,
40-
std::shared_ptr<IRequestsHandler> requestsHandler,
41-
IStateTransfer *stateTransfer,
42-
std::shared_ptr<MsgsCommunicator> msgComm,
43-
std::shared_ptr<MsgHandlersRegistrator> msgHandlerReg,
45+
std::shared_ptr<IRequestsHandler> requests_handler,
46+
IStateTransfer *state_transfer,
47+
std::shared_ptr<MsgsCommunicator> msg_comm,
48+
std::shared_ptr<MsgHandlersRegistrator> msg_handler_reg,
4449
concordUtil::Timers &timers,
45-
MetadataStorage *metadataStorage)
46-
: ReplicaForStateTransfer(config, requestsHandler, stateTransfer, msgComm, msgHandlerReg, true, timers),
50+
MetadataStorage *metadata_storage)
51+
: ReplicaForStateTransfer(config, requests_handler, state_transfer, msg_comm, msg_handler_reg, true, timers),
4752
fn_metrics_{metrics_.RegisterCounter("receivedCheckpointMsgs"),
4853
metrics_.RegisterCounter("sentAskForCheckpointMsgs"),
4954
metrics_.RegisterCounter("receivedInvalidMsgs"),
5055
metrics_.RegisterGauge("lastExecutedSeqNum", lastExecutedSeqNum)},
51-
metadataStorage_{metadataStorage} {
56+
metadata_storage_{metadata_storage} {
5257
LOG_INFO(GL, "Initialising Full Node Replica");
5358
repsInfo = new ReplicasInfo(config, dynamicCollectorForPartialProofs, dynamicCollectorForExecutionProofs);
54-
msgHandlers_->registerMsgHandler(
55-
MsgCode::Checkpoint, std::bind(&FullNodeReplica::messageHandler<CheckpointMsg>, this, std::placeholders::_1));
56-
msgHandlers_->registerMsgHandler(
57-
MsgCode::ClientRequest,
58-
std::bind(&FullNodeReplica::messageHandler<ClientRequestMsg>, this, std::placeholders::_1));
59-
msgHandlers_->registerMsgHandler(
60-
MsgCode::StateTransfer,
61-
std::bind(&FullNodeReplica::messageHandler<StateTransferMsg>, this, std::placeholders::_1));
59+
60+
registerMsgHandlers();
6261
metrics_.Register();
6362

6463
SigManager::init(config_.replicaId,
@@ -96,10 +95,8 @@ void FullNodeReplica::stop() {
9695
}
9796

9897
void FullNodeReplica::onTransferringCompleteImp(uint64_t newStateCheckpoint) {
99-
lastExecutedSeqNum = newStateCheckpoint * checkpointWindowSize;
100-
101-
fn_metrics_.last_executed_seq_num_.Get().Set(lastExecutedSeqNum);
102-
last_executed_seq_num_ = lastExecutedSeqNum;
98+
last_executed_seq_num_ = newStateCheckpoint * checkpointWindowSize;
99+
fn_metrics_.last_executed_seq_num_.Get().Set(last_executed_seq_num_);
103100
}
104101

105102
void FullNodeReplica::onReportAboutInvalidMessage(MessageBase *msg, const char *reason) {
@@ -111,8 +108,8 @@ void FullNodeReplica::onReportAboutInvalidMessage(MessageBase *msg, const char *
111108
void FullNodeReplica::sendAskForCheckpointMsg() {
112109
fn_metrics_.sent_ask_for_checkpoint_msg_++;
113110
LOG_INFO(GL, "sending AskForCheckpointMsg");
114-
auto msg = std::make_unique<AskForCheckpointMsg>(config_.replicaId);
115-
for (auto id : repsInfo->idsOfPeerReplicas()) send(msg.get(), id);
111+
AskForCheckpointMsg msg{config_.replicaId};
112+
for (auto id : repsInfo->idsOfPeerReplicas()) send(&msg, id);
116113
}
117114

118115
template <>
@@ -139,24 +136,24 @@ void FullNodeReplica::onMessage<CheckpointMsg>(std::unique_ptr<CheckpointMsg> ms
139136
msg->rvbDataDigest()));
140137

141138
// Reconfiguration cmd block is synced to RO replica via reserved pages
142-
EpochNum replicasLastKnownEpochVal = 0;
143-
auto epochNumberFromResPages = ReconfigurationCmd::instance().getReconfigurationCommandEpochNumber();
144-
if (epochNumberFromResPages.has_value()) replicasLastKnownEpochVal = epochNumberFromResPages.value();
139+
EpochNum replicas_last_known_epoch_val = 0;
140+
auto epoch_number_from_res_pages = ReconfigurationCmd::instance().getReconfigurationCommandEpochNumber();
141+
if (epoch_number_from_res_pages.has_value()) replicas_last_known_epoch_val = epoch_number_from_res_pages.value();
145142

146143
// not relevant
147144
if (!msg->isStableState() || msg->seqNumber() <= lastExecutedSeqNum ||
148-
msg->epochNumber() < replicasLastKnownEpochVal) {
145+
msg->epochNumber() < replicas_last_known_epoch_val) {
149146
return;
150147
}
151148
// no self certificate
152-
static std::map<SeqNum, CheckpointInfo<false>> checkpointsInfo;
153-
const auto msgSeqNum = msg->seqNumber();
154-
const auto idOfGeneratedReplica = msg->idOfGeneratedReplica();
155-
checkpointsInfo[msgSeqNum].addCheckpointMsg(msg.release(), idOfGeneratedReplica);
149+
static std::map<SeqNum, CheckpointInfo<false>> checkpoints_info;
150+
const auto msg_seq_num = msg->seqNumber();
151+
const auto id_of_generated_eplica = msg->idOfGeneratedReplica();
152+
checkpoints_info[msg_seq_num].addCheckpointMsg(msg.release(), id_of_generated_eplica);
156153
// if enough - invoke state transfer
157-
if (checkpointsInfo[msgSeqNum].isCheckpointCertificateComplete()) {
158-
persistCheckpointDescriptor(msgSeqNum, checkpointsInfo[msgSeqNum]);
159-
checkpointsInfo.clear();
154+
if (checkpoints_info[msg_seq_num].isCheckpointCertificateComplete()) {
155+
persistCheckpointDescriptor(msg_seq_num, checkpoints_info[msg_seq_num]);
156+
checkpoints_info.clear();
160157
LOG_INFO(GL, "call to startCollectingState()");
161158
stateTransfer->startCollectingState();
162159
}
@@ -177,103 +174,37 @@ void FullNodeReplica::persistCheckpointDescriptor(const SeqNum &seqnum, const Ch
177174
m.second->idOfGeneratedReplica()));
178175
}
179176
DescriptorOfLastStableCheckpoint desc(ReplicaConfig::instance().getnumReplicas(), msgs);
180-
const size_t bufLen = DescriptorOfLastStableCheckpoint::maxSize(ReplicaConfig::instance().getnumReplicas());
181-
concord::serialize::UniquePtrToChar descBuf(new char[bufLen]);
182-
char *descBufPtr = descBuf.get();
183-
size_t actualSize = 0;
184-
desc.serialize(descBufPtr, bufLen, actualSize);
185-
ConcordAssertNE(actualSize, 0);
177+
const size_t buf_len = DescriptorOfLastStableCheckpoint::maxSize(ReplicaConfig::instance().getnumReplicas());
178+
concord::serialize::UniquePtrToChar desc_buf(new char[buf_len]);
179+
char *desc_buf_ptr = desc_buf.get();
180+
size_t actual_size = 0;
181+
desc.serialize(desc_buf_ptr, buf_len, actual_size);
182+
ConcordAssertNE(actual_size, 0);
186183

187184
// TODO [TK] S3KeyGenerator
188185
// checkpoints/<BlockId>/<RepId>
189186
std::ostringstream oss;
190187
oss << "checkpoints/" << msgs[0]->state() << "/" << config_.replicaId;
191-
metadataStorage_->atomicWriteArbitraryObject(oss.str(), descBuf.get(), actualSize);
188+
metadata_storage_->atomicWriteArbitraryObject(oss.str(), desc_buf.get(), actual_size);
192189
}
193190

194191
template <>
195192
void FullNodeReplica::onMessage<ClientRequestMsg>(std::unique_ptr<ClientRequestMsg> msg) {
196-
const NodeIdType senderId = msg->senderId();
197-
const NodeIdType clientId = msg->clientProxyId();
198-
const bool reconfig_flag = (msg->flags() & MsgFlag::RECONFIG_FLAG) != 0;
199-
const ReqId reqSeqNum = msg->requestSeqNum();
193+
const NodeIdType sender_id = msg->senderId();
194+
const NodeIdType client_id = msg->clientProxyId();
195+
const ReqId req_seq_num = msg->requestSeqNum();
200196
const uint64_t flags = msg->flags();
201197

202198
SCOPED_MDC_CID(msg->getCid());
203-
LOG_DEBUG(CNSUS, KVLOG(clientId, reqSeqNum, senderId) << " flags: " << std::bitset<sizeof(uint64_t) * 8>(flags));
199+
LOG_DEBUG(CNSUS, KVLOG(client_id, req_seq_num, sender_id) << " flags: " << std::bitset<sizeof(uint64_t) * 8>(flags));
204200

205201
const auto &span_context = msg->spanContext<std::remove_pointer<ClientRequestMsg>::type>();
206202
auto span = concordUtils::startChildSpanFromContext(span_context, "bft_client_request");
207203
span.setTag("rid", config_.getreplicaId());
208204
span.setTag("cid", msg->getCid());
209-
span.setTag("seq_num", reqSeqNum);
210-
211-
// A full node replica can handle only reconfiguration requests. Those requests are signed by the operator and
212-
// the validation is done in the reconfiguration engine. Thus, we don't need to check the client validity as in
213-
// the committers
205+
span.setTag("seq_num", req_seq_num);
214206

215-
if (reconfig_flag) {
216-
LOG_INFO(GL, "FN replica has received a reconfiguration request");
217-
executeReadOnlyRequest(span, *(msg.get()));
218-
return;
219-
}
220-
}
221-
222-
void FullNodeReplica::executeReadOnlyRequest(concordUtils::SpanWrapper &parent_span, const ClientRequestMsg &request) {
223-
auto span = concordUtils::startChildSpan("bft_execute_read_only_request", parent_span);
224-
// full node replica does not know who is the primary, so it always return 0. It is the client responsibility to treat
225-
// the replies accordingly.
226-
ClientReplyMsg reply(0, request.requestSeqNum(), config_.getreplicaId());
227-
const uint16_t clientId = request.clientProxyId();
228-
229-
int executionResult = 0;
230-
bftEngine::IRequestsHandler::ExecutionRequestsQueue accumulatedRequests;
231-
accumulatedRequests.push_back(bftEngine::IRequestsHandler::ExecutionRequest{clientId,
232-
static_cast<uint64_t>(lastExecutedSeqNum),
233-
request.getCid(),
234-
request.flags(),
235-
request.requestLength(),
236-
request.requestBuf(),
237-
"",
238-
reply.maxReplyLength(),
239-
reply.replyBuf(),
240-
request.requestSeqNum(),
241-
request.requestIndexInBatch(),
242-
request.result()});
243-
// DD: Do we need to take care of Time Service here?
244-
bftRequestsHandler_->execute(accumulatedRequests, std::nullopt, request.getCid(), span);
245-
IRequestsHandler::ExecutionRequest &single_request = accumulatedRequests.back();
246-
executionResult = single_request.outExecutionStatus;
247-
const uint32_t actualReplyLength = single_request.outActualReplySize;
248-
const uint32_t actualReplicaSpecificInfoLength = single_request.outReplicaSpecificInfoSize;
249-
LOG_DEBUG(GL,
250-
"Executed full node request. " << KVLOG(clientId,
251-
lastExecutedSeqNum,
252-
request.requestLength(),
253-
reply.maxReplyLength(),
254-
actualReplyLength,
255-
actualReplicaSpecificInfoLength,
256-
executionResult));
257-
// TODO(GG): TBD - how do we want to support empty replies? (actualReplyLength==0)
258-
if (!executionResult) {
259-
if (actualReplyLength > 0) {
260-
reply.setReplyLength(actualReplyLength);
261-
reply.setReplicaSpecificInfoLength(actualReplicaSpecificInfoLength);
262-
send(&reply, clientId);
263-
return;
264-
} else {
265-
LOG_WARN(GL, "Received zero size response. " << KVLOG(clientId));
266-
strcpy(single_request.outReply, "Executed data is empty");
267-
single_request.outActualReplySize = strlen(single_request.outReply);
268-
executionResult = static_cast<uint32_t>(bftEngine::OperationResult::EXEC_DATA_EMPTY);
269-
}
270-
271-
} else {
272-
LOG_ERROR(GL, "Received error while executing FN request. " << KVLOG(clientId, executionResult));
273-
}
274-
ClientReplyMsg replyMsg(
275-
0, request.requestSeqNum(), single_request.outReply, single_request.outActualReplySize, executionResult);
276-
send(&replyMsg, clientId);
207+
// TODO: handle reconfiguration request here, refer ReadOnlyReplica class
277208
}
278209

279210
void FullNodeReplica::registerStatusHandlers() {
@@ -292,4 +223,13 @@ void FullNodeReplica::registerStatusHandlers() {
292223
concord::diagnostics::RegistrarSingleton::getInstance().status.registerHandler(h);
293224
}
294225

226+
void FullNodeReplica::registerMsgHandlers() {
227+
msgHandlers_->registerMsgHandler(MsgCode::Checkpoint,
228+
std::bind(&FullNodeReplica::messageHandler<CheckpointMsg>, this, _1));
229+
msgHandlers_->registerMsgHandler(MsgCode::ClientRequest,
230+
std::bind(&FullNodeReplica::messageHandler<ClientRequestMsg>, this, _1));
231+
msgHandlers_->registerMsgHandler(MsgCode::StateTransfer,
232+
std::bind(&FullNodeReplica::messageHandler<StateTransferMsg>, this, _1));
233+
}
234+
295235
} // namespace bftEngine::impl

bftengine/src/bftengine/FullNodeReplica.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class FullNodeReplica : public ReplicaForStateTransfer {
3333

3434
void start() override;
3535
void stop() override;
36-
virtual bool isReadOnly() const override { return false; }
37-
virtual bool isFullNode() const override { return true; }
36+
virtual bool isReadOnly() const override { return config_.isReadOnly; }
37+
virtual bool isFullNode() const override { return config_.isFullNode; }
3838

3939
protected:
4040
void sendAskForCheckpointMsg();
@@ -54,7 +54,6 @@ class FullNodeReplica : public ReplicaForStateTransfer {
5454
template <class T>
5555
void onMessage(std::unique_ptr<T>);
5656

57-
void executeReadOnlyRequest(concordUtils::SpanWrapper& parent_span, const ClientRequestMsg& m);
5857
void persistCheckpointDescriptor(const SeqNum&, const CheckpointInfo<false>&);
5958

6059
protected:
@@ -67,7 +66,7 @@ class FullNodeReplica : public ReplicaForStateTransfer {
6766
concordMetrics::GaugeHandle last_executed_seq_num_;
6867
} fn_metrics_;
6968

70-
std::unique_ptr<MetadataStorage> metadataStorage_;
69+
std::unique_ptr<MetadataStorage> metadata_storage_;
7170
std::atomic<SeqNum> last_executed_seq_num_{0};
7271

7372
private:
@@ -76,6 +75,8 @@ class FullNodeReplica : public ReplicaForStateTransfer {
7675
// The full node replica also hasn't got an implementation for InternalMessages which are used by the
7776
// ReplicaStatusHandler.
7877
void registerStatusHandlers();
78+
79+
void registerMsgHandlers();
7980
};
8081

8182
} // namespace bftEngine::impl

bftengine/src/bftengine/ReadOnlyReplica.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ class ReadOnlyReplica : public ReplicaForStateTransfer {
3333

3434
void start() override;
3535
void stop() override;
36-
virtual bool isReadOnly() const override { return true; }
37-
virtual bool isFullNode() const override { return false; }
36+
virtual bool isReadOnly() const override { return config_.isReadOnly; }
37+
virtual bool isFullNode() const override { return config_.isFullNode; }
3838

3939
protected:
4040
void sendAskForCheckpointMsg();

bftengine/src/bftengine/ReplicaImp.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,9 @@ class ReplicaImp : public InternalReplicaApi, public ReplicaForStateTransfer {
364364

365365
std::shared_ptr<concord::cron::TicksGenerator> ticksGenerator() const { return ticks_gen_; }
366366

367-
virtual bool isReadOnly() const override { return false; }
367+
virtual bool isReadOnly() const override { return config_.isReadOnly; }
368368

369-
virtual bool isFullNode() const override { return false; }
369+
virtual bool isFullNode() const override { return config_.isFullNode; }
370370

371371
shared_ptr<PersistentStorage> getPersistentStorage() const { return ps_; }
372372
std::shared_ptr<concord::secretsmanager::ISecretsManagerImpl> getSecretsManager() { return sm_; }

0 commit comments

Comments
 (0)