wenbingshen commented on code in PR #3833:
URL: https://github.com/apache/bookkeeper/pull/3833#discussion_r1184622195


##########
bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerFragment.java:
##########
@@ -229,15 +229,16 @@ public void setReplicateType(ReplicateType replicateType) 
{
     @Override
     public String toString() {
         return String.format("Fragment(LedgerID: %d, FirstEntryID: %d[%d], "
-                + "LastKnownEntryID: %d[%d], Host: %s, Closed: %s)", ledgerId, 
firstEntryId,
+                + "LastKnownEntryID: %d[%d], Host: %s, Closed: %s, Type: %s)", 
ledgerId, firstEntryId,
                 getFirstStoredEntryId(), lastKnownEntryId, 
getLastStoredEntryId(),
-                getAddresses(), isLedgerClosed);
+                getAddresses(), isLedgerClosed, replicateType);
     }
 
     /**
      * ReplicateType.
      */
     public enum ReplicateType {
+        NULL,

Review Comment:
   @hangc0276 @horizonzy Yes, when I first looked at the use of LedgerFragment, 
I also thought it only had two states, `DATA_LOSS` or 
`DATA_NOT_ADHERING_PLACEMENT`, when I read the code again, I felt something was 
different.
   
   `LedgerFragmentReplicator` is used to copy and restore those copies of a 
ledger segment in a failed bookie. This state initialization is `DATA_LOSS`.
   
   `ReplicationWorker` will first recover the LedgerFragment of `DATA_LOSS` 
state, and then recover the LedgerFragment of `DATA_NOT_ADHERING_PLACEMENT`.
   
   When `BookKeeperAdmin` is recovering Ledger, LedgerFragment is in 
`DATA_LOSS` state.
   
   The above LedgerFragment is mainly in recover or replicate, and 
LedgerFragment has an obvious state.
   
   In addition to the above, there is also a LedgerFragment, which is in an 
unclear state and mainly occurs inside `LedgerChecker`. 
`AuditorCheckAllLedgersTask` and `ReplicationWorker` use `LedgerChecker` 
checkLedger. By default, it will check the first and last Entry of each 
LedgerFragment of the ledger before the check is completed. , LedgerFragment 
should not be in `DATA_LOSS` or `DATA_NOT_ADHERING_PLACEMENT`, because after 
the inspection is completed, the LedgerFragment may be normal, or the replicate 
may be missing; before and after the inspection is completed, we sometimes 
print the LedgerFragment through debug, which may cause a wrong state, so I 
added the `NULL` state is used to identify this situation.
   
   
https://github.com/apache/bookkeeper/blob/master/bookkeeper-server/src/main/java/org/apache/bookkeeper/client/LedgerChecker.java#L476-L492
   ```java
           for (LedgerFragment r : fragments) {
               if (LOG.isDebugEnabled()) {
                   LOG.debug("Checking fragment {}", r);
               }
               try {
                   verifyLedgerFragment(r, allFragmentsCb, 
percentageOfLedgerFragmentToBeVerified);
               } catch (InvalidFragmentException ife) {
                   LOG.error("Invalid fragment found : {}", r);
                   allFragmentsCb.operationComplete(
                           BKException.Code.IncorrectParameterException, r);
               } catch (BKException e) {
                   LOG.error("BKException when checking fragment : {}", r, e);
               } catch (InterruptedException e) {
                   LOG.error("InterruptedException when checking fragment : 
{}", r, e);
               }
           }
   ```
   
   `NULL` may be difficult to understand, maybe we can add `INIT` before 
checking, and `NORMAL` state if the segment not data loss after checking?



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