Skip to content

Commit 0dd8631

Browse files
committed
SERVER-40915 View namespaces now included in the LockManager's ResourceId::toString()
1 parent 171fe80 commit 0dd8631

File tree

2 files changed

+115
-3
lines changed

2 files changed

+115
-3
lines changed

src/mongo/db/views/view_catalog.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include "mongo/base/status_with.h"
4040
#include "mongo/base/string_data.h"
4141
#include "mongo/bson/util/builder.h"
42+
#include "mongo/db/catalog/collection_catalog.h"
4243
#include "mongo/db/catalog/database.h"
4344
#include "mongo/db/commands/feature_compatibility_version_command_parser.h"
4445
#include "mongo/db/namespace_string.h"
@@ -195,9 +196,17 @@ Status ViewCatalog::_createOrUpdateView(WithLock lk,
195196

196197
_durable->upsert(opCtx, viewName, viewDefBuilder.obj());
197198
_viewMap[viewName.ns()] = view;
198-
opCtx->recoveryUnit()->onRollback([this, viewName]() {
199+
200+
// Register the view in the CollectionCatalog mapping from ResourceID->namespace
201+
CollectionCatalog& catalog = CollectionCatalog::get(opCtx);
202+
auto viewRid = ResourceId(RESOURCE_COLLECTION, viewName.ns());
203+
catalog.addResource(viewRid, viewName.ns());
204+
205+
opCtx->recoveryUnit()->onRollback([this, viewName, opCtx, viewRid]() {
199206
this->_viewMap.erase(viewName.ns());
200207
this->_viewGraphNeedsRefresh = true;
208+
CollectionCatalog& catalog = CollectionCatalog::get(opCtx);
209+
catalog.removeResource(viewRid, viewName.ns());
201210
});
202211

203212
// We may get invalidated, but we're exclusively locked, so the change must be ours.
@@ -411,8 +420,12 @@ Status ViewCatalog::modifyView(OperationContext* opCtx,
411420
str::stream() << "invalid name for 'viewOn': " << viewOn.coll());
412421

413422
ViewDefinition savedDefinition = *viewPtr;
414-
opCtx->recoveryUnit()->onRollback([this, viewName, savedDefinition]() {
423+
424+
opCtx->recoveryUnit()->onRollback([this, viewName, savedDefinition, opCtx]() {
415425
this->_viewMap[viewName.ns()] = std::make_shared<ViewDefinition>(savedDefinition);
426+
auto viewRid = ResourceId(RESOURCE_COLLECTION, viewName.ns());
427+
CollectionCatalog& catalog = CollectionCatalog::get(opCtx);
428+
catalog.addResource(viewRid, viewName.ns());
416429
});
417430

418431
return _createOrUpdateView(lk,
@@ -446,9 +459,16 @@ Status ViewCatalog::dropView(OperationContext* opCtx, const NamespaceString& vie
446459
_durable->remove(opCtx, viewName);
447460
_viewGraph.remove(savedDefinition.name());
448461
_viewMap.erase(viewName.ns());
449-
opCtx->recoveryUnit()->onRollback([this, viewName, savedDefinition]() {
462+
463+
CollectionCatalog& catalog = CollectionCatalog::get(opCtx);
464+
auto viewRid = ResourceId(RESOURCE_COLLECTION, viewName.ns());
465+
catalog.removeResource(viewRid, viewName.ns());
466+
467+
opCtx->recoveryUnit()->onRollback([this, viewName, savedDefinition, opCtx, viewRid]() {
450468
this->_viewGraphNeedsRefresh = true;
451469
this->_viewMap[viewName.ns()] = std::make_shared<ViewDefinition>(savedDefinition);
470+
CollectionCatalog& catalog = CollectionCatalog::get(opCtx);
471+
catalog.addResource(viewRid, viewName.ns());
452472
});
453473

454474
// We may get invalidated, but we're exclusively locked, so the change must be ours.

src/mongo/db/views/view_catalog_test.cpp

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
#include "mongo/bson/bsonmisc.h"
4040
#include "mongo/bson/bsonobj.h"
4141
#include "mongo/bson/bsonobjbuilder.h"
42+
#include "mongo/db/catalog/collection_catalog.h"
43+
#include "mongo/db/concurrency/lock_manager_defs.h"
4244
#include "mongo/db/namespace_string.h"
4345
#include "mongo/db/operation_context.h"
4446
#include "mongo/db/query/collation/collator_factory_interface.h"
@@ -451,6 +453,96 @@ TEST_F(ViewCatalogFixture, LookupExistingView) {
451453
ASSERT(viewCatalog.lookup(opCtx.get(), "db.view"_sd));
452454
}
453455

456+
TEST_F(ViewCatalogFixture, LookupRIDExistingView) {
457+
const NamespaceString viewName("db.view");
458+
const NamespaceString viewOn("db.coll");
459+
460+
ASSERT_OK(viewCatalog.createView(opCtx.get(), viewName, viewOn, emptyPipeline, emptyCollation));
461+
462+
auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd);
463+
auto& collectionCatalog = CollectionCatalog::get(opCtx.get());
464+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == "db.view");
465+
}
466+
467+
TEST_F(ViewCatalogFixture, LookupRIDExistingViewRollback) {
468+
const NamespaceString viewName("db.view");
469+
const NamespaceString viewOn("db.coll");
470+
{
471+
WriteUnitOfWork wunit(opCtx.get());
472+
ASSERT_OK(
473+
viewCatalog.createView(opCtx.get(), viewName, viewOn, emptyPipeline, emptyCollation));
474+
}
475+
auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd);
476+
auto& collectionCatalog = CollectionCatalog::get(opCtx.get());
477+
ASSERT(!collectionCatalog.lookupResourceName(resourceID));
478+
}
479+
480+
TEST_F(ViewCatalogFixture, LookupRIDAfterDrop) {
481+
const NamespaceString viewName("db.view");
482+
const NamespaceString viewOn("db.coll");
483+
484+
ASSERT_OK(viewCatalog.createView(opCtx.get(), viewName, viewOn, emptyPipeline, emptyCollation));
485+
ASSERT_OK(viewCatalog.dropView(opCtx.get(), viewName));
486+
487+
auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd);
488+
auto& collectionCatalog = CollectionCatalog::get(opCtx.get());
489+
ASSERT(!collectionCatalog.lookupResourceName(resourceID));
490+
}
491+
492+
TEST_F(ViewCatalogFixture, LookupRIDAfterDropRollback) {
493+
const NamespaceString viewName("db.view");
494+
const NamespaceString viewOn("db.coll");
495+
496+
auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd);
497+
auto& collectionCatalog = CollectionCatalog::get(opCtx.get());
498+
{
499+
WriteUnitOfWork wunit(opCtx.get());
500+
ASSERT_OK(
501+
viewCatalog.createView(opCtx.get(), viewName, viewOn, emptyPipeline, emptyCollation));
502+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == viewName.ns());
503+
wunit.commit();
504+
}
505+
506+
{
507+
WriteUnitOfWork wunit(opCtx.get());
508+
ASSERT_OK(viewCatalog.dropView(opCtx.get(), viewName));
509+
}
510+
511+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == viewName.ns());
512+
}
513+
514+
TEST_F(ViewCatalogFixture, LookupRIDAfterModify) {
515+
const NamespaceString viewName("db.view");
516+
const NamespaceString viewOn("db.coll");
517+
518+
auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd);
519+
auto& collectionCatalog = CollectionCatalog::get(opCtx.get());
520+
ASSERT_OK(viewCatalog.createView(opCtx.get(), viewName, viewOn, emptyPipeline, emptyCollation));
521+
ASSERT_OK(viewCatalog.modifyView(opCtx.get(), viewName, viewOn, emptyPipeline));
522+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == viewName.ns());
523+
}
524+
525+
TEST_F(ViewCatalogFixture, LookupRIDAfterModifyRollback) {
526+
const NamespaceString viewName("db.view");
527+
const NamespaceString viewOn("db.coll");
528+
529+
auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd);
530+
auto& collectionCatalog = CollectionCatalog::get(opCtx.get());
531+
{
532+
WriteUnitOfWork wunit(opCtx.get());
533+
ASSERT_OK(
534+
viewCatalog.createView(opCtx.get(), viewName, viewOn, emptyPipeline, emptyCollation));
535+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == viewName.ns());
536+
wunit.commit();
537+
}
538+
{
539+
WriteUnitOfWork wunit(opCtx.get());
540+
ASSERT_OK(viewCatalog.modifyView(opCtx.get(), viewName, viewOn, emptyPipeline));
541+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == viewName.ns());
542+
}
543+
ASSERT(collectionCatalog.lookupResourceName(resourceID).get() == viewName.ns());
544+
}
545+
454546
TEST_F(ViewCatalogFixture, CreateViewThenDropAndLookup) {
455547
const NamespaceString viewName("db.view");
456548
const NamespaceString viewOn("db.coll");

0 commit comments

Comments
 (0)