cxzl25 opened a new pull request, #8416:
URL: https://github.com/apache/hadoop/pull/8416

   ### Description of PR
   ## Description
   
   HDFS-16942 introduced `InvalidBlockReportLeaseException`, which the NameNode 
now throws back to the DataNode via RPC when a block report is rejected due to 
an invalid lease. On a DataNode that also includes HDFS-16942, the exception is 
caught and `fullBlockReportLeaseId` is reset to 0, allowing the DN to request a 
new lease on the next heartbeat and retry.
   
   However, during a rolling upgrade where the NameNode has been upgraded (with 
HDFS-16942) but DataNodes are still running an older version (without 
HDFS-16942), the old DataNode code does not have the 
`InvalidBlockReportLeaseException` handling branch in 
`BPServiceActor.offerService()`. This causes the DN to enter an infinite 
failure loop where it can never successfully send a full block report.
   
   ## Root Cause
   
   In `BPServiceActor.offerService()`, the logic works as follows:
   
   1. The DN requests a block report lease during heartbeat only when 
`fullBlockReportLeaseId == 0`:
   
   ```java
   boolean requestBlockReportLease = (fullBlockReportLeaseId == 0) &&
           scheduler.isBlockReportDue(startTime);
   ```
   
   2. After sending the block report, `fullBlockReportLeaseId` is reset to 0:
   
   ```java
   if ((fullBlockReportLeaseId != 0) || forceFullBr) {
       cmds = blockReport(fullBlockReportLeaseId);
       fullBlockReportLeaseId = 0;  // not reached if blockReport() throws
   }
   ```
   
   3. When the upgraded NN throws `InvalidBlockReportLeaseException`, 
`blockReport()` propagates the exception. The `fullBlockReportLeaseId = 0` line 
after the call is never executed.
   
   4. The exception is caught by the generic `RemoteException` catch block. The 
old DN code does not recognize `InvalidBlockReportLeaseException`, so 
`fullBlockReportLeaseId` remains set to the stale invalid value.
   
   5. On the next heartbeat iteration, because `fullBlockReportLeaseId != 0`, 
`requestBlockReportLease` is `false` — the DN does not request a new lease. It 
then attempts `blockReport()` again with the same stale lease, which the NN 
rejects again. This repeats indefinitely.
   
   
   ### How was this patch tested?
   Add test
   
   ### For code changes:
   
   - [ ] Does the title or this PR starts with the corresponding JIRA issue id 
(e.g. 'HADOOP-17799. Your PR title ...')?
   - [ ] Object storage: have the integration tests been executed and the 
endpoint declared according to the connector-specific documentation?
   - [ ] If adding new dependencies to the code, are these dependencies 
licensed in a way that is compatible for inclusion under [ASF 
2.0](http://www.apache.org/legal/resolved.html#category-a)?
   - [ ] If applicable, have you updated the `LICENSE`, `LICENSE-binary`, 
`NOTICE-binary` files?
   
   ### AI Tooling
   
   If an AI tool was used:
   
   - [ ] The PR includes the phrase "Contains content generated by <tool>"
         where <tool> is the name of the AI tool used.
   - [ ] My use of AI contributions follows the ASF legal policy
         https://www.apache.org/legal/generative-tooling.html


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


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

Reply via email to