You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by bi...@apache.org on 2016/12/20 01:32:19 UTC
hbase git commit: HBASE-17332 Replace HashMap to Array for
DataBlockEncoding.idToEncoding
Repository: hbase
Updated Branches:
refs/heads/master d53f012bb -> b7bde350a
HBASE-17332 Replace HashMap to Array for DataBlockEncoding.idToEncoding
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/b7bde350
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/b7bde350
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/b7bde350
Branch: refs/heads/master
Commit: b7bde350a160f2481e8dcbcf00702333d8a978cc
Parents: d53f012
Author: binlijin <bi...@gmail.com>
Authored: Tue Dec 20 09:32:28 2016 +0800
Committer: binlijin <bi...@gmail.com>
Committed: Tue Dec 20 09:32:28 2016 +0800
----------------------------------------------------------------------
.../hbase/io/encoding/DataBlockEncoding.java | 52 +++++++++-----------
.../io/encoding/TestDataBlockEncoding.java | 50 +++++++++++++++++++
2 files changed, 72 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/b7bde350/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java
index ea173ea..d7535e5 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java
@@ -16,15 +16,13 @@
*/
package org.apache.hadoop.hbase.io.encoding;
+import java.io.IOException;
+import java.io.OutputStream;
+
import org.apache.hadoop.hbase.classification.InterfaceAudience;
import org.apache.hadoop.hbase.classification.InterfaceStability;
import org.apache.hadoop.hbase.util.Bytes;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
/**
* Provide access to all data block encoding algorithms. All of the algorithms
* are required to have unique id which should <b>NEVER</b> be changed. If you
@@ -54,24 +52,21 @@ public enum DataBlockEncoding {
public static final int ID_SIZE = Bytes.SIZEOF_SHORT;
/** Maps data block encoding ids to enum instances. */
- private static Map<Short, DataBlockEncoding> idToEncoding =
- new HashMap<Short, DataBlockEncoding>();
+ private static DataBlockEncoding[] idArray = new DataBlockEncoding[Byte.MAX_VALUE + 1];
static {
for (DataBlockEncoding algo : values()) {
- if (idToEncoding.containsKey(algo.id)) {
+ if (idArray[algo.id] != null) {
throw new RuntimeException(String.format(
- "Two data block encoder algorithms '%s' and '%s' have " +
- "the same id %d",
- idToEncoding.get(algo.id).toString(), algo.toString(),
- (int) algo.id));
+ "Two data block encoder algorithms '%s' and '%s' have " + "the same id %d",
+ idArray[algo.id].toString(), algo.toString(), (int) algo.id));
}
- idToEncoding.put(algo.id, algo);
+ idArray[algo.id] = algo;
}
}
private DataBlockEncoding(int id, String encoderClsName) {
- if (id < Short.MIN_VALUE || id > Short.MAX_VALUE) {
+ if (id < 0 || id > Byte.MAX_VALUE) {
throw new AssertionError(
"Data block encoding algorithm id is out of range: " + id);
}
@@ -139,13 +134,7 @@ public enum DataBlockEncoding {
* @return Newly created data block encoder.
*/
public static DataBlockEncoder getDataBlockEncoderById(short encoderId) {
- if (!idToEncoding.containsKey(encoderId)) {
- throw new IllegalArgumentException(String.format(
- "There is no data block encoder for given id '%d'",
- (int) encoderId));
- }
-
- return idToEncoding.get(encoderId).getEncoder();
+ return getEncodingById(encoderId).getEncoder();
}
/**
@@ -154,7 +143,7 @@ public enum DataBlockEncoding {
* @return name, same as used in options in column family
*/
public static String getNameFromId(short encoderId) {
- return idToEncoding.get(encoderId).toString();
+ return getEncodingById(encoderId).toString();
}
/**
@@ -167,19 +156,22 @@ public enum DataBlockEncoding {
*/
public static boolean isCorrectEncoder(DataBlockEncoder encoder,
short encoderId) {
- if (!idToEncoding.containsKey(encoderId)) {
- throw new IllegalArgumentException(String.format(
- "There is no data block encoder for given id '%d'",
- (int) encoderId));
- }
-
- DataBlockEncoding algorithm = idToEncoding.get(encoderId);
+ DataBlockEncoding algorithm = getEncodingById(encoderId);
String encoderCls = encoder.getClass().getName();
return encoderCls.equals(algorithm.encoderCls);
}
public static DataBlockEncoding getEncodingById(short dataBlockEncodingId) {
- return idToEncoding.get(dataBlockEncodingId);
+ DataBlockEncoding algorithm = null;
+ if (dataBlockEncodingId >= 0 && dataBlockEncodingId <= Byte.MAX_VALUE) {
+ algorithm = idArray[dataBlockEncodingId];
+ }
+ if (algorithm == null) {
+ throw new IllegalArgumentException(String.format(
+ "There is no data block encoder for given id '%d'",
+ (int) dataBlockEncodingId));
+ }
+ return algorithm;
}
protected static DataBlockEncoder createEncoder(String fullyQualifiedClassName){
http://git-wip-us.apache.org/repos/asf/hbase/blob/b7bde350/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoding.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoding.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoding.java
new file mode 100644
index 0000000..58865c9
--- /dev/null
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoding.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with this
+ * work for additional information regarding copyright ownership. The ASF
+ * licenses this file to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.hadoop.hbase.io.encoding;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+@Category(SmallTests.class)
+public class TestDataBlockEncoding {
+
+ @Test
+ public void testGetDataBlockEncoder() throws Exception {
+ for (DataBlockEncoding algo : DataBlockEncoding.values()) {
+ DataBlockEncoder encoder = DataBlockEncoding.getDataBlockEncoderById(algo.getId());
+ if (algo.getId() != 0) {
+ assertTrue(DataBlockEncoding.isCorrectEncoder(encoder, algo.getId()));
+ }
+ }
+ try {
+ DataBlockEncoding.getDataBlockEncoderById((short) -1);
+ fail("Illegal encoderId, should get IllegalArgumentException.");
+ } catch (IllegalArgumentException ie) {
+ }
+ try {
+ DataBlockEncoding.getDataBlockEncoderById(Byte.MAX_VALUE);
+ // fail because idArray[Byte.MAX_VALUE] = null
+ fail("Illegal encoderId, should get IllegalArgumentException.");
+ } catch (IllegalArgumentException ie) {
+ }
+ }
+
+}