diff options
Diffstat (limited to 'src/mongo/db/repl/database_cloner.h')
-rw-r--r-- | src/mongo/db/repl/database_cloner.h | 303 |
1 files changed, 151 insertions, 152 deletions
diff --git a/src/mongo/db/repl/database_cloner.h b/src/mongo/db/repl/database_cloner.h index f1171bf5e4b..954f816cdaa 100644 --- a/src/mongo/db/repl/database_cloner.h +++ b/src/mongo/db/repl/database_cloner.h @@ -47,158 +47,157 @@ namespace mongo { namespace repl { - class DatabaseCloner : public BaseCloner { - MONGO_DISALLOW_COPYING(DatabaseCloner); - public: - - /** - * Predicate used on the collection info objects returned by listCollections. - * Each collection info is represented by a document in the following format: - * { - * name: <collection name>, - * options: <collection options> - * } - * - * Returns true if the collection described by the info object should be cloned. - * Returns false if the collection should be ignored. - */ - using ListCollectionsPredicateFn = stdx::function<bool (const BSONObj&)>; - - /** - * Callback function to report progress of collection cloning. Arguments are: - * - status from the collection cloner's 'onCompletion' callback. - * - source namespace of the collection cloner that completed (or failed). - * - * Called exactly once for every collection cloner started by the the database cloner. - */ - using CollectionCallbackFn = stdx::function<void (const Status&, const NamespaceString&)>; - - /** - * Type of function to start a collection cloner. - */ - using StartCollectionClonerFn = stdx::function<Status (CollectionCloner&)>; - - /** - * Creates DatabaseCloner task in inactive state. Use start() to activate cloner. - * - * The cloner calls 'onCompletion' when the database cloning has completed or failed. - * - * 'onCompletion' will be called exactly once. - * - * Takes ownership of the passed StorageInterface object. - */ - DatabaseCloner(ReplicationExecutor* executor, - const HostAndPort& source, - const std::string& dbname, - const BSONObj& listCollectionsFilter, - const ListCollectionsPredicateFn& listCollectionsPredicate, - CollectionCloner::StorageInterface* storageInterface, - const CollectionCallbackFn& collectionWork, - const CallbackFn& onCompletion); - - virtual ~DatabaseCloner(); - - /** - * Returns collection info objects read from listCollections result. - * This will return an empty vector until we have processed the last - * batch of results from listCollections. - */ - const std::vector<BSONObj>& getCollectionInfos() const; - - std::string getDiagnosticString() const override; - - bool isActive() const override; - - Status start() override; - - void cancel() override; - - void wait() override; - - // - // Testing only functions below. - // - - /** - * Overrides how executor schedules database work. - * - * For testing only. - */ - void setScheduleDbWorkFn(const CollectionCloner::ScheduleDbWorkFn& scheduleDbWorkFn); - - /** - * Overrides how executor starts a collection cloner. - * - * For testing only - */ - void setStartCollectionClonerFn(const StartCollectionClonerFn& startCollectionCloner); - - private: - - /** - * Read collection names and options from listCollections result. - */ - void _listCollectionsCallback(const StatusWith<Fetcher::QueryResponse>& fetchResult, - Fetcher::NextAction* nextAction, - BSONObjBuilder* getMoreBob); - - /** - * Forwards collection cloner result to client. - * Starts a new cloner on a different collection. - */ - void _collectionClonerCallback(const Status& status, const NamespaceString& nss); - - /** - * Reports completion status. - * Sets cloner to inactive. - */ - void _finishCallback(const Status& status); - - // Not owned by us. - ReplicationExecutor* _executor; - - HostAndPort _source; - std::string _dbname; - BSONObj _listCollectionsFilter; - ListCollectionsPredicateFn _listCollectionsPredicate; - CollectionCloner::StorageInterface* _storageInterface; - - // Invoked once for every successfully started collection cloner. - CollectionCallbackFn _collectionWork; - - // Invoked once when cloning completes or fails. - CallbackFn _onCompletion; - - // Protects member data of this database cloner. - mutable stdx::mutex _mutex; - - mutable stdx::condition_variable _condition; - - // _active is true when database cloner is started. - bool _active; - - // Fetcher instance for running listCollections command. - Fetcher _listCollectionsFetcher; - - // Collection info objects returned from listCollections. - // Format of each document: - // { - // name: <collection name>, - // options: <collection options> - // } - // Holds all collection infos from listCollections. - std::vector<BSONObj> _collectionInfos; +class DatabaseCloner : public BaseCloner { + MONGO_DISALLOW_COPYING(DatabaseCloner); + +public: + /** + * Predicate used on the collection info objects returned by listCollections. + * Each collection info is represented by a document in the following format: + * { + * name: <collection name>, + * options: <collection options> + * } + * + * Returns true if the collection described by the info object should be cloned. + * Returns false if the collection should be ignored. + */ + using ListCollectionsPredicateFn = stdx::function<bool(const BSONObj&)>; + + /** + * Callback function to report progress of collection cloning. Arguments are: + * - status from the collection cloner's 'onCompletion' callback. + * - source namespace of the collection cloner that completed (or failed). + * + * Called exactly once for every collection cloner started by the the database cloner. + */ + using CollectionCallbackFn = stdx::function<void(const Status&, const NamespaceString&)>; + + /** + * Type of function to start a collection cloner. + */ + using StartCollectionClonerFn = stdx::function<Status(CollectionCloner&)>; + + /** + * Creates DatabaseCloner task in inactive state. Use start() to activate cloner. + * + * The cloner calls 'onCompletion' when the database cloning has completed or failed. + * + * 'onCompletion' will be called exactly once. + * + * Takes ownership of the passed StorageInterface object. + */ + DatabaseCloner(ReplicationExecutor* executor, + const HostAndPort& source, + const std::string& dbname, + const BSONObj& listCollectionsFilter, + const ListCollectionsPredicateFn& listCollectionsPredicate, + CollectionCloner::StorageInterface* storageInterface, + const CollectionCallbackFn& collectionWork, + const CallbackFn& onCompletion); + + virtual ~DatabaseCloner(); + + /** + * Returns collection info objects read from listCollections result. + * This will return an empty vector until we have processed the last + * batch of results from listCollections. + */ + const std::vector<BSONObj>& getCollectionInfos() const; + + std::string getDiagnosticString() const override; + + bool isActive() const override; + + Status start() override; + + void cancel() override; + + void wait() override; + + // + // Testing only functions below. + // + + /** + * Overrides how executor schedules database work. + * + * For testing only. + */ + void setScheduleDbWorkFn(const CollectionCloner::ScheduleDbWorkFn& scheduleDbWorkFn); + + /** + * Overrides how executor starts a collection cloner. + * + * For testing only + */ + void setStartCollectionClonerFn(const StartCollectionClonerFn& startCollectionCloner); + +private: + /** + * Read collection names and options from listCollections result. + */ + void _listCollectionsCallback(const StatusWith<Fetcher::QueryResponse>& fetchResult, + Fetcher::NextAction* nextAction, + BSONObjBuilder* getMoreBob); + + /** + * Forwards collection cloner result to client. + * Starts a new cloner on a different collection. + */ + void _collectionClonerCallback(const Status& status, const NamespaceString& nss); + + /** + * Reports completion status. + * Sets cloner to inactive. + */ + void _finishCallback(const Status& status); + + // Not owned by us. + ReplicationExecutor* _executor; + + HostAndPort _source; + std::string _dbname; + BSONObj _listCollectionsFilter; + ListCollectionsPredicateFn _listCollectionsPredicate; + CollectionCloner::StorageInterface* _storageInterface; + + // Invoked once for every successfully started collection cloner. + CollectionCallbackFn _collectionWork; + + // Invoked once when cloning completes or fails. + CallbackFn _onCompletion; + + // Protects member data of this database cloner. + mutable stdx::mutex _mutex; + + mutable stdx::condition_variable _condition; + + // _active is true when database cloner is started. + bool _active; + + // Fetcher instance for running listCollections command. + Fetcher _listCollectionsFetcher; + + // Collection info objects returned from listCollections. + // Format of each document: + // { + // name: <collection name>, + // options: <collection options> + // } + // Holds all collection infos from listCollections. + std::vector<BSONObj> _collectionInfos; + + std::vector<NamespaceString> _collectionNamespaces; + + std::list<CollectionCloner> _collectionCloners; + std::list<CollectionCloner>::iterator _currentCollectionClonerIter; - std::vector<NamespaceString> _collectionNamespaces; + // Function for scheduling database work using the executor. + CollectionCloner::ScheduleDbWorkFn _scheduleDbWorkFn; - std::list<CollectionCloner> _collectionCloners; - std::list<CollectionCloner>::iterator _currentCollectionClonerIter; + StartCollectionClonerFn _startCollectionCloner; +}; - // Function for scheduling database work using the executor. - CollectionCloner::ScheduleDbWorkFn _scheduleDbWorkFn; - - StartCollectionClonerFn _startCollectionCloner; - }; - -} // namespace repl -} // namespace mongo +} // namespace repl +} // namespace mongo |