diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2017-12-14 11:57:35 -0500 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2017-12-16 11:43:28 -0500 |
commit | 8467708af7fa83f8827362b80f56dab4aad30a41 (patch) | |
tree | ab7858f01ec8ced3111c583ec33e1a55f89d27fe /src/mongo/db/db_raii.h | |
parent | 6cbca62471218a08a4fdf8785bd1e1e38cf9bde3 (diff) | |
download | mongo-8467708af7fa83f8827362b80f56dab4aad30a41.tar.gz |
SERVER-29909 Remove circular dependency between db_raii and sharding libraries
Diffstat (limited to 'src/mongo/db/db_raii.h')
-rw-r--r-- | src/mongo/db/db_raii.h | 188 |
1 files changed, 1 insertions, 187 deletions
diff --git a/src/mongo/db/db_raii.h b/src/mongo/db/db_raii.h index f764d671d31..25c676fe7ea 100644 --- a/src/mongo/db/db_raii.h +++ b/src/mongo/db/db_raii.h @@ -30,197 +30,12 @@ #include <string> -#include "mongo/base/string_data.h" -#include "mongo/db/catalog/database.h" -#include "mongo/db/concurrency/d_concurrency.h" -#include "mongo/db/namespace_string.h" -#include "mongo/db/operation_context.h" +#include "mongo/db/catalog/catalog_raii.h" #include "mongo/db/stats/top.h" -#include "mongo/db/views/view.h" #include "mongo/util/timer.h" namespace mongo { -class Collection; - -/** - * RAII-style class, which acquires a lock on the specified database in the requested mode and - * obtains a reference to the database. Used as a shortcut for calls to dbHolder().get(). - * - * Use this when you want to do a database-level operation, like read a list of all collections, or - * drop a collection. - * - * It is guaranteed that the lock will be released when this object goes out of scope, therefore - * the database reference returned by this class should not be retained. - */ -class AutoGetDb { - MONGO_DISALLOW_COPYING(AutoGetDb); - -public: - AutoGetDb(OperationContext* opCtx, StringData ns, LockMode mode); - AutoGetDb(OperationContext* opCtx, StringData ns, Lock::DBLock lock); - - Database* getDb() const { - return _db; - } - -private: - const Lock::DBLock _dbLock; - Database* const _db; -}; - -/** - * RAII-style class, which acquires a locks on the specified database and collection in the - * requested mode and obtains references to both. - * - * Use this when you want to access something at the collection level, but do not want to do any of - * the tasks associated with the 'ForRead' variants below. For example, you can use this to access a - * Collection's CursorManager, or to remove a document. - * - * It is guaranteed that locks will be released when this object goes out of scope, therefore - * the database and the collection references returned by this class should not be retained. - */ -class AutoGetCollection { - MONGO_DISALLOW_COPYING(AutoGetCollection); - - enum class ViewMode; - -public: - AutoGetCollection(OperationContext*, const NamespaceString&, const UUID&, LockMode modeAll); - - AutoGetCollection(OperationContext* opCtx, const NamespaceString& nss, LockMode modeAll) - : AutoGetCollection(opCtx, nss, modeAll, modeAll, ViewMode::kViewsForbidden) {} - - AutoGetCollection(OperationContext* opCtx, - const NamespaceString& nss, - LockMode modeDB, - LockMode modeColl) - : AutoGetCollection(opCtx, nss, modeDB, modeColl, ViewMode::kViewsForbidden) {} - - AutoGetCollection(OperationContext* opCtx, - const NamespaceString& nss, - LockMode modeColl, - ViewMode viewMode, - Lock::DBLock lock); - /** - * This constructor is intended for internal use and should not be used outside this file. - * AutoGetCollectionForReadCommand and AutoGetCollectionOrViewForReadCommand use 'viewMode' to - * determine whether or not it is permissible to obtain a handle on a view namespace. Use - * another constructor or another 'AutoGet' class instead. - */ - AutoGetCollection(OperationContext* opCtx, - const NamespaceString& nss, - LockMode modeDB, - LockMode modeColl, - ViewMode viewMode); - - /** - * Returns nullptr if the database didn't exist. - */ - Database* getDb() const { - return _autoDb.getDb(); - } - - /** - * Returns nullptr if the collection didn't exist. - */ - Collection* getCollection() const { - return _coll; - } - -private: - enum class ViewMode { kViewsPermitted, kViewsForbidden }; - - const ViewMode _viewMode; - const AutoGetDb _autoDb; - const Lock::CollectionLock _collLock; - Collection* const _coll; - - friend class AutoGetCollectionOrView; - friend class AutoGetCollectionForRead; - friend class AutoGetCollectionForReadCommand; - friend class AutoGetCollectionOrViewForReadCommand; -}; - -/** - * RAII-style class which acquires the appropriate hierarchy of locks for a collection or - * view. The pointer to a view definition is nullptr if it does not exist. - * - * Use this when you have not yet determined if the namespace is a view or a collection. - * For example, you can use this to access a namespace's CursorManager. - * - * It is guaranteed that locks will be released when this object goes out of scope, therefore - * the view returned by this class should not be retained. - */ -class AutoGetCollectionOrView { - MONGO_DISALLOW_COPYING(AutoGetCollectionOrView); - -public: - AutoGetCollectionOrView(OperationContext* opCtx, const NamespaceString& nss, LockMode modeAll); - - /** - * Returns nullptr if the database didn't exist. - */ - Database* getDb() const { - return _autoColl.getDb(); - } - - /** - * Returns nullptr if the collection didn't exist. - */ - Collection* getCollection() const { - return _autoColl.getCollection(); - } - - /** - * Returns nullptr if the view didn't exist. - */ - ViewDefinition* getView() const { - return _view.get(); - } - -private: - const AutoGetCollection _autoColl; - std::shared_ptr<ViewDefinition> _view; -}; - -/** - * RAII-style class, which acquires a lock on the specified database in the requested mode and - * obtains a reference to the database, creating it was non-existing. Used as a shortcut for - * calls to dbHolder().openDb(), taking care of locking details. The requested mode must be - * MODE_IX or MODE_X. If the database needs to be created, the lock will automatically be - * reacquired as MODE_X. - * - * Use this when you are about to perform a write, and want to create the database if it doesn't - * already exist. - * - * It is guaranteed that locks will be released when this object goes out of scope, therefore - * the database reference returned by this class should not be retained. - */ -class AutoGetOrCreateDb { - MONGO_DISALLOW_COPYING(AutoGetOrCreateDb); - -public: - AutoGetOrCreateDb(OperationContext* opCtx, StringData ns, LockMode mode); - - Database* getDb() const { - return _db; - } - - bool justCreated() const { - return _justCreated; - } - - Lock::DBLock& lock() { - return _dbLock; - } - -private: - Lock::DBLock _dbLock; // not const, as we may need to relock for implicit create - Database* _db; - bool _justCreated; -}; - /** * RAII-style class which automatically tracks the operation namespace in CurrentOp and records the * operation via Top upon destruction. @@ -448,7 +263,6 @@ private: Timer _timer; }; - class OldClientWriteContext { MONGO_DISALLOW_COPYING(OldClientWriteContext); |