elnafateh opened a new pull request, #5674:
URL: https://github.com/apache/fineract/pull/5674

   ## Description
   
   ## Overview
   This PR introduces a hybrid idempotency mechanism for command processing, 
aimed at improving reliability of retries in scenarios where clients do not 
provide an idempotency key.
   
   ## Problem
   Currently, when a request is sent without an idempotency key:
   - The system generates a random UUID.
   - On retry (e.g., network failure), a new key is generated.
   - This leads to duplicate command execution (e.g., duplicate transfers).
   
   ## Solution
   This PR implements a hybrid approach:
   
   1. Use client-provided `Idempotency-Key` header if present.
   2. Otherwise, generate a deterministic key based on:
      - Request payload
      - A configurable time bucket
   
   This ensures:
   - Same request within a short window → same idempotency key
   - Automatic deduplication without requiring client changes
   
   ## Key Changes
   - Introduced `DeterministicIdempotencyKeyGenerator`
   - Enhanced `IdempotencyKeyResolver` to:
     - Prefer header key
     - Fallback to deterministic key generation
   - Retained DB-level uniqueness constraint:
     (action_name, entity_name, idempotency_key)
   
   ## Behavior
   | Scenario | Result |
   |--------|--------|
   | Retry after network failure | Deduplicated |
   | Duplicate request within bucket | Blocked |
   | Intentional repeat after bucket | Allowed |
   | Concurrent requests | DB handles safely |
   
   ## Design Considerations
   - Avoids over-reliance on client-provided keys
   - Keeps implementation simple and backward compatible
   - Leverages existing command framework and DB constraints
   
   ## Testing
   - Verified successful deduplication on retry without header key
   - Verified DB uniqueness prevents race condition duplicates
   - Verified intentional repeat works outside time bucket
   
   ## Impact
   Improves robustness of financial operations like transfers, especially in 
unreliable network conditions.
   
   ---
   
   This contribution is part of my preparation for Google Summer of Code and 
aims to improve reliability in Fineract's command processing pipeline.
   
   ## Checklist
   
   Please make sure these boxes are checked before submitting your pull request 
- thanks!
   
   - [x ] Write the commit message as per [our 
guidelines](https://github.com/apache/fineract/blob/develop/CONTRIBUTING.md#pull-requests)
   - [ x] Acknowledge that we will not review PRs that are not passing the 
build _("green")_ - it is your responsibility to get a proposed PR to pass the 
build, not primarily the project's maintainers.
   - [ ] Create/update [unit or integration 
tests](https://fineract.apache.org/docs/current/#_testing) for verifying the 
changes made.
   - [ x] Follow our [coding 
conventions](https://cwiki.apache.org/confluence/display/FINERACT/Coding+Conventions).
   - [ ] Add required Swagger annotation and update API documentation at 
fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with 
details of any API changes
   - [ x] [This PR must not be a "code 
dump"](https://cwiki.apache.org/confluence/display/FINERACT/Pull+Request+Size+Limit).
 Large changes can be made in a branch, with assistance. Ask for help on the 
[developer mailing list](https://fineract.apache.org/#contribute).
   
   Your assigned reviewer(s) will follow our [guidelines for code 
reviews](https://cwiki.apache.org/confluence/display/FINERACT/Code+Review+Guide).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to