aboutsummaryrefslogtreecommitdiffstats
path: root/storage/src/tests/bucketmover
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /storage/src/tests/bucketmover
Publish
Diffstat (limited to 'storage/src/tests/bucketmover')
-rw-r--r--storage/src/tests/bucketmover/CMakeLists.txt9
-rw-r--r--storage/src/tests/bucketmover/bucketmovertest.cpp190
-rw-r--r--storage/src/tests/bucketmover/htmltabletest.cpp100
3 files changed, 299 insertions, 0 deletions
diff --git a/storage/src/tests/bucketmover/CMakeLists.txt b/storage/src/tests/bucketmover/CMakeLists.txt
new file mode 100644
index 00000000000..2d02cdc4942
--- /dev/null
+++ b/storage/src/tests/bucketmover/CMakeLists.txt
@@ -0,0 +1,9 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_library(storage_testbucketmover
+ SOURCES
+ bucketmovertest.cpp
+ htmltabletest.cpp
+ DEPENDS
+ AFTER
+ storage_storageconfig
+)
diff --git a/storage/src/tests/bucketmover/bucketmovertest.cpp b/storage/src/tests/bucketmover/bucketmovertest.cpp
new file mode 100644
index 00000000000..2720e6bac2a
--- /dev/null
+++ b/storage/src/tests/bucketmover/bucketmovertest.cpp
@@ -0,0 +1,190 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/storage/bucketdb/storbucketdb.h>
+#include <vespa/storage/common/bucketmessages.h>
+#include <vespa/storage/bucketmover/bucketmover.h>
+#include <tests/common/dummystoragelink.h>
+#include <tests/common/testhelper.h>
+#include <tests/common/teststorageapp.h>
+#include <vespa/storage/bucketdb/storbucketdb.h>
+
+bool debug = false;
+
+namespace storage {
+namespace bucketmover {
+
+struct BucketMoverTest : public CppUnit::TestFixture {
+public:
+ void setUp();
+ void tearDown();
+
+ void testNormalUsage();
+ void testMaxPending();
+ void testErrorHandling();
+
+ CPPUNIT_TEST_SUITE(BucketMoverTest);
+ CPPUNIT_TEST(testNormalUsage);
+ CPPUNIT_TEST(testMaxPending);
+ CPPUNIT_TEST(testErrorHandling);
+ CPPUNIT_TEST_SUITE_END();
+
+ std::unique_ptr<TestServiceLayerApp> _node;
+ std::unique_ptr<ServiceLayerComponent> _component;
+ std::unique_ptr<BucketMover> _bucketMover;
+ DummyStorageLink* after;
+
+private:
+ void addBucket(const document::BucketId& id, uint16_t idealDiff);
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(BucketMoverTest);
+
+void
+BucketMoverTest::tearDown()
+{
+ _node.reset(0);
+}
+
+void
+BucketMoverTest::setUp()
+{
+ try {
+ _node.reset(new TestServiceLayerApp(DiskCount(4)));
+ _node->setupDummyPersistence();
+ } catch (config::InvalidConfigException& e) {
+ fprintf(stderr, "%s\n", e.what());
+ }
+
+ _component.reset(new ServiceLayerComponent(_node->getComponentRegister(), "foo"));
+ _bucketMover.reset(new BucketMover("raw:", _node->getComponentRegister()));
+ after = new DummyStorageLink();
+ _bucketMover->push_back(StorageLink::UP(after));
+}
+
+void
+BucketMoverTest::addBucket(const document::BucketId& id,
+ uint16_t idealDiff)
+{
+ StorBucketDatabase::WrappedEntry entry(
+ _component->getBucketDatabase().get(
+ id,
+ "",
+ StorBucketDatabase::CREATE_IF_NONEXISTING));
+
+ entry->setBucketInfo(api::BucketInfo(1,1,1));
+
+ uint16_t idealDisk = _component->getIdealPartition(id);
+ entry->disk = (idealDisk + idealDiff) % _component->getDiskCount();
+ entry.write();
+}
+
+void
+BucketMoverTest::testNormalUsage()
+{
+ for (uint32_t i = 1; i < 4; ++i) {
+ addBucket(document::BucketId(16, i), 1);
+ }
+ for (uint32_t i = 4; i < 6; ++i) {
+ addBucket(document::BucketId(16, i), 0);
+ }
+
+ _bucketMover->open();
+ _bucketMover->tick();
+
+ std::vector<api::StorageMessage::SP> msgs = after->getCommandsOnce();
+ CPPUNIT_ASSERT_EQUAL(
+ std::string("BucketDiskMoveCommand("
+ "BucketId(0x4000000000000002), source 3, target 2)"),
+ msgs[0]->toString());
+ CPPUNIT_ASSERT_EQUAL(
+ std::string("BucketDiskMoveCommand("
+ "BucketId(0x4000000000000001), source 2, target 1)"),
+ msgs[1]->toString());
+ CPPUNIT_ASSERT_EQUAL(
+ std::string("BucketDiskMoveCommand("
+ "BucketId(0x4000000000000003), source 1, target 0)"),
+ msgs[2]->toString());
+
+ for (uint32_t i = 0; i < 2; ++i) {
+ after->sendUp(std::shared_ptr<api::StorageMessage>(
+ ((api::StorageCommand*)msgs[i].get())->
+ makeReply().release()));
+ }
+
+ _bucketMover->tick();
+ CPPUNIT_ASSERT_EQUAL(0, (int)after->getNumCommands());
+
+ _bucketMover->finishCurrentRun();
+}
+
+void
+BucketMoverTest::testMaxPending()
+{
+ for (uint32_t i = 1; i < 100; ++i) {
+ addBucket(document::BucketId(16, i), 1);
+ }
+ for (uint32_t i = 101; i < 200; ++i) {
+ addBucket(document::BucketId(16, i), 0);
+ }
+
+ _bucketMover->open();
+ _bucketMover->tick();
+
+ std::vector<api::StorageMessage::SP> msgs = after->getCommandsOnce();
+ // 5 is the max pending default config.
+ CPPUNIT_ASSERT_EQUAL(5, (int)msgs.size());
+
+ after->sendUp(std::shared_ptr<api::StorageMessage>(
+ ((api::StorageCommand*)msgs[3].get())->
+ makeReply().release()));
+
+ _bucketMover->tick();
+
+ std::vector<api::StorageMessage::SP> msgs2 = after->getCommandsOnce();
+ CPPUNIT_ASSERT_EQUAL(1, (int)msgs2.size());
+}
+
+void
+BucketMoverTest::testErrorHandling()
+{
+ for (uint32_t i = 1; i < 100; ++i) {
+ addBucket(document::BucketId(16, i), 1);
+ }
+ for (uint32_t i = 101; i < 200; ++i) {
+ addBucket(document::BucketId(16, i), 0);
+ }
+
+ _bucketMover->open();
+ _bucketMover->tick();
+
+ std::vector<api::StorageMessage::SP> msgs = after->getCommandsOnce();
+ // 5 is the max pending default config.
+ CPPUNIT_ASSERT_EQUAL(5, (int)msgs.size());
+
+ BucketDiskMoveCommand& cmd = static_cast<BucketDiskMoveCommand&>(*msgs[0]);
+ uint32_t targetDisk = cmd.getDstDisk();
+
+ std::unique_ptr<api::StorageReply> reply(cmd.makeReply().release());
+ reply->setResult(api::ReturnCode(api::ReturnCode::INTERNAL_FAILURE, "foobar"));
+ after->sendUp(std::shared_ptr<api::StorageMessage>(reply.release()));
+
+ for (uint32_t i = 1; i < msgs.size(); ++i) {
+ after->sendUp(std::shared_ptr<api::StorageMessage>(
+ ((api::StorageCommand*)msgs[i].get())->
+ makeReply().release()));
+ }
+
+ _bucketMover->tick();
+
+ std::vector<api::StorageMessage::SP> msgs2 = after->getCommandsOnce();
+ CPPUNIT_ASSERT_EQUAL(5, (int)msgs2.size());
+
+ for (uint32_t i = 0; i < msgs2.size(); ++i) {
+ BucketDiskMoveCommand& bdm = static_cast<BucketDiskMoveCommand&>(*msgs2[i]);
+ CPPUNIT_ASSERT(bdm.getDstDisk() != targetDisk);
+ }
+}
+
+} // bucketmover
+} // storage
diff --git a/storage/src/tests/bucketmover/htmltabletest.cpp b/storage/src/tests/bucketmover/htmltabletest.cpp
new file mode 100644
index 00000000000..98cf68d489a
--- /dev/null
+++ b/storage/src/tests/bucketmover/htmltabletest.cpp
@@ -0,0 +1,100 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+
+#include <vespa/fastos/fastos.h>
+#include <vespa/storage/bucketmover/htmltable.h>
+#include <tests/common/testhelper.h>
+
+namespace storage {
+
+struct HtmlTableTest : public CppUnit::TestFixture {
+
+ void testPercentageColumn();
+ void testByteSizeColumn();
+
+ CPPUNIT_TEST_SUITE(HtmlTableTest);
+ CPPUNIT_TEST(testPercentageColumn);
+ CPPUNIT_TEST(testByteSizeColumn);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+CPPUNIT_TEST_SUITE_REGISTRATION(HtmlTableTest);
+
+void HtmlTableTest::testPercentageColumn()
+{
+ // With total hardcoded to 100
+ {
+ HtmlTable table("disk");
+ PercentageColumn perc("fillrate", 100);
+ perc.addColorLimit(70, Column::LIGHT_GREEN);
+ perc.addColorLimit(85, Column::LIGHT_YELLOW);
+ perc.addColorLimit(100, Column::LIGHT_RED);
+ table.addColumn(perc);
+ table.addRow(0);
+ table.addRow(1);
+ table.addRow(2);
+ perc[0] = 30;
+ perc[1] = 80;
+ perc[2] = 100;
+ std::ostringstream ost;
+ table.print(ost);
+ std::string expected(
+"<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n"
+"<tr><th>disk</th><th>fillrate</th></tr>\n"
+"<tr><td>0</td><td bgcolor=\"#a0ffa0\" align=\"right\">30.00 %</td></tr>\n"
+"<tr><td>1</td><td bgcolor=\"#ffffa0\" align=\"right\">80.00 %</td></tr>\n"
+"<tr><td>2</td><td bgcolor=\"#ffa0a0\" align=\"right\">100.00 %</td></tr>\n"
+"</table>\n");
+ CPPUNIT_ASSERT_EQUAL(expected, ost.str());
+ }
+ // With automatically gathered total
+ {
+ HtmlTable table("disk");
+ PercentageColumn perc("fillrate");
+ table.addColumn(perc);
+ table.addRow(0);
+ table.addRow(1);
+ table.addRow(2);
+ perc[0] = 30;
+ perc[1] = 80;
+ perc[2] = 100;
+ std::ostringstream ost;
+ table.print(ost);
+ std::string expected(
+ "<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n"
+ "<tr><th>disk</th><th>fillrate</th></tr>\n"
+ "<tr><td>0</td><td align=\"right\">14.29 %</td></tr>\n"
+ "<tr><td>1</td><td align=\"right\">38.10 %</td></tr>\n"
+ "<tr><td>2</td><td align=\"right\">47.62 %</td></tr>\n"
+ "</table>\n");
+ CPPUNIT_ASSERT_EQUAL(expected, ost.str());
+ }
+}
+
+void HtmlTableTest::testByteSizeColumn()
+{
+ {
+ HtmlTable table("disk");
+ ByteSizeColumn size("size");
+ table.addColumn(size);
+ table.addRow(0);
+ table.addRow(1);
+ table.addRow(2);
+ // Biggest value enforce the denomination
+ size[0] = 42123;
+ size[1] = 124123151;
+ size[2] = 6131231;
+ std::ostringstream ost;
+ table.print(ost);
+ std::string expected(
+ "<table border=\"1\" cellpadding=\"2\" cellspacing=\"0\">\n"
+ "<tr><th>disk</th><th>size</th></tr>\n"
+ "<tr><td>0</td><td align=\"right\">0 MB</td></tr>\n"
+ "<tr><td>1</td><td align=\"right\">118 MB</td></tr>\n"
+ "<tr><td>2</td><td align=\"right\">5 MB</td></tr>\n"
+ "</table>\n");
+ CPPUNIT_ASSERT_EQUAL(expected, ost.str());
+ }
+
+}
+
+} // storage