diff options
Diffstat (limited to 'storage/src/tests/persistence')
-rw-r--r-- | storage/src/tests/persistence/CMakeLists.txt | 1 | ||||
-rw-r--r-- | storage/src/tests/persistence/active_operations_stats_test.cpp | 150 |
2 files changed, 151 insertions, 0 deletions
diff --git a/storage/src/tests/persistence/CMakeLists.txt b/storage/src/tests/persistence/CMakeLists.txt index f0deec90aae..7b165e11b66 100644 --- a/storage/src/tests/persistence/CMakeLists.txt +++ b/storage/src/tests/persistence/CMakeLists.txt @@ -2,6 +2,7 @@ vespa_add_executable(storage_persistence_gtest_runner_app TEST SOURCES + active_operations_stats_test.cpp apply_bucket_diff_state_test.cpp bucketownershipnotifiertest.cpp has_mask_remapper_test.cpp diff --git a/storage/src/tests/persistence/active_operations_stats_test.cpp b/storage/src/tests/persistence/active_operations_stats_test.cpp new file mode 100644 index 00000000000..a5dd3d929db --- /dev/null +++ b/storage/src/tests/persistence/active_operations_stats_test.cpp @@ -0,0 +1,150 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + +#include <vespa/persistence/dummyimpl/dummypersistence.h> +#include <tests/persistence/common/filestortestfixture.h> +#include <tests/persistence/filestorage/forwardingmessagesender.h> +#include <vespa/storage/persistence/filestorage/filestormetrics.h> +#include <vespa/document/test/make_document_bucket.h> +#include <vespa/document/fieldset/fieldsets.h> +#include <vespa/metrics/updatehook.h> + +using document::test::makeDocumentBucket; + +namespace storage { + +class ActiveOperationsStatsTest : public FileStorTestFixture +{ +protected: + DummyStorageLink top; + std::unique_ptr<DummyStorageLink> dummyManager; + ForwardingMessageSender messageSender; + FileStorMetrics metrics; + std::unique_ptr<FileStorHandler> filestorHandler; + uint32_t stripeId; + +public: + ActiveOperationsStatsTest(); + ~ActiveOperationsStatsTest() override; + std::shared_ptr<api::StorageMessage> createPut(uint64_t bucket, uint64_t docIdx); + std::shared_ptr<api::StorageMessage> createGet(uint64_t bucket) const; + + void assert_active_operations_stats(const ActiveOperationsStats &stats, uint32_t exp_active_size, uint32_t exp_size_samples, uint32_t exp_latency_samples); + void update_metrics(); + void test_active_operations_stats(); +}; + +ActiveOperationsStatsTest::ActiveOperationsStatsTest() + : FileStorTestFixture(), + top(), + dummyManager(std::make_unique<DummyStorageLink>()), + messageSender(*dummyManager), + metrics(), + stripeId(0) +{ + setupPersistenceThreads(1); + _node->setPersistenceProvider(std::make_unique<spi::dummy::DummyPersistence>(_node->getTypeRepo())); + top.push_back(std::move(dummyManager)); + top.open(); + metrics.initDiskMetrics(1, 1); + filestorHandler = std::make_unique<FileStorHandlerImpl>(messageSender, metrics, + _node->getComponentRegister()); + filestorHandler->setGetNextMessageTimeout(20ms); +} + +ActiveOperationsStatsTest::~ActiveOperationsStatsTest() = default; + +std::shared_ptr<api::StorageMessage> +ActiveOperationsStatsTest::createPut(uint64_t bucket, uint64_t docIdx) +{ + auto doc = _node->getTestDocMan().createDocument( + "foobar", vespalib::make_string("id:foo:testdoctype1:n=%" PRIu64 ":%" PRIu64, bucket, docIdx)); + auto cmd = std::make_shared<api::PutCommand>(makeDocumentBucket(document::BucketId(16, bucket)), std::move(doc), 1234); + cmd->setAddress(makeSelfAddress()); + return cmd; +} + +std::shared_ptr<api::StorageMessage> +ActiveOperationsStatsTest::createGet(uint64_t bucket) const +{ + auto cmd = std::make_shared<api::GetCommand>( + makeDocumentBucket(document::BucketId(16, bucket)), + document::DocumentId(vespalib::make_string("id:foo:testdoctype1:n=%" PRIu64 ":0", bucket)), document::AllFields::NAME); + cmd->setAddress(makeSelfAddress()); + return cmd; +} + +void +ActiveOperationsStatsTest::assert_active_operations_stats(const ActiveOperationsStats &stats, uint32_t exp_active_size, uint32_t exp_size_samples, uint32_t exp_latency_samples) +{ + EXPECT_EQ(exp_active_size, stats.get_active_size()); + EXPECT_EQ(exp_size_samples, stats.get_size_samples()); + EXPECT_EQ(exp_latency_samples, stats.get_latency_samples()); +} + +void +ActiveOperationsStatsTest::update_metrics() +{ + std::mutex dummy_lock; + auto &impl = dynamic_cast<FileStorHandlerImpl&>(*filestorHandler); + auto& hook = impl.get_metric_update_hook_for_testing(); + hook.updateMetrics(metrics::MetricLockGuard(dummy_lock)); +} + +void +ActiveOperationsStatsTest::test_active_operations_stats() +{ + auto lock0 = filestorHandler->getNextMessage(stripeId); + auto lock1 = filestorHandler->getNextMessage(stripeId); + auto lock2 = filestorHandler->getNextMessage(stripeId); + ASSERT_TRUE(lock0.first); + ASSERT_TRUE(lock1.first); + ASSERT_FALSE(lock2.first); + auto stats = filestorHandler->get_active_operations_stats(false); + { + SCOPED_TRACE("during"); + assert_active_operations_stats(stats, 2, 2, 0); + } + EXPECT_EQ(3, stats.get_total_size()); + lock0.first.reset(); + lock1.first.reset(); + stats = filestorHandler->get_active_operations_stats(false); + { + SCOPED_TRACE("after"); + assert_active_operations_stats(stats, 0, 4, 2); + } + EXPECT_EQ(4, stats.get_total_size()); + EXPECT_LT(0.0, stats.get_total_latency()); + update_metrics(); + auto &ao_metrics = metrics.disk->active_operations; + EXPECT_DOUBLE_EQ(1.0, ao_metrics.size.getAverage()); + EXPECT_DOUBLE_EQ(0.0, ao_metrics.size.getMinimum()); + EXPECT_DOUBLE_EQ(2.0, ao_metrics.size.getMaximum()); + EXPECT_DOUBLE_EQ(4.0, ao_metrics.size.getCount()); + EXPECT_LT(0.0, ao_metrics.latency.getAverage()); + EXPECT_LT(0.0, ao_metrics.latency.getMinimum()); + EXPECT_LT(0.0, ao_metrics.latency.getMaximum()); + EXPECT_DOUBLE_EQ(2.0, ao_metrics.latency.getCount()); +} + +TEST_F(ActiveOperationsStatsTest, empty_stats) +{ + auto stats = filestorHandler->get_active_operations_stats(false); + assert_active_operations_stats(stats, 0, 0, 0); +} + +TEST_F(ActiveOperationsStatsTest, exclusive_lock_active_operations_stats) +{ + filestorHandler->schedule(createPut(1234, 0)); + filestorHandler->schedule(createPut(1234, 1)); + filestorHandler->schedule(createPut(5432, 0)); + test_active_operations_stats(); +} + +TEST_F(ActiveOperationsStatsTest, shared_lock_active_operations_stats) +{ + filestorHandler->schedule(createGet(1234)); + filestorHandler->schedule(createGet(1234)); + test_active_operations_stats(); +} + +} |