diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2020-11-01 15:04:10 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2020-11-01 15:04:10 +0000 |
commit | f9f2dce25135663be0bdf2c90add6e060f3e95d5 (patch) | |
tree | 58db19f977b1de9b382d9c92c91cdd372bdc2785 /searchcore | |
parent | 7b44c957c74037ce3c5c49730ffcce16d1fba51b (diff) |
- Use 2 loops as moving invalidates metastore.
- Move update of cursor til second loop.
- Only set done when both loops are completed.
Diffstat (limited to 'searchcore')
-rw-r--r-- | searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp b/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp index 3793d29bad8..9025fc56874 100644 --- a/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp +++ b/searchcore/src/vespa/searchcore/proton/server/documentbucketmover.cpp @@ -74,6 +74,29 @@ DocumentBucketMover::setupForBucket(const BucketId &bucket, _lastGidValid = false; } + +namespace +{ + +class MoveKey +{ +public: + DocumentIdT _lid; + document::GlobalId _gid; + Timestamp _timestamp; + + MoveKey(DocumentIdT lid, + const document::GlobalId &gid, + Timestamp timestamp) + : _lid(lid), + _gid(gid), + _timestamp(timestamp) + { + } +}; + +} + void DocumentBucketMover::setBucketDone() { _bucketDone = true; @@ -90,6 +113,8 @@ DocumentBucketMover::moveDocuments(size_t maxDocsToMove) const Iterator end = _source->meta_store()->upperBound(_bucket); size_t docsMoved = 0; size_t docsSkipped = 0; // In absence of a proper cost metric + typedef std::vector<MoveKey> MoveVec; + MoveVec toMove; for (; itr != end && docsMoved < maxDocsToMove; ++itr) { DocumentIdT lid = itr.getKey(); const RawDocumentMetaData &metaData = _source->meta_store()->getRawMetaData(lid); @@ -100,15 +125,20 @@ DocumentBucketMover::moveDocuments(size_t maxDocsToMove) docsSkipped = 0; } } else { - if ( ! moveDocument(lid, metaData.getGid(), metaData.getTimestamp())) { - return false; - } + // moveDocument(lid, metaData.getTimestamp()); + toMove.push_back(MoveKey(lid, metaData.getGid(), metaData.getTimestamp())); ++docsMoved; } - _lastGid = metaData.getGid(); + } + bool done = (itr == end); + for (const MoveKey & key : toMove) { + if ( ! moveDocument(key._lid, key._gid, key._timestamp)) { + return false; + } + _lastGid = key._gid; _lastGidValid = true; } - if (itr == end) { + if (done) { setBucketDone(); } return true; |