This is an automated email from the ASF dual-hosted git repository.

vhs pushed a commit to branch release-1.0.2
in repository https://gitbox.apache.org/repos/asf/hudi.git

commit 46a1c76fe3da57602b5c46b49772945edeb14a67
Author: Lokesh Jain <[email protected]>
AuthorDate: Fri Apr 4 04:47:25 2025 +0530

    [MINOR] Fix NumberFormatException while updating metrics for MDT in table 
version 6 (#13056)
    
    (cherry picked from commit 76a8615fa915a1c55a9476aab8b9b204babd0162)
---
 .../metadata/HoodieBackedTableMetadataWriterTableVersionSix.java   | 6 ++++++
 .../src/main/java/org/apache/hudi/metrics/HoodieMetrics.java       | 4 ++--
 .../src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java   | 7 +++++--
 3 files changed, 13 insertions(+), 4 deletions(-)

diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieBackedTableMetadataWriterTableVersionSix.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieBackedTableMetadataWriterTableVersionSix.java
index 33e5070b8fb..bab6b7515fc 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieBackedTableMetadataWriterTableVersionSix.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metadata/HoodieBackedTableMetadataWriterTableVersionSix.java
@@ -57,6 +57,12 @@ public abstract class 
HoodieBackedTableMetadataWriterTableVersionSix<I> extends
   /**
    * Hudi backed table metadata writer.
    *
+   * Timestamps are generated in format {@link 
org.apache.hudi.common.table.timeline.HoodieInstantTimeGenerator#MILLIS_INSTANT_TIMESTAMP_FORMAT}.
+   * For operations like compaction, log compaction, clean, index and rollback 
- suffix are used which are appended to the timestamp. In some cases
+   * it is possible for suffix to be added twice. For instance, there is an 
index commit in metadata table leading to an instant with 010 suffix in
+   * the timeline. If compaction triggers now, the compaction would use the 
index instant timestamp and add 001 suffix to it, creating a timestamp
+   * value with suffix 010001. Both indexing and compaction suffix would be 
present in the compaction timestamp in such a case.
+   *
    * @param storageConf                Storage configuration to use for the 
metadata writer
    * @param writeConfig                Writer config
    * @param failedWritesCleaningPolicy Cleaning policy on failed writes
diff --git 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/HoodieMetrics.java
 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/HoodieMetrics.java
index 0146a2baf1b..c73aaacdd5b 100644
--- 
a/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/HoodieMetrics.java
+++ 
b/hudi-client/hudi-client-common/src/main/java/org/apache/hudi/metrics/HoodieMetrics.java
@@ -457,9 +457,9 @@ public class HoodieMetrics {
     Option<HoodieInstant> hoodieInstantOption = filteredInstants.lastInstant();
     if (hoodieInstantOption.isPresent()) {
       String requestedTime = hoodieInstantOption.get().requestedTime();
-      if (hoodieInstantOption.get().requestedTime().length() > 
MILLIS_INSTANT_TIMESTAMP_FORMAT_LENGTH) {
+      if (requestedTime.length() > MILLIS_INSTANT_TIMESTAMP_FORMAT_LENGTH) {
         // If requested instant is in MDT with table version six, it can 
contain suffix
-        requestedTime = requestedTime.substring(0, requestedTime.length() - 3);
+        requestedTime = requestedTime.substring(0, 
MILLIS_INSTANT_TIMESTAMP_FORMAT_LENGTH);
       }
       updateMetric(action, metricName, Long.parseLong(requestedTime));
     }
diff --git 
a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java
 
b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java
index 862c9d8d7f1..304ed1f12dd 100755
--- 
a/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java
+++ 
b/hudi-client/hudi-client-common/src/test/java/org/apache/hudi/metrics/TestHoodieMetrics.java
@@ -295,8 +295,11 @@ public class TestHoodieMetrics {
     HoodieInstant instant008 = 
INSTANT_GENERATOR.createNewInstant(HoodieInstant.State.INFLIGHT, 
HoodieTimeline.COMPACTION_ACTION, "1008");
     HoodieInstant instant0012 = 
INSTANT_GENERATOR.createNewInstant(HoodieInstant.State.REQUESTED, 
HoodieTimeline.COMPACTION_ACTION, "10012");
     HoodieInstant instant0014 = 
INSTANT_GENERATOR.createNewInstant(HoodieInstant.State.INFLIGHT, 
HoodieTimeline.COMPACTION_ACTION, "10014");
+    HoodieInstant longInstant = 
INSTANT_GENERATOR.createNewInstant(HoodieInstant.State.INFLIGHT, 
HoodieTimeline.COMPACTION_ACTION, "20250329154030600010001");
 
-    HoodieActiveTimeline activeTimeline3 = new 
MockHoodieActiveTimeline(instant002, instant003, instant006, instant008, 
instant0012, instant0014);
+    HoodieActiveTimeline activeTimeline3 = new 
MockHoodieActiveTimeline(instant002, instant003, instant006, instant008, 
instant0012, instant0014, longInstant);
+    // verify longer instant times can also be updated in the metrics. These 
are required for table version six
+    // where suffix is added at the end of older instants for compaction in 
the metadata timeline
     hoodieMetrics.updateTableServiceInstantMetrics(activeTimeline3);
 
     metricName = 
hoodieMetrics.getMetricsName(HoodieTimeline.COMPACTION_ACTION, 
HoodieMetrics.EARLIEST_PENDING_COMPACTION_INSTANT_STR);
@@ -306,7 +309,7 @@ public class TestHoodieMetrics {
     
assertEquals((long)metrics.getRegistry().getGauges().get(metricName).getValue(),
 Long.valueOf("1006"));
 
     metricName = 
hoodieMetrics.getMetricsName(HoodieTimeline.COMPACTION_ACTION, 
HoodieMetrics.PENDING_COMPACTION_INSTANT_COUNT_STR);
-    
assertEquals((long)metrics.getRegistry().getGauges().get(metricName).getValue(),
 5L);
+    
assertEquals((long)metrics.getRegistry().getGauges().get(metricName).getValue(),
 6L);
   }
 
   private static class MockHoodieActiveTimeline extends ActiveTimelineV2 {

Reply via email to