Release greenthread when computing checksum
Having time.sleep(0) after reading each block of data for computing checksum will allow other greenthreads to run. Closes-Bug: 1882569 Change-Id: I6e547d206de9e3e333e29ccad52bf6b519a86ff9
This commit is contained in:
parent
00ccff5a0d
commit
b9938230f9
@ -25,6 +25,7 @@ import hashlib
|
||||
import os
|
||||
import stat
|
||||
import tempfile
|
||||
import time
|
||||
|
||||
from oslo_utils import excutils
|
||||
|
||||
@ -123,6 +124,8 @@ def compute_file_checksum(path, read_chunksize=65536, algorithm='sha256'):
|
||||
with open(path, 'rb') as f:
|
||||
for chunk in iter(lambda: f.read(read_chunksize), b''):
|
||||
checksum.update(chunk)
|
||||
# Release greenthread, if greenthreads are not used it is a noop.
|
||||
time.sleep(0)
|
||||
return checksum.hexdigest()
|
||||
|
||||
|
||||
|
@ -19,6 +19,8 @@ import os
|
||||
import shutil
|
||||
import stat
|
||||
import tempfile
|
||||
import time
|
||||
from unittest import mock
|
||||
import uuid
|
||||
|
||||
from oslotest import base as test_base
|
||||
@ -215,6 +217,23 @@ class TestComputeFileChecksum(test_base.BaseTestCase):
|
||||
|
||||
self.assertEqual(expected_checksum.hexdigest(), actual_checksum)
|
||||
|
||||
def test_compute_checksum_sleep_0_called(self):
|
||||
path = fileutils.write_to_tempfile(self.content)
|
||||
self.assertTrue(os.path.exists(path))
|
||||
self.check_file_content(self.content, path)
|
||||
|
||||
expected_checksum = hashlib.sha256()
|
||||
expected_checksum.update(self.content)
|
||||
|
||||
with mock.patch.object(time, "sleep") as sleep_mock:
|
||||
actual_checksum = fileutils.compute_file_checksum(
|
||||
path, read_chunksize=4)
|
||||
|
||||
sleep_mock.assert_has_calls([mock.call(0)] * 3)
|
||||
# Just to make sure that there were exactly 3 calls
|
||||
self.assertEqual(3, sleep_mock.call_count)
|
||||
self.assertEqual(expected_checksum.hexdigest(), actual_checksum)
|
||||
|
||||
def test_compute_checksum_named_algorithm(self):
|
||||
path = fileutils.write_to_tempfile(self.content)
|
||||
self.assertTrue(os.path.exists(path))
|
||||
|
Loading…
x
Reference in New Issue
Block a user