Merge "xenapi: Added logging for sparse copy"
This commit is contained in:
@@ -24,6 +24,7 @@ from nova.compute import flavors
|
|||||||
from nova import context
|
from nova import context
|
||||||
from nova import db
|
from nova import db
|
||||||
from nova import exception
|
from nova import exception
|
||||||
|
from nova.openstack.common import timeutils
|
||||||
from nova import test
|
from nova import test
|
||||||
from nova.tests.virt.xenapi import stubs
|
from nova.tests.virt.xenapi import stubs
|
||||||
from nova import utils
|
from nova import utils
|
||||||
@@ -364,6 +365,26 @@ class ResizeHelpersTestCase(test.TestCase):
|
|||||||
|
|
||||||
vm_utils._resize_part_and_fs("fake", 0, 20, 10)
|
vm_utils._resize_part_and_fs("fake", 0, 20, 10)
|
||||||
|
|
||||||
|
def test_log_progress_if_required(self):
|
||||||
|
self.mox.StubOutWithMock(vm_utils.LOG, "debug")
|
||||||
|
vm_utils.LOG.debug(_("Sparse copy in progress, "
|
||||||
|
"%(complete_pct).2f%% complete. "
|
||||||
|
"%(left) bytes left to copy"),
|
||||||
|
{"complete_pct": 50.0, "left": 1})
|
||||||
|
current = timeutils.utcnow()
|
||||||
|
timeutils.set_time_override(current)
|
||||||
|
timeutils.advance_time_seconds(vm_utils.PROGRESS_INTERVAL_SECONDS + 1)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
vm_utils._log_progress_if_required(1, current, 2)
|
||||||
|
|
||||||
|
def test_log_progress_if_not_required(self):
|
||||||
|
self.mox.StubOutWithMock(vm_utils.LOG, "debug")
|
||||||
|
current = timeutils.utcnow()
|
||||||
|
timeutils.set_time_override(current)
|
||||||
|
timeutils.advance_time_seconds(vm_utils.PROGRESS_INTERVAL_SECONDS - 1)
|
||||||
|
self.mox.ReplayAll()
|
||||||
|
vm_utils._log_progress_if_required(1, current, 2)
|
||||||
|
|
||||||
def test_resize_part_and_fs_down_fails_disk_too_big(self):
|
def test_resize_part_and_fs_down_fails_disk_too_big(self):
|
||||||
self.mox.StubOutWithMock(vm_utils, "_repair_filesystem")
|
self.mox.StubOutWithMock(vm_utils, "_repair_filesystem")
|
||||||
self.mox.StubOutWithMock(utils, 'execute')
|
self.mox.StubOutWithMock(utils, 'execute')
|
||||||
|
@@ -46,6 +46,7 @@ from nova.openstack.common import excutils
|
|||||||
from nova.openstack.common import log as logging
|
from nova.openstack.common import log as logging
|
||||||
from nova.openstack.common import processutils
|
from nova.openstack.common import processutils
|
||||||
from nova.openstack.common import strutils
|
from nova.openstack.common import strutils
|
||||||
|
from nova.openstack.common import timeutils
|
||||||
from nova import utils
|
from nova import utils
|
||||||
from nova.virt import configdrive
|
from nova.virt import configdrive
|
||||||
from nova.virt.disk import api as disk
|
from nova.virt.disk import api as disk
|
||||||
@@ -145,6 +146,7 @@ MBR_SIZE_SECTORS = 63
|
|||||||
MBR_SIZE_BYTES = MBR_SIZE_SECTORS * SECTOR_SIZE
|
MBR_SIZE_BYTES = MBR_SIZE_SECTORS * SECTOR_SIZE
|
||||||
KERNEL_DIR = '/boot/guest'
|
KERNEL_DIR = '/boot/guest'
|
||||||
MAX_VDI_CHAIN_SIZE = 16
|
MAX_VDI_CHAIN_SIZE = 16
|
||||||
|
PROGRESS_INTERVAL_SECONDS = 300
|
||||||
|
|
||||||
|
|
||||||
class ImageType(object):
|
class ImageType(object):
|
||||||
@@ -2138,9 +2140,20 @@ def _resize_part_and_fs(dev, start, old_sectors, new_sectors):
|
|||||||
utils.execute('tune2fs', '-j', partition_path, run_as_root=True)
|
utils.execute('tune2fs', '-j', partition_path, run_as_root=True)
|
||||||
|
|
||||||
|
|
||||||
|
def _log_progress_if_required(left, last_log_time, virtual_size):
|
||||||
|
if timeutils.is_older_than(last_log_time, PROGRESS_INTERVAL_SECONDS):
|
||||||
|
last_log_time = timeutils.utcnow()
|
||||||
|
complete_pct = float(virtual_size - left) / virtual_size * 100
|
||||||
|
LOG.debug(_("Sparse copy in progress, "
|
||||||
|
"%(complete_pct).2f%% complete. "
|
||||||
|
"%(left) bytes left to copy"),
|
||||||
|
{"complete_pct": complete_pct, "left": left})
|
||||||
|
return last_log_time
|
||||||
|
|
||||||
|
|
||||||
def _sparse_copy(src_path, dst_path, virtual_size, block_size=4096):
|
def _sparse_copy(src_path, dst_path, virtual_size, block_size=4096):
|
||||||
"""Copy data, skipping long runs of zeros to create a sparse file."""
|
"""Copy data, skipping long runs of zeros to create a sparse file."""
|
||||||
start_time = time.time()
|
start_time = last_log_time = timeutils.utcnow()
|
||||||
EMPTY_BLOCK = '\0' * block_size
|
EMPTY_BLOCK = '\0' * block_size
|
||||||
bytes_read = 0
|
bytes_read = 0
|
||||||
skipped_bytes = 0
|
skipped_bytes = 0
|
||||||
@@ -2175,8 +2188,10 @@ def _sparse_copy(src_path, dst_path, virtual_size, block_size=4096):
|
|||||||
|
|
||||||
data = src.read(min(block_size, left))
|
data = src.read(min(block_size, left))
|
||||||
greenthread.sleep(0)
|
greenthread.sleep(0)
|
||||||
|
last_log_time = _log_progress_if_required(
|
||||||
|
left, last_log_time, virtual_size)
|
||||||
|
|
||||||
duration = time.time() - start_time
|
duration = timeutils.delta_seconds(start_time, timeutils.utcnow())
|
||||||
compression_pct = float(skipped_bytes) / bytes_read * 100
|
compression_pct = float(skipped_bytes) / bytes_read * 100
|
||||||
|
|
||||||
LOG.debug(_("Finished sparse_copy in %(duration).2f secs, "
|
LOG.debug(_("Finished sparse_copy in %(duration).2f secs, "
|
||||||
|
Reference in New Issue
Block a user