summaryrefslogtreecommitdiff
path: root/src/mongo/db/views
diff options
context:
space:
mode:
authorLouis Williams <louis.williams@mongodb.com>2021-03-29 11:40:34 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-03-31 21:44:49 +0000
commitbed9b4820e4421d63ff5457cd854671cf51bf4f6 (patch)
treed2599cab58b0c24e53cbcfd26246ef7c9c5e360a /src/mongo/db/views
parent7cfcec38fd4f6549a12907f8c32f86a85e773ff5 (diff)
downloadmongo-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/SConscript1
-rw-r--r--src/mongo/db/views/view.cpp12
-rw-r--r--src/mongo/db/views/view.h12
-rw-r--r--src/mongo/db/views/view_catalog.cpp32
-rw-r--r--src/mongo/db/views/view_catalog.h6
-rw-r--r--src/mongo/db/views/view_catalog_test.cpp12
-rw-r--r--src/mongo/db/views/view_definition_test.cpp35
-rw-r--r--src/mongo/db/views/view_graph_test.cpp2
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: