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

Reply via email to