Repository: orc Updated Branches: refs/heads/master b0dc08bb1 -> bfbdc504a
Copying patch of HIVE-13699. Project: http://git-wip-us.apache.org/repos/asf/orc/repo Commit: http://git-wip-us.apache.org/repos/asf/orc/commit/bffb88b6 Tree: http://git-wip-us.apache.org/repos/asf/orc/tree/bffb88b6 Diff: http://git-wip-us.apache.org/repos/asf/orc/diff/bffb88b6 Branch: refs/heads/master Commit: bffb88b61e5a4d8c3c236bcff076485c0943aca0 Parents: b0dc08b Author: Owen O'Malley <[email protected]> Authored: Thu May 26 13:33:34 2016 -0700 Committer: Owen O'Malley <[email protected]> Committed: Thu May 26 13:36:40 2016 -0700 ---------------------------------------------------------------------- .../hadoop/hive/ql/util/JavaDataModel.java | 34 +++++++---- .../hadoop/hive/ql/util/JavaDataModelTest.java | 59 ++++++++++++++++++++ 2 files changed, 82 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/orc/blob/bffb88b6/java/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java ---------------------------------------------------------------------- diff --git a/java/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java b/java/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java index 151f30d..33b70c2 100644 --- a/java/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java +++ b/java/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java @@ -18,6 +18,11 @@ package org.apache.hadoop.hive.ql.util; +import com.google.common.annotations.VisibleForTesting; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Estimation of memory footprint of object */ @@ -229,6 +234,8 @@ public enum JavaDataModel { return (value + align - 1) & ~(align - 1); } + private static final Logger LOG = LoggerFactory.getLogger(JavaDataModel.class); + public static final int JAVA32_META = 12; public static final int JAVA32_ARRAY_META = 16; public static final int JAVA32_REF = 4; @@ -246,22 +253,27 @@ public enum JavaDataModel { public static final int PRIMITIVE_BYTE = 1; // byte - private static JavaDataModel current; + private static final class LazyHolder { + private static final JavaDataModel MODEL_FOR_SYSTEM = getModelForSystem(); + } - public static JavaDataModel get() { - if (current != null) { - return current; - } + @VisibleForTesting + static JavaDataModel getModelForSystem() { + String props = null; try { - String props = System.getProperty("sun.arch.data.model"); - if ("32".equals(props)) { - return current = JAVA32; - } + props = System.getProperty("sun.arch.data.model"); } catch (Exception e) { - // ignore + LOG.warn("Failed to determine java data model, defaulting to 64", e); + } + if ("32".equals(props)) { + return JAVA32; } // TODO: separate model is needed for compressedOops, which can be guessed from memory size. - return current = JAVA64; + return JAVA64; + } + + public static JavaDataModel get() { + return LazyHolder.MODEL_FOR_SYSTEM; } public static int round(int size) { http://git-wip-us.apache.org/repos/asf/orc/blob/bffb88b6/java/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java ---------------------------------------------------------------------- diff --git a/java/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java b/java/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java new file mode 100644 index 0000000..35976cc --- /dev/null +++ b/java/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java @@ -0,0 +1,59 @@ +package org.apache.hadoop.hive.ql.util; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; + +public final class JavaDataModelTest { + + private static final String DATA_MODEL_PROPERTY = "sun.arch.data.model"; + + private String previousModelSetting; + + @Before + public void setUp() throws Exception { + previousModelSetting = System.getProperty(DATA_MODEL_PROPERTY); + } + + @After + public void tearDown() throws Exception { + if (previousModelSetting != null) { + System.setProperty(DATA_MODEL_PROPERTY, previousModelSetting); + } else { + System.clearProperty(DATA_MODEL_PROPERTY); + } + } + + @Test + public void testGetDoesNotReturnNull() throws Exception { + JavaDataModel model = JavaDataModel.get(); + assertNotNull(model); + } + + @Test + public void testGetModelForSystemWhenSetTo32() throws Exception { + System.setProperty(DATA_MODEL_PROPERTY, "32"); + assertSame(JavaDataModel.JAVA32, JavaDataModel.getModelForSystem()); + } + + @Test + public void testGetModelForSystemWhenSetTo64() throws Exception { + System.setProperty(DATA_MODEL_PROPERTY, "64"); + assertSame(JavaDataModel.JAVA64, JavaDataModel.getModelForSystem()); + } + + @Test + public void testGetModelForSystemWhenSetToUnknown() throws Exception { + System.setProperty(DATA_MODEL_PROPERTY, "unknown"); + assertSame(JavaDataModel.JAVA64, JavaDataModel.getModelForSystem()); + } + + @Test + public void testGetModelForSystemWhenUndefined() throws Exception { + System.clearProperty(DATA_MODEL_PROPERTY); + assertSame(JavaDataModel.JAVA64, JavaDataModel.getModelForSystem()); + } +} \ No newline at end of file
