summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/resharding/resharding_metrics.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/resharding/resharding_metrics.h')
-rw-r--r--src/mongo/db/s/resharding/resharding_metrics.h56
1 files changed, 52 insertions, 4 deletions
diff --git a/src/mongo/db/s/resharding/resharding_metrics.h b/src/mongo/db/s/resharding/resharding_metrics.h
index 5b8f1a76f06..3c2bd1e57a9 100644
--- a/src/mongo/db/s/resharding/resharding_metrics.h
+++ b/src/mongo/db/s/resharding/resharding_metrics.h
@@ -80,6 +80,20 @@ public:
CoordinatorStateEnum _enumVal;
};
+ struct ExternallyTrackedRecipientFields {
+ public:
+ void accumulateFrom(const ReshardingOplogApplierProgress& progressDoc);
+
+ boost::optional<int64_t> documentCountCopied;
+ boost::optional<int64_t> documentBytesCopied;
+ boost::optional<int64_t> oplogEntriesFetched;
+ boost::optional<int64_t> oplogEntriesApplied;
+ boost::optional<int64_t> insertsApplied;
+ boost::optional<int64_t> updatesApplied;
+ boost::optional<int64_t> deletesApplied;
+ boost::optional<int64_t> writesToStashCollections;
+ };
+
ReshardingMetrics(const CommonReshardingMetadata& metadata,
Role role,
ClockSource* clockSource,
@@ -151,28 +165,43 @@ public:
void onStateTransition(T before, T after) {
_stateHolder.onStateTransition(before, after);
}
- void accumulateFrom(const ReshardingOplogApplierProgress& progressDoc);
+
+ template <typename StateOrStateVariant>
+ static bool mustRestoreExternallyTrackedRecipientFields(StateOrStateVariant stateOrVariant) {
+ if constexpr (std::is_same_v<StateOrStateVariant, State>) {
+ return stdx::visit(
+ [](auto v) { return mustRestoreExternallyTrackedRecipientFieldsImpl(v); },
+ stateOrVariant);
+ } else {
+ return mustRestoreExternallyTrackedRecipientFieldsImpl(stateOrVariant);
+ }
+ }
+
BSONObj reportForCurrentOp() const noexcept override;
void onUpdateApplied();
void onInsertApplied();
void onDeleteApplied();
void onOplogEntriesFetched(int64_t numEntries, Milliseconds elapsed);
- void restoreOplogEntriesFetched(int64_t numEntries);
void onOplogEntriesApplied(int64_t numEntries);
- void restoreOplogEntriesApplied(int64_t numEntries);
void onApplyingBegin();
void onApplyingEnd();
void onLocalInsertDuringOplogFetching(Milliseconds elapsed);
void onBatchRetrievedDuringOplogApplying(Milliseconds elapsed);
void onOplogLocalBatchApplied(Milliseconds elapsed);
+ void restoreExternallyTrackedRecipientFields(const ExternallyTrackedRecipientFields& values);
Seconds getApplyingElapsedTimeSecs() const;
Date_t getApplyingBegin() const;
Date_t getApplyingEnd() const;
- Milliseconds getRecipientHighEstimateRemainingTimeMillis() const;
protected:
+ boost::optional<Milliseconds> getRecipientHighEstimateRemainingTimeMillis() const override;
+ void restoreOplogEntriesFetched(int64_t numEntries);
+ void restoreOplogEntriesApplied(int64_t numEntries);
+ void restoreUpdatesApplied(int64_t count);
+ void restoreInsertsApplied(int64_t count);
+ void restoreDeletesApplied(int64_t count);
virtual StringData getStateString() const noexcept override;
void restoreApplyingBegin(Date_t date);
void restoreApplyingEnd(Date_t date);
@@ -196,6 +225,16 @@ private:
}
template <typename T>
+ static bool mustRestoreExternallyTrackedRecipientFieldsImpl(T state) {
+ static_assert(resharding_metrics::isState<T>);
+ if constexpr (std::is_same_v<T, RecipientStateEnum>) {
+ return state > RecipientStateEnum::kAwaitingFetchTimestamp;
+ } else {
+ return false;
+ }
+ }
+
+ template <typename T>
void restorePhaseDurationFields(const T& document) {
static_assert(resharding_metrics::isStateDocument<T>);
auto metrics = document.getMetrics();
@@ -226,6 +265,15 @@ private:
}
}
+ template <typename MemberFn, typename... T>
+ void invokeIfAllSet(MemberFn&& fn, const boost::optional<T>&... args) {
+ if (!(args && ...)) {
+ return;
+ }
+ std::invoke(fn, this, *args...);
+ }
+
+ AtomicWord<bool> _ableToEstimateRemainingRecipientTime;
AtomicWord<int64_t> _deletesApplied;
AtomicWord<int64_t> _insertsApplied;
AtomicWord<int64_t> _updatesApplied;