protected boolean isLosslessResetPossible() { // #pending must be equal to cursor, i.e. all buckets ever fetched // must be located in the set of pending if (progressToken.getPendingBucketCount() != progressToken.getBucketCursor()) { return false; } // Check if all pending buckets have a progress of 0 for (Map.Entry<ProgressToken.BucketKeyWrapper, ProgressToken.BucketEntry> entry : progressToken.getBuckets().entrySet()) { if (entry.getValue().getState() != ProgressToken.BucketState.BUCKET_PENDING) { return false; } if (entry.getValue().getProgress().getId() != 0) { return false; } } return true; }
private void correctTruncatedBucketCursor() { // We've truncated the bucket cursor, but in doing so we might // have moved back beyond where there are pending buckets. Consider // having a cursor value of 3 at 31 bits and then moving to 11 bits. // With 1 pending we'll normally reach a cursor of 0, even though it // should be 1 for (ProgressToken.BucketKeyWrapper bucketKey : progressToken.getBuckets().keySet()) { BucketId bid = bucketKey.toBucketId(); long idx = bucketKey.getKey() >>> (64 - bid.getUsedBits()); if (bid.getUsedBits() == distributionBitCount && idx >= progressToken.getBucketCursor()) { progressToken.setBucketCursor(idx + 1); } } if (log.isLoggable(LogLevel.SPAM)) { log.log(LogLevel.SPAM, "New range bucket cursor is " + progressToken.getBucketCursor()); } }
= new TreeMap<ProgressToken.BucketKeyWrapper, ProgressToken.BucketEntry>(p.getBuckets()); for (Map.Entry<ProgressToken.BucketKeyWrapper, ProgressToken.BucketEntry> entry : buckets.entrySet()) { buckets = new TreeMap<ProgressToken.BucketKeyWrapper, ProgressToken.BucketEntry>(p.getBuckets()); for (Map.Entry<ProgressToken.BucketKeyWrapper, ProgressToken.BucketEntry> entry : buckets.entrySet()) {
TreeMap<ProgressToken.BucketKeyWrapper, ProgressToken.BucketEntry> buckets = progressToken.getBuckets(); ProgressToken.BucketEntry pending = null; BucketId superbucket = null;