From c2f9cd584cd7852b4745396494cc0c423eb645c1 Mon Sep 17 00:00:00 2001 From: Jitendra Pandey Date: Fri, 15 Jul 2016 14:28:53 -0700 Subject: [PATCH] HADOOP-13368. DFSOpsCountStatistics$OpType#fromSymbol and s3a.Statistic#fromSymbol should be O(1) operation. Contributed by Mingliang Liu. --- .../hadoop/hdfs/DFSOpsCountStatistics.java | 18 +++++++++-------- .../hdfs/TestDFSOpsCountStatistics.java | 2 ++ .../org/apache/hadoop/fs/s3a/Statistic.java | 20 +++++++++++-------- 3 files changed, 24 insertions(+), 16 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOpsCountStatistics.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOpsCountStatistics.java index 83d880a248d..d631dd47878 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOpsCountStatistics.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSOpsCountStatistics.java @@ -21,6 +21,7 @@ import org.apache.hadoop.fs.StorageStatistics; import org.apache.hadoop.hdfs.protocol.HdfsConstants; import java.util.EnumMap; +import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; @@ -88,6 +89,14 @@ public class DFSOpsCountStatistics extends StorageStatistics { TRUNCATE(CommonStatisticNames.OP_TRUNCATE), UNSET_STORAGE_POLICY("op_unset_storage_policy"); + private static final Map SYMBOL_MAP = + new HashMap<>(OpType.values().length); + static { + for (OpType opType : values()) { + SYMBOL_MAP.put(opType.getSymbol(), opType); + } + } + private final String symbol; OpType(String symbol) { @@ -99,14 +108,7 @@ public class DFSOpsCountStatistics extends StorageStatistics { } public static OpType fromSymbol(String symbol) { - if (symbol != null) { - for (OpType opType : values()) { - if (opType.getSymbol().equals(symbol)) { - return opType; - } - } - } - return null; + return SYMBOL_MAP.get(symbol); } } diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/TestDFSOpsCountStatistics.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/TestDFSOpsCountStatistics.java index d63ef1079dd..5ccee3e86a7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/TestDFSOpsCountStatistics.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/test/java/org/apache/hadoop/hdfs/TestDFSOpsCountStatistics.java @@ -111,12 +111,14 @@ public class TestDFSOpsCountStatistics { @Test public void testGetLong() { + assertNull(statistics.getLong(null)); assertNull(statistics.getLong(NO_SUCH_OP)); verifyStatistics(); } @Test public void testIsTracked() { + assertFalse(statistics.isTracked(null)); assertFalse(statistics.isTracked(NO_SUCH_OP)); final Iterator iter = statistics.getLongStatistics(); diff --git a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Statistic.java b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Statistic.java index 3c205f34392..36d163c5fc2 100644 --- a/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Statistic.java +++ b/hadoop-tools/hadoop-aws/src/main/java/org/apache/hadoop/fs/s3a/Statistic.java @@ -20,6 +20,9 @@ package org.apache.hadoop.fs.s3a; import org.apache.hadoop.fs.StorageStatistics.CommonStatisticNames; +import java.util.HashMap; +import java.util.Map; + /** * Statistic which are collected in S3A. * These statistics are available at a low level in {@link S3AStorageStatistics} @@ -105,6 +108,14 @@ public enum Statistic { STREAM_ABORT_BYTES_DISCARDED("stream_bytes_discarded_in_abort", "Count of bytes discarded by aborting the stream"); + private static final Map SYMBOL_MAP = + new HashMap<>(Statistic.values().length); + static { + for (Statistic stat : values()) { + SYMBOL_MAP.put(stat.getSymbol(), stat); + } + } + Statistic(String symbol, String description) { this.symbol = symbol; this.description = description; @@ -123,14 +134,7 @@ public enum Statistic { * @return the value or null. */ public static Statistic fromSymbol(String symbol) { - if (symbol != null) { - for (Statistic opType : values()) { - if (opType.getSymbol().equals(symbol)) { - return opType; - } - } - } - return null; + return SYMBOL_MAP.get(symbol); } public String getDescription() {