luoyuxia commented on code in PR #3469:
URL: https://github.com/apache/fluss/pull/3469#discussion_r3506251823


##########
fluss-server/src/main/java/org/apache/fluss/server/log/LogTablet.java:
##########
@@ -599,15 +631,63 @@ public void updateLakeLogStartOffset(long 
lakeHouseLogStartOffset) {
     public void updateLakeLogEndOffset(long lakeLogEndOffset) {
         if (lakeLogEndOffset > this.lakeLogEndOffset) {
             this.lakeLogEndOffset = lakeLogEndOffset;
+            if (!hasPendingLakeBacklog()) {
+                clearPendingStartTime();
+            }
         }
     }
 
     public void updateLakeMaxTimestamp(long lakeMaxTimestamp) {
         if (lakeMaxTimestamp > this.lakeMaxTimestamp) {
             this.lakeMaxTimestamp = lakeMaxTimestamp;
+            onLakeProgressUpdated();
         }
     }
 
+    private void onHighWatermarkAdvanced(boolean hadPendingRecords) {

Review Comment:
   actually, I do spend some time to fingure out it. I'm wondering whether the 
following is better:
   ```
   private void onHighWatermarkUpdated(long previousHighWatermark, long 
currentHighWatermark) {
         long firstPendingOffset = Math.max(lakeLogEndOffset, 
localLogStartOffset());
   
         boolean hadPendingBeforeUpdate = firstPendingOffset < 
previousHighWatermark;
         boolean hasPendingAfterUpdate = firstPendingOffset < 
currentHighWatermark;
   
         if (!hasPendingAfterUpdate) {
             clearPendingStartTime();
         } else if (!hadPendingBeforeUpdate) {
             markPendingStartTimeNow();
         }
     }
   ```



##########
fluss-server/src/main/java/org/apache/fluss/server/log/LogTablet.java:
##########
@@ -599,15 +631,63 @@ public void updateLakeLogStartOffset(long 
lakeHouseLogStartOffset) {
     public void updateLakeLogEndOffset(long lakeLogEndOffset) {
         if (lakeLogEndOffset > this.lakeLogEndOffset) {
             this.lakeLogEndOffset = lakeLogEndOffset;
+            if (!hasPendingLakeBacklog()) {
+                clearPendingStartTime();
+            }
         }
     }
 
     public void updateLakeMaxTimestamp(long lakeMaxTimestamp) {
         if (lakeMaxTimestamp > this.lakeMaxTimestamp) {
             this.lakeMaxTimestamp = lakeMaxTimestamp;
+            onLakeProgressUpdated();
         }
     }
 
+    private void onHighWatermarkAdvanced(boolean hadPendingRecords) {

Review Comment:
   is there any diffeernce between  `hadPendingRecords` and `hasPendingRecords`



##########
fluss-server/src/main/java/org/apache/fluss/server/log/LogTablet.java:
##########
@@ -599,15 +631,63 @@ public void updateLakeLogStartOffset(long 
lakeHouseLogStartOffset) {
     public void updateLakeLogEndOffset(long lakeLogEndOffset) {
         if (lakeLogEndOffset > this.lakeLogEndOffset) {
             this.lakeLogEndOffset = lakeLogEndOffset;
+            if (!hasPendingLakeBacklog()) {
+                clearPendingStartTime();
+            }
         }
     }
 
     public void updateLakeMaxTimestamp(long lakeMaxTimestamp) {
         if (lakeMaxTimestamp > this.lakeMaxTimestamp) {
             this.lakeMaxTimestamp = lakeMaxTimestamp;
+            onLakeProgressUpdated();
         }
     }
 
+    private void onHighWatermarkAdvanced(boolean hadPendingRecords) {
+        boolean hasPendingRecords = hasPendingLakeBacklog();
+        if (!hasPendingRecords) {
+            clearPendingStartTime();
+        } else if (!hadPendingRecords) {
+            markPendingStartTimeNow();
+        }
+    }
+
+    private void onLakeProgressUpdated() {
+        if (!hasPendingLakeBacklog()) {
+            clearPendingStartTime();
+            return;
+        }
+        long timestampLag = getTimestampLag();
+        if (timestampLag < 0L) {
+            return;
+        }
+        long candidatePendingStartTimeMs =
+                Math.max(0L, clock.milliseconds() - Math.max(0L, 
timestampLag));
+        advancePendingStartTime(candidatePendingStartTimeMs);
+    }
+
+    private boolean hasPendingLakeBacklog() {

Review Comment:
   hasPendingLakeBacklog -> hasPendingLakeTieringRecords 



##########
fluss-server/src/main/java/org/apache/fluss/server/log/LogTablet.java:
##########
@@ -599,15 +631,63 @@ public void updateLakeLogStartOffset(long 
lakeHouseLogStartOffset) {
     public void updateLakeLogEndOffset(long lakeLogEndOffset) {
         if (lakeLogEndOffset > this.lakeLogEndOffset) {
             this.lakeLogEndOffset = lakeLogEndOffset;
+            if (!hasPendingLakeBacklog()) {
+                clearPendingStartTime();
+            }
         }
     }
 
     public void updateLakeMaxTimestamp(long lakeMaxTimestamp) {
         if (lakeMaxTimestamp > this.lakeMaxTimestamp) {
             this.lakeMaxTimestamp = lakeMaxTimestamp;
+            onLakeProgressUpdated();
         }
     }
 
+    private void onHighWatermarkAdvanced(boolean hadPendingRecords) {
+        boolean hasPendingRecords = hasPendingLakeBacklog();
+        if (!hasPendingRecords) {
+            clearPendingStartTime();
+        } else if (!hadPendingRecords) {
+            markPendingStartTimeNow();
+        }
+    }
+
+    private void onLakeProgressUpdated() {
+        if (!hasPendingLakeBacklog()) {
+            clearPendingStartTime();
+            return;
+        }
+        long timestampLag = getTimestampLag();
+        if (timestampLag < 0L) {
+            return;
+        }
+        long candidatePendingStartTimeMs =

Review Comment:
   nit: Result of 'max' is the same as the second argument making the call 
meaningless 



##########
website/docs/maintenance/observability/monitor-metrics.md:
##########
@@ -890,6 +890,11 @@ Some metrics might not be exposed when using other JVM 
implementations (e.g. IBM
       <td>The timestamp lag between the latest log record and the latest 
tiered lake log record for this table bucket, in milliseconds.</td>
       <td>Gauge</td>
     </tr>
+    <tr>
+      <td>pendingRecordsLag</td>
+      <td>The backlog-aware lag for committed records pending lake tiering for 
this table bucket, in milliseconds. It is 0 when there are no committed records 
pending lake tiering.</td>

Review Comment:
   actually, for me, the backlog-aware is not intuitive.. Some thing like this:
   ```
   The elapsed time, in milliseconds, since the oldest committed record in this 
table bucket became pending for lake tiering. Returns 0 when no committed 
records are pending lake tiering.
   ```
   ?



##########
fluss-server/src/main/java/org/apache/fluss/server/log/LogTablet.java:
##########
@@ -599,15 +631,63 @@ public void updateLakeLogStartOffset(long 
lakeHouseLogStartOffset) {
     public void updateLakeLogEndOffset(long lakeLogEndOffset) {
         if (lakeLogEndOffset > this.lakeLogEndOffset) {
             this.lakeLogEndOffset = lakeLogEndOffset;
+            if (!hasPendingLakeBacklog()) {
+                clearPendingStartTime();
+            }
         }
     }
 
     public void updateLakeMaxTimestamp(long lakeMaxTimestamp) {
         if (lakeMaxTimestamp > this.lakeMaxTimestamp) {
             this.lakeMaxTimestamp = lakeMaxTimestamp;
+            onLakeProgressUpdated();
         }
     }
 
+    private void onHighWatermarkAdvanced(boolean hadPendingRecords) {
+        boolean hasPendingRecords = hasPendingLakeBacklog();

Review Comment:
   nit: we can skip handle pendingRecords for non-tablelake table



##########
fluss-server/src/main/java/org/apache/fluss/server/log/LogTablet.java:
##########
@@ -599,15 +631,63 @@ public void updateLakeLogStartOffset(long 
lakeHouseLogStartOffset) {
     public void updateLakeLogEndOffset(long lakeLogEndOffset) {
         if (lakeLogEndOffset > this.lakeLogEndOffset) {
             this.lakeLogEndOffset = lakeLogEndOffset;
+            if (!hasPendingLakeBacklog()) {
+                clearPendingStartTime();
+            }
         }
     }
 
     public void updateLakeMaxTimestamp(long lakeMaxTimestamp) {
         if (lakeMaxTimestamp > this.lakeMaxTimestamp) {
             this.lakeMaxTimestamp = lakeMaxTimestamp;
+            onLakeProgressUpdated();
         }
     }
 
+    private void onHighWatermarkAdvanced(boolean hadPendingRecords) {
+        boolean hasPendingRecords = hasPendingLakeBacklog();
+        if (!hasPendingRecords) {
+            clearPendingStartTime();
+        } else if (!hadPendingRecords) {
+            markPendingStartTimeNow();
+        }
+    }
+
+    private void onLakeProgressUpdated() {
+        if (!hasPendingLakeBacklog()) {
+            clearPendingStartTime();
+            return;
+        }
+        long timestampLag = getTimestampLag();
+        if (timestampLag < 0L) {
+            return;
+        }
+        long candidatePendingStartTimeMs =
+                Math.max(0L, clock.milliseconds() - Math.max(0L, 
timestampLag));
+        advancePendingStartTime(candidatePendingStartTimeMs);
+    }
+
+    private boolean hasPendingLakeBacklog() {
+        long firstPendingOffset =

Review Comment:
   can be simplified to 
   ```
   Math.max(lakeLogEndOffset, localLogStartOffset())  < getHighWatermark();
   ```
   ?



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