diff options
Diffstat (limited to 'storage/src/tests/distributor/mergeoperationtest.cpp')
-rw-r--r-- | storage/src/tests/distributor/mergeoperationtest.cpp | 378 |
1 files changed, 140 insertions, 238 deletions
diff --git a/storage/src/tests/distributor/mergeoperationtest.cpp b/storage/src/tests/distributor/mergeoperationtest.cpp index 672c1d06124..75faddbe667 100644 --- a/storage/src/tests/distributor/mergeoperationtest.cpp +++ b/storage/src/tests/distributor/mergeoperationtest.cpp @@ -1,70 +1,35 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -#include <boost/lexical_cast.hpp> -#include <cppunit/extensions/HelperMacros.h> -#include <iomanip> +#include <vespa/document/test/make_document_bucket.h> #include <tests/common/dummystoragelink.h> #include <vespa/storage/distributor/idealstatemanager.h> #include <vespa/storageapi/message/persistence.h> #include <vespa/storage/distributor/operations/idealstate/mergeoperation.h> #include <vespa/storage/distributor/bucketdbupdater.h> -#include <tests/distributor/distributortestutil.h> -#include <vespa/document/test/make_document_bucket.h> #include <vespa/storage/distributor/distributor.h> +#include <tests/distributor/distributortestutil.h> #include <vespa/vespalib/text/stringtokenizer.h> +#include <vespa/vespalib/gtest/gtest.h> -using std::shared_ptr; using document::test::makeDocumentBucket; +using namespace ::testing; -namespace storage { -namespace distributor { - -class MergeOperationTest : public CppUnit::TestFixture, - public DistributorTestUtil -{ - CPPUNIT_TEST_SUITE(MergeOperationTest); - CPPUNIT_TEST(testSimple); - CPPUNIT_TEST(testFailIfSourceOnlyCopiesChanged); - CPPUNIT_TEST(testGenerateNodeList); - CPPUNIT_TEST(doNotRemoveCopiesWithPendingMessages); - CPPUNIT_TEST(allow_deleting_active_source_only_replica); - CPPUNIT_TEST(testMarkRedundantTrustedCopiesAsSourceOnly); - CPPUNIT_TEST(onlyMarkRedundantRetiredReplicasAsSourceOnly); - CPPUNIT_TEST(mark_post_merge_redundant_replicas_source_only); - CPPUNIT_TEST(merge_operation_is_blocked_by_any_busy_target_node); - CPPUNIT_TEST(missing_replica_is_included_in_limited_node_list); - CPPUNIT_TEST_SUITE_END(); +namespace storage::distributor { +struct MergeOperationTest : Test, DistributorTestUtil { std::unique_ptr<PendingMessageTracker> _pendingTracker; -protected: - void testSimple(); - void testFailIfSourceOnlyCopiesChanged(); - void testGenerateNodeList(); - void doNotRemoveCopiesWithPendingMessages(); - void allow_deleting_active_source_only_replica(); - void testMarkRedundantTrustedCopiesAsSourceOnly(); - void onlyMarkRedundantRetiredReplicasAsSourceOnly(); - void mark_post_merge_redundant_replicas_source_only(); - void merge_operation_is_blocked_by_any_busy_target_node(); - void missing_replica_is_included_in_limited_node_list(); - -public: - void setUp() override { + void SetUp() override { createLinks(); - _pendingTracker.reset(new PendingMessageTracker(getComponentRegister())); + _pendingTracker = std::make_unique<PendingMessageTracker>(getComponentRegister()); _sender.setPendingMessageTracker(*_pendingTracker); } - void tearDown() override { + void TearDown() override { close(); } }; -CPPUNIT_TEST_SUITE_REGISTRATION(MergeOperationTest); - -void -MergeOperationTest::testSimple() -{ +TEST_F(MergeOperationTest, simple) { getClock().setAbsoluteTimeInSeconds(10); addNodesToBucketDB(document::BucketId(16, 1), @@ -79,25 +44,20 @@ MergeOperationTest::testSimple() op.setIdealStateManager(&getIdealStateManager()); op.start(_sender, framework::MilliSecTime(0)); - CPPUNIT_ASSERT_EQUAL( - std::string( - "MergeBucketCommand(BucketId(0x4000000000000001), to time 10000000, " - "cluster state version: 0, nodes: [0, 2, 1 (source only)], chain: [], " - "reasons to start: ) => 0"), - _sender.getLastCommand(true)); + ASSERT_EQ("MergeBucketCommand(BucketId(0x4000000000000001), to time 10000000, " + "cluster state version: 0, nodes: [0, 2, 1 (source only)], chain: [], " + "reasons to start: ) => 0", + _sender.getLastCommand(true)); sendReply(op); - CPPUNIT_ASSERT_EQUAL( - std::string("DeleteBucketCommand(BucketId(0x4000000000000001)) " - "Reasons to start: => 1"), - _sender.getLastCommand(true)); + ASSERT_EQ("DeleteBucketCommand(BucketId(0x4000000000000001)) " + "Reasons to start: => 1", + _sender.getLastCommand(true)); } -void -MergeOperationTest::testFailIfSourceOnlyCopiesChanged() -{ +TEST_F(MergeOperationTest, fail_if_source_only_copies_changed) { getClock().setAbsoluteTimeInSeconds(10); addNodesToBucketDB(document::BucketId(16, 1), @@ -116,11 +76,10 @@ MergeOperationTest::testFailIfSourceOnlyCopiesChanged() "cluster state version: 0, nodes: [0, 2, 1 (source only)], chain: [], " "reasons to start: ) => 0"); - CPPUNIT_ASSERT_EQUAL(merge, _sender.getLastCommand(true)); + ASSERT_EQ(merge, _sender.getLastCommand(true)); { - const api::MergeBucketCommand& cmd( - dynamic_cast<api::MergeBucketCommand&>(*_sender.commands[0])); - CPPUNIT_ASSERT_EQUAL(uint16_t(0), cmd.getSourceIndex()); + auto& cmd = dynamic_cast<api::MergeBucketCommand&>(*_sender.command(0)); + EXPECT_EQ(0, cmd.getSourceIndex()); } // Source-only copy changed during merge @@ -130,8 +89,8 @@ MergeOperationTest::testFailIfSourceOnlyCopiesChanged() "2=10/1/1/t"); sendReply(op); // Should not be a remove here! - CPPUNIT_ASSERT_EQUAL(merge, _sender.getLastCommand(true)); - CPPUNIT_ASSERT(!op.ok()); + ASSERT_EQ(merge, _sender.getLastCommand(true)); + EXPECT_FALSE(op.ok()); } namespace { @@ -176,130 +135,96 @@ std::string getNodeList(std::string state, uint32_t redundancy, std::string exis } } -void -MergeOperationTest::testGenerateNodeList() -{ +TEST_F(MergeOperationTest, generate_node_list) { // If this fails, the distribution has changed and the rest of the test will // likely fail - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,1,4"), - getNodeList("storage:10", 10, "0,1,2,3,4,5,6,7,8,9")); + ASSERT_EQ("3,5,7,6,8,0,9,2,1,4", + getNodeList("storage:10", 10, "0,1,2,3,4,5,6,7,8,9")); // Nodes that are initializing should be treated as up - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7s,6s"), - getNodeList("storage:10 .3.s:i .5.s:i", 2, "7,6,3,5")); // Ideal: 3,5 + EXPECT_EQ("3,5,7s,6s", + getNodeList("storage:10 .3.s:i .5.s:i", 2, "7,6,3,5")); // Ideal: 3,5 // Order is given by ideal state algorithm, not order of storagenodes in bucket db - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7"), - getNodeList("storage:10", 3, "3,7,5")); + EXPECT_EQ("3,5,7", + getNodeList("storage:10", 3, "3,7,5")); // Node not in ideal state will be used if not enough nodes in ideal state - CPPUNIT_ASSERT_EQUAL( - std::string("3,7,6"), - getNodeList("storage:10", 3, "3,7,6")); + EXPECT_EQ("3,7,6", + getNodeList("storage:10", 3, "3,7,6")); // Nodes not in ideal state will be included as source only after redundancy // is reached - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,8s"), - getNodeList("storage:10", 3, "3,5,7,8")); + EXPECT_EQ("3,5,7,8s", + getNodeList("storage:10", 3, "3,5,7,8")); // Need at least redundancy copies that are not source only - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,8,9s"), - getNodeList("storage:10", 3, "3,5,8,9")); + EXPECT_EQ("3,5,8,9s", + getNodeList("storage:10", 3, "3,5,8,9")); // Order is given by storagenodes in bucket db // when no nodes are in ideal state - CPPUNIT_ASSERT_EQUAL( - std::string("4,1,2"), - getNodeList("storage:10", 3, "4,1,2")); - - CPPUNIT_ASSERT_EQUAL( - std::string("3,0s,1s,2s,4s,5s,6s,7s,8s,9s"), - getNodeList("storage:10", 1, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,0s,1s,2s,4s,6s,7s,8s,9s"), - getNodeList("storage:10", 2, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,0s,1s,2s,4s,6s,8s,9s"), - getNodeList("storage:10", 3, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,0s,1s,2s,4s,8s,9s"), - getNodeList("storage:10", 4, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0s,1s,2s,4s,9s"), - getNodeList("storage:10", 5, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,1s,2s,4s,9s"), - getNodeList("storage:10", 6, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,1s,2s,4s"), - getNodeList("storage:10", 7, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,1s,4s"), - getNodeList("storage:10", 8, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,1,4s"), - getNodeList("storage:10", 9, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,1,4"), - getNodeList("storage:10", 10, "0,1,2,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,9s,8s,7s,6s,5s,4s,2s,1s,0s"), - getNodeList("storage:10", 1, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,9s,8s,7s,6s,4s,2s,1s,0s"), - getNodeList("storage:10", 2, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,9s,8s,6s,4s,2s,1s,0s"), - getNodeList("storage:10", 3, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,9s,8s,4s,2s,1s,0s"), - getNodeList("storage:10", 4, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,9s,4s,2s,1s,0s"), - getNodeList("storage:10", 5, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9s,4s,2s,1s"), - getNodeList("storage:10", 6, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,4s,2s,1s"), - getNodeList("storage:10", 7, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,4s,1s"), - getNodeList("storage:10", 8, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,1,4s"), - getNodeList("storage:10", 9, "9,8,7,6,5,4,3,2,1,0")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,2,1,4"), - getNodeList("storage:10", 10, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("4,1,2", + getNodeList("storage:10", 3, "4,1,2")); + + EXPECT_EQ("3,0s,1s,2s,4s,5s,6s,7s,8s,9s", + getNodeList("storage:10", 1, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,0s,1s,2s,4s,6s,7s,8s,9s", + getNodeList("storage:10", 2, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,0s,1s,2s,4s,6s,8s,9s", + getNodeList("storage:10", 3, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,0s,1s,2s,4s,8s,9s", + getNodeList("storage:10", 4, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0s,1s,2s,4s,9s", + getNodeList("storage:10", 5, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,1s,2s,4s,9s", + getNodeList("storage:10", 6, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,9,1s,2s,4s", + getNodeList("storage:10", 7, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,9,2,1s,4s", + getNodeList("storage:10", 8, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,9,2,1,4s", + getNodeList("storage:10", 9, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,9,2,1,4", + getNodeList("storage:10", 10, "0,1,2,3,4,5,6,7,8,9")); + EXPECT_EQ("3,9s,8s,7s,6s,5s,4s,2s,1s,0s", + getNodeList("storage:10", 1, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,9s,8s,7s,6s,4s,2s,1s,0s", + getNodeList("storage:10", 2, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,9s,8s,6s,4s,2s,1s,0s", + getNodeList("storage:10", 3, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,9s,8s,4s,2s,1s,0s", + getNodeList("storage:10", 4, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,8,9s,4s,2s,1s,0s", + getNodeList("storage:10", 5, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,8,0,9s,4s,2s,1s", + getNodeList("storage:10", 6, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,8,0,9,4s,2s,1s", + getNodeList("storage:10", 7, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,8,0,9,2,4s,1s", + getNodeList("storage:10", 8, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,8,0,9,2,1,4s", + getNodeList("storage:10", 9, "9,8,7,6,5,4,3,2,1,0")); + EXPECT_EQ("3,5,7,6,8,0,9,2,1,4", + getNodeList("storage:10", 10, "9,8,7,6,5,4,3,2,1,0")); // Trusted copies can be source-only if they are in the non-ideal node set. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,1s,2s,4s"), - getNodeList("storage:10", 7, "0,1t,2t,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,9,1s,2s,4s", + getNodeList("storage:10", 7, "0,1t,2t,3,4,5,6,7,8,9")); - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6,8,0,9,1s,2s,4s"), - getNodeList("storage:10", 7, "0,1,2t,3,4,5,6,7,8,9")); + EXPECT_EQ("3,5,7,6,8,0,9,1s,2s,4s", + getNodeList("storage:10", 7, "0,1,2t,3,4,5,6,7,8,9")); // Retired nodes are not in ideal state // Ideal: 5,7 - CPPUNIT_ASSERT_EQUAL( - std::string("0,2,3s"), - getNodeList("storage:10 .3.s:r", 2, "0,2,3")); + EXPECT_EQ("0,2,3s", + getNodeList("storage:10 .3.s:r", 2, "0,2,3")); // Ideal: 5,7,6 - CPPUNIT_ASSERT_EQUAL( - std::string("0,2,3"), - getNodeList("storage:10 .3.s:r", 3, "0,2,3")); + EXPECT_EQ("0,2,3", + getNodeList("storage:10 .3.s:r", 3, "0,2,3")); } -void -MergeOperationTest::doNotRemoveCopiesWithPendingMessages() { +TEST_F(MergeOperationTest, do_not_remove_copies_with_pending_messages) { document::BucketId bucket(16, 1); getClock().setAbsoluteTimeInSeconds(10); @@ -318,20 +243,20 @@ MergeOperationTest::doNotRemoveCopiesWithPendingMessages() { "cluster state version: 0, nodes: [0, 2, 1 (source only)], chain: [], " "reasons to start: ) => 0"); - CPPUNIT_ASSERT_EQUAL(merge, _sender.getLastCommand(true)); + ASSERT_EQ(merge, _sender.getLastCommand(true)); // Suddenly a wild operation appears to the source only copy! // Removes are blocked by all and any operation types, so can just choose // at will. - api::StorageMessage::SP msg( - new api::SetBucketStateCommand(makeDocumentBucket(bucket), api::SetBucketStateCommand::ACTIVE)); + auto msg = std::make_shared<api::SetBucketStateCommand>( + makeDocumentBucket(bucket), api::SetBucketStateCommand::ACTIVE); msg->setAddress(api::StorageMessageAddress("storage", lib::NodeType::STORAGE, 1)); _pendingTracker->insert(msg); sendReply(op); // Should not be a remove here! - CPPUNIT_ASSERT_EQUAL(merge, _sender.getLastCommand(true)); - CPPUNIT_ASSERT(!op.ok()); + ASSERT_EQ(merge, _sender.getLastCommand(true)); + EXPECT_FALSE(op.ok()); } /* @@ -359,9 +284,7 @@ MergeOperationTest::doNotRemoveCopiesWithPendingMessages() { * should be an uncommon edge case and it's arguably better than to never * activate the ideal replicas at all. */ -void -MergeOperationTest::allow_deleting_active_source_only_replica() -{ +TEST_F(MergeOperationTest, allow_deleting_active_source_only_replica) { getClock().setAbsoluteTimeInSeconds(10); addNodesToBucketDB(document::BucketId(16, 1), @@ -379,111 +302,92 @@ MergeOperationTest::allow_deleting_active_source_only_replica() "MergeBucketCommand(BucketId(0x4000000000000001), to time " "10000000, cluster state version: 0, nodes: [0, 2, 1 " "(source only)], chain: [], reasons to start: ) => 0"); - CPPUNIT_ASSERT_EQUAL(merge, _sender.getLastCommand(true)); + ASSERT_EQ(merge, _sender.getLastCommand(true)); sendReply(op); - CPPUNIT_ASSERT_EQUAL( - std::string("DeleteBucketCommand(BucketId(0x4000000000000001)) " - "Reasons to start: => 1"), - _sender.getLastCommand(true)); + ASSERT_EQ("DeleteBucketCommand(BucketId(0x4000000000000001)) " + "Reasons to start: => 1", + _sender.getLastCommand(true)); } -void -MergeOperationTest::testMarkRedundantTrustedCopiesAsSourceOnly() -{ +TEST_F(MergeOperationTest, MarkRedundantTrustedCopiesAsSourceOnly) { // This test uses the same distribution as testGenerateNodeList(), i.e. // an ideal state sequence of [3, 5, 7, 6, 8, 0, 9, 2, 1, 4] // 3 redundancy, 5 trusted -> 2 trusted source only. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s"), - getNodeList("storage:10", 3, "3t,5t,7t,6t,8t")); + EXPECT_EQ("3,5,7,6s,8s", + getNodeList("storage:10", 3, "3t,5t,7t,6t,8t")); // 3 redundancy, 4 trusted -> 1 trusted source only. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s"), - getNodeList("storage:10", 3, "3t,5t,7t,6t,8")); + EXPECT_EQ("3,5,7,6s,8s", + getNodeList("storage:10", 3, "3t,5t,7t,6t,8")); // 3 redundancy, 3 trusted -> 0 trusted source only, 2 non-trusted sources. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s"), - getNodeList("storage:10", 3, "3t,5t,7t,6,8")); + EXPECT_EQ("3,5,7,6s,8s", + getNodeList("storage:10", 3, "3t,5t,7t,6,8")); // Trusted-ness should not be taken into account when marking nodes as source-only. // 2 out of 3 ideal replicas trusted. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s"), - getNodeList("storage:10", 3, "3t,5t,7,6t,8t")); + EXPECT_EQ("3,5,7,6s,8s", + getNodeList("storage:10", 3, "3t,5t,7,6t,8t")); // 1 out of 3 ideal replicas trusted. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s"), - getNodeList("storage:10", 3, "3t,5,7,6t,8t")); + EXPECT_EQ("3,5,7,6s,8s", + getNodeList("storage:10", 3, "3t,5,7,6t,8t")); // 0 out of 3 ideal replicas trusted. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s"), - getNodeList("storage:10", 3, "3,5,7,6t,8t")); + EXPECT_EQ("3,5,7,6s,8s", + getNodeList("storage:10", 3, "3,5,7,6t,8t")); // #redundancy of trusted, but none are ideal. Non-ideal trusted may be // marked as source only. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s,0s,9s"), - getNodeList("storage:10", 3, "3,5,7,6,8t,0t,9t")); + EXPECT_EQ("3,5,7,6s,8s,0s,9s", + getNodeList("storage:10", 3, "3,5,7,6,8t,0t,9t")); // Allow for removing excess trusted, non-ideal copies. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6s,8s,0s,9s"), - getNodeList("storage:10", 3, "3,5,7,6t,8t,0t,9t")); + EXPECT_EQ("3,5,7,6s,8s,0s,9s", + getNodeList("storage:10", 3, "3,5,7,6t,8t,0t,9t")); } -void -MergeOperationTest::onlyMarkRedundantRetiredReplicasAsSourceOnly() -{ +TEST_F(MergeOperationTest, only_mark_redundant_retired_replicas_as_source_only) { // No nodes in ideal state and all nodes are retired. With redundancy of 2 // we can only mark the last replica in the DB as source-only. Retired // nodes are meant as source-only due to being migrated away from, but // source-only nodes will have their replica removed after a successful // merge, which we cannot allow to happen here. - CPPUNIT_ASSERT_EQUAL( - std::string("1,0,2s"), - getNodeList("storage:3 .0.s:r .1.s:r .2.s:r", 2, "1,0,2")); + EXPECT_EQ("1,0,2s", + getNodeList("storage:3 .0.s:r .1.s:r .2.s:r", 2, "1,0,2")); } -void MergeOperationTest::mark_post_merge_redundant_replicas_source_only() { +TEST_F(MergeOperationTest, mark_post_merge_redundant_replicas_source_only) { // Ideal state sequence is [3, 5, 7, 6, 8, 0, 9, 2, 1, 4] // Retired node 7 is not part of the #redundancy ideal state and should be moved // to node 6. Once the merge is done we'll end up with too many replicas unless // we allow marking the to-be-moved replica as source only. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,6,7s"), - getNodeList("storage:10 .7.s:r", 3, "3t,5t,7t,6")); + EXPECT_EQ("3,5,6,7s", + getNodeList("storage:10 .7.s:r", 3, "3t,5t,7t,6")); // Should be allowed to mark as source only even if retired replica is the // only trusted replica at the time the merge starts. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,6,7s"), - getNodeList("storage:10 .7.s:r", 3, "3,5,7t,6")); + EXPECT_EQ("3,5,6,7s", + getNodeList("storage:10 .7.s:r", 3, "3,5,7t,6")); // This extends to multiple retired nodes. - CPPUNIT_ASSERT_EQUAL( - std::string("3,6,8,5s,7s"), - getNodeList("storage:10 .5.s:r .7.s:r", 3, "3t,5t,7t,6,8")); + EXPECT_EQ("3,6,8,5s,7s", + getNodeList("storage:10 .5.s:r .7.s:r", 3, "3t,5t,7t,6,8")); // If number of post-merge ideal nodes is lower than desired redundancy, don't // mark any as source only. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6"), - getNodeList("storage:10", 5, "3,5,7,6")); + EXPECT_EQ("3,5,7,6", + getNodeList("storage:10", 5, "3,5,7,6")); // Same applies to when post-merge ideal nodes is _equal_ to desired redundancy. - CPPUNIT_ASSERT_EQUAL( - std::string("3,5,7,6"), - getNodeList("storage:10", 4, "3,5,7,6")); + EXPECT_EQ("3,5,7,6", + getNodeList("storage:10", 4, "3,5,7,6")); } -void MergeOperationTest::merge_operation_is_blocked_by_any_busy_target_node() { +TEST_F(MergeOperationTest, merge_operation_is_blocked_by_any_busy_target_node) { getClock().setAbsoluteTimeInSeconds(10); addNodesToBucketDB(document::BucketId(16, 1), "0=10/1/1/t,1=20/1/1,2=10/1/1/t"); enableDistributorClusterState("distributor:1 storage:3"); @@ -492,21 +396,21 @@ void MergeOperationTest::merge_operation_is_blocked_by_any_busy_target_node() { // Should not block on nodes _not_ included in operation node set _pendingTracker->getNodeInfo().setBusy(3, std::chrono::seconds(10)); - CPPUNIT_ASSERT(!op.isBlocked(*_pendingTracker)); + EXPECT_FALSE(op.isBlocked(*_pendingTracker)); // Node 1 is included in operation node set and should cause a block _pendingTracker->getNodeInfo().setBusy(0, std::chrono::seconds(10)); - CPPUNIT_ASSERT(op.isBlocked(*_pendingTracker)); + EXPECT_TRUE(op.isBlocked(*_pendingTracker)); getClock().addSecondsToTime(11); - CPPUNIT_ASSERT(!op.isBlocked(*_pendingTracker)); // No longer busy + EXPECT_FALSE(op.isBlocked(*_pendingTracker)); // No longer busy // Should block on other operation nodes than the first listed as well _pendingTracker->getNodeInfo().setBusy(1, std::chrono::seconds(10)); - CPPUNIT_ASSERT(op.isBlocked(*_pendingTracker)); + EXPECT_TRUE(op.isBlocked(*_pendingTracker)); } -void MergeOperationTest::missing_replica_is_included_in_limited_node_list() { +TEST_F(MergeOperationTest, missing_replica_is_included_in_limited_node_list) { setupDistributor(Redundancy(4), NodeCount(4), "distributor:1 storage:4"); getClock().setAbsoluteTimeInSeconds(10); addNodesToBucketDB(document::BucketId(16, 1), "1=0/0/0/t,2=0/0/0/t,3=0/0/0/t"); @@ -516,12 +420,10 @@ void MergeOperationTest::missing_replica_is_included_in_limited_node_list() { op.start(_sender, framework::MilliSecTime(0)); // Must include missing node 0 and not just 2 existing replicas - CPPUNIT_ASSERT_EQUAL( - std::string("MergeBucketCommand(BucketId(0x4000000000000001), to time 10000000, " - "cluster state version: 0, nodes: [0, 1], chain: [], " - "reasons to start: ) => 0"), - _sender.getLastCommand(true)); + EXPECT_EQ("MergeBucketCommand(BucketId(0x4000000000000001), to time 10000000, " + "cluster state version: 0, nodes: [0, 1], chain: [], " + "reasons to start: ) => 0", + _sender.getLastCommand(true)); } -} // distributor -} // storage +} // storage::distributor |