Project

General

Profile

Bug #75478

Sur un crash dans un job de cron, le statut du tenant n'a pas été posé à terminé bloquant les jobs pendant 1 journée

Added by Benjamin Dauvergne 5 days ago. Updated about 8 hours ago.

Status:
Solution validée
Priority:
Normal
Target version:
-
Start date:
15 March 2023
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

Description

Cf. #75438-5

La trace qui bloque le cron : https://sentry.entrouvert.org/entrouvert/publik/issues/108094/?environment=prod

AttributeError: 'NoneType' object has no attribute 'cursor'
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "wcs/qommon/management/commands/cron.py", line 114, in handle
    sql.mark_cron_status('done')
  File "wcs/sql.py", line 742, in f
    return func(*args, **kwargs)
  File "wcs/sql.py", line 5141, in mark_cron_status
    conn, cur = get_connection_and_cursor()
  File "wcs/sql.py", line 620, in get_connection_and_cursor
    cur = conn.cursor()

effectivement si on a plus de base, il sera difficile de marquer la tâche comme terminée :/ On a le choix soit on attend un peu, soit on pose une pierre tombale ailleurs (genre dans /var/lib/wcs/tenants/<tenant>/cron-crashed) pour récupérer ça au prochain cron.

History

#2

Updated by Benjamin Dauvergne 5 days ago

Autre approche :
  • ajouter une colonne hearbeat : datetime.
  • régulièrement pendant les jobs appeler un update_cron_hearbeat() pour dire que ça tourne toujours
  • changer la condition à now() - heartbeat > 10 minutes
  • sur un update_cron_hearbeat() si la condition est déjà fausse, crasher proprement (ça veut dire qu'on avance trpo lentement)

On peut peut-être ne pas ajouter de colonne et réutiliser timestamp (code à relire).

#3

Updated by Benjamin Dauvergne about 15 hours ago

  • Assignee set to Benjamin Dauvergne
#4

Updated by Frédéric Péters about 11 hours ago

Avant de lancer quoique ce soit, il y a déjà une détection de cron anormalement coupé :

                    running += 1
                    if now() - timestamp > datetime.timedelta(days=1):
                        stalled_tenants.append(hostname)

Le sujet serait simplement de réduire ce delta ?

#5

Updated by Benjamin Dauvergne about 11 hours ago

Il faudrait mettre 20 minutes et ce sera trop court.

#6

Updated by Frédéric Péters about 10 hours ago

Quel problème à mettre, par exemple, 6 heures ? Sur le ticket pointé, ça aurait été suffisant. Et la situation (indisponibilité du serveur SQL) est suffisamment anormale et rare. (pour rester sur une correction simple).

#7

Updated by Benjamin Dauvergne about 10 hours ago

  • Assignee deleted (Benjamin Dauvergne)

Frédéric Péters a écrit :

Quel problème à mettre, par exemple, 6 heures ? Sur le ticket pointé, ça aurait été suffisant. Et la situation (indisponibilité du serveur SQL) est suffisamment anormale et rare. (pour rester sur une correction simple).

Dans ce cas particulier c'est ok, dans plein d'autres qui demanderont qu'un truc arrive pendant ces 6h ça ne conviendra pas. Je laisse ce ticket.

#8

Updated by Frédéric Péters about 10 hours ago

  • Assignee set to Frédéric Péters

demanderont qu'un truc arrive pendant ces 6h ça ne conviendra pas

On n'a jamais offert de garantie sur l'exécution, avant la parallélisation des cron on a parfois été bien au-delà des 6 heures, donc perso je doute de ça.

Et ok pour faire moi-même le patch simple.

#9

Updated by Gitea (Bot) Gitea about 8 hours ago

  • Status changed from Nouveau to Solution proposée

Frédéric Péters (fpeters) a ouvert une pull request sur Gitea concernant cette demande :

#10

Updated by Gitea (Bot) Gitea about 8 hours ago

  • Status changed from Solution proposée to Solution validée

Emmanuel Cazenave (ecazenave) a approuvé une pull request sur Gitea concernant cette demande :

Also available in: Atom PDF