Repository: hive Updated Branches: refs/heads/master f68cbcbfb -> 2c3ebf8f2
HIVE-13699: Make JavaDataModel#get thread safe for parallel compilation (Peter Slawski via Ashutosh Chauhan) Signed-off-by: Ashutosh Chauhan <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/2c3ebf8f Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/2c3ebf8f Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/2c3ebf8f Branch: refs/heads/master Commit: 2c3ebf8f2259a46d102b598df3512f7226b6522a Parents: f68cbcb Author: Peter Slawski <[email protected]> Authored: Tue Apr 5 14:21:55 2016 -0700 Committer: Ashutosh Chauhan <[email protected]> Committed: Fri May 20 18:04:14 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/hive/blob/2c3ebf8f/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java ---------------------------------------------------------------------- diff --git a/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java b/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java index 151f30d..33b70c2 100644 --- a/storage-api/src/java/org/apache/hadoop/hive/ql/util/JavaDataModel.java +++ b/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/hive/blob/2c3ebf8f/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java ---------------------------------------------------------------------- diff --git a/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java b/storage-api/src/test/org/apache/hadoop/hive/ql/util/JavaDataModelTest.java new file mode 100644 index 0000000..35976cc --- /dev/null +++ b/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
