Skip to content

Commit d4a91bd

Browse files
jteaglesJonathan Eagles
andauthored
YARN-11116. Migrate Times util from SimpleDateFormat to thread-safe DateTimeFormatter class (#4242)
Co-authored-by: Jonathan Eagles <[email protected]> Signed-off-by: Akira Ajisaka <[email protected]>
1 parent a74acc7 commit d4a91bd

File tree

2 files changed

+30
-20
lines changed
  • hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src

2 files changed

+30
-20
lines changed

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/util/Times.java

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@
1919
package org.apache.hadoop.yarn.util;
2020

2121
import java.text.ParseException;
22-
import java.text.SimpleDateFormat;
23-
import java.util.Date;
22+
import java.time.Instant;
23+
import java.time.ZoneId;
24+
import java.time.format.DateTimeFormatter;
2425

2526
import org.slf4j.Logger;
2627
import org.slf4j.LoggerFactory;
@@ -31,23 +32,16 @@ public class Times {
3132
private static final Logger LOG =
3233
LoggerFactory.getLogger(Times.class);
3334

34-
static final String ISO8601DATEFORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
35+
static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
3536

3637
// This format should match the one used in yarn.dt.plugins.js
37-
static final ThreadLocal<SimpleDateFormat> dateFormat =
38-
new ThreadLocal<SimpleDateFormat>() {
39-
@Override protected SimpleDateFormat initialValue() {
40-
return new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy");
41-
}
42-
};
38+
static final DateTimeFormatter DATE_FORMAT =
39+
DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss Z yyyy").withZone(
40+
ZoneId.systemDefault());
4341

44-
static final ThreadLocal<SimpleDateFormat> isoFormat =
45-
new ThreadLocal<SimpleDateFormat>() {
46-
@Override
47-
protected SimpleDateFormat initialValue() {
48-
return new SimpleDateFormat(ISO8601DATEFORMAT);
49-
}
50-
};
42+
static final DateTimeFormatter ISO_OFFSET_DATE_TIME =
43+
DateTimeFormatter.ofPattern(ISO8601_DATE_FORMAT).withZone(
44+
ZoneId.systemDefault());
5145

5246
public static long elapsed(long started, long finished) {
5347
return Times.elapsed(started, finished, true);
@@ -83,8 +77,7 @@ public static long elapsed(long started, long finished, boolean isRunning) {
8377
}
8478

8579
public static String format(long ts) {
86-
return ts > 0 ? String.valueOf(dateFormat.get().format(new Date(ts)))
87-
: "N/A";
80+
return ts > 0 ? DATE_FORMAT.format(Instant.ofEpochMilli(ts)) : "N/A";
8881
}
8982

9083
/**
@@ -94,7 +87,7 @@ public static String format(long ts) {
9487
* @return ISO 8601 formatted string.
9588
*/
9689
public static String formatISO8601(long ts) {
97-
return isoFormat.get().format(new Date(ts));
90+
return ISO_OFFSET_DATE_TIME.format(Instant.ofEpochMilli(ts));
9891
}
9992

10093
/**
@@ -109,6 +102,6 @@ public static long parseISO8601ToLocalTimeInMillis(String isoString)
109102
if (isoString == null) {
110103
throw new ParseException("Invalid input.", -1);
111104
}
112-
return isoFormat.get().parse(isoString).getTime();
105+
return Instant.from(ISO_OFFSET_DATE_TIME.parse(isoString)).toEpochMilli();
113106
}
114107
}

hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/util/TestTimes.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@
2121
import org.junit.Assert;
2222
import org.junit.Test;
2323

24+
import java.io.IOException;
25+
import java.text.SimpleDateFormat;
26+
import java.util.Date;
27+
28+
import static org.apache.hadoop.yarn.util.Times.ISO8601_DATE_FORMAT;
29+
2430
public class TestTimes {
2531

2632
@Test
@@ -61,4 +67,15 @@ public void testFinishTimesAheadOfStartTimes() {
6167
elapsed = Times.elapsed(Long.MAX_VALUE, 0, true);
6268
Assert.assertEquals("Elapsed time is not -1", -1, elapsed);
6369
}
70+
71+
@Test
72+
public void validateISO() throws IOException {
73+
SimpleDateFormat isoFormat = new SimpleDateFormat(ISO8601_DATE_FORMAT);
74+
for (int i = 0; i < 1000; i++) {
75+
long now = System.currentTimeMillis();
76+
String instant = Times.formatISO8601(now);
77+
String date = isoFormat.format(new Date(now));
78+
Assert.assertEquals(date, instant);
79+
}
80+
}
6481
}

0 commit comments

Comments
 (0)