Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Polyflow task sync sometimes not working #1251

Closed
simonhir opened this issue Jan 29, 2024 · 30 comments
Closed

Polyflow task sync sometimes not working #1251

simonhir opened this issue Jan 29, 2024 · 30 comments
Assignees
Labels
bug Something isn't working digiwf-task internal

Comments

@simonhir
Copy link
Member

simonhir commented Jan 29, 2024

Very rarely it occurs that engine task changes are not correctly represented in polyflow. That means that tasks are not created or not closed.

Observations with below example

  • Task and process has been completed in engine
  • TaskCompletedEngineEvent correctly in COMAIN_EVENT_ENTRY table in engine db
  • Task still present in plf_task table in tasklist db

Acceptance criteria

  • All events are correctly represented in the tasklist

Reference

@simonhir simonhir added bug Something isn't working digiwf-task labels Jan 29, 2024
@simonhir simonhir self-assigned this Jan 29, 2024
@simonhir
Copy link
Member Author

image.png

Problem seems to be that a older message when sorted via timestamp has a lower global_index. The task so was closed and then recreated by the assign event.

@simonhir
Copy link
Member Author

For above mentioned incident the solution was to manually delete the task with all correlating data.

@simonhir
Copy link
Member Author

simonhir commented Feb 2, 2024

image.png

Problem reoccurred but this time the timestamps and global_index are not in conflicting order. Seems to be not the reason for the problem.

@simonhir
Copy link
Member Author

simonhir commented Feb 2, 2024

image.png

Reoccurred but this time the task was not created in the tasklist.

@zambrovski zambrovski self-assigned this Feb 8, 2024
@zambrovski
Copy link
Contributor

We need more metrics in prometheus to detect the occurencies.

StephanStrehlerCGI added a commit that referenced this issue Feb 12, 2024
zambrovski added a commit that referenced this issue Feb 19, 2024
* ongoing metrics redefinition

* configured kafka-ui, resorted services

* change visibility

* wip: new gauge

* new logging

* more logging

* #1251: move event EventMessageCountingMonitor setup to constructor. add /actuator/prometheus to permitted paths

* create additional metrics for tasks, reduce loggingin integration itests

* confgured monitoring

* tasklist service fix prometheus path

* remove unnneded config

* rename metric to match the sender side

* rename label

---------

Co-authored-by: stephan.strehler <[email protected]>
Co-authored-by: Simon Hirtreiter <[email protected]>
@darenegade
Copy link
Member

Wartet auf #1229, um den Fehler einzugrenzen

simonhir added a commit that referenced this issue Feb 23, 2024
* ongoing metrics redefinition

* configured kafka-ui, resorted services

* change visibility

* wip: new gauge

* new logging

* more logging

* #1251: move event EventMessageCountingMonitor setup to constructor. add /actuator/prometheus to permitted paths

* create additional metrics for tasks, reduce loggingin integration itests

* confgured monitoring

* tasklist service fix prometheus path

* remove unnneded config

* rename metric to match the sender side

* rename label

---------

