vamshipasunuru1 opened a new issue, #20222:
URL: https://github.com/apache/hudi/issues/20222

   ### Bug Description
   
   **What happened:**
    #19902 established that `StreamWriteOperatorCoordinator` should serve 
instant-time requests in O(1),
     and enumerated two blocking operations on that path: 
`EventBuffers#awaitAllInstantsToCompleteIfNecessary()`
     (commit guard) and table-lock acquisition inside `startCommit`. #19960 
followed by serving requests
     asynchronously and having the task poll up to `write.commit.ack.timeout`, 
so a slow request no longer
     breaks the coordination RPC.
   
     Working in that same direction, we hit two remaining gaps when
     `hoodie.prewrite.cleaner.policy=ROLLBACK_FAILED_WRITES` (or 
`FAILED_WRITES_CLEANER_POLICY=EAGER`) is
     set.
   
     **Gap 1 — a third blocking operation on the path, and it is work rather 
than a wait.**
   
     With pre-write rollback enabled, `startCommit` performs a full rollback of 
failed writes before it
     returns:
   
     StreamWriteFunction.snapshotState -> flushRemaining(false)     
[StreamWriteFunction.java:186]
       -> instantToWrite(hasData())                                 [:515]
       -> Correspondent.requestInstantTime
       -> StreamWriteOperatorCoordinator.handleInstantRequest       
[StreamWriteOperatorCoordinator.java:421]
           -> awaitAllInstantsToCompleteIfNecessary                 [:429]  <- 
#19902, blocking #1
           -> startInstant                                          [:430, :538]
               -> HoodieFlinkWriteClient.startCommit                
[BaseHoodieWriteClient.java:1150]
                   -> table lock                                            <- 
#19902, blocking #2
                   -> rollbackFailedWrites                                  <- 
gap 1
   
   
   
   **What you expected:**
   
   Pre-write rollback should be usable in the Flink writer without instant-time 
request latency scaling
   with the number of files being rolled back.
   
   Why this matters to us rather than simply leaving the config off: we 
currently rely on async cleans
   running outside Flink to clean up failed writes, and enabling pre-write 
rollback is what surfaced the
   above. The fallback works, but it overloads clean with a responsibility that 
is not its own. Clean and
   rollback of failed writes are functionally different operations with 
different urgency. Clean reclaims
   space and can tolerate running hours later. An uncleaned failed write 
actively blocks downstream
   consumers: incremental readers such as DeltaStreamer block or fail on hollow 
commits, and a blocking
   reader stalls silently, with every run reporting success and zero rows. 
Tying failed-write cleanup to
   the clean schedule sets the latency of a correctness-affecting operation by 
a space-reclamation one.
   
   
   **Steps to reproduce:**
   1. Set `hoodie.prewrite.cleaner.policy=ROLLBACK_FAILED_WRITES`.
   2. Restart the job mid-write so an inflight commit is left behind.
   3. On restart, the first instant-time request triggers rollback of that 
inflight commit inside
      `startCommit`. JM will have as many as rollback.parallelism number of 
threads working on it.
   4. Observe checkpoint duration and JobManager thread count scaling with the 
marker count; on object
      storage, the request can exceed `write.commit.ack.timeout` and fail the 
checkpoint, leaving another
      inflight commit behind.
   
   
   ### Acceptance criteria
   
   - With `prewrite.cleaner.policy=ROLLBACK_FAILED_WRITES`, instant-time 
request latency is independent
     of the number of files in the instant being rolled back.
   - A restart leaving an inflight commit with ~100k markers is rolled back 
without checkpoint duration
     growing with marker count.
   
   
   ### Environment
   
   **Hudi version:** master
   **Query engine:** (Spark/Flink/Trino etc) Flink
   **Relevant configs:**prewrite.cleaner.policy=ROLLBACK_FAILED_WRITES 
   
   
   ### Logs and Stack Trace
   
   _No response_


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