summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGregory Noma <gregory.noma@gmail.com>2022-02-15 05:53:54 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-02-15 06:20:36 +0000
commitd02536f48aee7593077c12b1e60829b9441a7c08 (patch)
tree3e07a27328b7d2191e02159c44ef18b9ca6e3d68 /src
parent9e354a640fd52d5ecfbaabb305eea25d21956a38 (diff)
downloadmongo-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.cpp14
-rw-r--r--src/mongo/db/catalog/collection_uuid_mismatch_info.cpp23
-rw-r--r--src/mongo/db/catalog/collection_uuid_mismatch_info.h25
-rw-r--r--src/mongo/s/cluster_commands_helpers.cpp4
-rw-r--r--src/mongo/s/query/establish_cursors.cpp2
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);
}
}