Co-authored-by: stephan.strehler <[email protected]>
Co-authored-by: Simon Hirtreiter <[email protected]>
simonhir added a commit that referenced this issue Feb 23, 2024
* Feature/monitoring (#1306)

* ongoing metrics redefinition

* configured kafka-ui, resorted services

* change visibility

* wip: new gauge

* new logging

* more logging

* #1251: move event EventMessageCountingMonitor setup to constructor. add /actuator/prometheus to permitted paths

* create additional metrics for tasks, reduce loggingin integration itests

* confgured monitoring

* tasklist service fix prometheus path

* remove unnneded config

* rename metric to match the sender side

* rename label

---------

Co-authored-by: stephan.strehler <[email protected]>
Co-authored-by: Simon Hirtreiter <[email protected]>

* configurble metrics, fix #1338 (#1353)

* configurble metrics, fix #1338

* Update digiwf-engine/digiwf-engine-service/src/main/resources/application.yml

Co-authored-by: Simon Hirtreiter <[email protected]>

* Update digiwf-libs/digiwf-camunda-prometheus/digiwf-camunda-prometheus-starter/src/main/java/de/muenchen/oss/digiwf/camunda/prometheus/MetricsProviderSchedulerAutoConfiguration.java

Co-authored-by: Simon Hirtreiter <[email protected]>

* Update digiwf-libs/digiwf-camunda-prometheus/digiwf-camunda-prometheus-starter/src/main/java/de/muenchen/oss/digiwf/camunda/prometheus/CamundaPrometheusProperties.java

Co-authored-by: Simon Hirtreiter <[email protected]>

---------

Co-authored-by: Simon Hirtreiter <[email protected]>

---------

Co-authored-by: Simon Zambrovski <[email protected]>
Co-authored-by: stephan.strehler <[email protected]>
markostreich added a commit that referenced this issue Feb 29, 2024
* #881 move types folder

* #881 update types in package.json

* chore: bump release version (#1289)

* chore: mvn auto version bump to 1.7.2-SNAPSHOT

* v1.7.2

---------

Co-authored-by: DigiWF Github Bot <[email protected]>

* fix components.d.ts

* Fix: DMS-Input returns COOs

* chore: bump release version (#1342)

* chore: mvn auto version bump to 1.7.4-SNAPSHOT

* v1.7.4

---------

Co-authored-by: DigiWF Github Bot <[email protected]>

* chore: bump release version (#1344)

* chore: mvn auto version bump to 1.7.5-SNAPSHOT

* v1.7.5

---------

Co-authored-by: DigiWF Github Bot <[email protected]>

* Feature/metrics for 1.7 release (#1356)

* Feature/monitoring (#1306)

* ongoing metrics redefinition

* configured kafka-ui, resorted services

* change visibility

* wip: new gauge

* new logging

* more logging

* #1251: move event EventMessageCountingMonitor setup to constructor. add /actuator/prometheus to permitted paths

* create additional metrics for tasks, reduce loggingin integration itests

* confgured monitoring

* tasklist service fix prometheus path

* remove unnneded config

* rename metric to match the sender side

* rename label

---------

Co-authored-by: stephan.strehler <[email protected]>
Co-authored-by: Simon Hirtreiter <[email protected]>

* configurble metrics, fix #1338 (#1353)

* configurble metrics, fix #1338

* Update digiwf-engine/digiwf-engine-service/src/main/resources/application.yml

Co-authored-by: Simon Hirtreiter <[email protected]>

* Update digiwf-libs/digiwf-camunda-prometheus/digiwf-camunda-prometheus-starter/src/main/java/de/muenchen/oss/digiwf/camunda/prometheus/MetricsProviderSchedulerAutoConfiguration.java

Co-authored-by: Simon Hirtreiter <[email protected]>

* Update digiwf-libs/digiwf-camunda-prometheus/digiwf-camunda-prometheus-starter/src/main/java/de/muenchen/oss/digiwf/camunda/prometheus/CamundaPrometheusProperties.java

Co-authored-by: Simon Hirtreiter <[email protected]>

---------

Co-authored-by: Simon Hirtreiter <[email protected]>

---------

Co-authored-by: Simon Zambrovski <[email protected]>
Co-authored-by: stephan.strehler <[email protected]>

* chore: bump release version (#1358)

* chore: mvn auto version bump to 1.7.6-SNAPSHOT

* v1.7.6

---------

Co-authored-by: DigiWF Github Bot <[email protected]>

* chore: bump release version (#1371)

* chore: mvn auto version bump to 1.8.0-SNAPSHOT

* v1.8.0

---------

Co-authored-by: DigiWF Github Bot <[email protected]>

---------

Co-authored-by: stephan.strehler <[email protected]>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: DigiWF Github Bot <[email protected]>
Co-authored-by: darenegade <[email protected]>
Co-authored-by: Simon Hirtreiter <[email protected]>
Co-authored-by: Simon Zambrovski <[email protected]>
@simonhir
Copy link
Member Author

simonhir commented Mar 1, 2024

@zambrovski im Rahmen von #1392 habe ich auf Processes-Hotfix einen Reimport angestoßen, dabei ist mir folgendes aufgefallen:

  • Ausgangszustand: In der Engine existieren 6 Tasks mehr als in der Tasklist (Engine: 120, Tasklist: 114)
  • Beim Import wird für jeden Task in der Engine (120) ein Axon Event gesendet und Empfangen, jedoch erhöht sich die Anzahl in der Tasklist nicht
  • Im Log der Tasklist sind keine Fehler erkennbar

image.png

Sieht für mich so aus, wie wenn die Taskliste also für manche Events nichts ändert und das an den Tasks selbst zu liegen scheint, weil ja die gleichen immer wieder ignoriert werden, so wie es aussieht.
Die entsprechenden Tasks sind hier verlinkt: #1392 (comment)

@zambrovski
Copy link
Contributor

Hat sich nicht bestätigt... Verbessertes logging eingebaut und mit Polyflow 4.1.4 released. Ist eingebaut und wir schauen, was nun passiert

@darenegade
Copy link
Member

Problem konnte durch einen koordinierten Lasttest nicht mehr reproduziert werden und ist auch schon länger nicht mehr aufgetreten.

Wir richten einen Alert ein auf den Processes-* und Prod. Bis das Problem wieder aufkommt, wird das Ticket erstmal geschlossen

@simonhir
Copy link
Member Author

Aufgetreten auf Processes-Test für Instanz ecb94808-e82a-11ee-8b4a-0a580a8a27ad mit Task 9ef184d3-e82b-11ee-90eb-0a580a8a319e:

Verhalten war hier, dass die Engine in dem Moment gecrasht hat, das führte zu folgender Fehlermeldung. Wie man aus der Fehlermeldung schließen kann wurde in diesem Fall gar kein Axon-Event erzeugt.

Log

2024-03-22T10:07:38.741

org.axonframework.commandhandling.NoHandlerForCommandException: No handler was subscribed for command [io.holunda.camunda.taskpool.api.task.CreateTaskCommand].
	at org.axonframework.commandhandling.SimpleCommandBus.doDispatch(SimpleCommandBus.java:167)
	at org.axonframework.commandhandling.SimpleCommandBus.lambda$dispatch$1(SimpleCommandBus.java:131)
	at org.axonframework.tracing.Span.run(Span.java:101)
	at org.axonframework.commandhandling.SimpleCommandBus.dispatch(SimpleCommandBus.java:125)
	at org.axonframework.commandhandling.gateway.AbstractCommandGateway.send(AbstractCommandGateway.java:76)
	at org.axonframework.commandhandling.gateway.DefaultCommandGateway.send(DefaultCommandGateway.java:83)
	at io.holunda.polyflow.taskpool.sender.gateway.AxonCommandListGateway.sendToGateway(AxonCommandListGateway.kt:31)
	at io.holunda.polyflow.taskpool.sender.task.DirectTxAwareAccumulatingEngineTaskCommandSender.send(DirectTxAwareAccumulatingEngineTaskCommandSender.kt:27)
	at io.holunda.polyflow.taskpool.sender.task.TxAwareAccumulatingEngineTaskCommandSender$send$2.beforeCommit(TxAwareAccumulatingEngineTaskCommandSender.kt:46)
	at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:97)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:916)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:727)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711)
	at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:152)
	at org.camunda.bpm.engine.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:71)
	at org.camunda.bpm.engine.impl.interceptor.ProcessApplicationContextInterceptor.execute(ProcessApplicationContextInterceptor.java:70)
	at org.camunda.bpm.engine.impl.interceptor.CommandCounterInterceptor.execute(CommandCounterInterceptor.java:35)
	at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:33)
	at org.camunda.bpm.engine.impl.interceptor.ExceptionCodeInterceptor.execute(ExceptionCodeInterceptor.java:55)
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobHelper.executeJob(ExecuteJobHelper.java:57)
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.executeJob(ExecuteJobsRunnable.java:110)
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:71)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:840)

