diff options
author | Gregory Noma <gregory.noma@gmail.com> | 2022-02-15 05:53:54 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-02-15 06:20:36 +0000 |
commit | d02536f48aee7593077c12b1e60829b9441a7c08 (patch) | |
tree | 3e07a27328b7d2191e02159c44ef18b9ca6e3d68 /src | |
parent | 9e354a640fd52d5ecfbaabb305eea25d21956a38 (diff) | |
download | mongo-d02536f48aee7593077c12b1e60829b9441a7c08.tar.gz |
SERVER-63528 Use db and collection instead of namespace in CollectionUUIDMismatch error response
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/catalog/collection_uuid_mismatch.cpp | 14 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_uuid_mismatch_info.cpp | 23 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_uuid_mismatch_info.h | 25 | ||||
-rw-r--r-- | src/mongo/s/cluster_commands_helpers.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/query/establish_cursors.cpp | 2 |
5 files changed, 39 insertions, 29 deletions
diff --git a/src/mongo/db/catalog/collection_uuid_mismatch.cpp b/src/mongo/db/catalog/collection_uuid_mismatch.cpp index ad79a15f02e..7ae9410a2b2 100644 --- a/src/mongo/db/catalog/collection_uuid_mismatch.cpp +++ b/src/mongo/db/catalog/collection_uuid_mismatch.cpp @@ -49,9 +49,15 @@ void checkCollectionUUIDMismatch(OperationContext* opCtx, feature_flags::gCommandsAcceptCollectionUUID.isEnabled( serverGlobalParams.featureCompatibility)); - uassert((CollectionUUIDMismatchInfo{ - *uuid, ns, CollectionCatalog::get(opCtx)->lookupNSSByUUID(opCtx, *uuid)}), - "Collection UUID does not match that specified", - coll && coll->uuid() == *uuid); + auto actualNamespace = CollectionCatalog::get(opCtx)->lookupNSSByUUID(opCtx, *uuid); + uassert( + (CollectionUUIDMismatchInfo{ns.db().toString(), + *uuid, + ns.coll().toString(), + actualNamespace && actualNamespace->db() == ns.db() + ? boost::make_optional(actualNamespace->coll().toString()) + : boost::none}), + "Collection UUID does not match that specified", + coll && coll->uuid() == *uuid); } } // namespace mongo diff --git a/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp b/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp index 5313b459b67..7cb40347e92 100644 --- a/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp +++ b/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp @@ -36,28 +36,29 @@ namespace mongo { namespace { MONGO_INIT_REGISTER_ERROR_EXTRA_INFO(CollectionUUIDMismatchInfo); +constexpr StringData kDbFieldName = "db"_sd; constexpr StringData kCollectionUUIDFieldName = "collectionUUID"_sd; -constexpr StringData kExpectedNamespaceFieldName = "expectedNamespace"_sd; -constexpr StringData kActualNamespaceFieldName = "actualNamespace"_sd; +constexpr StringData kExpectedCollectionFieldName = "expectedCollection"_sd; +constexpr StringData kActualCollectionFieldName = "actualCollection"_sd; } // namespace std::shared_ptr<const ErrorExtraInfo> CollectionUUIDMismatchInfo::parse(const BSONObj& obj) { - auto actualNamespace = obj[kActualNamespaceFieldName]; + auto actualNamespace = obj[kActualCollectionFieldName]; return std::make_shared<CollectionUUIDMismatchInfo>( + obj[kDbFieldName].str(), UUID::parse(obj[kCollectionUUIDFieldName]).getValue(), - NamespaceString{obj.getStringField(kExpectedNamespaceFieldName)}, - actualNamespace.isNull() - ? boost::none - : boost::make_optional(NamespaceString{actualNamespace.valueStringData()})); + obj[kExpectedCollectionFieldName].str(), + actualNamespace.isNull() ? boost::none : boost::make_optional(actualNamespace.str())); } void CollectionUUIDMismatchInfo::serialize(BSONObjBuilder* builder) const { + builder->append(kDbFieldName, _db); _collectionUUID.appendToBuilder(builder, kCollectionUUIDFieldName); - builder->append(kExpectedNamespaceFieldName, _expectedNamespace.ns()); - if (_actualNamespace) { - builder->append(kActualNamespaceFieldName, _actualNamespace->ns()); + builder->append(kExpectedCollectionFieldName, _expectedCollection); + if (_actualCollection) { + builder->append(kActualCollectionFieldName, *_actualCollection); } else { - builder->appendNull(kActualNamespaceFieldName); + builder->appendNull(kActualCollectionFieldName); } } } // namespace mongo diff --git a/src/mongo/db/catalog/collection_uuid_mismatch_info.h b/src/mongo/db/catalog/collection_uuid_mismatch_info.h index 538527b14c9..f32ea8c6c61 100644 --- a/src/mongo/db/catalog/collection_uuid_mismatch_info.h +++ b/src/mongo/db/catalog/collection_uuid_mismatch_info.h @@ -31,31 +31,34 @@ #include "mongo/base/error_extra_info.h" -#include "mongo/db/namespace_string.h" +#include "mongo/util/uuid.h" namespace mongo { class CollectionUUIDMismatchInfo final : public ErrorExtraInfo { public: static constexpr auto code = ErrorCodes::CollectionUUIDMismatch; - explicit CollectionUUIDMismatchInfo(const UUID& collectionUUID, - const NamespaceString& expectedNamespace, - const boost::optional<NamespaceString>& actualNamespace) - : _collectionUUID(collectionUUID), - _expectedNamespace(expectedNamespace), - _actualNamespace(actualNamespace) {} + explicit CollectionUUIDMismatchInfo(std::string db, + UUID collectionUUID, + std::string expectedCollection, + boost::optional<std::string> actualCollection) + : _db(std::move(db)), + _collectionUUID(std::move(collectionUUID)), + _expectedCollection(std::move(expectedCollection)), + _actualCollection(std::move(actualCollection)) {} static std::shared_ptr<const ErrorExtraInfo> parse(const BSONObj& obj); void serialize(BSONObjBuilder* builder) const override; - const auto& actualNamespace() const { - return _actualNamespace; + const auto& actualCollection() const { + return _actualCollection; } private: + std::string _db; UUID _collectionUUID; - NamespaceString _expectedNamespace; - boost::optional<NamespaceString> _actualNamespace; + std::string _expectedCollection; + boost::optional<std::string> _actualCollection; }; } // namespace mongo diff --git a/src/mongo/s/cluster_commands_helpers.cpp b/src/mongo/s/cluster_commands_helpers.cpp index abeec91696c..7a2ac3adca7 100644 --- a/src/mongo/s/cluster_commands_helpers.cpp +++ b/src/mongo/s/cluster_commands_helpers.cpp @@ -626,14 +626,14 @@ RawResponsesResult appendRawResponses( auto& firstError = genericErrorsReceived.front().second; if (firstError.code() == ErrorCodes::CollectionUUIDMismatch && - !firstError.extraInfo<CollectionUUIDMismatchInfo>()->actualNamespace()) { + !firstError.extraInfo<CollectionUUIDMismatchInfo>()->actualCollection()) { // The first error is a CollectionUUIDMismatchInfo but it doesn't contain an actual // namespace. It's possible that the acutal namespace is unsharded, in which case only the // error from the primary shard will contain this information. Iterate through the errors to // see if this is the case. for (const auto& error : genericErrorsReceived) { if (error.second.code() == ErrorCodes::CollectionUUIDMismatch && - error.second.extraInfo<CollectionUUIDMismatchInfo>()->actualNamespace()) { + error.second.extraInfo<CollectionUUIDMismatchInfo>()->actualCollection()) { firstError = error.second; break; } diff --git a/src/mongo/s/query/establish_cursors.cpp b/src/mongo/s/query/establish_cursors.cpp index c37de60e22d..57991fccb36 100644 --- a/src/mongo/s/query/establish_cursors.cpp +++ b/src/mongo/s/query/establish_cursors.cpp @@ -254,7 +254,7 @@ void CursorEstablisher::_favorCollectionUUIDMismatchError(Status newError) noexc // Favor 'CollectionUUIDMismatchError' that has a non empty 'actualNamespace'. auto errorInfo = _maybeFailure->extraInfo<CollectionUUIDMismatchInfo>(); invariant(errorInfo); - if (!errorInfo->actualNamespace()) { + if (!errorInfo->actualCollection()) { _maybeFailure = std::move(newError); } } |