File size: 1,495 Bytes
89419ea
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

from __future__ import annotations

from datetime import datetime

from sqlalchemy.orm import Session

from ...database import crud, external_batch_crud


def recover_interrupted_external_batches(db: Session) -> int:
    recovered = 0
    for batch in external_batch_crud.list_recoverable_batches(db):
        items = external_batch_crud.list_batch_items(db, batch.batch_uuid)
        for item in items:
            if item.status in {'pending', 'running'}:
                external_batch_crud.update_batch_item(
                    db,
                    item.id,
                    status='failed',
                    failure_reason='service_restarted',
                    upload_status='failed' if item.upload_status == 'pending' else item.upload_status,
                    completed_at=datetime.utcnow(),
                )
            task = crud.get_registration_task_by_uuid(db, item.registration_task_uuid) if item.registration_task_uuid else None
            if task and task.status in {'pending', 'running'}:
                task.status = 'failed'
                task.error_message = 'service_restarted'
                task.completed_at = datetime.utcnow()
        external_batch_crud.update_batch(
            db,
            batch.batch_uuid,
            status='failed',
            failure_reason='service_restarted',
            failure_category='transient',
            completed_at=datetime.utcnow(),
        )
        recovered += 1
    db.commit()
    return recovered