ScopedCollectionMetadata MetadataManager::getActiveMetadata() { stdx::lock_guard<stdx::mutex> scopedLock(_managerLock); if (!_activeMetadataTracker) { return ScopedCollectionMetadata(); } return ScopedCollectionMetadata(this, _activeMetadataTracker.get()); }
boost::optional<ScopedCollectionMetadata> MetadataManager::getActiveMetadata( std::shared_ptr<MetadataManager> self, const boost::optional<LogicalTime>& atClusterTime) { stdx::lock_guard<stdx::mutex> lg(_managerLock); if (_metadata.empty()) { return boost::none; } auto activeMetadataTracker = _metadata.back(); const auto& activeMetadata = activeMetadataTracker->metadata; // We don't keep routing history for unsharded collections, so if the collection is unsharded // just return the active metadata if (!atClusterTime || !activeMetadata.isSharded()) { return ScopedCollectionMetadata(std::make_shared<RangePreserver>( lg, std::move(self), std::move(activeMetadataTracker))); } auto chunkManager = activeMetadata.getChunkManager(); auto chunkManagerAtClusterTime = std::make_shared<ChunkManager>( chunkManager->getRoutingHistory(), atClusterTime->asTimestamp()); class MetadataAtTimestamp : public ScopedCollectionMetadata::Impl { public: MetadataAtTimestamp(CollectionMetadata metadata) : _metadata(std::move(metadata)) {} const CollectionMetadata& get() override { return _metadata; } private: CollectionMetadata _metadata; }; return ScopedCollectionMetadata(std::make_shared<MetadataAtTimestamp>( CollectionMetadata(chunkManagerAtClusterTime, activeMetadata.shardId()))); }