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:
parent
ae73287c7b
commit
eedf0460b6
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue