21639: Reenable prefetch, but not on every read()
[arvados.git] / sdk / python / arvados / arvfile.py
index 0cc7d25a331871c88860357853d1a21898eae965..666efb078d58e3a798e9721613919f0d0bf82469 100644 (file)
@@ -825,7 +825,7 @@ class ArvadosFile(object):
     """
 
     __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=[]):
         """
@@ -846,6 +846,7 @@ class ArvadosFile(object):
         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()
@@ -1060,8 +1061,11 @@ class ArvadosFile(object):
             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 = []
@@ -1074,7 +1078,7 @@ class ArvadosFile(object):
             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)