summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeert Bosch <geert@mongodb.com>2015-05-27 15:59:45 -0400
committerGeert Bosch <geert@mongodb.com>2015-06-08 17:41:32 -0400
commit1367fe09ce1f76479bb88bf570b5928212396024 (patch)
tree85b998e47acaa9befcb8dd062053aca9014a1b32
parenta6b23ca29af686e704874e9210faac4b6691f382 (diff)
downloadmongo-1367fe09ce1f76479bb88bf570b5928212396024.tar.gz
SERVER-18807: Add commit/rollback functionality to recovery_unit_noop.h
-rw-r--r--src/mongo/db/storage/recovery_unit_noop.h39
1 files changed, 29 insertions, 10 deletions
diff --git a/src/mongo/db/storage/recovery_unit_noop.h b/src/mongo/db/storage/recovery_unit_noop.h
index 911320bed86..c324bc330a8 100644
--- a/src/mongo/db/storage/recovery_unit_noop.h
+++ b/src/mongo/db/storage/recovery_unit_noop.h
@@ -28,6 +28,9 @@
#pragma once
+#include <memory>
+#include <vector>
+
#include "mongo/db/storage/recovery_unit.h"
namespace mongo {
@@ -36,10 +39,29 @@ namespace mongo {
class RecoveryUnitNoop : public RecoveryUnit {
public:
- // TODO implement rollback
void beginUnitOfWork(OperationContext* opCtx) final {}
- void commitUnitOfWork() final {}
- void abortUnitOfWork() final {}
+ void commitUnitOfWork() final {
+ for (auto& change : _changes) {
+ try {
+ change->commit();
+ }
+ catch (...) {
+ std::terminate();
+ }
+ }
+ _changes.clear();
+ }
+ void abortUnitOfWork() final {
+ for (auto it = _changes.rbegin(); it != _changes.rend(); ++it) {
+ try {
+ (*it)->rollback();
+ }
+ catch (...) {
+ std::terminate();
+ }
+ }
+ _changes.clear();
+ }
virtual void abandonSnapshot() {}
@@ -48,13 +70,7 @@ namespace mongo {
}
virtual void registerChange(Change* change) {
- try {
- change->commit();
- delete change;
- }
- catch (...) {
- std::terminate();
- }
+ _changes.push_back(std::unique_ptr<Change>(change));
}
virtual void* writingPtr(void* data, size_t len) {
@@ -63,6 +79,9 @@ namespace mongo {
virtual void setRollbackWritesDisabled() {}
virtual SnapshotId getSnapshotId() const { return SnapshotId(); }
+
+ private:
+ std::vector<std::unique_ptr<Change>> _changes;
};
} // namespace mongo