aglinxinyuan opened a new pull request, #7416:
URL: https://github.com/apache/texera/pull/7416
### What changes were proposed in this PR?
`onClickAbortUploadProgress` was the largest uncovered block in
`DatasetDetailComponent` and the one with the most ways to go wrong. Aborting
an in-flight upload has to survive the backend still finalizing a previous
attempt, so the abort is retried on 409:
| Response | Behaviour |
|---|---|
| success | notify, report the abort |
| 404 | already gone — report the abort, no error |
| 409, attempt < `ABORT_RETRY_MAX_ATTEMPTS` | retry after
`ABORT_RETRY_BACKOFF_BASE_MS * (attempt + 1)` |
| 409 at the limit, or any other status | give up, but still report the
abort |
Adds 9 tests over that ladder plus the surrounding bookkeeping: the abort
flag on the request, the task moving to `aborted`, the progress subscription
being dropped so a late event cannot resurrect it, the concurrency slot being
released so a queued upload starts, and `cancelExistingUpload` delegating here
for an upload still running. Both constants are exported, so the backoff growth
and the attempt bound are asserted rather than hard-coded.
**Verified by mutation**, all reverted (production diff empty):
| Mutation | Result |
|---|---|
| never retry on conflict | red |
| make the retry unbounded | red |
| use a constant backoff instead of a growing one | red |
| skip the unsubscribe | red |
| leave the task unmarked | red |
| send the abort flag as false | red |
| drop the `onUploadComplete()` that frees the slot | red |
| remove the 404 early return | **survived** |
| remove the `doneCalled` idempotence guard | **survived** |
The two survivors are reported rather than papered over, because they are
informative:
- **The 404 early return is behaviourally redundant.** Without it a 404
falls past the 409 check to the same `done()` at the bottom, so no input
distinguishes the two. The test still earns its place — it fails if 404 is ever
turned into an error path — but it does not pin the branch itself.
- **The `doneCalled` guard is not reachable.** Exactly one of the
`next`/404/fallback paths fires per response, and each retry replaces the
subscription, so `done()` is never invoked twice. It is defensive code with no
observable behaviour at this level.
The slot-release mutation survived my first pass too; unlike the other two
that was a genuine gap, so I added the test that covers it.
No production file is touched.
### Any related issues, documentation, discussions?
Closes #7413
### How was this PR tested?
```
npx ng test --watch=false --include="**/dataset-detail.component.spec.ts"
```
```
Test Files 1 passed (1)
Tests 104 passed (104)
```
9 new on top of the existing 95. `yarn format:ci` passes.
### Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (Opus 5)
--
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]