summaryrefslogtreecommitdiffstats
path: root/searchcore
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2020-11-01 15:04:10 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2020-11-01 15:04:10 +0000
commitf9f2dce25135663be0bdf2c90add6e060f3e95d5 (patch)
tree58db19f977b1de9b382d9c92c91cdd372bdc2785 /searchcore
parent7b44c957c74037ce3c5c49730ffcce16d1fba51b (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.cpp40
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;