Fix for BufferedReader sets is_zero_size true for a chunk

When the image is size larger than chunk size, swift store
uploads 0 bytes for swift_buffered_upload enabled.

Closes-Bug: #1863691

Change-Id: I272d380d8fc093e946ecd6bd5ba99b5bbe2409b2
This commit is contained in:
Elancheran T.S 2020-02-17 18:41:58 -08:00 committed by esubramanian
parent ae73287c7b
commit eedf0460b6
2 changed files with 38 additions and 1 deletions

View File

@ -137,7 +137,7 @@ class BufferedReader(object):
def _buffer(self):
to_buffer = self.total
LOG.debug("Buffering %s bytes of image segment" % to_buffer)
buffer_read_count = 0
while not self._buffered:
read_size = min(to_buffer, READ_SIZE)
try:
@ -156,6 +156,9 @@ class BufferedReader(object):
break
self._tmpfile.write(buf)
to_buffer -= len(buf)
buffer_read_count = buffer_read_count + 1
if buffer_read_count == 0:
self.is_zero_size = True
# NOTE(belliott) seek and tell get used by python-swiftclient to "reset"
# if there is a put_object error

View File

@ -2239,3 +2239,37 @@ class TestBufferedReader(base.StoreBaseTest):
# file objects are not required to have a 'close' attribute
if getattr(self.reader._tmpfile, 'closed'):
self.assertTrue(self.reader._tmpfile.closed)
def test_read_all_data(self):
"""
Replicate what goes on in the Swift driver with the
repeated creation of the BufferedReader object
"""
CHUNKSIZE = 100
data = b'*' * units.Ki
expected_checksum = hashlib.md5(data).hexdigest()
expected_multihash = hashlib.sha256(data).hexdigest()
data_file = tempfile.NamedTemporaryFile()
data_file.write(data)
data_file.flush()
infile = open(data_file.name, 'rb')
bytes_read = 0
checksum = hashlib.md5()
os_hash_value = hashlib.sha256()
while True:
cr = buffered.BufferedReader(infile, checksum, os_hash_value,
CHUNKSIZE)
chunk = cr.read(CHUNKSIZE)
if len(chunk) == 0:
self.assertEqual(True, cr.is_zero_size)
break
else:
self.assertEqual(False, cr.is_zero_size)
bytes_read += len(chunk)
self.assertEqual(units.Ki, bytes_read)
self.assertEqual(expected_checksum,
cr.checksum.hexdigest())
self.assertEqual(expected_multihash,
cr.os_hash_value.hexdigest())
data_file.close()
infile.close()