@darenegade darenegade reopened this Mar 22, 2024
@darenegade darenegade assigned simonhir and unassigned zambrovski Mar 22, 2024
@darenegade
Copy link
Member

darenegade commented Mar 22, 2024

Scheint eine Race-Condition beim Gracefull-Shutdown vorzuliegen, da der Handler für CreateTaskCommand existiert an sich, da es sonst gar nicht gehen würde

@darenegade
Copy link
Member

Änderung zum Graceful-Shutdown:
#1207

@simonhir
Copy link
Member Author

simonhir commented Mar 25, 2024

Entsprechendes Axon-Issue dazu: AxonFramework/AxonFramework#891
Muss mal noch schauen ab welcher Version das behoben ist und ob es eigentlich schon gehen müsste

@darenegade
Copy link
Member

darenegade commented Mar 25, 2024

Muss mal noch schauen ab welcher Version das behoben ist und ob es eigentlich schon gehen müsste

Hatte ich schon geprüft. Axon hat das seit 4.3 und wir nutzen 4.9.

Wo ich noch nicht sicher bin, ist ob es richtig bei uns integriert ist, sodass dies auch greift und ob das auch Polyflow richtig unterstützt.

@simonhir
Copy link
Member Author

Aktueller Stand: Events werden immer korrekt in die DOMAIN_EVENT_ENTRY Tabelle geschrieben, aber von dort nicht an die Tasklist weitergeleitet

@darenegade
Copy link
Member

@simonhir
Copy link
Member Author

Debugging durch setzen des Tokens auf einen vergangen Wert um das erneute senden der Events auszulosen.

select processor_name, to_char(token) from token_entry where processor_name = 'de.muenchen.oss.digiwf.task.polyflow.kafka';


update token_entry set token = to_blob( utl_raw.cast_to_raw('{"index":1010650,"gaps":[]}')) where processor_name = 'de.muenchen.oss.digiwf.task.polyflow.kafka';
commit;

Fehlende Tasks werden immer noch nicht angelegt.

1 similar comment
@simonhir
Copy link
Member Author

Debugging durch setzen des Tokens auf einen vergangen Wert um das erneute senden der Events auszulosen.

select processor_name, to_char(token) from token_entry where processor_name = 'de.muenchen.oss.digiwf.task.polyflow.kafka';


update token_entry set token = to_blob( utl_raw.cast_to_raw('{"index":1010650,"gaps":[]}')) where processor_name = 'de.muenchen.oss.digiwf.task.polyflow.kafka';
commit;

Fehlende Tasks werden immer noch nicht angelegt.

@zambrovski
Copy link
Contributor

zambrovski commented Mar 28, 2024

Aktuelle Diagnose

Der global_index und timestamp sind nicht konsistent in der domain_event_entry - es tauchen Events mit einer höherem Index zeitlich "VOR" den Events mit kleineren Nummern. Das füht dazu das TEP nicht richtig die Events ans Kafka liefert, was zur Diskrepanz zwischen der Engine und tasklist führt.

Grund

Die Verwendung von JPA/Hibernate default sequence increment von 50 führt zu diesem Verhalten bei mehr als einem Knoten.

Behebung

  • INCREMENT BY in DOMAIN_EVENT_ENTRY_SEQ auf 1 setzen (in DB)
  • set property in Spring: spring.jpa.properties.hibernate.id.optimizer.pooled.preferred=none

Mehr details

Weitere Hinweise

  • Falls es doch nicht so klapped habe ich auch gelesen, dass es einen hibernate.id.optimizer.pooled.preferred=org.hibernate.id.enhanced.NoopOptimizer gibt... Vielleicht hilft der dann.

@darenegade
Copy link
Member

  • Pods runterfahren
  • In DB:
ALTER SEQUENCE domain_event_entry_seq
INCREMENT BY 1;
  • Config hinzufügen:
    SPRING_JPA_PROPERTIES_HIBERNATE_ID_OPTIMIZER_POOLED_PREFERRED = none

  • Pods hochfahren

