Comment stopper une boucle infinie ?

Il peut arriver qu’une instance de processus K2 soit bloquée dans une boucle infinie. La raison ? Des conditions mal gérées entre deux activités, des branchements erronés, des appels récursifs d’un sous-processus sans étape humaine etc.

Nous allons donc voir dans ce billet comment se sortir de cette situation qui peut aboutir à une saturation complète du serveur. Rassurez-vous cependant, à moins de travailler directement sur un environnement de production, ceci n’arrive que sur des environnements de développement suite à des publications hasardeuses .

Qu’est-ce qui caractérise une boucle infinie ?

Une boucle infinie est une instance du processus qui reste perpétuellement dans le statut Running.
Ce statut est habituellement celui d’une tâche utilisateur en cours de création ou celui d’un traitement assez long (quelques secondes tout au plus). Le processeur du serveur K2 est lourdement sollicité pendant ce laps de temps.

Lorsque la tâche entre dans une boucle infinie, la consommation du processeur augmente fortement ce qui peut entraîner un blocage total du serveur K2 mais aussi de la machine physique, qui devient alors complètement saturée et donc inutilisable. Si un redémarrage est effectué, que ce soit Windows ou le service K2, pour tenter de stopper cette boucle, aucune amélioration ne sera observée car la tâche K2 va reprendre son exécution immédiatement et les ressources vont à nouveau être utilisées jusqu’à saturation.

Voici les étapes à suivre pour stopper une boucle infinie :

  1. Arrêter le service K2 blackpearl. Cette interruption empêchera la création de nouvelles instances du processus qui génère la boucle.
    Stop service K2
  2. Accéder à la base de données K2 depuis Microsoft SQL Server Management Studio.
  3. Exécuter la requête SQL suivante :
USE [K2];
GO
SELECT *
FROM [Server].[ProcInst]
WHERE [Status] = 1
GO
  1. Le résultat devrait être de la forme suivante :
  2. Identifier la valeur du champ ID de l’instance en état running (colonne ID).
  3. Mettre à jour la table [Server].[ProcInst] grâce à la requête suivante (le statut “0” correspond au statut Error qui stoppera l’exécution de l’instance) :
USE [K2];
GO

UPDATE [Server].[ProcInst]
SET [Status] = 0
WHERE [ID] = 32
GO

 ATTENTION : toute exécution de requête SQL visant à modifier la base de données K2, en particulier sur un serveur de production, doit être précédée des actions suivantes :

  • sauvegarde complète de la base de données K2,
  • validation de la requête par le support K2.
  1. Redémarrer le service K2 blackpearl.

Ainsi, l’instance concernée sera affichée avec le statut Error et ne consommera plus de ressources au niveau du serveur.

Note : ne pas supprimer l’instance concernée permet d’analyser les causes de la boucle (valeurs des datafields, suivi graphique, données contextuelles, etc ..)

Quelques cas similaires mais différents

Il peut être possible d’avoir une boucle infinie générée par une instance de processus qui déclenche un sous processus de manière récursive. Dans ce cas, il y a 2 options :

  1. Soit l’instance mère est en attente de la fin de l’instance fille et dans ce cas, il n’y aura qu’une instance qui sera en running. La procédure à suivre sera la même sauf qu’il sera nécessaire de faire un peu de ménage (beaucoup d’instances de processus auront été créées pour rien).
  2. Soit l’instance mère boucle sur la création de l’instance fille et dans ce cas, il y aura un grand nombre d’instances en running. Il faudra donc récupérer la liste de tous les ID qui sont en running (étape 4 ci-dessus) pour tous les désactiver (étape 5). C’est typiquement le cas où il est indispensable d’arrêter le service K2 sous peine de voir des instances filles démarrer indéfiniment.

benoit

Customer Success Manager depuis presque 5 ans, traite les tickets supports et participe à la vie du blog.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.