[virt-tools-list] [virt-bootstrap] [PATCH v5 03/11] DockerSource: Fix formula of download progress
Cedric Bosdonnat
cbosdonnat at suse.com
Mon Jul 24 12:21:05 UTC 2017
On Mon, 2017-07-24 at 09:14 +0100, Radostin Stoyanov wrote:
> When downloading image with multiple layers, the download progress
> value of every following layer should not start from 0.
>
> If we have 10 layers, downloading each of them should increase the
> total download progress by 10%.
>
> Assuming that the download and extraction are 50/50 of the total work.
>
> Then, downloading each of 10 layers will increase the progress value
> with 5% of the total work.
>
> When all layers are downloaded the progress value should be 50%.
>
> However, with the current formula the progress value of each layer
> starts from 0%.
> (E.g. when downloading 2nd layer of 10 the download progress starts
> from 0% instead of 5%.)
>
> This bug can be seen when downloading images with multiple layers of
> large size.
>
> Example:
> virt-bootstrap docker://rails /tmp/foo --status-only
> ---
> src/virtBootstrap/sources.py | 18 +++++++++++++++---
> 1 file changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/src/virtBootstrap/sources.py b/src/virtBootstrap/sources.py
> index 8800d72..898993d 100644
> --- a/src/virtBootstrap/sources.py
> +++ b/src/virtBootstrap/sources.py
> @@ -225,7 +225,15 @@ class DockerSource(object):
> total size of image layer.
>
> Calculate percentage and update the progress of virt-bootstrap.
> +
> + @param current_l: Number of currently downloaded layer
> + @param total_l: Total number of layers
> + @param line_split: A list with format:
> + [<d_size>, <d_format>, '/', <t_size>, <t_format>, <progress>]
> + Example:
> + ['5.92', 'MB', '/', '44.96', 'MB', '[===>-----------------]']
> """
> +
> if not (len(line_split) > 4 and isinstance(line_split, list)):
> return
>
> @@ -237,9 +245,13 @@ class DockerSource(object):
> total_size = utils.size_to_bytes(t_size, t_format)
> if downloaded_size and total_size:
> try:
> - self.progress(value=(50
> - * downloaded_size / total_size
> - * float(current_l)/total_l))
> + frac = float(1) / total_l
> + downloaded = float(downloaded_size) / total_size
> + layer_frac = float(max(0, current_l - 1)) / total_l
> +
> + progress = 50 * (layer_frac + (frac * downloaded))
> +
> + self.progress(value=progress)
> except Exception:
> pass # Ignore failures
>
ACK
--
Cedric
More information about the virt-tools-list
mailing list