You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@fineract.apache.org by "Arnold Galovics (Jira)" <ji...@apache.org> on 2026/10/11 18:19:00 UTC

[jira] [Created] (FINERACT-2918) Scheduler resume replays misfired jobs asynchronously, then saves a future next_run_time, so the replay vetoes itself

Arnold Galovics created FINERACT-2918:
-----------------------------------------

             Summary: Scheduler resume replays misfired jobs asynchronously, then saves a future next_run_time, so the replay vetoes itself
                 Key: FINERACT-2918
                 URL: https://issues.apache.org/jira/browse/FINERACT-2918
             Project: Apache Fineract
          Issue Type: Bug
            Reporter: Arnold Galovics
            Assignee: Arnold Galovics


📋 JIRA Bug Preview 1/5
─────────────────────────────────────
Project:   FINERACT - Apache Fineract
Type:      Bug
Summary:   Scheduler resume replays misfired jobs asynchronously, then saves a future next_run_time, so the replay vetoes itself

🐛 Steps to Reproduce
  1. Fineract 1.15.0 (or develop), scheduler_detail.execute_misfired_jobs = true (the default).
  2. Give an active job a 1-minute cron (e.g. Update Loan Arrears Ageing).
  3. POST /scheduler?command=stop.
  4. Wait for a few cron fires, so the job has is_misfired = true.
  5. POST /scheduler?command=start.
  6. Check the job run history and the next_run_time / is_misfired columns of the job.

❌ Actual Result
  • The replay is vetoed and the job does not run (ran in 1 of 13 attempts on 1.15.0).
  • is_misfired is cleared anyway, so the record of the missed run is lost.

✅ Expected Result
  • Each misfired active job runs once on resume, then is_misfired is cleared.

ℹ️ Notes
  • Reproduced on 1.15.0 (bootJar, Postgres). The vetoer read next_run_time about 0.6 s after it was saved.

🔧 Technical Notes
  • JobRegisterServiceImpl#startScheduler: executeJob(..., TRIGGER_TYPE_CRON) (:175) only queues the fire via scheduler.triggerJob (:122). The same thread then sets jobDetail.setNextRunTime(trigger.getNextFireTime()) (:187) and saves it.
  • SchedularWritePlatformServiceJpaRepositoryImpl#processJobDetailForExecution (:146-150) vetoes a CRON-type fire when getNextRunTime().after(new Date()).
  • Fix idea: do not advance next_run_time before the replay has claimed the job, or replay with a trigger type that is not compared against next_run_time.
─────────────────────────────────────



--
This message was sent by Atlassian Jira
(v8.20.10#820010)