summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Larkin-York <dan.larkin-york@mongodb.com>2022-12-16 15:52:17 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-12-16 16:56:05 +0000
commit4cb4b84d88c783af575195d934c236beebbb47c6 (patch)
tree1709eda2fc49a2bccfb04c32b9a8743a5e660d13
parentf04d4dc226a2b80d1e342c2585f900d7024a85d5 (diff)
downloadmongo-4cb4b84d88c783af575195d934c236beebbb47c6.tar.gz
SERVER-72048 Ensure we can't reopen a time series bucket with closed flag set
-rw-r--r--src/mongo/db/timeseries/bucket_catalog.cpp8
-rw-r--r--src/mongo/db/timeseries/bucket_catalog_test.cpp55
2 files changed, 60 insertions, 3 deletions
diff --git a/src/mongo/db/timeseries/bucket_catalog.cpp b/src/mongo/db/timeseries/bucket_catalog.cpp
index 48ab0d1dc65..33d507d9f27 100644
--- a/src/mongo/db/timeseries/bucket_catalog.cpp
+++ b/src/mongo/db/timeseries/bucket_catalog.cpp
@@ -1521,6 +1521,13 @@ StatusWith<std::unique_ptr<BucketCatalog::Bucket>> BucketCatalog::_rehydrateBuck
return result.second;
}
+ auto controlField = bucketDoc.getObjectField(timeseries::kBucketControlFieldName);
+ auto closedElem = controlField.getField(timeseries::kBucketControlClosedFieldName);
+ if (closedElem.booleanSafe()) {
+ return {ErrorCodes::BadValue,
+ "Bucket has been marked closed and is not eligible for reopening"};
+ }
+
BSONElement metadata;
auto metaFieldName = options.getMetaField();
if (metaFieldName) {
@@ -1555,7 +1562,6 @@ StatusWith<std::unique_ptr<BucketCatalog::Bucket>> BucketCatalog::_rehydrateBuck
} else {
bucket->_size = bucketDoc.objsize();
}
- auto controlField = bucketDoc.getObjectField(timeseries::kBucketControlFieldName);
bucket->_minTime = controlField.getObjectField(timeseries::kBucketControlMinFieldName)
.getField(options.getTimeField())
.Date();
diff --git a/src/mongo/db/timeseries/bucket_catalog_test.cpp b/src/mongo/db/timeseries/bucket_catalog_test.cpp
index 833f96a43b6..4f784dee500 100644
--- a/src/mongo/db/timeseries/bucket_catalog_test.cpp
+++ b/src/mongo/db/timeseries/bucket_catalog_test.cpp
@@ -1194,6 +1194,57 @@ TEST_F(BucketCatalogTest, ReopenMalformedBucket) {
}
}
+TEST_F(BucketCatalogTest, ReopenClosedBuckets) {
+ RAIIServerParameterControllerForTest featureFlag{"featureFlagTimeseriesScalabilityImprovements",
+ true};
+
+ AutoGetCollection autoColl(_opCtx, _ns1.makeTimeseriesBucketsNamespace(), MODE_IX);
+
+ {
+ // control.closed: true
+ BSONObj closedBucket = ::mongo::fromjson(
+ R"({"_id":{"$oid":"629e1e680958e279dc29a517"},
+ "control":{"version":1,"min":{"time":{"$date":"2022-06-06T15:34:00.000Z"},"a":1,"b":1},
+ "max":{"time":{"$date":"2022-06-06T15:34:30.000Z"},"a":3,"b":3},
+ "closed": true},
+ "data":{"time":{"0":{"$date":"2022-06-06T15:34:30.000Z"},
+ "1":{"$date":"2022-06-06T15:34:30.000Z"},
+ "2":{"$date":"2022-06-06T15:34:30.000Z"}},
+ "a":{"0":1,"1":2,"2":3},
+ "b":{"0":1,"1":2,"2":3}}})");
+ ASSERT_NOT_OK(_bucketCatalog->reopenBucket(_opCtx, autoColl.getCollection(), closedBucket));
+ }
+
+ {
+ // control.closed: false
+ BSONObj openBucket = ::mongo::fromjson(
+ R"({"_id":{"$oid":"629e1e680958e279dc29a518"},
+ "control":{"version":1,"min":{"time":{"$date":"2022-06-06T15:34:00.000Z"},"a":1,"b":1},
+ "max":{"time":{"$date":"2022-06-06T15:34:30.000Z"},"a":3,"b":3},
+ "closed": false},
+ "data":{"time":{"0":{"$date":"2022-06-06T15:34:30.000Z"},
+ "1":{"$date":"2022-06-06T15:34:30.000Z"},
+ "2":{"$date":"2022-06-06T15:34:30.000Z"}},
+ "a":{"0":1,"1":2,"2":3},
+ "b":{"0":1,"1":2,"2":3}}})");
+ ASSERT_OK(_bucketCatalog->reopenBucket(_opCtx, autoColl.getCollection(), openBucket));
+ }
+
+ {
+ // No control.closed
+ BSONObj openBucket = ::mongo::fromjson(
+ R"({"_id":{"$oid":"629e1e680958e279dc29a517"},
+ "control":{"version":1,"min":{"time":{"$date":"2022-06-06T15:34:00.000Z"},"a":1,"b":1},
+ "max":{"time":{"$date":"2022-06-06T15:34:30.000Z"},"a":3,"b":3}},
+ "data":{"time":{"0":{"$date":"2022-06-06T15:34:30.000Z"},
+ "1":{"$date":"2022-06-06T15:34:30.000Z"},
+ "2":{"$date":"2022-06-06T15:34:30.000Z"}},
+ "a":{"0":1,"1":2,"2":3},
+ "b":{"0":1,"1":2,"2":3}}})");
+ ASSERT_OK(_bucketCatalog->reopenBucket(_opCtx, autoColl.getCollection(), openBucket));
+ }
+}
+
TEST_F(BucketCatalogTest, ReopenUncompressedBucketAndInsertCompatibleMeasurement) {
RAIIServerParameterControllerForTest featureFlag{"featureFlagTimeseriesScalabilityImprovements",
true};
@@ -1319,7 +1370,7 @@ TEST_F(BucketCatalogTest, ReopenCompressedBucketAndInsertCompatibleMeasurement)
timeseries::compressBucket(bucketDoc,
_timeField,
_ns1,
- /*eligibleForReopening*/ false,
+ /*eligibleForReopening*/ true,
/*validateDecompression*/ true);
const BSONObj& compressedBucketDoc = compressionResult.compressedBucket.value();
@@ -1382,7 +1433,7 @@ TEST_F(BucketCatalogTest, ReopenCompressedBucketAndInsertIncompatibleMeasurement
timeseries::compressBucket(bucketDoc,
_timeField,
_ns1,
- /*eligibleForReopening*/ false,
+ /*eligibleForReopening*/ true,
/*validateDecompression*/ true);
const BSONObj& compressedBucketDoc = compressionResult.compressedBucket.value();