summaryrefslogtreecommitdiffstats
path: root/storage
diff options
context:
space:
mode:
authorGeir Storli <geirstorli@yahoo.no>2017-11-16 10:55:55 +0100
committerGitHub <noreply@github.com>2017-11-16 10:55:55 +0100
commit8265f7cf4e007e66a825a43d96ebcbdbc5507ddf (patch)
treeff35ce4aca6c00071f4e4619a93582c7bb800847 /storage
parent05adec4027b7af6954f42b5172792caf1d912827 (diff)
parent3920e0cc48d677181a00b2d779fb656e094f3706 (diff)
Merge pull request #4144 from vespa-engine/toregge/scan-all-bucket-dbs-in-distributor-simple-maintenance-scanner
Scan all bucket dbs in storage::distributor::SimpleMaintenanceScanner.
Diffstat (limited to 'storage')
-rw-r--r--storage/src/tests/distributor/simplemaintenancescannertest.cpp46
-rw-r--r--storage/src/vespa/storage/distributor/distributor.cpp2
-rw-r--r--storage/src/vespa/storage/distributor/distributor_bucket_space_repo.cpp10
-rw-r--r--storage/src/vespa/storage/distributor/distributor_bucket_space_repo.h1
-rw-r--r--storage/src/vespa/storage/distributor/maintenance/maintenancescanner.h11
-rw-r--r--storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.cpp33
-rw-r--r--storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.h12
7 files changed, 87 insertions, 28 deletions
diff --git a/storage/src/tests/distributor/simplemaintenancescannertest.cpp b/storage/src/tests/distributor/simplemaintenancescannertest.cpp
index a46419b71a4..66a2d3efa6c 100644
--- a/storage/src/tests/distributor/simplemaintenancescannertest.cpp
+++ b/storage/src/tests/distributor/simplemaintenancescannertest.cpp
@@ -1,6 +1,9 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/document/test/make_bucket_space.h>
#include <vespa/vdstestlib/cppunit/macros.h>
+#include <vespa/storage/distributor/distributor_bucket_space_repo.h>
+#include <vespa/storage/distributor/distributor_bucket_space.h>
#include <vespa/storage/distributor/maintenance/simplemaintenancescanner.h>
#include <vespa/storage/distributor/maintenance/simplebucketprioritydatabase.h>
#include <vespa/storage/bucketdb/mapbucketdatabase.h>
@@ -11,11 +14,13 @@
namespace storage::distributor {
using document::BucketId;
+using document::test::makeBucketSpace;
typedef MaintenancePriority Priority;
class SimpleMaintenanceScannerTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(SimpleMaintenanceScannerTest);
CPPUNIT_TEST(testPrioritizeSingleBucket);
+ CPPUNIT_TEST(testPrioritizeSingleBucketAltBucketSpace);
CPPUNIT_TEST(testPrioritizeMultipleBuckets);
CPPUNIT_TEST(testPendingMaintenanceOperationStatistics);
CPPUNIT_TEST(perNodeMaintenanceStatsAreTracked);
@@ -27,10 +32,11 @@ class SimpleMaintenanceScannerTest : public CppUnit::TestFixture {
std::string dumpPriorityDbToString(const BucketPriorityDatabase&) const;
std::unique_ptr<MockMaintenancePriorityGenerator> _priorityGenerator;
- std::unique_ptr<MapBucketDatabase> _bucketDb;
+ std::unique_ptr<DistributorBucketSpaceRepo> _bucketSpaceRepo;
std::unique_ptr<SimpleBucketPriorityDatabase> _priorityDb;
std::unique_ptr<SimpleMaintenanceScanner> _scanner;
+ void addBucketToDb(document::BucketSpace bucketSpace, int bucketNum);
void addBucketToDb(int bucketNum);
bool scanEntireDatabase(int expected);
@@ -39,6 +45,7 @@ class SimpleMaintenanceScannerTest : public CppUnit::TestFixture {
public:
void testPrioritizeSingleBucket();
+ void testPrioritizeSingleBucketAltBucketSpace();
void testPrioritizeMultipleBuckets();
void testPendingMaintenanceOperationStatistics();
void perNodeMaintenanceStatsAreTracked();
@@ -53,16 +60,23 @@ void
SimpleMaintenanceScannerTest::setUp()
{
_priorityGenerator.reset(new MockMaintenancePriorityGenerator());
- _bucketDb.reset(new MapBucketDatabase());
+ _bucketSpaceRepo = std::make_unique<DistributorBucketSpaceRepo>();
_priorityDb.reset(new SimpleBucketPriorityDatabase());
- _scanner.reset(new SimpleMaintenanceScanner(*_priorityDb, *_priorityGenerator, *_bucketDb));
+ _scanner.reset(new SimpleMaintenanceScanner(*_priorityDb, *_priorityGenerator, *_bucketSpaceRepo));
}
void
-SimpleMaintenanceScannerTest::addBucketToDb(int bucketNum)
+SimpleMaintenanceScannerTest::addBucketToDb(document::BucketSpace bucketSpace, int bucketNum)
{
BucketDatabase::Entry entry(BucketId(16, bucketNum), BucketInfo());
- _bucketDb->update(entry);
+ auto &bucketDb(_bucketSpaceRepo->get(bucketSpace).getBucketDatabase());
+ bucketDb.update(entry);
+}
+
+void
+SimpleMaintenanceScannerTest::addBucketToDb(int bucketNum)
+{
+ addBucketToDb(makeBucketSpace(), bucketNum);
}
std::string
@@ -80,7 +94,27 @@ SimpleMaintenanceScannerTest::testPrioritizeSingleBucket()
addBucketToDb(1);
std::string expected("PrioritizedBucket(Bucket(BucketSpace(0x0000000000000000), BucketId(0x4000000000000001)), pri VERY_HIGH)\n");
- CPPUNIT_ASSERT(!_scanner->scanNext().isDone());
+ auto scanResult = _scanner->scanNext();
+ CPPUNIT_ASSERT(!scanResult.isDone());
+ CPPUNIT_ASSERT_EQUAL(makeBucketSpace().getId(), scanResult.getBucketSpace().getId());
+ CPPUNIT_ASSERT_EQUAL(expected, _priorityDb->toString());
+
+ CPPUNIT_ASSERT(_scanner->scanNext().isDone());
+ CPPUNIT_ASSERT_EQUAL(expected, _priorityDb->toString());
+}
+
+void
+SimpleMaintenanceScannerTest::testPrioritizeSingleBucketAltBucketSpace()
+{
+ document::BucketSpace bucketSpace(4);
+ _bucketSpaceRepo->add(bucketSpace, std::make_unique<DistributorBucketSpace>());
+ _scanner->reset();
+ addBucketToDb(bucketSpace, 1);
+ std::string expected("PrioritizedBucket(Bucket(BucketSpace(0x0000000000000004), BucketId(0x4000000000000001)), pri VERY_HIGH)\n");
+
+ auto scanResult = _scanner->scanNext();
+ CPPUNIT_ASSERT(!scanResult.isDone());
+ CPPUNIT_ASSERT_EQUAL(bucketSpace.getId(), scanResult.getBucketSpace().getId());
CPPUNIT_ASSERT_EQUAL(expected, _priorityDb->toString());
CPPUNIT_ASSERT(_scanner->scanNext().isDone());
diff --git a/storage/src/vespa/storage/distributor/distributor.cpp b/storage/src/vespa/storage/distributor/distributor.cpp
index c9930b7299c..665f2edd569 100644
--- a/storage/src/vespa/storage/distributor/distributor.cpp
+++ b/storage/src/vespa/storage/distributor/distributor.cpp
@@ -87,7 +87,7 @@ Distributor::Distributor(DistributorComponentRegister& compReg,
_bucketPriorityDb(new SimpleBucketPriorityDatabase()),
_scanner(new SimpleMaintenanceScanner(
*_bucketPriorityDb, _idealStateManager,
- getDefaultBucketSpace().getBucketDatabase())),
+ *_bucketSpaceRepo)),
_throttlingStarter(new ThrottlingOperationStarter(
_maintenanceOperationOwner)),
_blockingStarter(new BlockingOperationStarter(_pendingMessageTracker,
diff --git a/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.cpp b/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.cpp
index 27f2c344e9f..ddf28b3d95d 100644
--- a/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.cpp
+++ b/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.cpp
@@ -16,12 +16,18 @@ namespace distributor {
DistributorBucketSpaceRepo::DistributorBucketSpaceRepo()
: _map()
{
- _map.emplace(BucketSpace::placeHolder(), std::make_unique<DistributorBucketSpace>());
+ add(BucketSpace::placeHolder(), std::make_unique<DistributorBucketSpace>());
}
DistributorBucketSpaceRepo::~DistributorBucketSpaceRepo() {
}
+void
+DistributorBucketSpaceRepo::add(document::BucketSpace bucketSpace, std::unique_ptr<DistributorBucketSpace> distributorBucketSpace)
+{
+ _map.emplace(bucketSpace, std::move(distributorBucketSpace));
+}
+
void DistributorBucketSpaceRepo::setDefaultDistribution(
std::shared_ptr<lib::Distribution> distr)
{
@@ -33,7 +39,6 @@ void DistributorBucketSpaceRepo::setDefaultDistribution(
DistributorBucketSpace &
DistributorBucketSpaceRepo::get(BucketSpace bucketSpace)
{
- assert(bucketSpace == BucketSpace::placeHolder());
auto itr = _map.find(bucketSpace);
assert(itr != _map.end());
return *itr->second;
@@ -42,7 +47,6 @@ DistributorBucketSpaceRepo::get(BucketSpace bucketSpace)
const DistributorBucketSpace &
DistributorBucketSpaceRepo::get(BucketSpace bucketSpace) const
{
- assert(bucketSpace == BucketSpace::placeHolder());
auto itr = _map.find(bucketSpace);
assert(itr != _map.end());
return *itr->second;
diff --git a/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.h b/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.h
index a9892a1039f..b0f367e8be5 100644
--- a/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.h
+++ b/storage/src/vespa/storage/distributor/distributor_bucket_space_repo.h
@@ -37,6 +37,7 @@ public:
void setDefaultDistribution(std::shared_ptr<lib::Distribution> distr);
BucketSpaceMap::const_iterator begin() const { return _map.begin(); }
BucketSpaceMap::const_iterator end() const { return _map.end(); }
+ void add(document::BucketSpace bucketSpace, std::unique_ptr<DistributorBucketSpace> distributorBucketSpace);
};
}
diff --git a/storage/src/vespa/storage/distributor/maintenance/maintenancescanner.h b/storage/src/vespa/storage/distributor/maintenance/maintenancescanner.h
index 783e8e1e5ba..c1d76b57c7c 100644
--- a/storage/src/vespa/storage/distributor/maintenance/maintenancescanner.h
+++ b/storage/src/vespa/storage/distributor/maintenance/maintenancescanner.h
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#pragma once
+#include <vespa/document/bucket/bucketspace.h>
#include <vespa/storage/bucketdb/bucketdatabase.h>
namespace storage {
@@ -13,20 +14,22 @@ public:
class ScanResult {
bool _done;
+ document::BucketSpace _bucketSpace;
BucketDatabase::Entry _entry;
public:
bool isDone() const { return _done; }
+ document::BucketSpace getBucketSpace() const { return _bucketSpace; }
const BucketDatabase::Entry& getEntry() const { return _entry; }
static ScanResult createDone() { return ScanResult(true); }
- static ScanResult createNotDone(BucketDatabase::Entry entry) {
- return ScanResult(entry);
+ static ScanResult createNotDone(document::BucketSpace bucketSpace, BucketDatabase::Entry entry) {
+ return ScanResult(bucketSpace, entry);
}
private:
- ScanResult(bool done) : _done(done), _entry() {}
- ScanResult(const BucketDatabase::Entry& e) : _done(false), _entry(e) {}
+ ScanResult(bool done) : _done(done), _bucketSpace(document::BucketSpace::placeHolder()), _entry() {}
+ ScanResult(document::BucketSpace bucketSpace, const BucketDatabase::Entry& e) : _done(false), _bucketSpace(bucketSpace), _entry(e) {}
};
virtual ScanResult scanNext() = 0;
diff --git a/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.cpp b/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.cpp
index 2bdef7ed320..870dcc25a4b 100644
--- a/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.cpp
+++ b/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.cpp
@@ -1,8 +1,20 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
#include "simplemaintenancescanner.h"
+#include <vespa/storage/distributor/distributor_bucket_space.h>
namespace storage::distributor {
+SimpleMaintenanceScanner::SimpleMaintenanceScanner(BucketPriorityDatabase& bucketPriorityDb,
+ const MaintenancePriorityGenerator& priorityGenerator,
+ const DistributorBucketSpaceRepo& bucketSpaceRepo)
+ : _bucketPriorityDb(bucketPriorityDb),
+ _priorityGenerator(priorityGenerator),
+ _bucketSpaceRepo(bucketSpaceRepo),
+ _bucketSpaceItr(_bucketSpaceRepo.begin()),
+ _bucketCursor()
+{
+}
+
SimpleMaintenanceScanner::~SimpleMaintenanceScanner() {}
SimpleMaintenanceScanner::PendingMaintenanceStats::PendingMaintenanceStats() {}
@@ -14,19 +26,28 @@ SimpleMaintenanceScanner::PendingMaintenanceStats::operator = (const PendingMain
MaintenanceScanner::ScanResult
SimpleMaintenanceScanner::scanNext()
{
- BucketDatabase::Entry entry(_bucketDb.getNext(_bucketCursor));
- if (!entry.valid()) {
- return ScanResult::createDone();
+ for (;;) {
+ if (_bucketSpaceItr == _bucketSpaceRepo.end()) {
+ return ScanResult::createDone();
+ }
+ const auto &bucketDb(_bucketSpaceItr->second->getBucketDatabase());
+ BucketDatabase::Entry entry(bucketDb.getNext(_bucketCursor));
+ if (!entry.valid()) {
+ ++_bucketSpaceItr;
+ _bucketCursor = document::BucketId();
+ continue;
+ }
+ prioritizeBucket(document::Bucket(_bucketSpaceItr->first, entry.getBucketId()));
+ _bucketCursor = entry.getBucketId();
+ return ScanResult::createNotDone(_bucketSpaceItr->first, entry);
}
- prioritizeBucket(document::Bucket(document::BucketSpace::placeHolder(), entry.getBucketId()));
- _bucketCursor = entry.getBucketId();
- return ScanResult::createNotDone(entry);
}
void
SimpleMaintenanceScanner::reset()
{
_bucketCursor = document::BucketId();
+ _bucketSpaceItr = _bucketSpaceRepo.begin();
_pendingMaintenance = PendingMaintenanceStats();
}
diff --git a/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.h b/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.h
index 05de7674d6a..f4ad53957e9 100644
--- a/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.h
+++ b/storage/src/vespa/storage/distributor/maintenance/simplemaintenancescanner.h
@@ -5,7 +5,7 @@
#include "bucketprioritydatabase.h"
#include "maintenanceprioritygenerator.h"
#include "node_maintenance_stats_tracker.h"
-#include <vespa/storage/bucketdb/bucketdatabase.h>
+#include <vespa/storage/distributor/distributor_bucket_space_repo.h>
namespace storage {
namespace distributor {
@@ -31,18 +31,14 @@ public:
private:
BucketPriorityDatabase& _bucketPriorityDb;
const MaintenancePriorityGenerator& _priorityGenerator;
- const BucketDatabase& _bucketDb;
+ const DistributorBucketSpaceRepo &_bucketSpaceRepo;
+ DistributorBucketSpaceRepo::BucketSpaceMap::const_iterator _bucketSpaceItr;
document::BucketId _bucketCursor;
PendingMaintenanceStats _pendingMaintenance;
public:
SimpleMaintenanceScanner(BucketPriorityDatabase& bucketPriorityDb,
const MaintenancePriorityGenerator& priorityGenerator,
- const BucketDatabase& bucketDb)
- : _bucketPriorityDb(bucketPriorityDb),
- _priorityGenerator(priorityGenerator),
- _bucketDb(bucketDb),
- _bucketCursor()
- {}
+ const DistributorBucketSpaceRepo& bucketSpaceRepo);
SimpleMaintenanceScanner(const SimpleMaintenanceScanner&) = delete;
SimpleMaintenanceScanner& operator=(const SimpleMaintenanceScanner&) = delete;
~SimpleMaintenanceScanner();