Fix with fs remove

This commit is contained in:
Zeecka
2025-12-30 16:57:08 +01:00
parent 87df3cc629
commit b15dca9c53
+37 -43
View File
@@ -6,6 +6,7 @@ import os
import time import time
from datetime import datetime, timezone from datetime import datetime, timezone
from pathlib import Path from pathlib import Path
from shutil import rmtree
from typing import Any, Optional from typing import Any, Optional
from flask import Flask, Response, abort, jsonify, render_template, request, send_file from flask import Flask, Response, abort, jsonify, render_template, request, send_file
@@ -112,34 +113,33 @@ def upload_image() -> tuple[Response, int]:
submission_hash = hashlib.md5(submission_data).hexdigest() submission_hash = hashlib.md5(submission_data).hexdigest()
submission_path = RESULT_FOLDER / img_hash / submission_hash submission_path = RESULT_FOLDER / img_hash / submission_hash
# Check if hash is present on the DB # If submission already exists, return submission hash
submission: Submission = Submission.query.filter_by( if submission_path.exists():
hash=submission_hash submission: Submission = Submission.query.filter_by(
).first() hash=submission_hash
).first()
# Only return if BOTH the file exists AND the DB entry exists if submission is not None: # File exist but not in DB (should not happen),
if submission_path.exists() and submission is not None: rmtree(submission_path) # Removing file and continue processing as new
return jsonify({"submission_hash": submission.hash}), 200 db.session.delete(submission) # pylint: disable=no-member
db.session.commit() # pylint: disable=no-member
else:
return jsonify({"submission_hash": submission.hash}), 200
# Self-Healing Logic # If image is new, create a new Image entry
new_img_path = RESULT_FOLDER / img_hash / image_name new_img_path = RESULT_FOLDER / img_hash / image_name
sub_img = Image.query.filter_by(hash=img_hash).first() # type: ignore
# Try to find image in DB by hash if new_img_path.parent.exists() and sub_img is None:
sub_img = Image.query.filter_by( # Inconsistent state: image file exists but no DB entry
hash=img_hash rmtree(new_img_path.parent) # Remove the existing files and continue
).first()
# If DB entry is missing (even if file exists on disk), create it! if not new_img_path.parent.exists():
if sub_img is None: new_img_path.parent.mkdir(parents=True, exist_ok=True)
if not new_img_path.parent.exists() or not new_img_path.exists(): with open(new_img_path, "wb") as f: # Write file to disk
new_img_path.parent.mkdir(parents=True, exist_ok=True) f.write(image_data)
with open(new_img_path, "wb") as f:
f.write(image_data)
new_img = Image(
# Recreate the missing Database Entry
sub_img = Image(
file=str(new_img_path), file=str(new_img_path),
hash=img_hash, hash=img_hash,
size=len(image_data), size=len(image_data),
@@ -147,39 +147,33 @@ def upload_image() -> tuple[Response, int]:
first_submission_date=datetime.now(timezone.utc), first_submission_date=datetime.now(timezone.utc),
last_submission_date=datetime.now(timezone.utc), last_submission_date=datetime.now(timezone.utc),
) )
db.session.add(sub_img) db.session.add(new_img) # pylint: disable=no-member
db.session.commit() db.session.commit() # pylint: disable=no-member
# Increment upload count for the image sub_img = Image.query.filter_by(hash=img_hash).first() # type: ignore
sub_img.upload_count += 1 sub_img.upload_count += 1
db.session.commit() db.session.commit() # pylint: disable=no-member
# Create new Submission entry # Create new Submission entry
submission_path.mkdir(parents=True, exist_ok=True) submission_path.mkdir(parents=True, exist_ok=True)
submission = Submission(
filename=image.filename,
password=password,
deep_analysis=deep_analysis,
hash=submission_hash,
status="pending",
date=time.time(),
image_hash=sub_img.hash, # type: ignore
)
db.session.add(submission) # pylint: disable=no-member
# Only create a new submission if it does not already exist db.session.commit() # pylint: disable=no-member
# New submission for new image
if not submission:
submission = Submission(
filename=image.filename,
password=password,
deep_analysis=deep_analysis,
hash=submission_hash,
status="pending",
date=time.time(),
image_hash=sub_img.hash,
)
db.session.add(submission)
db.session.commit()
# Start the analysis jobs # Start the analysis jobs
queue.enqueue("aperisolve.workers.analyze_image", submission.hash, job_timeout=300) queue.enqueue("aperisolve.workers.analyze_image", submission.hash, job_timeout=300)
# Return submission identifier
return jsonify({"submission_hash": submission.hash}), 200 return jsonify({"submission_hash": submission.hash}), 200
@app.route("/status/<hash_val>", methods=["GET"]) @app.route("/status/<hash_val>", methods=["GET"])
def get_status(hash_val: str) -> Response: def get_status(hash_val: str) -> Response:
"""Get the processing status of a submission.""" """Get the processing status of a submission."""