From 9b2f667bbe0d6933b13262fbb7457ee28166caef Mon Sep 17 00:00:00 2001 From: Meng Xu Date: Tue, 18 Aug 2020 11:58:57 -0700 Subject: [PATCH] FastRestore:Fix uninitialized variable --- fdbserver/RestoreApplier.actor.cpp | 12 +++++++----- fdbserver/RestoreLoader.actor.cpp | 2 ++ fdbserver/RestoreLoader.actor.h | 3 ++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/fdbserver/RestoreApplier.actor.cpp b/fdbserver/RestoreApplier.actor.cpp index 9877fd4c78..31efd2c784 100644 --- a/fdbserver/RestoreApplier.actor.cpp +++ b/fdbserver/RestoreApplier.actor.cpp @@ -111,6 +111,7 @@ ACTOR static Future handleSendMutationVectorRequest(RestoreSendVersionedMu Reference self) { state Reference batchData = self->batch[req.batchIndex]; state bool printTrace = false; + state NotifiedVersion* curMsgIndex = nullptr; ASSERT(batchData.isValid()); ASSERT(self->finishedBatch.get() < req.batchIndex); @@ -134,14 +135,15 @@ ACTOR static Future handleSendMutationVectorRequest(RestoreSendVersionedMu wait(isSchedulable(self, req.batchIndex, __FUNCTION__)); ASSERT(batchData.isValid()); + ASSERT(req.batchIndex > self->finishedBatch.get()); // Assume: processedFileState[req.asset] will not be erased while the actor is active. // Note: Insert new items into processedFileState will not invalidate the reference. - state NotifiedVersion& curMsgIndex = batchData->processedFileState[req.asset]; - wait(curMsgIndex.whenAtLeast(req.msgIndex - 1)); + curMsgIndex = &batchData->processedFileState[req.asset]; + wait(curMsgIndex->whenAtLeast(req.msgIndex - 1)); batchData->vbState = ApplierVersionBatchState::RECEIVE_MUTATIONS; state bool isDuplicated = true; - if (curMsgIndex.get() == req.msgIndex - 1) { + if (curMsgIndex->get() == req.msgIndex - 1) { isDuplicated = false; for (int mIndex = 0; mIndex < req.versionedMutations.size(); mIndex++) { @@ -169,14 +171,14 @@ ACTOR static Future handleSendMutationVectorRequest(RestoreSendVersionedMu ASSERT(versionedMutation.mutation.type != MutationRef::SetVersionstampedKey && versionedMutation.mutation.type != MutationRef::SetVersionstampedValue); } - curMsgIndex.set(req.msgIndex); + curMsgIndex->set(req.msgIndex); } req.reply.send(RestoreCommonReply(self->id(), isDuplicated)); TraceEvent(printTrace ? SevInfo : SevFRDebugInfo, "FastRestoreApplierPhaseReceiveMutationsDone", self->id()) .detail("BatchIndex", req.batchIndex) .detail("RestoreAsset", req.asset.toString()) - .detail("ProcessedMessageIndex", curMsgIndex.get()) + .detail("ProcessedMessageIndex", curMsgIndex->get()) .detail("Request", req.toString()); return Void(); } diff --git a/fdbserver/RestoreLoader.actor.cpp b/fdbserver/RestoreLoader.actor.cpp index 41516ed381..f0871a6523 100644 --- a/fdbserver/RestoreLoader.actor.cpp +++ b/fdbserver/RestoreLoader.actor.cpp @@ -476,6 +476,7 @@ ACTOR Future handleLoadFileRequest(RestoreLoadFileRequest req, Reference self->finishedBatch.get()); bool paramExist = batchData->processedFileParams.find(req.param) != batchData->processedFileParams.end(); bool isReady = paramExist ? batchData->processedFileParams[req.param].isReady() : false; @@ -563,6 +564,7 @@ ACTOR Future handleSendMutationsRequest(RestoreSendMutationsToAppliersRequ state bool isDuplicated = true; ASSERT(batchData.isValid() && batchStatus.isValid()); + ASSERT(req.batchIndex > self->finishedBatch.get()); TraceEvent("FastRestoreLoaderPhaseSendMutations", self->id()) .detail("BatchIndex", req.batchIndex) .detail("UseRangeFile", req.useRangeFile) diff --git a/fdbserver/RestoreLoader.actor.h b/fdbserver/RestoreLoader.actor.h index 4db650c3c0..b2c43ae032 100644 --- a/fdbserver/RestoreLoader.actor.h +++ b/fdbserver/RestoreLoader.actor.h @@ -93,7 +93,8 @@ struct LoaderBatchData : public ReferenceCounted { oldLogMutations("OldLogMutations", cc) {} } counters; - explicit LoaderBatchData(UID nodeID, int batchIndex) : counters(this, nodeID, batchIndex), vbState(LoaderVersionBatchState::NOT_INIT) { + explicit LoaderBatchData(UID nodeID, int batchIndex) + : counters(this, nodeID, batchIndex), vbState(LoaderVersionBatchState::NOT_INIT), loadFileReqs(0) { pollMetrics = traceCounters(format("FastRestoreLoaderMetrics%d", batchIndex), nodeID, SERVER_KNOBS->FASTRESTORE_ROLE_LOGGING_DELAY, &counters.cc, nodeID.toString() + "/RestoreLoaderMetrics/" + std::to_string(batchIndex));