xxubai opened a new issue, #4300:
URL: https://github.com/apache/amoro/issues/4300

   ### What happened?
   
   During Apache Amoro 0.9.0-incubating RC4 validation, a running local
   orphan-clean process was not recovered when database-HA bucket ownership 
moved
   from a failed AMS node to another already-running AMS node.
   
   After the takeover:
   
   - the surviving AMS successfully acquired the failed node's buckets;
   - the affected Iceberg table was loaded by the surviving AMS;
   - the persisted process remained `RUNNING`;
   - `external_process_identifier` remained empty;
   - `finish_time` remained `NULL`;
   - the orphan file remained present.
   
   The same process state is recovered successfully when the owner AMS is
   restarted. This means the RC4 startup recovery path works, but the online
   bucket-takeover recovery path does not.
   
   Expected behavior: after the table bucket is assigned to another AMS, the new
   owner should recover persisted `SUBMITTED`/`RUNNING` processes for that 
table.
   For this orphan-clean process, the process should finish as `SUCCESS` and
   remove the orphan file.
   
   This was found while validating RC4 and is considered release-blocking 
because
   maintenance processes can remain stuck after an AMS failure in database-HA
   deployments.
   
   ### Affects Versions
   
   0.9.0-incubating RC4 (`v0.9.0-rc4`,
   `a93a32b4d817e41af730b2e30bfce6e292dc8575`)
   
   ### What table formats are you seeing the problem on?
   
   Iceberg
   
   ### What engines are you seeing the problem on?
   
   AMS
   
   ### How to reproduce
   
   1. Start two AMS nodes backed by the same MySQL database and shared 
warehouse:
      - `ha.type=database`
      - `ha.use-master-slave-mode=true`
      - 16 table-service buckets
   2. Create a filesystem catalog with an Iceberg table and enable orphan clean:
      - `clean-orphan-file.enabled=true`
      - `clean-orphan-file.min-existing-time-minutes=0`
   3. Identify the AMS node that owns the table's bucket.
   4. Create an old, unreferenced file under the table's data directory.
   5. Persist a `table_process` record for the table with:
      - `status='RUNNING'`
      - `process_type='CLEAN-ORPHAN-FILES'`
      - `execution_engine='local'`
      - an empty `external_process_identifier`
   6. Kill the owner AMS node without a graceful shutdown.
   7. Wait until the other, already-running AMS acquires the table's bucket.
   8. Query `table_process` and check the orphan file.
   
   Observed database state after bucket takeover:
   
   ```text
   process_id:                  1462464657670146
   table_id:                    1
   external_process_identifier:
   status:                      RUNNING
   process_type:                CLEAN-ORPHAN-FILES
   execution_engine:            local
   finish_time:                 NULL
   summary:                     {}
   ```
   
   Observed file state:
   
   ```text
   /warehouse/rc4_db/orphan_test/data/rc4-recovery-takeover.parquet
   PRESENT
   ```
   
   As a control case, restarting the owner AMS with the same persisted process
   state recovered the process to `SUCCESS` and deleted the orphan file.
   
   ### Relevant log output
   
   ```shell
   # The surviving AMS acquired all 16 buckets after the owner was killed.
   assignments_json:
   ["2","4","6","8","10","12","14","16","1","3","5","7","9","11","13","15"]
   
   # The active process was not recovered after takeover.
   process_id          external_process_identifier  status   finish_time  
summary
   1462464657670146                                 RUNNING  NULL         {}
   ```
   
   ### Anything else
   
   Root cause:
   
   `ProcessService.initialize()` invokes `recoverProcesses(tableRuntimes)`, so
   active processes are recovered when an AMS starts:
   
   
https://github.com/apache/amoro/blob/v0.9.0-rc4/amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java#L123-L139
   
   During online database-HA bucket takeover, `DefaultTableService` dynamically
   loads the newly assigned table and emits `fireTableAdded()`:
   
   
https://github.com/apache/amoro/blob/v0.9.0-rc4/amoro-ams/src/main/java/org/apache/amoro/server/table/DefaultTableService.java#L439-L468
   
   However, `ProcessService.handleTableAdded()` only forwards the table-added
   event to action coordinators and does not recover persisted active processes
   for the newly owned table:
   
   
https://github.com/apache/amoro/blob/v0.9.0-rc4/amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java#L527-L536
   
   Process recovery is therefore tied to service initialization rather than the
   TableRuntime ownership lifecycle.
   
   This is different from #4286 / #4288: that issue fixed process recovery 
during
   AMS restart, while this issue occurs when ownership moves to an 
already-running
   AMS node.
   
   ### Are you willing to submit a PR?
   
   - [ ] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's Code of Conduct
   


-- 
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