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...)}.