Skip to content

Commit 7e34258

Browse files
Simplify TimeValue Serialization (#62023)
This can be done without map lookups => less code and much smaller methods => better inlining potentially.
1 parent 0c782bc commit 7e34258

File tree

2 files changed

+12
-42
lines changed

2 files changed

+12
-42
lines changed

server/src/main/java/org/elasticsearch/common/io/stream/StreamInput.java

Lines changed: 11 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -94,25 +94,6 @@
9494
*/
9595
public abstract class StreamInput extends InputStream {
9696

97-
private static final Map<Byte, TimeUnit> BYTE_TIME_UNIT_MAP;
98-
99-
static {
100-
final Map<Byte, TimeUnit> byteTimeUnitMap = new HashMap<>();
101-
byteTimeUnitMap.put((byte)0, TimeUnit.NANOSECONDS);
102-
byteTimeUnitMap.put((byte)1, TimeUnit.MICROSECONDS);
103-
byteTimeUnitMap.put((byte)2, TimeUnit.MILLISECONDS);
104-
byteTimeUnitMap.put((byte)3, TimeUnit.SECONDS);
105-
byteTimeUnitMap.put((byte)4, TimeUnit.MINUTES);
106-
byteTimeUnitMap.put((byte)5, TimeUnit.HOURS);
107-
byteTimeUnitMap.put((byte)6, TimeUnit.DAYS);
108-
109-
for (TimeUnit value : TimeUnit.values()) {
110-
assert byteTimeUnitMap.containsValue(value) : value;
111-
}
112-
113-
BYTE_TIME_UNIT_MAP = Collections.unmodifiableMap(byteTimeUnitMap);
114-
}
115-
11697
private Version version = Version.CURRENT;
11798

11899
/**
@@ -1312,12 +1293,22 @@ private int readArraySize() throws IOException {
13121293
*/
13131294
protected abstract void ensureCanReadBytes(int length) throws EOFException;
13141295

1296+
private static final TimeUnit[] TIME_UNITS = TimeUnit.values();
1297+
1298+
static {
1299+
// assert the exact form of the TimeUnit values to ensure we're not silently broken by a JDK change
1300+
if (Arrays.equals(TIME_UNITS, new TimeUnit[]{TimeUnit.NANOSECONDS, TimeUnit.MICROSECONDS, TimeUnit.MILLISECONDS,
1301+
TimeUnit.SECONDS, TimeUnit.MINUTES, TimeUnit.HOURS, TimeUnit.DAYS}) == false) {
1302+
throw new AssertionError("Incompatible JDK version used that breaks assumptions on the structure of the TimeUnit enum");
1303+
}
1304+
}
1305+
13151306
/**
13161307
* Read a {@link TimeValue} from the stream
13171308
*/
13181309
public TimeValue readTimeValue() throws IOException {
13191310
long duration = readZLong();
1320-
TimeUnit timeUnit = BYTE_TIME_UNIT_MAP.get(readByte());
1311+
TimeUnit timeUnit = TIME_UNITS[readByte()];
13211312
return new TimeValue(duration, timeUnit);
13221313
}
13231314

server/src/main/java/org/elasticsearch/common/io/stream/StreamOutput.java

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,14 @@
6262
import java.time.ZonedDateTime;
6363
import java.util.Arrays;
6464
import java.util.Collection;
65-
import java.util.Collections;
6665
import java.util.Date;
67-
import java.util.EnumMap;
6866
import java.util.EnumSet;
6967
import java.util.Iterator;
7068
import java.util.LinkedHashMap;
7169
import java.util.LinkedHashSet;
7270
import java.util.List;
7371
import java.util.Map;
7472
import java.util.Set;
75-
import java.util.concurrent.TimeUnit;
7673
import java.util.function.IntFunction;
7774

7875
import static java.util.Map.entry;
@@ -90,26 +87,8 @@
9087
*/
9188
public abstract class StreamOutput extends OutputStream {
9289

93-
private static final Map<TimeUnit, Byte> TIME_UNIT_BYTE_MAP;
9490
private static final int MAX_NESTED_EXCEPTION_LEVEL = 100;
9591

96-
static {
97-
final Map<TimeUnit, Byte> timeUnitByteMap = new EnumMap<>(TimeUnit.class);
98-
timeUnitByteMap.put(TimeUnit.NANOSECONDS, (byte)0);
99-
timeUnitByteMap.put(TimeUnit.MICROSECONDS, (byte)1);
100-
timeUnitByteMap.put(TimeUnit.MILLISECONDS, (byte)2);
101-
timeUnitByteMap.put(TimeUnit.SECONDS, (byte)3);
102-
timeUnitByteMap.put(TimeUnit.MINUTES, (byte)4);
103-
timeUnitByteMap.put(TimeUnit.HOURS, (byte)5);
104-
timeUnitByteMap.put(TimeUnit.DAYS, (byte)6);
105-
106-
for (TimeUnit value : TimeUnit.values()) {
107-
assert timeUnitByteMap.containsKey(value) : value;
108-
}
109-
110-
TIME_UNIT_BYTE_MAP = Collections.unmodifiableMap(timeUnitByteMap);
111-
}
112-
11392
private Version version = Version.CURRENT;
11493

11594
/**
@@ -1280,7 +1259,7 @@ public <E extends Enum<E>> void writeEnumSet(EnumSet<E> enumSet) throws IOExcept
12801259
*/
12811260
public void writeTimeValue(TimeValue timeValue) throws IOException {
12821261
writeZLong(timeValue.duration());
1283-
writeByte(TIME_UNIT_BYTE_MAP.get(timeValue.timeUnit()));
1262+
writeByte((byte) timeValue.timeUnit().ordinal());
12841263
}
12851264

12861265
/**

0 commit comments

Comments
 (0)