if a chunk has been requested in prefetch, don't bother doing an overlapping prefetch during readv
This commit is contained in:
parent
c731a077fb
commit
17a93bce4c
|
@ -83,6 +83,20 @@ class SFTPFile (BufferedFile):
|
||||||
# may have outlived the Transport connection
|
# may have outlived the Transport connection
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _data_in_prefetch_requests(self, offset, size):
|
||||||
|
k = [i for i in self._prefetch_reads if i[0] <= offset]
|
||||||
|
if len(k) == 0:
|
||||||
|
return False
|
||||||
|
k.sort(cmp=lambda x, y: cmp(x[0], y[0]))
|
||||||
|
buf_offset, buf_size = k[-1]
|
||||||
|
if buf_offset + buf_size <= offset:
|
||||||
|
return True
|
||||||
|
if buf_offset + buf_size >= offset + size:
|
||||||
|
# inclusive
|
||||||
|
return True
|
||||||
|
# well, we have part of the request. see if another chunk has the rest.
|
||||||
|
return self._data_in_prefetch_requests(buf_offset + buf_size, offset + size - buf_offset - buf_size)
|
||||||
|
|
||||||
def _data_in_prefetch_buffers(self, offset):
|
def _data_in_prefetch_buffers(self, offset):
|
||||||
"""
|
"""
|
||||||
if a block of data is present in the prefetch buffers, at the given
|
if a block of data is present in the prefetch buffers, at the given
|
||||||
|
@ -393,7 +407,7 @@ class SFTPFile (BufferedFile):
|
||||||
read_chunks = []
|
read_chunks = []
|
||||||
for offset, size in chunks:
|
for offset, size in chunks:
|
||||||
# don't fetch data that's already in the prefetch buffer
|
# don't fetch data that's already in the prefetch buffer
|
||||||
if self._data_in_prefetch_buffers(offset):
|
if self._data_in_prefetch_buffers(offset) or self._data_in_prefetch_requests(offset, size):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# break up anything larger than the max read size
|
# break up anything larger than the max read size
|
||||||
|
|
Loading…
Reference in New Issue