diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-05-10 15:49:36 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-05-10 20:57:23 +0000 |
commit | 31fa5fa15ed23e4b5fa848604ac41626199cf390 (patch) | |
tree | 0544123707cb9f6389dae8c404111fa152a5f669 /searchcore/src/tests/proton/documentdb/maintenancecontroller | |
parent | af1f8d076495792bb508ee208815d013c0523dbc (diff) |
GC frozen buckets concept
Diffstat (limited to 'searchcore/src/tests/proton/documentdb/maintenancecontroller')
3 files changed, 0 insertions, 190 deletions
diff --git a/searchcore/src/tests/proton/documentdb/maintenancecontroller/CMakeLists.txt b/searchcore/src/tests/proton/documentdb/maintenancecontroller/CMakeLists.txt index 0864f444ecf..7a2f741c1be 100644 --- a/searchcore/src/tests/proton/documentdb/maintenancecontroller/CMakeLists.txt +++ b/searchcore/src/tests/proton/documentdb/maintenancecontroller/CMakeLists.txt @@ -18,20 +18,3 @@ vespa_add_executable(searchcore_maintenancecontroller_test_app TEST searchlib_test ) vespa_add_test(NAME searchcore_maintenancecontroller_test_app COMMAND searchcore_maintenancecontroller_test_app) -vespa_add_executable(searchcore_frozenbucketsmap_test_app TEST - SOURCES - frozenbucketsmap_test.cpp - DEPENDS - searchcore_server - searchcore_feedoperation - searchcore_matching - searchcore_attribute - searchcore_documentmetastore - searchcore_bucketdb - searchcore_pcommon - searchcore_persistenceengine - searchcore_grouping - searchcore_proton_metrics - searchcore_fconfig -) -vespa_add_test(NAME searchcore_frozenbucketsmap_test_app COMMAND searchcore_frozenbucketsmap_test_app) diff --git a/searchcore/src/tests/proton/documentdb/maintenancecontroller/frozenbucketsmap_test.cpp b/searchcore/src/tests/proton/documentdb/maintenancecontroller/frozenbucketsmap_test.cpp deleted file mode 100644 index b9a7e967b74..00000000000 --- a/searchcore/src/tests/proton/documentdb/maintenancecontroller/frozenbucketsmap_test.cpp +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <vespa/log/log.h> -LOG_SETUP("frozenbucketsmap_test"); -#include <vespa/vespalib/testkit/testapp.h> -#include <vespa/searchcore/proton/server/frozenbuckets.h> -#include <vespa/vespalib/util/threadstackexecutor.h> - -using namespace proton; -using document::BucketId; - -class RWTask : public vespalib::Executor::Task { -public: - RWTask(FrozenBucketsMap & m, BucketId b, size_t count) : _b(b), _m(m), _count(count) {} -protected: - const BucketId _b; - FrozenBucketsMap & _m; - const size_t _count; -}; - -class Reader : public RWTask { -public: - Reader(FrozenBucketsMap & m, BucketId b, size_t count) : - RWTask(m, b, count), - numContended(0) - {} - ~Reader() { - LOG(info, "NumContended = %ld", numContended); - } - void run() override { - for (size_t i(0); i < _count; i++) { - _m.freezeBucket(_b); - if (_m.thawBucket(_b)) { - numContended++; - } - } - } - size_t numContended; -}; - -class Writer : public RWTask { -public: - Writer(FrozenBucketsMap & m, BucketId b, size_t count) : - RWTask(m, b, count), - numFailed(0), - numSucces(0) - {} - ~Writer() { - EXPECT_EQUAL(_count, numSucces + numFailed); - LOG(info, "NumSuccess = %ld, NumFailed = %ld", numSucces, numFailed); - } - void run() override { - for (size_t i(0); i < _count; i++) { - IFrozenBucketHandler::ExclusiveBucketGuard::UP guard = _m.acquireExclusiveBucket(_b); - if (guard) { - numSucces++; - } else { - numFailed++; - } - } - } - size_t numFailed; - size_t numSucces; -}; - -TEST("Race reader and writer on FrozenBucketsMap") { - FrozenBucketsMap m; - BucketId a(8, 6); - constexpr size_t NUM_READERS = 3; - constexpr size_t NUM_WRITERS = 1; - constexpr size_t READER_COUNT = 1000000; - constexpr size_t WRITER_COUNT = 1000000; - vespalib::ThreadStackExecutor executor(NUM_READERS+NUM_WRITERS, 0x10000); - for (size_t i(0); i < NUM_READERS; i++) { - EXPECT_FALSE(bool(executor.execute(std::make_unique<Reader>(m, a, READER_COUNT)))); - } - for (size_t i(0); i < NUM_WRITERS; i++) { - EXPECT_FALSE(bool(executor.execute(std::make_unique<Writer>(m, a, WRITER_COUNT)))); - } - executor.sync(); -} - -TEST_MAIN() -{ - TEST_RUN_ALL(); -} diff --git a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp index deaeec07db7..67a7ceeae34 100644 --- a/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp +++ b/searchcore/src/tests/proton/documentdb/maintenancecontroller/maintenancecontroller_test.cpp @@ -264,28 +264,6 @@ public: bool waitIdle(vespalib::duration timeout); }; - -class MyFrozenBucket -{ - IBucketFreezer &_freezer; - BucketId _bucketId; -public: - typedef std::unique_ptr<MyFrozenBucket> UP; - - MyFrozenBucket(IBucketFreezer &freezer, - const BucketId &bucketId) - : _freezer(freezer), - _bucketId(bucketId) - { - _freezer.freezeBucket(_bucketId); - } - - ~MyFrozenBucket() - { - _freezer.thawBucket(_bucketId); - } -}; - struct MySimpleJob : public BlockableMaintenanceJob { vespalib::CountDownLatch _latch; @@ -1006,39 +984,6 @@ TEST_F("require that a split maintenance job is executed", MaintenanceController EXPECT_EQUAL(0u, myJob._latch.getCount()); } -TEST_F("require that a blocked job is unblocked and executed after thaw bucket", - MaintenanceControllerFixture) -{ - auto job1 = std::make_unique<MySimpleJob>(TIMEOUT * 2, TIMEOUT * 2, 1); - MySimpleJob &myJob1 = *job1; - auto job2 = std::make_unique< MySimpleJob>(TIMEOUT * 2, TIMEOUT * 2, 0); - MySimpleJob &myJob2 = *job2; - f._mc.registerJobInMasterThread(std::move(job1)); - f._mc.registerJobInMasterThread(std::move(job2)); - f._injectDefaultJobs = false; - f.startMaintenance(); - - myJob1.block(); - EXPECT_TRUE(myJob1.isBlocked()); - EXPECT_FALSE(myJob2.isBlocked()); - IBucketFreezer &ibf = f._mc; - ibf.freezeBucket(BucketId(1)); - ibf.thawBucket(BucketId(1)); - EXPECT_TRUE(myJob1.isBlocked()); - ibf.freezeBucket(BucketId(1)); - IFrozenBucketHandler & fbh = f._mc; - // This is to simulate contention, as that is required for notification on thawed buckets. - EXPECT_FALSE(fbh.acquireExclusiveBucket(BucketId(1))); - ibf.thawBucket(BucketId(1)); - f._executor.sync(); - EXPECT_FALSE(myJob1.isBlocked()); - EXPECT_FALSE(myJob2.isBlocked()); - bool done1 = myJob1._latch.await(TIMEOUT); - EXPECT_TRUE(done1); - std::this_thread::sleep_for(2s); - EXPECT_EQUAL(0u, myJob2._runCnt); -} - TEST_F("require that blocked jobs are not executed", MaintenanceControllerFixture) { auto job = std::make_unique<MySimpleJob>(200ms, 200ms, 0); @@ -1079,39 +1024,6 @@ TEST_F("require that maintenance controller state list jobs", MaintenanceControl EXPECT_EQUAL("long_running_job", allJobs[1]["name"].asString().make_string()); } -TEST("Verify FrozenBucketsMap interface") { - FrozenBucketsMap m; - BucketId a(8, 6); - { - auto guard = m.acquireExclusiveBucket(a); - EXPECT_TRUE(bool(guard)); - EXPECT_EQUAL(a, guard->getBucket()); - } - m.freezeBucket(a); - EXPECT_FALSE(m.thawBucket(a)); - m.freezeBucket(a); - { - auto guard = m.acquireExclusiveBucket(a); - EXPECT_FALSE(bool(guard)); - } - EXPECT_TRUE(m.thawBucket(a)); - m.freezeBucket(a); - m.freezeBucket(a); - m.freezeBucket(a); - { - auto guard = m.acquireExclusiveBucket(a); - EXPECT_FALSE(bool(guard)); - } - EXPECT_FALSE(m.thawBucket(a)); - EXPECT_FALSE(m.thawBucket(a)); - EXPECT_TRUE(m.thawBucket(a)); - { - auto guard = m.acquireExclusiveBucket(a); - EXPECT_TRUE(bool(guard)); - EXPECT_EQUAL(a, guard->getBucket()); - } -} - const MaintenanceJobRunner * findJob(const MaintenanceController::JobList &jobs, const vespalib::string &jobName) { |