diff options
author | Dan Larkin-York <dan.larkin-york@mongodb.com> | 2022-12-16 15:52:17 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-12-16 16:56:05 +0000 |
commit | 4cb4b84d88c783af575195d934c236beebbb47c6 (patch) | |
tree | 1709eda2fc49a2bccfb04c32b9a8743a5e660d13 | |
parent | f04d4dc226a2b80d1e342c2585f900d7024a85d5 (diff) | |
download | mongo-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.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/timeseries/bucket_catalog_test.cpp | 55 |
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(); |