summaryrefslogtreecommitdiff
path: root/src/mongo/s/metadata_loader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/s/metadata_loader.h')
-rw-r--r--src/mongo/s/metadata_loader.h224
1 files changed, 111 insertions, 113 deletions
diff --git a/src/mongo/s/metadata_loader.h b/src/mongo/s/metadata_loader.h
index 7d6e3d77798..15ca227926e 100644
--- a/src/mongo/s/metadata_loader.h
+++ b/src/mongo/s/metadata_loader.h
@@ -36,126 +36,124 @@
namespace mongo {
- class CatalogManager;
- class CollectionMetadata;
- class CollectionType;
- class DBClientCursor;
+class CatalogManager;
+class CollectionMetadata;
+class CollectionType;
+class DBClientCursor;
+
+/**
+ * The MetadataLoader is responsible for interfacing with the config servers and previous
+ * metadata to build new instances of CollectionMetadata. MetadataLoader is the "builder"
+ * class for metadata.
+ *
+ * CollectionMetadata has both persisted and volatile state (for now) - the persisted
+ * config server chunk state and the volatile pending state which is only tracked locally
+ * while a server is the primary. This requires a two-step loading process - the persisted
+ * chunk state *cannot* be loaded in a DBLock lock while the pending chunk state *must* be.
+ *
+ * Example usage:
+ * beforeMetadata = <get latest local metadata>;
+ * remoteMetadata = makeCollectionMetadata( beforeMetadata, remoteMetadata );
+ * DBLock lock(txn, dbname, MODE_X);
+ * afterMetadata = <get latest local metadata>;
+ * promotePendingChunks( afterMetadata, remoteMetadata );
+ *
+ * The loader will go out of its way to try to fetch the smaller amount possible of data
+ * from the config server without sacrificing the freshness and accuracy of the metadata it
+ * builds. (See ConfigDiffTracker class.)
+ *
+ * The class is not thread safe.
+ */
+class MetadataLoader {
+public:
+ explicit MetadataLoader();
+
+ ~MetadataLoader();
/**
- * The MetadataLoader is responsible for interfacing with the config servers and previous
- * metadata to build new instances of CollectionMetadata. MetadataLoader is the "builder"
- * class for metadata.
+ * Fills a new metadata instance representing the chunkset of the collection 'ns'
+ * (or its entirety, if not sharded) that lives on 'shard' with data from the config server.
+ * Optionally, uses an 'oldMetadata' for the same 'ns'/'shard'; the contents of
+ * 'oldMetadata' can help reducing the amount of data read from the config servers.
*
- * CollectionMetadata has both persisted and volatile state (for now) - the persisted
- * config server chunk state and the volatile pending state which is only tracked locally
- * while a server is the primary. This requires a two-step loading process - the persisted
- * chunk state *cannot* be loaded in a DBLock lock while the pending chunk state *must* be.
- *
- * Example usage:
- * beforeMetadata = <get latest local metadata>;
- * remoteMetadata = makeCollectionMetadata( beforeMetadata, remoteMetadata );
- * DBLock lock(txn, dbname, MODE_X);
- * afterMetadata = <get latest local metadata>;
- * promotePendingChunks( afterMetadata, remoteMetadata );
+ * Locking note:
+ * + Must not be called in a DBLock, since this loads over the network
*
- * The loader will go out of its way to try to fetch the smaller amount possible of data
- * from the config server without sacrificing the freshness and accuracy of the metadata it
- * builds. (See ConfigDiffTracker class.)
+ * OK on success.
*
- * The class is not thread safe.
+ * Failure return values:
+ * Abnormal:
+ * @return FailedToParse if there was an error parsing the remote config data
+ * Normal:
+ * @return NamespaceNotFound if the collection no longer exists
+ * @return HostUnreachable if there was an error contacting the config servers
+ * @return RemoteChangeDetected if the data loaded was modified by another operation
*/
- class MetadataLoader {
- public:
-
- explicit MetadataLoader();
-
- ~MetadataLoader();
+ Status makeCollectionMetadata(CatalogManager* catalogManager,
+ const std::string& ns,
+ const std::string& shard,
+ const CollectionMetadata* oldMetadata,
+ CollectionMetadata* metadata) const;
- /**
- * Fills a new metadata instance representing the chunkset of the collection 'ns'
- * (or its entirety, if not sharded) that lives on 'shard' with data from the config server.
- * Optionally, uses an 'oldMetadata' for the same 'ns'/'shard'; the contents of
- * 'oldMetadata' can help reducing the amount of data read from the config servers.
- *
- * Locking note:
- * + Must not be called in a DBLock, since this loads over the network
- *
- * OK on success.
- *
- * Failure return values:
- * Abnormal:
- * @return FailedToParse if there was an error parsing the remote config data
- * Normal:
- * @return NamespaceNotFound if the collection no longer exists
- * @return HostUnreachable if there was an error contacting the config servers
- * @return RemoteChangeDetected if the data loaded was modified by another operation
- */
- Status makeCollectionMetadata(CatalogManager* catalogManager,
- const std::string& ns,
- const std::string& shard,
- const CollectionMetadata* oldMetadata,
- CollectionMetadata* metadata) const;
-
- /**
- * Replaces the pending chunks of the remote metadata with the more up-to-date pending
- * chunks of the 'after' metadata (metadata from after the remote load), and removes pending
- * chunks which are now regular chunks.
- *
- * Pending chunks should always correspond to one or zero chunks in the remoteMetadata
- * if the epochs are the same and the remote version is the same or higher, otherwise they
- * are not applicable.
- *
- * Locking note:
- * + Must be called in a DBLock, to ensure validity of afterMetadata
- *
- * Returns OK if pending chunks correctly follow the rule above or are not applicable
- * Returns RemoteChangeDetected if pending chunks do not follow the rule above, indicating
- * either the config server or us has changed unexpectedly.
- * This should only occur with manual editing of the config
- * server.
- *
- * TODO: This is a bit ugly but necessary for now. If/when pending chunk info is stored on
- * the config server, this should go away.
- */
- Status promotePendingChunks( const CollectionMetadata* afterMetadata,
- CollectionMetadata* remoteMetadata ) const;
-
- private:
+ /**
+ * Replaces the pending chunks of the remote metadata with the more up-to-date pending
+ * chunks of the 'after' metadata (metadata from after the remote load), and removes pending
+ * chunks which are now regular chunks.
+ *
+ * Pending chunks should always correspond to one or zero chunks in the remoteMetadata
+ * if the epochs are the same and the remote version is the same or higher, otherwise they
+ * are not applicable.
+ *
+ * Locking note:
+ * + Must be called in a DBLock, to ensure validity of afterMetadata
+ *
+ * Returns OK if pending chunks correctly follow the rule above or are not applicable
+ * Returns RemoteChangeDetected if pending chunks do not follow the rule above, indicating
+ * either the config server or us has changed unexpectedly.
+ * This should only occur with manual editing of the config
+ * server.
+ *
+ * TODO: This is a bit ugly but necessary for now. If/when pending chunk info is stored on
+ * the config server, this should go away.
+ */
+ Status promotePendingChunks(const CollectionMetadata* afterMetadata,
+ CollectionMetadata* remoteMetadata) const;
- /**
- * Returns OK and fills in the internal state of 'metadata' with general collection
- * information, not including chunks.
- *
- * If information about the collection can be accessed or is invalid, returns:
- * @return NamespaceNotFound if the collection no longer exists
- * @return FailedToParse if there was an error parsing the remote config data
- * @return HostUnreachable if there was an error contacting the config servers
- * @return RemoteChangeDetected if the collection doc loaded is unexpectedly different
- *
- */
- Status _initCollection(CatalogManager* catalogManager,
- const std::string& ns,
- const std::string& shard,
- CollectionMetadata* metadata) const;
+private:
+ /**
+ * Returns OK and fills in the internal state of 'metadata' with general collection
+ * information, not including chunks.
+ *
+ * If information about the collection can be accessed or is invalid, returns:
+ * @return NamespaceNotFound if the collection no longer exists
+ * @return FailedToParse if there was an error parsing the remote config data
+ * @return HostUnreachable if there was an error contacting the config servers
+ * @return RemoteChangeDetected if the collection doc loaded is unexpectedly different
+ *
+ */
+ Status _initCollection(CatalogManager* catalogManager,
+ const std::string& ns,
+ const std::string& shard,
+ CollectionMetadata* metadata) const;
- /**
- * Returns OK and fills in the chunk state of 'metadata' to portray the chunks of the
- * collection 'ns' that sit in 'shard'. If provided, uses the contents of 'oldMetadata'
- * as a base (see description in initCollection above).
- *
- * If information about the chunks can be accessed or is invalid, returns:
- * @return HostUnreachable if there was an error contacting the config servers
- * @return RemoteChangeDetected if the chunks loaded are unexpectedly different
- *
- * For backwards compatibility,
- * @return NamespaceNotFound if there are no chunks loaded and an epoch change is detected
- * TODO: @return FailedToParse
- */
- Status initChunks(CatalogManager* catalogManager,
- const std::string& ns,
- const std::string& shard,
- const CollectionMetadata* oldMetadata,
- CollectionMetadata* metadata ) const;
- };
+ /**
+ * Returns OK and fills in the chunk state of 'metadata' to portray the chunks of the
+ * collection 'ns' that sit in 'shard'. If provided, uses the contents of 'oldMetadata'
+ * as a base (see description in initCollection above).
+ *
+ * If information about the chunks can be accessed or is invalid, returns:
+ * @return HostUnreachable if there was an error contacting the config servers
+ * @return RemoteChangeDetected if the chunks loaded are unexpectedly different
+ *
+ * For backwards compatibility,
+ * @return NamespaceNotFound if there are no chunks loaded and an epoch change is detected
+ * TODO: @return FailedToParse
+ */
+ Status initChunks(CatalogManager* catalogManager,
+ const std::string& ns,
+ const std::string& shard,
+ const CollectionMetadata* oldMetadata,
+ CollectionMetadata* metadata) const;
+};
-} // namespace mongo
+} // namespace mongo