diff options
-rw-r--r-- | storage/src/vespa/storage/distributor/operations/idealstate/idealstateoperation.cpp | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/storage/src/vespa/storage/distributor/operations/idealstate/idealstateoperation.cpp b/storage/src/vespa/storage/distributor/operations/idealstate/idealstateoperation.cpp index 2b6739623ec..3095dce7b87 100644 --- a/storage/src/vespa/storage/distributor/operations/idealstate/idealstateoperation.cpp +++ b/storage/src/vespa/storage/distributor/operations/idealstate/idealstateoperation.cpp @@ -182,6 +182,27 @@ public: } }; +bool +checkNullBucketRequestBucketInfoMessage(uint16_t node, + document::BucketSpace bucketSpace, + const PendingMessageTracker& tracker) +{ + RequestBucketInfoChecker rchk; + for (;;) { + // Check messages sent to null-bucket (i.e. any bucket) for the node. + document::Bucket nullBucket(bucketSpace, document::BucketId()); + tracker.checkPendingMessages(node, nullBucket, rchk); + if (rchk.blocked) { + return true; + } + if (bucketSpace == BucketSpace::placeHolder()) { + break; + } + bucketSpace = BucketSpace::placeHolder(); + } + return false; +} + } bool @@ -189,26 +210,15 @@ IdealStateOperation::checkBlock(const document::Bucket &bucket, const PendingMessageTracker& tracker) const { IdealStateOpChecker ichk(*this); - RequestBucketInfoChecker rchk; const std::vector<uint16_t>& nodes(getNodes()); - for (size_t i = 0; i < nodes.size(); ++i) { - tracker.checkPendingMessages(nodes[i], bucket, ichk); + for (auto node : nodes) { + tracker.checkPendingMessages(node, bucket, ichk); if (ichk.blocked) { return true; } - // Check messages sent to null-bucket (i.e. any bucket) for the node. - document::Bucket nullBucket(bucket.getBucketSpace(), document::BucketId()); - tracker.checkPendingMessages(nodes[i], nullBucket, rchk); - if (rchk.blocked) { + if (checkNullBucketRequestBucketInfoMessage(node, bucket.getBucketSpace(), tracker)) { return true; } - if (bucket.getBucketSpace() != BucketSpace::placeHolder()) { - nullBucket = document::Bucket(BucketSpace::placeHolder(), document::BucketId()); - tracker.checkPendingMessages(nodes[i], nullBucket, rchk); - if (rchk.blocked) { - return true; - } - } } return false; } @@ -224,22 +234,11 @@ IdealStateOperation::checkBlockForAllNodes( if (ichk.blocked) { return true; } - RequestBucketInfoChecker rchk; - // Check messages sent to null-bucket (i.e. _any bucket_) for the node. const std::vector<uint16_t>& nodes(getNodes()); - for (size_t i = 0; i < nodes.size(); ++i) { - document::Bucket nullBucket(bucket.getBucketSpace(), document::BucketId()); - tracker.checkPendingMessages(nodes[i], nullBucket, rchk); - if (rchk.blocked) { + for (auto node : nodes) { + if (checkNullBucketRequestBucketInfoMessage(node, bucket.getBucketSpace(), tracker)) { return true; } - if (bucket.getBucketSpace() != BucketSpace::placeHolder()) { - nullBucket = document::Bucket(BucketSpace::placeHolder(), document::BucketId()); - tracker.checkPendingMessages(nodes[i], nullBucket, rchk); - if (rchk.blocked) { - return true; - } - } } return false; } |