Local range download leaves an output file after source-read failure despite delete_on_failure=True
Les mainteneurs répondent en général sous 1 jour
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 2/5
- Temps estimé
- 1-3 heures
- Accessibilité débutants
- 82/100
Piste de recherche
Lisez le contrat de téléchargement par plages dans libcloud/storage/base.py et l’implémentation locale dans libcloud/storage/drivers/local.py. Reproduisez le cas de source manquante de l’issue, puis ajoutez un test de régression à côté des tests existants du pilote local. Le travail est terminé lorsqu’un téléchargement par plages échoué supprime la destination lorsque delete_on_failure=True, tandis que le comportement avec l’indicateur désactivé reste celui prévu.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
On trunk 8a0ef626, the local driver's range-download method creates a destination file but does not clean it up when opening the source fails, even with delete_on_failure=True.
This reproducer is sequential: obtain the object metadata, explicitly remove the stored file, then try to download. It does not depend on winning a filesystem race.
import os
import tempfile
from libcloud.storage.drivers.local import LocalStorageDriver
with tempfile.TemporaryDirectory() as root:
driver = LocalStorageDriver(root)
container = driver.create_container("bucket")
obj = driver.upload_object_via_stream(iter([b"payload"]), container, "object")
os.unlink(driver.get_object_cdn_url(obj))
destination = os.path.join(root, "download")
try:
driver.download_object_range(
obj, destination, start_bytes=0, delete_on_failure=True
)
except FileNotFoundError:
pass
print(os.path.exists(destination), os.path.getsize(destination))
# True 0
The public range-download contract describes delete_on_failure as deleting a partially downloaded file when the download was unsuccessful, with hash mismatch/file size given as examples. I expected the newly created empty output to be removed for a source-read failure as well. Otherwise a failed operation leaves a file that can be mistaken for a valid empty download.
The local implementation accepts the flag but never reads it. It opens the destination before consuming the source iterator and has no failure cleanup around that loop.
Checks with unchanged source, Python 3.12/Linux:
- Range download with
delete_on_failure=True: raisesFileNotFoundError, leaves a zero-byte output. - Range download with
delete_on_failure=False: same result. - Full
download_objectwith the same missing source: returnsFalse, leaves no output. - Successful range
[0, 3)before removing the source: returnsTrue, writesb"pay".
No code change yet. This report is limited to failure cleanup for local range downloads; it does not claim a concurrent-write reproduction or a full test-suite pass.
- Langage dominant
- Python
- Étoiles
- 2.1k
- Forks
- 935
- Merge moyen
- 5 j 3 h
- PR mergées (30 j)
- 15
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Propose un modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de apache/libcloud
-
Difficulté 2/5 1-3 heures Accessibilité débutants 76/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 1/5 1-3 heures Accessibilité débutants 88/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 15/100
apache/libcloud#2215 · 3 commentaires · 2 réactions ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 35/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 15/100
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de apache/libcloud
Issues similaires
-
Email validation accepts a trailing newlinePeut-être pris @marcello-pichini l’a pris aujourd’hui. Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Contributing instructionsOuverte
Difficulté 2/5 1-3 heures Accessibilité débutants 72/100
dbt-labs/spark-utils#51 ·
-
Difficulté 2/5 1-3 heures Accessibilité débutants 85/100
Les mainteneurs répondent en général sous 1 jour
-
bug frontend
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
vendrabuck/HERD#1419 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour