"""
__slots__ = ('parent', 'name', '_writers', '_committed',
- '_segments', 'lock', '_current_bblock', 'fuse_entry')
+ '_segments', 'lock', '_current_bblock', 'fuse_entry', '_read_counter')
def __init__(self, parent, name, stream=[], segments=[]):
"""
for s in segments:
self._add_segment(stream, s.locator, s.range_size)
self._current_bblock = None
+ self._read_counter = 0
def writable(self):
return self.parent.writable()
if size == 0 or offset >= self.size():
return b''
readsegs = locators_and_ranges(self._segments, offset, size)
- if self.parent._my_block_manager()._keep.num_prefetch_threads > 0:
- prefetch = locators_and_ranges(self._segments, offset + size, config.KEEP_BLOCK_SIZE * self.parent._my_block_manager()._keep.num_prefetch_threads, limit=32)
+ prefetch = None
+ if self.parent._my_block_manager()._keep.num_prefetch_threads > 0 and (self._read_counter % 128) == 0:
+ prefetch = locators_and_ranges(self._segments, offset + size, config.KEEP_BLOCK_SIZE * self.parent._my_block_manager()._keep.num_prefetch_threads,
+ limit=(1+self.parent._my_block_manager()._keep.num_prefetch_threads))
+ self._read_counter += 1
locs = set()
data = []
else:
break
- if self.parent._my_block_manager()._keep.num_prefetch_threads > 0:
+ if prefetch:
for lr in prefetch:
if lr.locator not in locs:
self.parent._my_block_manager().block_prefetch(lr.locator)
disk_cache=self.args.disk_cache,
disk_cache_dir=self.args.disk_cache_dir)
- # Profiling indicates that prefetching has more of a
- # negative impact on the read() fast path (by requiring it
- # to do more work and take additional locks) than benefit.
- # Also, the kernel does some readahead itself, which has a
- # similar effect.
- prefetch_threads = 0
-
self.api = arvados.safeapi.ThreadSafeApiCache(
apiconfig=arvados.config.settings(),
api_params={
},
keep_params={
'block_cache': block_cache,
- 'num_prefetch_threads': prefetch_threads,
'num_retries': self.args.retries,
},
version='v1',