diff options
author | Gregory Noma <gregory.noma@gmail.com> | 2022-02-11 14:54:48 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-02-11 15:32:28 +0000 |
commit | 037b22172c54d5652298203077c16cc0ee7f26a1 (patch) | |
tree | cd6628d5497f93bd74d617b79652593c5e1ca5e8 /src | |
parent | 2d92ff7fe9a774746e5e34023256b71a5a95a722 (diff) | |
download | mongo-037b22172c54d5652298203077c16cc0ee7f26a1.tar.gz |
SERVER-62861 Use `null` instead of empty string for `actualNamespace` in `CollectionUUIDMismatch` error response
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/db/catalog/collection_uuid_mismatch.cpp | 7 | ||||
-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 | 4 | ||||
-rw-r--r-- | src/mongo/s/cluster_commands_helpers.cpp | 6 | ||||
-rw-r--r-- | src/mongo/s/query/establish_cursors.cpp | 2 |
5 files changed, 24 insertions, 18 deletions
diff --git a/src/mongo/db/catalog/collection_uuid_mismatch.cpp b/src/mongo/db/catalog/collection_uuid_mismatch.cpp index 1eb6d30c931..ad79a15f02e 100644 --- a/src/mongo/db/catalog/collection_uuid_mismatch.cpp +++ b/src/mongo/db/catalog/collection_uuid_mismatch.cpp @@ -49,11 +49,8 @@ void checkCollectionUUIDMismatch(OperationContext* opCtx, feature_flags::gCommandsAcceptCollectionUUID.isEnabled( serverGlobalParams.featureCompatibility)); - uassert((CollectionUUIDMismatchInfo{*uuid, - ns, - CollectionCatalog::get(opCtx) - ->lookupNSSByUUID(opCtx, *uuid) - .value_or(NamespaceString{})}), + uassert((CollectionUUIDMismatchInfo{ + *uuid, ns, CollectionCatalog::get(opCtx)->lookupNSSByUUID(opCtx, *uuid)}), "Collection UUID does not match that specified", coll && coll->uuid() == *uuid); } diff --git a/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp b/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp index 3813615916a..5313b459b67 100644 --- a/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp +++ b/src/mongo/db/catalog/collection_uuid_mismatch_info.cpp @@ -35,18 +35,29 @@ namespace mongo { namespace { MONGO_INIT_REGISTER_ERROR_EXTRA_INFO(CollectionUUIDMismatchInfo); + +constexpr StringData kCollectionUUIDFieldName = "collectionUUID"_sd; +constexpr StringData kExpectedNamespaceFieldName = "expectedNamespace"_sd; +constexpr StringData kActualNamespaceFieldName = "actualNamespace"_sd; } // namespace std::shared_ptr<const ErrorExtraInfo> CollectionUUIDMismatchInfo::parse(const BSONObj& obj) { + auto actualNamespace = obj[kActualNamespaceFieldName]; return std::make_shared<CollectionUUIDMismatchInfo>( - UUID::parse(obj["collectionUUID"]).getValue(), - NamespaceString{obj.getStringField("expectedNamespace")}, - NamespaceString{obj.getStringField("actualNamespace")}); + UUID::parse(obj[kCollectionUUIDFieldName]).getValue(), + NamespaceString{obj.getStringField(kExpectedNamespaceFieldName)}, + actualNamespace.isNull() + ? boost::none + : boost::make_optional(NamespaceString{actualNamespace.valueStringData()})); } void CollectionUUIDMismatchInfo::serialize(BSONObjBuilder* builder) const { - _collectionUUID.appendToBuilder(builder, "collectionUUID"); - builder->append("expectedNamespace", _expectedNamespace.ns()); - builder->append("actualNamespace", _actualNamespace.ns()); + _collectionUUID.appendToBuilder(builder, kCollectionUUIDFieldName); + builder->append(kExpectedNamespaceFieldName, _expectedNamespace.ns()); + if (_actualNamespace) { + builder->append(kActualNamespaceFieldName, _actualNamespace->ns()); + } else { + builder->appendNull(kActualNamespaceFieldName); + } } } // 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 c851c57e36d..538527b14c9 100644 --- a/src/mongo/db/catalog/collection_uuid_mismatch_info.h +++ b/src/mongo/db/catalog/collection_uuid_mismatch_info.h @@ -40,7 +40,7 @@ public: explicit CollectionUUIDMismatchInfo(const UUID& collectionUUID, const NamespaceString& expectedNamespace, - const NamespaceString& actualNamespace) + const boost::optional<NamespaceString>& actualNamespace) : _collectionUUID(collectionUUID), _expectedNamespace(expectedNamespace), _actualNamespace(actualNamespace) {} @@ -56,6 +56,6 @@ public: private: UUID _collectionUUID; NamespaceString _expectedNamespace; - NamespaceString _actualNamespace; + boost::optional<NamespaceString> _actualNamespace; }; } // namespace mongo diff --git a/src/mongo/s/cluster_commands_helpers.cpp b/src/mongo/s/cluster_commands_helpers.cpp index 32bc6e50137..abeec91696c 100644 --- a/src/mongo/s/cluster_commands_helpers.cpp +++ b/src/mongo/s/cluster_commands_helpers.cpp @@ -626,16 +626,14 @@ RawResponsesResult appendRawResponses( auto& firstError = genericErrorsReceived.front().second; if (firstError.code() == ErrorCodes::CollectionUUIDMismatch && - firstError.extraInfo<CollectionUUIDMismatchInfo>()->actualNamespace().isEmpty()) { + !firstError.extraInfo<CollectionUUIDMismatchInfo>()->actualNamespace()) { // 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() - .isEmpty()) { + error.second.extraInfo<CollectionUUIDMismatchInfo>()->actualNamespace()) { firstError = error.second; break; } diff --git a/src/mongo/s/query/establish_cursors.cpp b/src/mongo/s/query/establish_cursors.cpp index f73a1672efb..c37de60e22d 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().ns().empty()) { + if (!errorInfo->actualNamespace()) { _maybeFailure = std::move(newError); } } |