@markostreich
Copy link
Contributor

@zambrovski @darenegade müssen domain_event_entry_seq und global_index auch noch angeglichen werden?
Sie sind gerade 878 Werte auseinander gedriftet.

@darenegade
Copy link
Member

Lass uns das als PN kurz besprechen. Falls du auf die Demo geschaut hast, darfst du den Werten dort nicht trauen, da ich aktuell ein paar Tests für den HotFix mache

@darenegade
Copy link
Member

darenegade commented Apr 2, 2024

Änderung wurde auf Demo ausgerollt und getestet. Grundsätzlich funktioniert die Config und Tasks werden synchronisiert. Die alten Fälle lassen sich damit natürlich nicht mehr "heilen", da die Reihenfolge nicht korrigiert ist. Man kann dies aber manuell beheben und dann passt es wieder.

Hier eine Query um die Fälle herauszufinden:

SELECT count(*) FROM domain_event_entry t1 
INNER JOIN domain_event_entry t2 
ON t1.aggregate_identifier = t2.aggregate_identifier 
WHERE t1.TIME_STAMP < t2.TIME_STAMP 
AND t1.GLOBAL_INDEX > t2.GLOBAL_INDEX
AND t1.payload_type='io.holunda.camunda.taskpool.api.task.TaskCreatedEngineEvent'
AND (
    t2.payload_type='io.holunda.camunda.taskpool.api.task.TaskCompletedEngineEvent' 
    OR
    t2.payload_type='io.holunda.camunda.taskpool.api.task.TaskDeletedEngineEvent'
    )
order by t1.TIME_STAMP ASC;

Anzahl Fälle:

Prod: 1272
Proc-Test: 949
Proc-Demo: 242

@darenegade
Copy link
Member

Fix ausgerollt auf Processes-*. Nun warten auf Rückmeldung, ob das Problem damit behoben...

@darenegade
Copy link
Member

darenegade commented Apr 2, 2024

Ansonsten ist die Lösung noch etwas wackelig, was eine Neuinstallation oder so angeht. Da wird der INCREMENT BY wieder standardmäßig auf 50 gesetzt. Das müssten wir noch anpassen.

Siehe: #1097

Update: Hier angepasst #1527

@darenegade
Copy link
Member

darenegade commented Apr 2, 2024

Falls es doch nicht so klapped habe ich auch gelesen, dass es einen hibernate.id.optimizer.pooled.preferred=org.hibernate.id.enhanced.NoopOptimizer gibt... Vielleicht hilft der dann.

none sollte eigentlich den NoopOptimizer setzen, womit diese Config gleichwertig wäre
https://docs.jboss.org/hibernate/orm/5.5/javadocs/org/hibernate/id/enhanced/StandardOptimizerDescriptor.html#NONE

@darenegade
Copy link
Member

@simonhir Wir müssen das Monitoring auch unbedingt wieder aktivieren. Aktuell kann man auf keiner Umgebung die Daten für die Engine sehen

@darenegade darenegade mentioned this issue Apr 5, 2024
7 tasks
@simonhir
Copy link
Member Author

simonhir commented Apr 10, 2024

Unterschied der mir auf dev im Gegensatz zu processestraining aufgefallen ist:

  • dev: gleicher User für beide Schemata
  • processestraining: unterschiedlicher User je Schema

Hab mit REQ0682591 eine Anpassung von dev auf den gleichen Zustand beantragt um das auszuschließen. Denke aber es könnte schon daran liegen.

@simonhir
Copy link
Member Author

Aufsplitten zu zwei separaten PostgreSQL-Usern für Engine und Tasklist hat das Problem wie oben vermutet behoben.

@simonhir simonhir reopened this Apr 17, 2024
@simonhir
Copy link
Member Author

Nach erneuten Fehlern merke: In Zukunft Schema neu anlegen lassen anstatt auf neuen User zu übertragen

Fehler danach behoben

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working digiwf-task internal
Projects
None yet
Development

No branches or pull requests

4 participants