30 خطوط
1.2 KiB
Python
30 خطوط
1.2 KiB
Python
"""Delete expired uploads/artifacts after any active lease has elapsed."""
|
|
import logging
|
|
import time
|
|
from sqlalchemy import select, delete, or_
|
|
from .db import Job, sessions, engine
|
|
from .storage import storage
|
|
from .job_types import comparison_sources
|
|
|
|
log=logging.getLogger(__name__)
|
|
|
|
def cleanup(batch=100):
|
|
now=time.time(); removed=0
|
|
with sessions().begin() as db:
|
|
q=select(Job).where(Job.expires_at<=now, or_(Job.status!='processing', Job.lease_until<now)).limit(batch)
|
|
if engine().dialect.name=='postgresql': q=q.with_for_update(skip_locked=True)
|
|
for job in db.scalars(q):
|
|
try:
|
|
storage().delete(job.input_key)
|
|
for source in comparison_sources(job.input_key): storage().delete(source)
|
|
for attempt in (1,2):
|
|
for name in ('data.json','drawing.svg','old.svg','new.svg'):
|
|
storage().delete(f'{job.id}/attempt-{attempt}/{name}')
|
|
db.delete(job); removed+=1
|
|
except Exception: log.exception('Expired artifact cleanup failed for %s',job.id)
|
|
return removed
|
|
|
|
if __name__=='__main__':
|
|
from .db import initialize
|
|
initialize(); print(f'Removed {cleanup()} expired schematics')
|