Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
67 changes: 46 additions & 21 deletions ietf/doc/storage_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@
from django.core.files.base import ContentFile, File
from django.core.files.storage import storages

from ietf.utils.log import log


# TODO-BLOBSTORE (Future, maybe after leaving 3.9) : add a return type
def _get_storage(kind: str):
Expand All @@ -22,16 +24,22 @@ def _get_storage(kind: str):

def exists_in_storage(kind: str, name: str) -> bool:
if settings.ENABLE_BLOBSTORAGE:
store = _get_storage(kind)
return store.exists_in_storage(kind, name)
try:
store = _get_storage(kind)
return store.exists_in_storage(kind, name)
except Exception as err:
log(f"Blobstore Error: Failed to test existence of {kind}:{name}: {repr(err)}")
else:
return False


def remove_from_storage(kind: str, name: str, warn_if_missing: bool = True) -> None:
if settings.ENABLE_BLOBSTORAGE:
store = _get_storage(kind)
store.remove_from_storage(kind, name, warn_if_missing)
try:
store = _get_storage(kind)
store.remove_from_storage(kind, name, warn_if_missing)
except Exception as err:
log(f"Blobstore Error: Failed to remove {kind}:{name}: {repr(err)}")
return None


Expand All @@ -46,8 +54,11 @@ def store_file(
) -> None:
# debug.show('f"asked to store {name} into {kind}"')
if settings.ENABLE_BLOBSTORAGE:
store = _get_storage(kind)
store.store_file(kind, name, file, allow_overwrite, doc_name, doc_rev)
try:
store = _get_storage(kind)
store.store_file(kind, name, file, allow_overwrite, doc_name, doc_rev)
except Exception as err:
log(f"Blobstore Error: Failed to store file {kind}:{name}: {repr(err)}")
return None


Expand All @@ -60,7 +71,11 @@ def store_bytes(
doc_rev: Optional[str] = None,
) -> None:
if settings.ENABLE_BLOBSTORAGE:
store_file(kind, name, ContentFile(content), allow_overwrite)
try:
store_file(kind, name, ContentFile(content), allow_overwrite)
except Exception as err:
# n.b., not likely to get an exception here because store_file or store_bytes will catch it
log(f"Blobstore Error: Failed to store bytes to {kind}:{name}: {repr(err)}")
return None


Expand All @@ -73,31 +88,41 @@ def store_str(
doc_rev: Optional[str] = None,
) -> None:
if settings.ENABLE_BLOBSTORAGE:
content_bytes = content.encode("utf-8")
store_bytes(kind, name, content_bytes, allow_overwrite)
try:
content_bytes = content.encode("utf-8")
store_bytes(kind, name, content_bytes, allow_overwrite)
except Exception as err:
# n.b., not likely to get an exception here because store_file or store_bytes will catch it
log(f"Blobstore Error: Failed to store string to {kind}:{name}: {repr(err)}")
return None


def retrieve_bytes(kind: str, name: str) -> bytes:
from ietf.doc.storage_backends import maybe_log_timing
content = b""
if settings.ENABLE_BLOBSTORAGE:
store = _get_storage(kind)
with store.open(name) as f:
with maybe_log_timing(
hasattr(store, "ietf_log_blob_timing") and store.ietf_log_blob_timing,
"read",
bucket_name=store.bucket_name if hasattr(store, "bucket_name") else "",
name=name,
):
content = f.read()
try:
store = _get_storage(kind)
with store.open(name) as f:
with maybe_log_timing(
hasattr(store, "ietf_log_blob_timing") and store.ietf_log_blob_timing,
"read",
bucket_name=store.bucket_name if hasattr(store, "bucket_name") else "",
name=name,
):
content = f.read()
except Exception as err:
log(f"Blobstore Error: Failed to read bytes from {kind}:{name}: {repr(err)}")
return content


def retrieve_str(kind: str, name: str) -> str:
content = ""
if settings.ENABLE_BLOBSTORAGE:
content_bytes = retrieve_bytes(kind, name)
# TODO-BLOBSTORE: try to decode all the different ways doc.text() does
content = content_bytes.decode("utf-8")
try:
content_bytes = retrieve_bytes(kind, name)
# TODO-BLOBSTORE: try to decode all the different ways doc.text() does
content = content_bytes.decode("utf-8")
except Exception as err:
log(f"Blobstore Error: Failed to read string from {kind}:{name}: {repr(err)}")
return content
6 changes: 3 additions & 3 deletions ietf/utils/storage.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,13 @@ def save(self, name, content, max_length=None):
saved_name = super().save(name, content, max_length)

if settings.ENABLE_BLOBSTORAGE:
# Retrieve the content and write to the blob store
blob_name = Path(saved_name).name # strips path
try:
# Retrieve the content and write to the blob store
blob_name = Path(saved_name).name # strips path
with self.open(saved_name, "rb") as f:
store_file(self.kind, blob_name, f, allow_overwrite=True)
except Exception as err:
log(f"Failed to shadow {saved_name} at {self.kind}:{blob_name}: {err}")
log(f"Blobstore Error: Failed to shadow {saved_name} at {self.kind}:{blob_name}: {repr(err)}")
return saved_name # includes the path!

def deconstruct(self):
Expand Down