fix(backup): nettoyer le fichier temporaire en cas d'erreur dans restore (#89)
Wraps temp file operations in try/except to ensure the temporary database file is always cleaned up, even if an exception occurs during write_snapshot or verify_integrity. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+100
@@ -0,0 +1,100 @@
|
||||
File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
|
||||
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
|
||||
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
|
||||
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
|
||||
File "/var/www/decpinfo/run.py", line 1, in <module>
|
||||
from src.app import app
|
||||
File "/var/www/decpinfo/src/app.py", line 30, in <module>
|
||||
app: Dash = Dash(
|
||||
^^^^^
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/dash.py", line 639, in __init__
|
||||
self.init_app()
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/dash.py", line 752, in init_app
|
||||
self.enable_pages()
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/dash.py", line 2535, in enable_pages
|
||||
_import_layouts_from_pages(self.config.pages_folder)
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/_pages.py", line 442, in _import_layouts_from_pages
|
||||
spec.loader.exec_module(page_module) # type: ignore[reportOptionalMemberAccess]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/src/pages/observatoire.py", line 19, in <module>
|
||||
from src.db import schema
|
||||
File "/var/www/decpinfo/src/db.py", line 126, in <module>
|
||||
DB_PATH = _ensure_database()
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/src/db.py", line 119, in _ensure_database
|
||||
if should_rebuild(db_path, parquet_path):
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/src/db.py", line 23, in should_rebuild
|
||||
return parquet_path.stat().st_mtime > db_path.stat().st_mtime
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.11/pathlib.py", line 1014, in stat
|
||||
return os.stat(self, follow_symlinks=follow_symlinks)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
FileNotFoundError: [Errno 2] No such file or directory: '/srv/shared/decp/prod/dist/decp.parquet'
|
||||
[2026-05-01 08:00:30 +0200] [2216551] [INFO] Worker exiting (pid: 2216551)
|
||||
[2026-05-01 08:00:30 +0200] [2216552] [ERROR] Exception in worker process
|
||||
Traceback (most recent call last):
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/arbiter.py", line 608, in spawn_worker
|
||||
worker.init_process()
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/workers/base.py", line 135, in init_process
|
||||
self.load_wsgi()
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/workers/base.py", line 147, in load_wsgi
|
||||
self.wsgi = self.app.wsgi()
|
||||
^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/app/base.py", line 66, in wsgi
|
||||
self.callable = self.load()
|
||||
^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 57, in load
|
||||
return self.load_wsgiapp()
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/app/wsgiapp.py", line 47, in load_wsgiapp
|
||||
return util.import_app(self.app_uri)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/gunicorn/util.py", line 370, in import_app
|
||||
mod = importlib.import_module(module)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module
|
||||
return _bootstrap._gcd_import(name[level:], package, level)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "<frozen importlib._bootstrap>", line 1206, in _gcd_import
|
||||
File "<frozen importlib._bootstrap>", line 1178, in _find_and_load
|
||||
File "<frozen importlib._bootstrap>", line 1149, in _find_and_load_unlocked
|
||||
File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
|
||||
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
|
||||
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
|
||||
File "/var/www/decpinfo/run.py", line 1, in <module>
|
||||
from src.app import app
|
||||
File "/var/www/decpinfo/src/app.py", line 30, in <module>
|
||||
app: Dash = Dash(
|
||||
^^^^^
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/dash.py", line 639, in __init__
|
||||
self.init_app()
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/dash.py", line 752, in init_app
|
||||
self.enable_pages()
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/dash.py", line 2535, in enable_pages
|
||||
_import_layouts_from_pages(self.config.pages_folder)
|
||||
File "/var/www/decpinfo/.venv/lib/python3.11/site-packages/dash/_pages.py", line 442, in _import_layouts_from_pages
|
||||
spec.loader.exec_module(page_module) # type: ignore[reportOptionalMemberAccess]
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/src/pages/observatoire.py", line 19, in <module>
|
||||
from src.db import schema
|
||||
File "/var/www/decpinfo/src/db.py", line 126, in <module>
|
||||
DB_PATH = _ensure_database()
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/src/db.py", line 119, in _ensure_database
|
||||
if should_rebuild(db_path, parquet_path):
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
File "/var/www/decpinfo/src/db.py", line 23, in should_rebuild
|
||||
return parquet_path.stat().st_mtime > db_path.stat().st_mtime
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
File "/usr/lib/python3.11/pathlib.py", line 1014, in stat
|
||||
return os.stat(self, follow_symlinks=follow_symlinks)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
FileNotFoundError: [Errno 2] No such file or directory: '/srv/shared/decp/prod/dist/decp.parquet'
|
||||
[2026-05-01 08:00:30 +0200] [2216552] [INFO] Worker exiting (pid: 2216552)
|
||||
[2026-05-01 08:00:30 +0200] [2216548] [ERROR] Worker (pid:2216549) exited with code 3
|
||||
[2026-05-01 08:00:30 +0200] [2216548] [ERROR] Worker (pid:2216550) was sent SIGTERM!
|
||||
[2026-05-01 08:00:30 +0200] [2216548] [ERROR] Worker (pid:2216552) was sent SIGTERM!
|
||||
[2026-05-01 08:00:30 +0200] [2216548] [ERROR] Worker (pid:2216551) was sent SIGTERM!
|
||||
[2026-05-01 08:00:31 +0200] [2216548] [ERROR] Shutting down: Master
|
||||
[2026-05-01 08:00:31 +0200] [2216548] [ERROR] Reason: Worker failed to boot.
|
||||
Reference in New Issue
Block a user