summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGregory Noma <gregory.noma@gmail.com>2022-02-11 14:54:48 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-02-11 15:32:28 +0000
commit037b22172c54d5652298203077c16cc0ee7f26a1 (patch)
treecd6628d5497f93bd74d617b79652593c5e1ca5e8 /src
parent2d92ff7fe9a774746e5e34023256b71a5a95a722 (diff)
downloadmongo-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.cpp7
-rw-r--r--src/mongo/db/catalog/collection_uuid_mismatch_info.cpp23
-rw-r--r--src/mongo/db/catalog/collection_uuid_mismatch_info.h4
-rw-r--r--src/mongo/s/cluster_commands_helpers.cpp6
-rw-r--r--src/mongo/s/query/establish_cursors.cpp2
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);
}
}