Arnold Galovics created FINERACT-2925:
-----------------------------------------

             Summary: Start COB catch-up after a replayed Loan COB or Working 
Capital COB run
                 Key: FINERACT-2925
                 URL: https://issues.apache.org/jira/browse/FINERACT-2925
             Project: Apache Fineract
          Issue Type: Improvement
            Reporter: Arnold Galovics
            Assignee: Arnold Galovics


✅ Acceptance Criteria
• With fineract.job.execute-missed-runs on, when a Loan COB run finishes 
COMPLETED and loans are lagging, the existing catch-up 
(COBCatchUpExecutorHelper, the same path as /loans/catch-up) starts and the 
loans reach the current COB date. On a normal night nothing extra starts.
• Working Capital COB behaves the same.
• Ordering: a Liquibase changeset puts the business date, COB date, Loan COB 
and Working Capital COB jobs in one scheduler_group greater than 0 (single 
thread), and ScheduledJobDetailRepository#findAllJobs orders by task_priority 
desc, id. A unit test with real in-memory Quartz asserts the replayed 
business-date runs happen before COB.
• Unit tests for the listener cover: flag off, job not COMPLETED, catch-up 
already running, lagging versus up to date.
• The grouping is documented in batch-jobs.adoc.
 
📘 Background
• A regular Loan COB run only picks loans with last_closed_business_date = 
COB_DATE-1 or NULL (RetrieveAllNonClosedIdServiceImpl), so one replayed run 
leaves loans that are more than one day behind still lagging.
• Catch-up (AsyncCommonCOBExecutorService) runs one COB per lagging day and 
reads COB_DATE once when it starts. If it starts before the business date has 
caught up, it stops at the old date.
• Seed data puts every job in scheduler_group 0, the shared 7-thread tenant 
pool, so business date and COB run concurrently. task_priority does not 
serialize them, and inside a single-thread group the order comes from 
nextFireTime with priority only breaking ties.
 
ℹ️ Notes
• Depends on the missed-runs ticket for the flag.
• With the flag on, the helper's unlockHardLockedLoans() releases loans that 
failed COB and they are retried every night. One stuck old loan makes catch-up 
iterate every day since its date.
• A shared group serializes Loan COB and Working Capital COB and delays the 
next midnight fires. The business-date job still fires each missed date (IGNORE 
policy).
• The changeset changes the default scheduler_group for every deployment; open 
to a documentation-only alternative if reviewers prefer.
 
🔧 Technical Notes
• Hook: an after-job listener (FineractCOBAfterJobListener, one subclass each 
for Loan COB and Working Capital COB, in the cob.listener package, conditional 
like the catch-up services) calling COBCatchUpExecutorHelper unchanged when the 
flag is on and the execution is COMPLETED. After a regular run, loans that were 
one day behind are at COB_DATE, so catch-up only starts for loans genuinely 
behind, and the regular run has finished so they do not overlap.
• Rejected: a before-job hook. The helper starts catch-up whenever the oldest 
loan date is not COB_DATE, which is the normal state at the start of a nightly 
run, and IS_CATCH_UP is not yet in the execution context at beforeJob.
• Recursion is not possible: while a catch-up run's afterJob executes its row 
is still STARTED, so isCatchUpRunning() is true and the helper answers 400.
• Fallback if the async hook proves racy: a synchronous before-hook that 
catches up to COB_DATE-1, skipping catch-up runs through isCatchUpRunning().
• To confirm by a local run: replay-then-COB order with real fires in one 
group, and Working Capital COB behaving the same.



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

Reply via email to