diff options
author | Louis Williams <louis.williams@mongodb.com> | 2021-03-29 11:40:34 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-03-31 21:44:49 +0000 |
commit | bed9b4820e4421d63ff5457cd854671cf51bf4f6 (patch) | |
tree | d2599cab58b0c24e53cbcfd26246ef7c9c5e360a /src/mongo/db/views | |
parent | 7cfcec38fd4f6549a12907f8c32f86a85e773ff5 (diff) | |
download | mongo-bed9b4820e4421d63ff5457cd854671cf51bf4f6.tar.gz |
SERVER-55591 Store time-series metadata in the durable catalog entry for buckets collections
Diffstat (limited to 'src/mongo/db/views')
-rw-r--r-- | src/mongo/db/views/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/views/view.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/views/view.h | 12 | ||||
-rw-r--r-- | src/mongo/db/views/view_catalog.cpp | 32 | ||||
-rw-r--r-- | src/mongo/db/views/view_catalog.h | 6 | ||||
-rw-r--r-- | src/mongo/db/views/view_catalog_test.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/views/view_definition_test.cpp | 35 | ||||
-rw-r--r-- | src/mongo/db/views/view_graph_test.cpp | 2 |
8 files changed, 32 insertions, 80 deletions
diff --git a/src/mongo/db/views/SConscript b/src/mongo/db/views/SConscript index 00298b97541..5ca16d561ed 100644 --- a/src/mongo/db/views/SConscript +++ b/src/mongo/db/views/SConscript @@ -30,7 +30,6 @@ env.Library( '$BUILD_DIR/mongo/db/pipeline/aggregation', '$BUILD_DIR/mongo/db/query/collation/collator_factory_interface', '$BUILD_DIR/mongo/db/repl/repl_coordinator_interface', - '$BUILD_DIR/mongo/db/timeseries/timeseries_idl', 'resolved_view', ], LIBDEPS_PRIVATE=[ diff --git a/src/mongo/db/views/view.cpp b/src/mongo/db/views/view.cpp index 1f2f6d797bd..04987538658 100644 --- a/src/mongo/db/views/view.cpp +++ b/src/mongo/db/views/view.cpp @@ -41,12 +41,8 @@ ViewDefinition::ViewDefinition(StringData dbName, StringData viewName, StringData viewOnName, const BSONObj& pipeline, - std::unique_ptr<CollatorInterface> collator, - const boost::optional<TimeseriesOptions>& timeseries) - : _viewNss(dbName, viewName), - _viewOnNss(dbName, viewOnName), - _collator(std::move(collator)), - _timeseries(timeseries) { + std::unique_ptr<CollatorInterface> collator) + : _viewNss(dbName, viewName), _viewOnNss(dbName, viewOnName), _collator(std::move(collator)) { for (BSONElement e : pipeline) { _pipeline.push_back(e.Obj().getOwned()); } @@ -56,15 +52,13 @@ ViewDefinition::ViewDefinition(const ViewDefinition& other) : _viewNss(other._viewNss), _viewOnNss(other._viewOnNss), _collator(CollatorInterface::cloneCollator(other._collator.get())), - _pipeline(other._pipeline), - _timeseries(other._timeseries) {} + _pipeline(other._pipeline) {} ViewDefinition& ViewDefinition::operator=(const ViewDefinition& other) { _viewNss = other._viewNss; _viewOnNss = other._viewOnNss; _collator = CollatorInterface::cloneCollator(other._collator.get()); _pipeline = other._pipeline; - _timeseries = other._timeseries; return *this; } diff --git a/src/mongo/db/views/view.h b/src/mongo/db/views/view.h index 07edd41fddc..713e65e3f92 100644 --- a/src/mongo/db/views/view.h +++ b/src/mongo/db/views/view.h @@ -36,7 +36,6 @@ #include "mongo/bson/bsonobj.h" #include "mongo/db/namespace_string.h" #include "mongo/db/query/collation/collator_interface.h" -#include "mongo/db/timeseries/timeseries_gen.h" namespace mongo { @@ -53,8 +52,7 @@ public: StringData viewName, StringData viewOnName, const BSONObj& pipeline, - std::unique_ptr<CollatorInterface> collation, - const boost::optional<TimeseriesOptions>& timeseries); + std::unique_ptr<CollatorInterface> collation); /** * Copying a view 'other' clones its collator and does a simple copy of all other fields. @@ -93,10 +91,11 @@ public: } /** - * Returns the time-series options for the view, or boost::none if not a time-series view. + * Returns 'true' if this view is a time-series collection. That is, it is backed by a + * time-series buckets collection. */ - const boost::optional<TimeseriesOptions>& timeseries() const { - return _timeseries; + bool timeseries() const { + return _viewOnNss.isTimeseriesBucketsCollection(); } void setViewOn(const NamespaceString& viewOnNss); @@ -111,6 +110,5 @@ private: NamespaceString _viewOnNss; std::unique_ptr<CollatorInterface> _collator; std::vector<BSONObj> _pipeline; - boost::optional<TimeseriesOptions> _timeseries; }; } // namespace mongo diff --git a/src/mongo/db/views/view_catalog.cpp b/src/mongo/db/views/view_catalog.cpp index 0c49ff64041..6f3706c6aab 100644 --- a/src/mongo/db/views/view_catalog.cpp +++ b/src/mongo/db/views/view_catalog.cpp @@ -205,22 +205,11 @@ Status ViewCatalog::_reload(OperationContext* opCtx, ViewCatalogLookupBehavior l } } - boost::optional<TimeseriesOptions> timeseries; - if (view.hasField("timeseries")) { - try { - timeseries = - TimeseriesOptions::parse({"ViewCatalog::_reload"}, view["timeseries"].Obj()); - } catch (const DBException& ex) { - return ex.toStatus(); - } - } - _viewMap[viewName.ns()] = std::make_shared<ViewDefinition>(viewName.db(), viewName.coll(), view["viewOn"].str(), pipeline, - std::move(collator.getValue()), - timeseries); + std::move(collator.getValue())); return Status::OK(); }; @@ -290,8 +279,7 @@ Status ViewCatalog::_createOrUpdateView(OperationContext* opCtx, const NamespaceString& viewName, const NamespaceString& viewOn, const BSONArray& pipeline, - std::unique_ptr<CollatorInterface> collator, - const boost::optional<TimeseriesOptions>& timeseries) { + std::unique_ptr<CollatorInterface> collator) { invariant(opCtx->lockState()->isDbLockedForMode(viewName.db(), MODE_IX)); invariant(opCtx->lockState()->isCollectionLockedForMode(viewName, MODE_IX)); invariant(opCtx->lockState()->isCollectionLockedForMode( @@ -308,17 +296,10 @@ Status ViewCatalog::_createOrUpdateView(OperationContext* opCtx, if (collator) { viewDefBuilder.append("collation", collator->getSpec().toBSON()); } - if (timeseries) { - viewDefBuilder.append("timeseries", timeseries->toBSON()); - } BSONObj ownedPipeline = pipeline.getOwned(); - auto view = std::make_shared<ViewDefinition>(viewName.db(), - viewName.coll(), - viewOn.coll(), - ownedPipeline, - std::move(collator), - timeseries); + auto view = std::make_shared<ViewDefinition>( + viewName.db(), viewName.coll(), viewOn.coll(), ownedPipeline, std::move(collator)); // Check that the resulting dependency graph is acyclic and within the maximum depth. Status graphStatus = _upsertIntoGraph(opCtx, *(view.get())); @@ -511,8 +492,7 @@ Status ViewCatalog::createView(OperationContext* opCtx, const NamespaceString& viewName, const NamespaceString& viewOn, const BSONArray& pipeline, - const BSONObj& collation, - const boost::optional<TimeseriesOptions>& timeseries) { + const BSONObj& collation) { invariant(opCtx->lockState()->isDbLockedForMode(viewName.db(), MODE_IX)); invariant(opCtx->lockState()->isCollectionLockedForMode(viewName, MODE_IX)); invariant(opCtx->lockState()->isCollectionLockedForMode( @@ -543,7 +523,7 @@ Status ViewCatalog::createView(OperationContext* opCtx, catalogStorage.setIgnoreExternalChange(true); result = catalog.writable()->_createOrUpdateView( - opCtx, viewName, viewOn, pipeline, std::move(collator.getValue()), timeseries); + opCtx, viewName, viewOn, pipeline, std::move(collator.getValue())); } if (result.isOK()) { catalog.commit(); diff --git a/src/mongo/db/views/view_catalog.h b/src/mongo/db/views/view_catalog.h index a7752303bc0..9743f789a76 100644 --- a/src/mongo/db/views/view_catalog.h +++ b/src/mongo/db/views/view_catalog.h @@ -96,8 +96,7 @@ public: const NamespaceString& viewName, const NamespaceString& viewOn, const BSONArray& pipeline, - const BSONObj& collation, - const boost::optional<TimeseriesOptions>& timeseries); + const BSONObj& collation); /** * Drop the view named 'viewName'. @@ -176,8 +175,7 @@ private: const NamespaceString& viewName, const NamespaceString& viewOn, const BSONArray& pipeline, - std::unique_ptr<CollatorInterface> collator, - const boost::optional<TimeseriesOptions>& timeseries = boost::none); + std::unique_ptr<CollatorInterface> collator); /** * Parses the view definition pipeline, attempts to upsert into the view graph, and refreshes * the graph if necessary. Returns an error status if the resulting graph would be invalid. diff --git a/src/mongo/db/views/view_catalog_test.cpp b/src/mongo/db/views/view_catalog_test.cpp index 06c859cbcea..d7cc6c52e1b 100644 --- a/src/mongo/db/views/view_catalog_test.cpp +++ b/src/mongo/db/views/view_catalog_test.cpp @@ -121,8 +121,7 @@ public: MODE_X); WriteUnitOfWork wuow(opCtx); - Status s = - ViewCatalog::createView(opCtx, _db, viewName, viewOn, pipeline, collation, boost::none); + Status s = ViewCatalog::createView(opCtx, _db, viewName, viewOn, pipeline, collation); wuow.commit(); return s; @@ -531,13 +530,8 @@ TEST_F(ViewCatalogFixture, LookupRIDExistingViewRollback) { MODE_X); WriteUnitOfWork wunit(operationContext()); - ASSERT_OK(ViewCatalog::createView(operationContext(), - db(), - viewName, - viewOn, - emptyPipeline, - emptyCollation, - boost::none)); + ASSERT_OK(ViewCatalog::createView( + operationContext(), db(), viewName, viewOn, emptyPipeline, emptyCollation)); } auto resourceID = ResourceId(RESOURCE_COLLECTION, "db.view"_sd); auto collectionCatalog = CollectionCatalog::get(operationContext()); diff --git a/src/mongo/db/views/view_definition_test.cpp b/src/mongo/db/views/view_definition_test.cpp index 7ea401caee4..3971e39693d 100644 --- a/src/mongo/db/views/view_definition_test.cpp +++ b/src/mongo/db/views/view_definition_test.cpp @@ -46,12 +46,12 @@ namespace { const NamespaceString viewNss("testdb.testview"); const NamespaceString backingNss("testdb.testcoll"); +const NamespaceString bucketsColl("testdb.system.buckets.testcoll"); const BSONObj samplePipeline = BSON_ARRAY(BSON("limit" << 9)); -const TimeseriesOptions timeseries("time"); TEST(ViewDefinitionTest, ViewDefinitionCreationCorrectlyBuildsNamespaceStrings) { ViewDefinition viewDef( - viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr, boost::none); + viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr); ASSERT_EQ(viewDef.name(), viewNss); ASSERT_EQ(viewDef.viewOn(), backingNss); } @@ -59,12 +59,8 @@ TEST(ViewDefinitionTest, ViewDefinitionCreationCorrectlyBuildsNamespaceStrings) TEST(ViewDefinitionTest, CopyConstructorProperlyClonesAllFields) { auto collator = std::make_unique<CollatorInterfaceMock>(CollatorInterfaceMock::MockType::kReverseString); - ViewDefinition originalView(viewNss.db(), - viewNss.coll(), - backingNss.coll(), - samplePipeline, - std::move(collator), - timeseries); + ViewDefinition originalView( + viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, std::move(collator)); ViewDefinition copiedView(originalView); ASSERT_EQ(originalView.name(), copiedView.name()); @@ -75,18 +71,14 @@ TEST(ViewDefinitionTest, CopyConstructorProperlyClonesAllFields) { SimpleBSONObjComparator::kInstance.makeEqualTo())); ASSERT(CollatorInterface::collatorsMatch(originalView.defaultCollator(), copiedView.defaultCollator())); - ASSERT(originalView.timeseries()->toBSON().binaryEqual(copiedView.timeseries()->toBSON())); + ASSERT_EQ(originalView.timeseries(), copiedView.timeseries()); } TEST(ViewDefinitionTest, CopyAssignmentOperatorProperlyClonesAllFields) { auto collator = std::make_unique<CollatorInterfaceMock>(CollatorInterfaceMock::MockType::kReverseString); - ViewDefinition originalView(viewNss.db(), - viewNss.coll(), - backingNss.coll(), - samplePipeline, - std::move(collator), - timeseries); + ViewDefinition originalView( + viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, std::move(collator)); ViewDefinition copiedView = originalView; ASSERT_EQ(originalView.name(), copiedView.name()); @@ -97,21 +89,20 @@ TEST(ViewDefinitionTest, CopyAssignmentOperatorProperlyClonesAllFields) { SimpleBSONObjComparator::kInstance.makeEqualTo())); ASSERT(CollatorInterface::collatorsMatch(originalView.defaultCollator(), copiedView.defaultCollator())); - ASSERT(originalView.timeseries()->toBSON().binaryEqual(copiedView.timeseries()->toBSON())); } DEATH_TEST_REGEX(ViewDefinitionTest, SetViewOnFailsIfNewViewOnNotInSameDatabaseAsView, R"#(Invariant failure.*_viewNss.db\(\) == viewOnNss.db\(\))#") { ViewDefinition viewDef( - viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr, boost::none); + viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr); NamespaceString badViewOn("someOtherDb.someOtherCollection"); viewDef.setViewOn(badViewOn); } TEST(ViewDefinitionTest, SetViewOnSucceedsIfNewViewOnIsInSameDatabaseAsView) { ViewDefinition viewDef( - viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr, boost::none); + viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr); ASSERT_EQ(viewDef.viewOn(), backingNss); NamespaceString newViewOn("testdb.othercollection"); @@ -123,7 +114,7 @@ DEATH_TEST_REGEX(ViewDefinitionTest, SetPiplineFailsIfPipelineTypeIsNotArray, R"#(Invariant failure.*pipeline.type\(\) == Array)#") { ViewDefinition viewDef( - viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr, boost::none); + viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr); // We'll pass in a BSONElement that could be a valid array, but is BSONType::Object rather than // BSONType::Array. @@ -138,8 +129,7 @@ DEATH_TEST_REGEX(ViewDefinitionTest, } TEST(ViewDefinitionTest, SetPipelineSucceedsOnValidArrayBSONElement) { - ViewDefinition viewDef( - viewNss.db(), viewNss.coll(), backingNss.coll(), BSONObj(), nullptr, boost::none); + ViewDefinition viewDef(viewNss.db(), viewNss.coll(), backingNss.coll(), BSONObj(), nullptr); ASSERT(viewDef.pipeline().empty()); BSONObj matchStage = BSON("match" << BSON("x" << 9)); @@ -157,9 +147,8 @@ TEST(ViewDefinitionTest, SetPipelineSucceedsOnValidArrayBSONElement) { TEST(ViewDefinitionTest, ViewDefinitionCreationCorrectlySetsTimeseries) { ViewDefinition viewDef( - viewNss.db(), viewNss.coll(), backingNss.coll(), samplePipeline, nullptr, timeseries); + viewNss.db(), viewNss.coll(), bucketsColl.coll(), samplePipeline, nullptr); ASSERT(viewDef.timeseries()); - ASSERT_EQ(viewDef.timeseries()->getTimeField(), "time"); } } // namespace } // namespace mongo diff --git a/src/mongo/db/views/view_graph_test.cpp b/src/mongo/db/views/view_graph_test.cpp index 0dbdab653d4..5ace80ef15a 100644 --- a/src/mongo/db/views/view_graph_test.cpp +++ b/src/mongo/db/views/view_graph_test.cpp @@ -83,7 +83,7 @@ public: collator = std::move(factoryCollator.getValue()); } - return {db, view, viewOn, pipeline, std::move(collator), boost::none}; + return {db, view, viewOn, pipeline, std::move(collator)}; } private: |