1
1
from __future__ import annotations
2
2
3
+ from typing import TYPE_CHECKING
4
+
3
5
from celery import shared_task
6
+ from celery .exceptions import SoftTimeLimitExceeded
4
7
from celery .utils .log import get_task_logger
5
8
6
9
from dandiapi .api .doi import delete_doi
15
18
from dandiapi .api .models import Asset , AssetBlob , Version
16
19
from dandiapi .api .models .dandiset import Dandiset
17
20
21
+ if TYPE_CHECKING :
22
+ from uuid import UUID
23
+
18
24
logger = get_task_logger (__name__ )
19
25
20
26
@@ -26,10 +32,16 @@ def remove_asset_blob_embargoed_tag_task(blob_id: str) -> None:
26
32
remove_asset_blob_embargoed_tag (asset_blob )
27
33
28
34
29
- @shared_task (queue = 'calculate_sha256' , soft_time_limit = 86_400 )
30
- def calculate_sha256 (blob_id : str ) -> None :
35
+ @shared_task (
36
+ queue = 'calculate_sha256' ,
37
+ soft_time_limit = 86_400 , # 24 hours
38
+ autoretry_for = (SoftTimeLimitExceeded ,),
39
+ retry_backoff = True ,
40
+ max_retries = 3 ,
41
+ )
42
+ def calculate_sha256 (blob_id : str | UUID ) -> None :
31
43
asset_blob = AssetBlob .objects .get (blob_id = blob_id )
32
- logger .info ('Found AssetBlob %s' , blob_id )
44
+ logger .info ('Calculating sha256 checksum for asset blob %s' , blob_id )
33
45
sha256 = asset_blob .blob .storage .sha256_checksum (asset_blob .blob .name )
34
46
35
47
# TODO: Run dandi-cli validation
0 commit comments