Storage Engine API
uuid_catalog.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include <unordered_map>
32 
33 #include "mongo/base/disallow_copying.h"
35 #include "mongo/db/op_observer.h"
36 #include "mongo/db/service_context.h"
37 #include "mongo/stdx/functional.h"
38 #include "mongo/util/uuid.h"
39 
40 namespace mongo {
44 class UUIDCatalogObserver : public OpObserver {
45 public:
46  void onCreateIndex(OperationContext* opCtx,
47  const NamespaceString& nss,
49  BSONObj indexDoc,
50  bool fromMigrate) override {}
51  void onInserts(OperationContext* opCtx,
52  const NamespaceString& nss,
54  std::vector<InsertStatement>::const_iterator begin,
55  std::vector<InsertStatement>::const_iterator end,
56  bool fromMigrate) override {}
57  void onUpdate(OperationContext* opCtx, const OplogUpdateEntryArgs& args) override {}
58  void aboutToDelete(OperationContext* opCtx,
59  const NamespaceString& nss,
60  const BSONObj& doc) override {}
61  void onDelete(OperationContext* opCtx,
62  const NamespaceString& nss,
64  StmtId stmtId,
65  bool fromMigrate,
66  const boost::optional<BSONObj>& deletedDoc) override {}
67  void onInternalOpMessage(OperationContext* opCtx,
68  const NamespaceString& nss,
69  const boost::optional<UUID> uuid,
70  const BSONObj& msgObj,
71  const boost::optional<BSONObj> o2MsgObj) override {}
72  void onCreateCollection(OperationContext* opCtx,
73  Collection* coll,
74  const NamespaceString& collectionName,
76  const BSONObj& idIndex) override;
77  void onCollMod(OperationContext* opCtx,
78  const NamespaceString& nss,
80  const BSONObj& collModCmd,
81  const CollectionOptions& oldCollOptions,
82  boost::optional<TTLCollModInfo> ttlInfo) override;
83  void onDropDatabase(OperationContext* opCtx, const std::string& dbName) override {}
84  repl::OpTime onDropCollection(OperationContext* opCtx,
85  const NamespaceString& collectionName,
86  OptionalCollectionUUID uuid) override;
87  void onDropIndex(OperationContext* opCtx,
88  const NamespaceString& nss,
90  const std::string& indexName,
91  const BSONObj& idxDescriptor) override {}
92  void onRenameCollection(OperationContext* opCtx,
93  const NamespaceString& fromCollection,
94  const NamespaceString& toCollection,
96  OptionalCollectionUUID dropTargetUUID,
97  bool stayTemp) override;
98  repl::OpTime preRenameCollection(OperationContext* opCtx,
99  const NamespaceString& fromCollection,
100  const NamespaceString& toCollection,
102  OptionalCollectionUUID dropTargetUUID,
103  bool stayTemp) override;
104  void postRenameCollection(OperationContext* opCtx,
105  const NamespaceString& fromCollection,
106  const NamespaceString& toCollection,
108  OptionalCollectionUUID dropTargetUUID,
109  bool stayTemp) override;
110  void onApplyOps(OperationContext* opCtx,
111  const std::string& dbName,
112  const BSONObj& applyOpCmd) override {}
113  void onEmptyCapped(OperationContext* opCtx,
114  const NamespaceString& collectionName,
115  OptionalCollectionUUID uuid) override {}
116  void onTransactionCommit(OperationContext* opCtx) override {}
117  void onTransactionPrepare(OperationContext* opCtx) override {}
118  void onTransactionAbort(OperationContext* opCtx) override {}
119  void onReplicationRollback(OperationContext* opCtx,
120  const RollbackObserverInfo& rbInfo) override {}
121 };
122 
127 using CollectionUUID = UUID;
128 class Database;
129 
130 class UUIDCatalog {
131  MONGO_DISALLOW_COPYING(UUIDCatalog);
132 
133 public:
134  static UUIDCatalog& get(ServiceContext* svcCtx);
135  static UUIDCatalog& get(OperationContext* opCtx);
136  UUIDCatalog() = default;
137 
142  void onCreateCollection(OperationContext* opCtx, Collection* coll, CollectionUUID uuid);
143 
148  void onDropCollection(OperationContext* opCtx, CollectionUUID uuid);
149 
155  void onRenameCollection(OperationContext* opCtx, Collection* coll, CollectionUUID uuid);
156 
160  void onCloseDatabase(Database* db);
161 
162  Collection* replaceUUIDCatalogEntry(CollectionUUID uuid, Collection* coll);
163  void registerUUIDCatalogEntry(CollectionUUID uuid, Collection* coll);
164  Collection* removeUUIDCatalogEntry(CollectionUUID uuid);
165 
172  Collection* lookupCollectionByUUID(CollectionUUID uuid) const;
173 
179  NamespaceString lookupNSSByUUID(CollectionUUID uuid) const;
180 
186  void onCloseCatalog();
187 
191  void onOpenCatalog();
192 
198  boost::optional<CollectionUUID> prev(const StringData& db, CollectionUUID uuid);
199 
205  boost::optional<CollectionUUID> next(const StringData& db, CollectionUUID uuid);
206 
207 private:
208  const std::vector<CollectionUUID>& _getOrdering_inlock(const StringData& db,
209  const stdx::lock_guard<stdx::mutex>&);
210 
211  mutable mongo::stdx::mutex _catalogLock;
216  boost::optional<
217  mongo::stdx::unordered_map<CollectionUUID, NamespaceString, CollectionUUID::Hash>>
219 
226  StringMap<std::vector<CollectionUUID>> _orderedCollections;
227  mongo::stdx::unordered_map<CollectionUUID, Collection*, CollectionUUID::Hash> _catalog;
228 };
229 
230 } // namespace mongo
void onInserts(OperationContext *opCtx, const NamespaceString &nss, OptionalCollectionUUID uuid, std::vector< InsertStatement >::const_iterator begin, std::vector< InsertStatement >::const_iterator end, bool fromMigrate) override
Definition: uuid_catalog.h:51
void onDropIndex(OperationContext *opCtx, const NamespaceString &nss, OptionalCollectionUUID uuid, const std::string &indexName, const BSONObj &idxDescriptor) override
Definition: uuid_catalog.h:87
mongo::stdx::mutex _catalogLock
Definition: uuid_catalog.h:211
void onEmptyCapped(OperationContext *opCtx, const NamespaceString &collectionName, OptionalCollectionUUID uuid) override
Definition: uuid_catalog.h:113
Class used for updating the UUID catalog on metadata operations.
Definition: uuid_catalog.h:44
void postRenameCollection(OperationContext *opCtx, const NamespaceString &fromCollection, const NamespaceString &toCollection, OptionalCollectionUUID uuid, OptionalCollectionUUID dropTargetUUID, bool stayTemp) override
Definition: uuid_catalog.cpp:110
Definition: collection_options.h:57
repl::OpTime preRenameCollection(OperationContext *opCtx, const NamespaceString &fromCollection, const NamespaceString &toCollection, OptionalCollectionUUID uuid, OptionalCollectionUUID dropTargetUUID, bool stayTemp) override
Definition: uuid_catalog.cpp:101
void onDelete(OperationContext *opCtx, const NamespaceString &nss, OptionalCollectionUUID uuid, StmtId stmtId, bool fromMigrate, const boost::optional< BSONObj > &deletedDoc) override
Definition: uuid_catalog.h:61
void onTransactionPrepare(OperationContext *opCtx) override
Definition: uuid_catalog.h:117
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
void onTransactionCommit(OperationContext *opCtx) override
Definition: uuid_catalog.h:116
void onUpdate(OperationContext *opCtx, const OplogUpdateEntryArgs &args) override
Definition: uuid_catalog.h:57
UUID CollectionUUID
A CollectionUUID is a 128-bit unique identifier, per RFC 4122, v4.
Definition: collection_options.h:53
void onRenameCollection(OperationContext *opCtx, const NamespaceString &fromCollection, const NamespaceString &toCollection, OptionalCollectionUUID uuid, OptionalCollectionUUID dropTargetUUID, bool stayTemp) override
Definition: uuid_catalog.cpp:85
this is NOT safe through a yield right now.
Definition: collection.h:160
StringMap< std::vector< CollectionUUID > > _orderedCollections
Map from database names to ordered vectors of their UUIDs.
Definition: uuid_catalog.h:226
void onReplicationRollback(OperationContext *opCtx, const RollbackObserverInfo &rbInfo) override
Definition: uuid_catalog.h:119
boost::optional< CollectionUUID > OptionalCollectionUUID
Definition: collection_options.h:55
mongo::stdx::unordered_map< CollectionUUID, Collection *, CollectionUUID::Hash > _catalog
Definition: uuid_catalog.h:227
Collection *const OperationContext *const const StringData OptionalCollectionUUID uuid
Definition: collection_impl.cpp:80
Definition: uuid_catalog.h:130
boost::optional< mongo::stdx::unordered_map< CollectionUUID, NamespaceString, CollectionUUID::Hash > > _shadowCatalog
When present, indicates that the catalog is in closed state, and contains a map from UUID to pre-clos...
Definition: uuid_catalog.h:218
void onCollMod(OperationContext *opCtx, const NamespaceString &nss, OptionalCollectionUUID uuid, const BSONObj &collModCmd, const CollectionOptions &oldCollOptions, boost::optional< TTLCollModInfo > ttlInfo) override
Definition: uuid_catalog.cpp:58
void onApplyOps(OperationContext *opCtx, const std::string &dbName, const BSONObj &applyOpCmd) override
Definition: uuid_catalog.h:110
Represents a logical database containing Collections.
Definition: database.h:57
OperationContext Database * db
Definition: database_impl.cpp:949
OperationContext Database StringData BSONObj options
Definition: database_impl.cpp:949
repl::OpTime onDropCollection(OperationContext *opCtx, const NamespaceString &collectionName, OptionalCollectionUUID uuid) override
Definition: uuid_catalog.cpp:74
void onCreateCollection(OperationContext *opCtx, Collection *coll, const NamespaceString &collectionName, const CollectionOptions &options, const BSONObj &idIndex) override
Definition: uuid_catalog.cpp:47
void aboutToDelete(OperationContext *opCtx, const NamespaceString &nss, const BSONObj &doc) override
Definition: uuid_catalog.h:58
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
void onTransactionAbort(OperationContext *opCtx) override
Definition: uuid_catalog.h:118
void onInternalOpMessage(OperationContext *opCtx, const NamespaceString &nss, const boost::optional< UUID > uuid, const BSONObj &msgObj, const boost::optional< BSONObj > o2MsgObj) override
Definition: uuid_catalog.h:67
void onCreateIndex(OperationContext *opCtx, const NamespaceString &nss, OptionalCollectionUUID uuid, BSONObj indexDoc, bool fromMigrate) override
Definition: uuid_catalog.h:46
void onDropDatabase(OperationContext *opCtx, const std::string &dbName) override
Definition: uuid_catalog.h:83