This is an automated email from the ASF dual-hosted git repository.

abstractdog pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a03a60  HIVE-22097: Incompatible java.util.ArrayList for java 11 
(Attila Magyar via Laszlo Bodor, Prasanth Jayachandran)
5a03a60 is described below

commit 5a03a6056648eda68ec975843707e05d3ad51fb0
Author: Attila Magyar <[email protected]>
AuthorDate: Wed Oct 2 12:43:39 2019 +0200

    HIVE-22097: Incompatible java.util.ArrayList for java 11 (Attila Magyar via 
Laszlo Bodor, Prasanth Jayachandran)
    
    Signed-off-by: Laszlo Bodor <[email protected]>
---
 .../hive/ql/exec/SerializationUtilities.java       | 120 ++++++++++++---------
 1 file changed, 71 insertions(+), 49 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/exec/SerializationUtilities.java 
b/ql/src/java/org/apache/hadoop/hive/ql/exec/SerializationUtilities.java
index e4d33e8..e205c08 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/SerializationUtilities.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/SerializationUtilities.java
@@ -367,67 +367,89 @@ public class SerializationUtilities {
   }
 
   /**
-   * Supports sublists created via {@link ArrayList#subList(int, int)} since 
java7 (oracle jdk,
-   * represented by <code>java.util.ArrayList$SubList</code>).
+   * Supports sublists created via {@link ArrayList#subList(int, int)} since 
java7 and {@link LinkedList#subList(int, int)} since java9 (openjdk).
    * This is from kryo-serializers package.
    */
   private static class ArrayListSubListSerializer extends 
com.esotericsoftware.kryo.Serializer<List<?>> {
 
-      private Field _parentField;
-      private Field _parentOffsetField;
-      private Field _sizeField;
-
-      public ArrayListSubListSerializer() {
-          try {
-              final Class<?> clazz = 
Class.forName("java.util.ArrayList$SubList");
-              _parentField = clazz.getDeclaredField("parent");
-              _parentOffsetField = clazz.getDeclaredField( "parentOffset" );
-              _sizeField = clazz.getDeclaredField( "size" );
-              _parentField.setAccessible( true );
-              _parentOffsetField.setAccessible( true );
-              _sizeField.setAccessible( true );
-          } catch (final Exception e) {
-              throw new RuntimeException(e);
-          }
+    private Field _parentField;
+    private Field _parentOffsetField;
+    private Field _sizeField;
+
+    public ArrayListSubListSerializer() {
+      try {
+        final Class<?> clazz = Class.forName("java.util.ArrayList$SubList");
+        _parentField = getParentField(clazz);
+        _parentOffsetField = getOffsetField(clazz);
+        _sizeField = clazz.getDeclaredField( "size" );
+        _parentField.setAccessible( true );
+        _parentOffsetField.setAccessible( true );
+        _sizeField.setAccessible( true );
+      } catch (final Exception e) {
+        throw new RuntimeException(e);
       }
+    }
 
-      @Override
-      public List<?> read(final Kryo kryo, final Input input, final 
Class<List<?>> clazz) {
-          kryo.reference(FAKE_REFERENCE);
-          final List<?> list = (List<?>) kryo.readClassAndObject(input);
-          final int fromIndex = input.readInt(true);
-          final int toIndex = input.readInt(true);
-          return list.subList(fromIndex, toIndex);
+    private static Field getParentField(Class clazz) throws 
NoSuchFieldException {
+      try {
+        // java 9+
+        return clazz.getDeclaredField("root");
+      } catch(NoSuchFieldException e) {
+        return clazz.getDeclaredField("parent");
       }
+    }
 
-      @Override
-      public void write(final Kryo kryo, final Output output, final List<?> 
obj) {
-        try {
-            kryo.writeClassAndObject(output, _parentField.get(obj));
-            final int parentOffset = _parentOffsetField.getInt( obj );
-            final int fromIndex = parentOffset;
-            output.writeInt(fromIndex, true);
-            final int toIndex = fromIndex + _sizeField.getInt( obj );
-            output.writeInt(toIndex, true);
-        } catch (final Exception e) {
-                throw new RuntimeException(e);
-        }
+    private static Field getOffsetField(Class<?> clazz) throws 
NoSuchFieldException {
+      try {
+        // up to jdk8 (which also has an "offset" field (we don't need) - 
therefore we check "parentOffset" first
+        return clazz.getDeclaredField( "parentOffset" );
+      } catch (NoSuchFieldException e) {
+        // jdk9+ only has "offset" which is the parent offset
+        return clazz.getDeclaredField( "offset" );
       }
+    }
 
-      @Override
-      public List<?> copy(final Kryo kryo, final List<?> original) {
-        try {
-            kryo.reference(FAKE_REFERENCE);
-            final List<?> list = (List<?>) _parentField.get(original);
-            final int parentOffset = _parentOffsetField.getInt( original );
-            final int fromIndex = parentOffset;
-            final int toIndex = fromIndex + _sizeField.getInt( original );
-            return kryo.copy(list).subList(fromIndex, toIndex);
-        } catch (final Exception e) {
-                throw new RuntimeException(e);
-        }
+    @Override
+    public List<?> read(final Kryo kryo, final Input input, final 
Class<List<?>> clazz) {
+      kryo.reference(FAKE_REFERENCE);
+      final List<?> list = (List<?>) kryo.readClassAndObject(input);
+      final int fromIndex = input.readInt(true);
+      final int toIndex = input.readInt(true);
+      return list.subList(fromIndex, toIndex);
+    }
+
+    @Override
+    public void write(final Kryo kryo, final Output output, final List<?> obj) 
{
+      try {
+        kryo.writeClassAndObject(output, _parentField.get(obj));
+        final int parentOffset = _parentOffsetField.getInt( obj );
+        final int fromIndex = parentOffset;
+        output.writeInt(fromIndex, true);
+        final int toIndex = fromIndex + _sizeField.getInt( obj );
+        output.writeInt(toIndex, true);
+      } catch (final RuntimeException e) {
+        // Don't eat and wrap RuntimeExceptions because the 
ObjectBuffer.write...
+        // handles SerializationException specifically (resizing the buffer)...
+        throw e;
+      } catch (final Exception e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+    @Override
+    public List<?> copy(final Kryo kryo, final List<?> original) {
+      kryo.reference(FAKE_REFERENCE);
+      try {
+        final List<?> list = (List<?>) _parentField.get(original);
+        final int parentOffset = _parentOffsetField.getInt( original );
+        final int fromIndex = parentOffset;
+        final int toIndex = fromIndex + _sizeField.getInt( original );
+        return kryo.copy(list).subList(fromIndex, toIndex);
+      } catch(final Exception e) {
+        throw new RuntimeException(e);
       }
     }
+  }
 
   /**
    * A kryo {@link Serializer} for lists created via {@link 
Arrays#asList(Object...)}.

Reply via email to