Siyao Meng created HDDS-17392:
---------------------------------

             Summary: Recon export job stays RUNNING forever after an Error 
such as OutOfMemoryError, and new exports for its state are rejected
                 Key: HDDS-17392
                 URL: https://issues.apache.org/jira/browse/HDDS-17392
             Project: Apache Ozone
          Issue Type: Bug
            Reporter: Siyao Meng
         Attachments: MC-3-mark-export-job-failed-on-error.patch

h3. Mechanism
{{ExportJobManager.executeExport}} handles only {{IOException}} and 
{{RuntimeException}} (plus {{InterruptedException}} for cancellation). An 
{{Error}} thrown while the job runs, for example {{OutOfMemoryError}}, skips 
the code that marks the job FAILED; the {{finally}} only clears 
{{runningTasks}}. The task is a {{FutureTask}} whose result nobody reads, so 
the Error is not logged either. The job stays RUNNING in the job tracker, and 
the duplicate check in {{ExportJobManager.submitJob}} refuses every new export 
for that state.

h3. Trigger
# An export is running.
# An {{Error}} is thrown inside the worker, for example the heap runs out while 
rows are written. Recon keeps running afterwards (Ozone sets no exit on 
OutOfMemoryError by default).

h3. Impact
* The job shows RUNNING with frozen progress indefinitely. Every new export 
request for that state is refused: REST API callers get HTTP 429 "An export for 
state ... already exists", and the UI shows the same warning without sending 
the request.
* The UI cannot clear it: the Active Exports table has no Delete or Cancel, and 
the message points to the Completed Exports table, where the job never appears. 
Only {{DELETE /api/v1/containers/unhealthy/export/<jobId>}} or a Recon restart 
clears it.
* Exports for other states still work; the worker thread survives.

h3. Reproduction
PASS on the unmodified source, deterministic. 
[^TestBugMC3ErrorStrandsExportJob.java] ({{hadoop-ozone/recon}}) uses only 
public {{ExportJobManager}} methods; the mocked DB layer throws 
{{OutOfMemoryError}} from the first count query, standing in for heap 
exhaustion. After a second job for another state has completed on the single 
worker (so the first task has ended), the first job is still RUNNING with no 
error message, a new export for its state is rejected with "already exists", 
and only {{cancelJob}} lets a new one through. Nothing about the Error appears 
in the log. A real heap exhaustion was not used in this test.

h3. Patch
[^MC-3-mark-export-job-failed-on-error.patch], against 
fb2d0310a9c6ea37c72cefb5cc1d5b4db35a7ab1. It also applies to master at 
9c3e5477ffb.

The patch adds {{Error}} to the existing {{catch (IOException | 
RuntimeException e)}}, so an Error gets the same handling as an exception: the 
job is marked FAILED with the message, its partial files are removed, and the 
Error is logged once with its stack trace. It is not rethrown; a rethrow would 
only be stored in the task's {{Future}}, which nothing reads, so the log line 
is where it is reported.

Covered by the new 
{{TestExportJobManager#errorInWorkerMarksJobFailedAndAllowsRetry}}, which fails 
without the change ("Timed out waiting for job ... to reach FAILED; last 
observed=RUNNING"). With the change {{TestExportJobManager}}, {{TestExportJob}} 
and {{TestContainerEndpoint}} pass and checkstyle is clean. With the patch the 
reproduction fails because the job is FAILED with the Error's message.

Not covered: an {{Error}} in the few assignments before the {{try}} would still 
leave the job QUEUED. An {{Error}} while the job directory is created (before 
the job leaves the queue) now marks the job FAILED but leaves it in the queue, 
as an {{IOException}} there does; HDDS-17391 fixes that.

Related: HDDS-17046 (the same pattern, an {{Error}} leaving a RUNNING state 
behind, in the NSSummary rebuild).

Found by TLA+ model checking and code review of the Recon unhealthy container 
export job manager under HDDS-15926, on commit 
fb2d0310a9c6ea37c72cefb5cc1d5b4db35a7ab1. Checked against HDDS issues and 
apache/ozone pull requests for duplicates before filing. The attached patch is 
a proposal for review. Generated with Specula (Claude Opus 5.5).



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to