X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/a830b5b560251c3143a7b1fd60db3f50a7021b34..58a026e09bda4c1e2374347615c325007c64fac4:/sdk/python/arvados/_ranges.py diff --git a/sdk/python/arvados/_ranges.py b/sdk/python/arvados/_ranges.py index 371d003995..bb245ab2bf 100644 --- a/sdk/python/arvados/_ranges.py +++ b/sdk/python/arvados/_ranges.py @@ -1,3 +1,9 @@ +# Copyright (C) The Arvados Authors. All rights reserved. +# +# SPDX-License-Identifier: Apache-2.0 + +from __future__ import division +from builtins import object import logging _logger = logging.getLogger('arvados.ranges') @@ -6,6 +12,8 @@ _logger = logging.getLogger('arvados.ranges') RANGES_SPAM = 9 class Range(object): + __slots__ = ("locator", "range_start", "range_size", "segment_offset") + def __init__(self, locator, range_start, range_size, segment_offset=0): self.locator = locator self.range_start = range_start @@ -22,14 +30,14 @@ class Range(object): self.segment_offset == other.segment_offset) def first_block(data_locators, range_start): - block_start = 0L + block_start = 0 # range_start/block_start is the inclusive lower bound # range_end/block_end is the exclusive upper bound hi = len(data_locators) lo = 0 - i = int((hi + lo) / 2) + i = (hi + lo) // 2 block_size = data_locators[i].range_size block_start = data_locators[i].range_start block_end = block_start + block_size @@ -45,7 +53,7 @@ def first_block(data_locators, range_start): lo = i else: hi = i - i = int((hi + lo) / 2) + i = (hi + lo) // 2 block_size = data_locators[i].range_size block_start = data_locators[i].range_start block_end = block_start + block_size @@ -53,6 +61,8 @@ def first_block(data_locators, range_start): return i class LocatorAndRange(object): + __slots__ = ("locator", "block_size", "segment_offset", "segment_size") + def __init__(self, locator, block_size, segment_offset, segment_size): self.locator = locator self.block_size = block_size @@ -99,15 +109,13 @@ def locators_and_ranges(data_locators, range_start, range_size, limit=None): # We should always start at the first segment due to the binary # search. - while i < len(data_locators): - if limit and len(resp) > limit: - break + while i < len(data_locators) and len(resp) != limit: dl = data_locators[i] block_start = dl.range_start block_size = dl.range_size block_end = block_start + block_size _logger.log(RANGES_SPAM, - "%s range_start %s block_start %s range_end %s block_end %s", + "L&R %s range_start %s block_start %s range_end %s block_end %s", dl.locator, range_start, block_start, range_end, block_end) if range_end <= block_start: # range ends before this block starts, so don't look at any more locators @@ -163,7 +171,7 @@ def replace_range(data_locators, new_range_start, new_range_size, new_locator, n last = data_locators[-1] if (last.range_start+last.range_size) == new_range_start: - if last.locator == new_locator: + if last.locator == new_locator and (last.segment_offset+last.range_size) == new_segment_offset: # extend last segment last.range_size += new_range_size else: @@ -181,14 +189,14 @@ def replace_range(data_locators, new_range_start, new_range_size, new_locator, n old_segment_start = dl.range_start old_segment_end = old_segment_start + dl.range_size _logger.log(RANGES_SPAM, - "%s range_start %s segment_start %s range_end %s segment_end %s", + "RR %s range_start %s segment_start %s range_end %s segment_end %s", dl, new_range_start, old_segment_start, new_range_end, old_segment_end) if new_range_end <= old_segment_start: # range ends before this segment starts, so don't look at any more locators break - if old_segment_start <= new_range_start and new_range_end <= old_segment_end: + if old_segment_start <= new_range_start and new_range_end <= old_segment_end: # new range starts and ends in old segment # split segment into up to 3 pieces if (new_range_start-old_segment_start) > 0: