Details
Description
The "Provision Paid Pending Services" automation tasks runs every 5 minutes by default to provision paid pending services. A paid pending service is considered paid if any linked invoices are paid. If there are no linked invoices, it's considered paid.
During order, the service is created first, then the invoice. If there is a delay between service and invoice creation, and the automation task runs between this delay, a service may be provisioned though it has not been paid since the invoice was not yet created.
I'm not sure what the right solution is here. Ideally, I suppose, it'd be great if there were some kind of "lock" put on a service that is released once the invoice has been generated, and then the automation task ignores services that are locked. Or, a delay in provisioning paid pending services to allow sufficient time for an invoice to be generated, though that is arbitrary.
Activity
| Field | Original Value | New Value |
|---|---|---|
| Rank | Ranked higher |
| Security | Private [ 10000 ] |
| Sprint | 4.3.0 Sprint 3 [ 53 ] |
| Rank | Ranked higher |
| Summary | Unpaid pending services may be activate under certain circumstances | Unpaid pending services may be activated under certain circumstances |
| Fix Version/s | 4.2.2 [ 11021 ] | |
| Fix Version/s | 4.3.0-b1 [ 11019 ] | |
| Fix Version/s | Short Term [ 10800 ] |
| Assignee | Tyson Phillips [ tyson ] |
| Remaining Estimate | 0 minutes [ 0 ] | |
| Time Spent | 38 minutes [ 2280 ] | |
| Worklog Id | 10708 [ 10708 ] |
Automated transition triggered when Tyson Phillips (Inactive) created a branch in Stash -
| Status | Open [ 1 ] | In Progress [ 3 ] |
Automated transition triggered when Tyson Phillips (Inactive) created pull request #395 in Stash -
| Status | In Progress [ 3 ] | In Review [ 5 ] |
| Resolution | Fixed [ 1 ] |
| Time Spent | 38 minutes [ 2280 ] | 1 hour, 42 minutes [ 6120 ] |
| Worklog Id | 10716 [ 10716 ] |
Automated transition triggered when Tyson Phillips (Inactive) merged pull request #395 in Stash -
| Status | In Review [ 5 ] | Closed [ 6 ] |
A good solution to this would be to have the entire process of the service + invoice creation be in a database transaction. The problem, however, is that there already exists transactions that occur in parts of the process when adding/updating services and when adding invoices, and since you can't have nested database transactions, we would have to refactor the process. I already had plans to refactor models in CORE-2430, which is where this could be resolved.
How often does this occur? An order has to be placed at exactly the right time such that between when the service is created and the invoice is created the cron happens to run the provision paid pending services task to fetch those services. While possible, that race condition seems like a shot in the dark, and I'm sure there would be other race conditions with similar undesired effects.
We could delay the provision paid pending services task as you suggested by some arbitrary amount of time, and that may reduce the frequency tremendously, although it will still be possible to encounter the issue. That would probably be alright in the interim.