From dfd574beebb0d58a75e0274095e9821eb4cc3505 Mon Sep 17 00:00:00 2001 From: Sergey Krashevich Date: Sun, 11 Jun 2023 22:49:13 +0300 Subject: [PATCH] Refactor storage stats calculation to use powers of 2 for more accurate values (#6765) * "Refactor storage stats calculation to use powers of 2 for more accurate values" * replace 1000000 to 2^20 * Refactor storage unit size display to use binary prefixes This commit updates the display of storage unit sizes in both the camera storage stats and the Storage component in the web UI to use binary prefixes (MiB and GiB) instead of decimal prefixes (MB and GB). This provides more accurate and consistent representation of storage sizes --- frigate/app.py | 2 +- frigate/record/maintainer.py | 2 +- frigate/stats.py | 6 +++--- frigate/storage.py | 4 ++-- web/src/routes/Storage.jsx | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frigate/app.py b/frigate/app.py index 840b80710..02e657ce1 100644 --- a/frigate/app.py +++ b/frigate/app.py @@ -429,7 +429,7 @@ class FrigateApp: self.frigate_watchdog.start() def check_shm(self) -> None: - available_shm = round(shutil.disk_usage("/dev/shm").total / 1000000, 1) + available_shm = round(shutil.disk_usage("/dev/shm").total / pow(2, 20), 1) min_req_shm = 30 for _, camera in self.config.cameras.items(): diff --git a/frigate/record/maintainer.py b/frigate/record/maintainer.py index cab7b669d..2d2d93f08 100644 --- a/frigate/record/maintainer.py +++ b/frigate/record/maintainer.py @@ -326,7 +326,7 @@ class RecordingMaintainer(threading.Thread): # get the segment size of the cache file # file without faststart is same size segment_size = round( - float(os.path.getsize(cache_path)) / 1000000, 1 + float(os.path.getsize(cache_path)) / pow(2, 20), 1 ) except OSError: segment_size = 0 diff --git a/frigate/stats.py b/frigate/stats.py index 246f74bf1..d18642dfe 100644 --- a/frigate/stats.py +++ b/frigate/stats.py @@ -286,9 +286,9 @@ def stats_snapshot( stats["service"]["storage"][path] = {} stats["service"]["storage"][path] = { - "total": round(storage_stats.total / 1000000, 1), - "used": round(storage_stats.used / 1000000, 1), - "free": round(storage_stats.free / 1000000, 1), + "total": round(storage_stats.total / pow(2, 20), 1), + "used": round(storage_stats.used / pow(2, 20), 1), + "free": round(storage_stats.free / pow(2, 20), 1), "mount_type": get_fs_type(path), } diff --git a/frigate/storage.py b/frigate/storage.py index d2cab553a..2511c2aa8 100644 --- a/frigate/storage.py +++ b/frigate/storage.py @@ -56,7 +56,7 @@ class StorageMaintainer(threading.Thread): bandwidth = 0 self.camera_storage_stats[camera]["bandwidth"] = bandwidth - logger.debug(f"{camera} has a bandwidth of {bandwidth} MB/hr.") + logger.debug(f"{camera} has a bandwidth of {bandwidth} MiB/hr.") def calculate_camera_usages(self) -> dict[str, dict]: """Calculate the storage usage of each camera.""" @@ -85,7 +85,7 @@ class StorageMaintainer(threading.Thread): hourly_bandwidth = sum( [b["bandwidth"] for b in self.camera_storage_stats.values()] ) - remaining_storage = round(shutil.disk_usage(RECORD_DIR).free / 1000000, 1) + remaining_storage = round(shutil.disk_usage(RECORD_DIR).free / pow(2, 20), 1) logger.debug( f"Storage cleanup check: {hourly_bandwidth} hourly with remaining storage: {remaining_storage}." ) diff --git a/web/src/routes/Storage.jsx b/web/src/routes/Storage.jsx index dd7f969c7..71fde1668 100644 --- a/web/src/routes/Storage.jsx +++ b/web/src/routes/Storage.jsx @@ -26,9 +26,9 @@ export default function Storage() { const getUnitSize = (MB) => { if (isNaN(MB) || MB < 0) return 'Invalid number'; - if (MB < 1024) return `${MB} MB`; + if (MB < 1024) return `${MB} MiB`; - return `${(MB / 1024).toFixed(2)} GB`; + return `${(MB / 1024).toFixed(2)} GiB`; }; let storage_usage;