mirror of
https://framagit.org/framasoft/framaspace/argos.git
synced 2025-04-28 18:02:41 +02:00
Merge branch 'improve-cleandb' into 'main'
🐛 — Remove selected_at on task once we got result + other things
See merge request framasoft/framaspace/argos!27
This commit is contained in:
commit
c417ad3621
3 changed files with 22 additions and 9 deletions
|
@ -8,6 +8,18 @@ from argos import logging
|
||||||
from argos.agent import ArgosAgent
|
from argos.agent import ArgosAgent
|
||||||
|
|
||||||
|
|
||||||
|
def validate_max_lock_seconds(ctx, param, value):
|
||||||
|
if value <= 60:
|
||||||
|
raise click.BadParameter("Should be strictly higher than 60")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
|
def validate_max_results(ctx, param, value):
|
||||||
|
if value <= 0:
|
||||||
|
raise click.BadParameter("Should be a positive integer")
|
||||||
|
return value
|
||||||
|
|
||||||
|
|
||||||
@click.group()
|
@click.group()
|
||||||
def cli():
|
def cli():
|
||||||
pass
|
pass
|
||||||
|
@ -68,15 +80,18 @@ def start(host, port, config, reload):
|
||||||
|
|
||||||
|
|
||||||
@server.command()
|
@server.command()
|
||||||
@click.option("--max-results", default=100, help="Number of results per tasks to keep")
|
@click.option("--max-results", default=100, help="Number of results per task to keep")
|
||||||
@click.option(
|
@click.option(
|
||||||
"--max-lock-seconds",
|
"--max-lock-seconds",
|
||||||
default=100,
|
default=100,
|
||||||
help="The number of seconds after which a lock is considered stale",
|
help="The number of seconds after which a lock is considered stale, must be higher than 60 "
|
||||||
|
"(the checks have a timeout value of 60 seconds)",
|
||||||
|
callback=validate_max_lock_seconds,
|
||||||
)
|
)
|
||||||
def cleandb(max_results, max_lock_seconds):
|
def cleandb(max_results, max_lock_seconds):
|
||||||
"""Clean the database (to run routinely)
|
"""Clean the database (to run routinely)
|
||||||
|
|
||||||
|
\b
|
||||||
- Removes old results from the database.
|
- Removes old results from the database.
|
||||||
- Removes locks from tasks that have been locked for too long.
|
- Removes locks from tasks that have been locked for too long.
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -53,6 +53,7 @@ class Task(Base):
|
||||||
def set_times_and_deselect(self):
|
def set_times_and_deselect(self):
|
||||||
"""Removes the lock on task and set the time for the next run"""
|
"""Removes the lock on task and set the time for the next run"""
|
||||||
self.selected_by = None
|
self.selected_by = None
|
||||||
|
self.selected_at = None
|
||||||
|
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
self.completed_at = now
|
self.completed_at = now
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from urllib.parse import urljoin
|
from urllib.parse import urljoin
|
||||||
|
|
||||||
from sqlalchemy import Select, desc, func
|
from sqlalchemy import desc, func
|
||||||
from sqlalchemy.orm import Session
|
from sqlalchemy.orm import Session
|
||||||
|
|
||||||
from argos import schemas
|
from argos import schemas
|
||||||
|
@ -161,15 +161,12 @@ async def remove_old_results(db: Session, max_results: int):
|
||||||
|
|
||||||
async def release_old_locks(db: Session, max_lock_seconds: int):
|
async def release_old_locks(db: Session, max_lock_seconds: int):
|
||||||
"""Remove outdated locks on tasks"""
|
"""Remove outdated locks on tasks"""
|
||||||
# Get all the jobs that have been selected_at for more than max_lock_time
|
|
||||||
max_acceptable_time = datetime.now() - timedelta(seconds=max_lock_seconds)
|
max_acceptable_time = datetime.now() - timedelta(seconds=max_lock_seconds)
|
||||||
subquery = (
|
|
||||||
db.query(Task.id).filter(Task.selected_at < max_acceptable_time).subquery()
|
# Release the locks on jobs that have been selected_at for more than max_lock_time
|
||||||
)
|
|
||||||
# Release the locks on these jobs
|
|
||||||
updated = (
|
updated = (
|
||||||
db.query(Task)
|
db.query(Task)
|
||||||
.filter(Task.id.in_(Select(subquery)))
|
.filter(Task.selected_at < max_acceptable_time)
|
||||||
.update({Task.selected_at: None, Task.selected_by: None})
|
.update({Task.selected_at: None, Task.selected_by: None})
|
||||||
)
|
)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
Loading…
Reference in a new issue