From 769ef4dc4b189459b175bb71fca97c6eb5328455 Mon Sep 17 00:00:00 2001 From: Vincent Michel Date: Fri, 10 Nov 2023 16:19:40 +0100 Subject: [PATCH] Normalize values to avoid overflow issues with the remanence widget progress bar --- newsfragments/5759.bugfix.rst | 1 + parsec/core/gui/remanence_management_widget.py | 15 +++++++++++++-- tests/core/gui/test_workspace_remanence.py | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 newsfragments/5759.bugfix.rst diff --git a/newsfragments/5759.bugfix.rst b/newsfragments/5759.bugfix.rst new file mode 100644 index 00000000000..bfcecf8ed32 --- /dev/null +++ b/newsfragments/5759.bugfix.rst @@ -0,0 +1 @@ +Fix progress bar issue for offline availability when the workspace contains more than 2GB of data diff --git a/parsec/core/gui/remanence_management_widget.py b/parsec/core/gui/remanence_management_widget.py index d81b5d82fc4..05a0380a341 100644 --- a/parsec/core/gui/remanence_management_widget.py +++ b/parsec/core/gui/remanence_management_widget.py @@ -19,6 +19,14 @@ from parsec.core.logged_core import LoggedCore +def normalize_progress(value: int, total: int, maxi: int = 0x7FFFFFFF) -> tuple[int, int]: + if total <= maxi: + return value, total + assert total != 0 + normalized_value = int(round(value * maxi / total)) + return normalized_value, maxi + + class RemanenceManagementWidget(QWidget, Ui_RemanenceManagementWidget): def __init__(self, jobs_ctx: QtToTrioJobScheduler, core: LoggedCore, workspace_fs: WorkspaceFS): super().__init__() @@ -106,10 +114,13 @@ def _update_text(self) -> None: format_value = "{} - {} / {} (%p%)".format( title, get_filesize(info.local_and_remote_size), get_filesize(info.total_size) ) + current_size, total_size = normalize_progress( + info.local_and_remote_size, info.total_size + ) self.progress_bar.setFormat(format_value) self.progress_bar.setMinimum(0) - self.progress_bar.setMaximum(info.total_size) - self.progress_bar.setValue(info.local_and_remote_size) + self.progress_bar.setMaximum(total_size) + self.progress_bar.setValue(current_size) # Congratulate when a download is finished if ( self._download_started diff --git a/tests/core/gui/test_workspace_remanence.py b/tests/core/gui/test_workspace_remanence.py index d970c8a88a5..f7c6916dd39 100644 --- a/tests/core/gui/test_workspace_remanence.py +++ b/tests/core/gui/test_workspace_remanence.py @@ -1,11 +1,16 @@ # Parsec Cloud (https://parsec.cloud) Copyright (c) AGPL-3.0 2016-present Scille SAS import pytest +from hypothesis import assume, given +from hypothesis.strategies import integers from PyQt5 import QtCore from parsec.api.data import EntryName from parsec.core.gui.lang import translate -from parsec.core.gui.remanence_management_widget import RemanenceManagementWidget +from parsec.core.gui.remanence_management_widget import ( + RemanenceManagementWidget, + normalize_progress, +) from parsec.core.gui.workspace_button import WorkspaceButton @@ -183,3 +188,14 @@ def _wait_remanence_turned_on(): ] await aqtbot.wait_until(_wait_remanence_turned_on) + + +@given(integers(min_value=0), integers(min_value=1)) +def test_normalize_progress(value, total): + assume(value <= total) + normalized_value, normalized_total = normalize_progress(value, total) + if total <= 0x7FFFFFFF: + assert value == normalized_value + assert total == normalized_total + precision = 5 + assert round(value / total, precision) == round(normalized_value / normalized_total, precision)