diff options
Diffstat (limited to 'src/mongo/db/repl/tenant_file_importer_service.h')
-rw-r--r-- | src/mongo/db/repl/tenant_file_importer_service.h | 56 |
1 files changed, 55 insertions, 1 deletions
diff --git a/src/mongo/db/repl/tenant_file_importer_service.h b/src/mongo/db/repl/tenant_file_importer_service.h index d5b0db7d629..ec3b77a986b 100644 --- a/src/mongo/db/repl/tenant_file_importer_service.h +++ b/src/mongo/db/repl/tenant_file_importer_service.h @@ -89,6 +89,60 @@ private: std::shared_ptr<executor::ScopedTaskExecutor> _scopedExecutor; boost::optional<UUID> _migrationId; Mutex _mutex = MONGO_MAKE_LATCH("TenantFileImporterService::_mutex"); - bool _toldPrimaryAllFilesAreCopied; + + class ImporterState { + public: + enum class State { kUninitialized, kCopyingFiles, kCopiedFiles, kImportedFiles }; + + void setState(State nextState) { + tassert(6114403, + str::stream() << "current state: " << toString(_state) + << ", new state: " << toString(nextState), + isValidTransition(nextState)); + _state = nextState; + } + + bool is(State state) { + return _state == state; + } + + private: + StringData toString(State value) { + switch (value) { + case State::kUninitialized: + return "uninitialized"; + case State::kCopyingFiles: + return "copying files"; + case State::kCopiedFiles: + return "copied files"; + case State::kImportedFiles: + return "imported files"; + } + MONGO_UNREACHABLE; + return StringData(); + } + + bool isValidTransition(State newState) { + if (_state == newState) { + return true; + } + + switch (_state) { + case State::kUninitialized: + return newState == State::kCopyingFiles; + case State::kCopyingFiles: + return newState == State::kCopiedFiles || newState == State::kUninitialized; + case State::kCopiedFiles: + return newState == State::kImportedFiles || newState == State::kUninitialized; + case State::kImportedFiles: + return newState == State::kUninitialized; + } + MONGO_UNREACHABLE; + } + + State _state = State::kUninitialized; + }; + + ImporterState _state; }; } // namespace mongo::repl |