summaryrefslogtreecommitdiff
path: root/src/mongo/db/storage/recovery_unit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/storage/recovery_unit.cpp')
-rw-r--r--src/mongo/db/storage/recovery_unit.cpp44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/mongo/db/storage/recovery_unit.cpp b/src/mongo/db/storage/recovery_unit.cpp
index bd2f0b70e52..9aeddf2d6ad 100644
--- a/src/mongo/db/storage/recovery_unit.cpp
+++ b/src/mongo/db/storage/recovery_unit.cpp
@@ -66,10 +66,15 @@ void RecoveryUnit::runPreCommitHooks(OperationContext* opCtx) {
}
void RecoveryUnit::registerChange(std::unique_ptr<Change> change) {
- invariant(_inUnitOfWork(), toString(_getState()));
+ validateInUnitOfWork();
_changes.push_back(std::move(change));
}
+void RecoveryUnit::registerChangeForCatalogVisibility(std::unique_ptr<Change> change) {
+ validateInUnitOfWork();
+ _changesForCatalogVisibility.push_back(std::move(change));
+}
+
void RecoveryUnit::commitRegisteredChanges(boost::optional<Timestamp> commitTimestamp) {
// Getting to this method implies `runPreCommitHooks` completed successfully, resulting in
// having its contents cleared.
@@ -77,6 +82,10 @@ void RecoveryUnit::commitRegisteredChanges(boost::optional<Timestamp> commitTime
if (MONGO_unlikely(widenWUOWChangesWindow.shouldFail())) {
sleepmillis(1000);
}
+ _executeCommitHandlers(commitTimestamp);
+}
+
+void RecoveryUnit::_executeCommitHandlers(boost::optional<Timestamp> commitTimestamp) {
for (auto& change : _changes) {
try {
// Log at higher level because commits occur far more frequently than rollbacks.
@@ -89,7 +98,20 @@ void RecoveryUnit::commitRegisteredChanges(boost::optional<Timestamp> commitTime
std::terminate();
}
}
+ for (auto& change : _changesForCatalogVisibility) {
+ try {
+ // Log at higher level because commits occur far more frequently than rollbacks.
+ LOGV2_DEBUG(5255701,
+ 2,
+ "CUSTOM COMMIT {demangleName_typeid_change}",
+ "demangleName_typeid_change"_attr = redact(demangleName(typeid(*change))));
+ change->commit(commitTimestamp);
+ } catch (...) {
+ std::terminate();
+ }
+ }
_changes.clear();
+ _changesForCatalogVisibility.clear();
}
void RecoveryUnit::abortRegisteredChanges() {
@@ -97,7 +119,21 @@ void RecoveryUnit::abortRegisteredChanges() {
if (MONGO_unlikely(widenWUOWChangesWindow.shouldFail())) {
sleepmillis(1000);
}
+ _executeRollbackHandlers();
+}
+void RecoveryUnit::_executeRollbackHandlers() {
try {
+ for (Changes::const_reverse_iterator it = _changesForCatalogVisibility.rbegin(),
+ end = _changesForCatalogVisibility.rend();
+ it != end;
+ ++it) {
+ Change* change = it->get();
+ LOGV2_DEBUG(5255702,
+ 2,
+ "CUSTOM ROLLBACK {demangleName_typeid_change}",
+ "demangleName_typeid_change"_attr = redact(demangleName(typeid(*change))));
+ change->rollback();
+ }
for (Changes::const_reverse_iterator it = _changes.rbegin(), end = _changes.rend();
it != end;
++it) {
@@ -108,9 +144,15 @@ void RecoveryUnit::abortRegisteredChanges() {
"demangleName_typeid_change"_attr = redact(demangleName(typeid(*change))));
change->rollback();
}
+ _changesForCatalogVisibility.clear();
_changes.clear();
} catch (...) {
std::terminate();
}
}
+
+void RecoveryUnit::validateInUnitOfWork() const {
+ invariant(_inUnitOfWork(), toString(_getState()));
+}
+
} // namespace mongo