URGENT - Blocage intempestif de processus

Bonjour,

nous rencontrons le problème suivant qui est bloquant et nous empêche de mettre en production les processus que nous avons développés.

Contexte :

- utilisation de Bonita Community Edition 2021.1
- installation sur serveur Windows et BDD Bonita sur SqlServer 15.0.2080.9 (environnement de Qualification/Pré-production)

Processus concerné :

- il est composé d'un processus principal destiné à enchaîner des traitements exécutés sur un logiciel externe. Il appelle deux sous-processus :
    - un sous-processus lancé 1 fois, qui déclenche sur le logiciel externe le chargement d'un fichier de données, via une API REST
    - un sous-processus lancé n fois, qui déclenche sur le logiciel externe le traitement fourni en paramètre d'appel, également via une API REST

- Les 2 sous-processus sont construits de manière similaire :

- une tâche déclenche l'API REST concernée ; cette tâche se termine par des opérations de mise à jour de données métier qui seront retournées au processus appelant
- une boucle de vérification de l'état du traitement externe, composée des éléments suivants

- une activité automatique qui appelle une API REST ad hoc ; cette tâche comporte également des opération en sortie, de mise à jour des données métier
- une porte qui teste le retour d'appel de l'API ainsi que le retour du logiciel externe, et déroule si nécessaire vers une gestion d'erreur
- une porte qui teste l'état du traitement externe, récupéré précedemment, et qui permet de rester dans la boucle tant que l'état du traitement est "Running"
- une porte "timeout" qui contrôle le nombre d'itérations et permet de sortir si on dépasse 120 itérations
- un événement minuterie qui permet d'attente 30 secondes avant de repartir sur l'activité ci-dessus.

- en sortie de boucle, une ou deux tâches automatiques, selon le sous-processus, permettent de récupérer via les API Rest appropriées, les infos produites par le logiciel externe : liste de fichiers générés par ce dernier (on ne récupère pas les fichiers, mais un lien URL permettant leur téléchargement si nécessaire), liste des erreurs de traitement

Le problème :

- le sous-processus de "chargement des données" se bloque assez régulièrement dans la boucle, après plusieurs itérations, après la porte Timeout et avant l'activité automatique d'appel de l'API Rest (Nous avons placé des traces dans les logs de Bonita et du logiciel externe qui nous ont permis de constater que l'API REST n'a pas été déclenchée).

- dans la log Bonita, juste après la dernière trace générée (sur le test de la porte Timeout), on a le message suivant :
    19-Jul-2021 16:26:37.596 WARNING [Bonita-Worker-1-08] org.bonitasoft.engine.log.technical.TechnicalLoggerSLF4JImpl.log THREAD_ID=79 | HOSTNAME=srv-sinv77 | TENANT_ID=1 | Work was not executed because preconditions were not met, WorkDescriptor[uuid=468d2977-ddd6-43e1-8fb9-b74d0b10246d,type=EXECUTE_FLOWNODE,tenantId=1,parameters={processDefinitionId=6952094303348697542, processInstanceId=8100, stateCanceling=false, stateExecuting=false, stateId=0, stateAborting=false, flowNodeInstanceId=164358},retryCount=0,executionThreshold=<null>,executionCount=1,registrationDate=2021-07-19T14:26:37.437890900Z,abnormalExecutionDetected=false] : Flow node 164358 does not exists
  Après ce message, il n'y a plus rien concernant le cas concerné.

- il nous a d'abord semblé que cela se produisait lorsque plusieurs cas tournaient simultanément, mais cela est arrivé également avec un seul cas en cours.

- A noter que les cas bloqués se débloquent en général tout seuls au bout d'environ 2 heures, et poursuivent leur chemin "normalement" jusqu'à la fin du processus
- A noter enfin que nous n'avons jamais rencontré ce problème sur l'environnement de développement qui utilise la BDD H2 fournie par défaut par Bonita

Si nécessaire, nous pouvons vous transmettre les exports .bos des processus & sous-processus concernés.

Nous avons enfin trouvé l'origine du problème.

Dans la documentation en ligne, dans https://documentation.bonitasoft.com/bonita/2021.1/database-configuration, il est indiqué explicitement que dans le cas d'une installation de la BDD sur SqlServer, pour empêcher les deadlocks, il faut exécuter :

ALTER DATABASE BONITA SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE BONITA SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE BONITA SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE BONITA SET MULTI_USER

Or pour résoudre notre problème, nous avons dû positionner READ_COMMITTED_SNAPSHOT à OFF

Et là, nous n'avons plus de blocage.

Bonjour,

Je pense que vous faite face à un problème connu que nous rencontrons avec ce niveau d'isolation lors de l'exécution de transactions ayant plusieurs ressources XA (modification du BDM et des données de bonita)

Positionner READ_COMMITTED_SNAPSHOT à OFF reviens à diminuer le niveau d'isolation de la base de donné. cf https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server#snapshot-isolation-level-extensions

Baisser ce niveau d'isolation fonctionne mais Bonita a été conçu pour fonctionner avec un niveau d'isolation SNAPSHOT et nous ne pouvons donc pas garantir que ce niveau d'isolation pus bas n'aura pas d'impact sur la consistance des données

Le problème source vient du fait que dans cette configuration (XA + Snapshot isolation), il semble que SQL Server ne rend pas les donnés lisibles immédiatement après le commit de la transaction (quelques millisecondes plus tard). Une solution de contournement à été introduite dans la prochaine version 2021.2 du produit permettant d'ajouter un délai minimum entre l'exécution de 2 "work" consécutifs traitant le même process instance.

cf https://github.com/bonitasoft/bonita-engine/commit/50178a7f7fcd8505424038612b8b157baf152963 

HTH,

Contents que vous ayez pu résoudre le problème et merci pour l'information complémentaire. Nous allons prendre en compte ce point et mettre à jour la documentation le cas échéant.