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

myui pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hivemall.git


The following commit(s) were added to refs/heads/master by this push:
     new 2621ca9  [HIVEMALL-311] Upgrade Kryo version from 2.21 to 2.24.0
2621ca9 is described below

commit 2621ca984eb4724be9eea2b87ded8a98e4e3391a
Author: Makoto Yui <[email protected]>
AuthorDate: Sun May 2 15:55:46 2021 +0900

    [HIVEMALL-311] Upgrade Kryo version from 2.21 to 2.24.0
    
    ## What changes were proposed in this pull request?
    
    xgboost4j and xgboost module used Kryo version 2.21 but it has a bug in 
serializing generic collections. So, update Kryo version to 2.24.0 just in case.
    
    ## What type of PR is it?
    
    Bug Fix
    
    ## What is the Jira issue?
    
    https://issues.apache.org/jira/browse/HIVEMALL-311
    
    ## How was this patch tested?
    
    unit tests
    
    ## Checklist
    
    (Please remove this section if not needed; check `x` for YES, blank for NO)
    
    - [x] Did you apply source code formatter, i.e., `./bin/format_code.sh`, 
for your commit?
    - [ ] Did you run system tests on Hive (or Spark)?
    
    Author: Makoto Yui <[email protected]>
    
    Closes #241 from myui/kryo_update.
---
 core/pom.xml                               |  6 +++
 core/src/test/java/hivemall/TestUtils.java | 64 ++++++++++++++++++++++++++----
 pom.xml                                    |  1 +
 xgboost/pom.xml                            |  2 +-
 4 files changed, 65 insertions(+), 8 deletions(-)

diff --git a/core/pom.xml b/core/pom.xml
index ee65e63..20eba13 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -163,6 +163,12 @@
                        <artifactId>mockito-core</artifactId>
                        <scope>test</scope>
                </dependency>
+               <dependency>
+                       <groupId>com.esotericsoftware.kryo</groupId>
+                       <artifactId>kryo</artifactId>
+                       <version>${kryo.version}</version>
+                       <scope>test</scope>
+               </dependency>
        </dependencies>
 
 </project>
diff --git a/core/src/test/java/hivemall/TestUtils.java 
b/core/src/test/java/hivemall/TestUtils.java
index fd8d189..3fb61dc 100644
--- a/core/src/test/java/hivemall/TestUtils.java
+++ b/core/src/test/java/hivemall/TestUtils.java
@@ -32,6 +32,7 @@ import 
org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
 import org.apache.hive.com.esotericsoftware.kryo.Kryo;
 import org.apache.hive.com.esotericsoftware.kryo.io.Input;
 import org.apache.hive.com.esotericsoftware.kryo.io.Output;
+import org.objenesis.strategy.StdInstantiatorStrategy;
 
 public final class TestUtils {
 
@@ -48,8 +49,11 @@ public final class TestUtils {
         udf.initialize(ois);
 
         // serialization after initialization
-        byte[] serialized = serializeObjectByKryo(udf);
-        deserializeObjectByKryo(serialized, clazz);
+        byte[] serialized1 = serializeObjectByKryo(udf);
+        deserializeObjectByKryo(serialized1, clazz);
+
+        byte[] serialized2 = serializeObjectByOriginalKryo(udf);
+        deserializeObjectByOriginalKryo(serialized2, clazz);
 
         int size = row.length;
         GenericUDF.DeferredObject[] rowDeferred = new 
GenericUDF.DeferredObject[size];
@@ -60,8 +64,11 @@ public final class TestUtils {
         udf.evaluate(rowDeferred);
 
         // serialization after evaluating row
-        serialized = serializeObjectByKryo(udf);
-        TestUtils.deserializeObjectByKryo(serialized, clazz);
+        serialized1 = serializeObjectByKryo(udf);
+        TestUtils.deserializeObjectByKryo(serialized1, clazz);
+
+        serialized2 = serializeObjectByOriginalKryo(udf);
+        TestUtils.deserializeObjectByOriginalKryo(serialized2, clazz);
 
         udf.close();
     }
@@ -82,6 +89,9 @@ public final class TestUtils {
         byte[] serialized = serializeObjectByKryo(udtf);
         deserializeObjectByKryo(serialized, clazz);
 
+        byte[] serialized2 = serializeObjectByOriginalKryo(udtf);
+        deserializeObjectByOriginalKryo(serialized2, clazz);
+
         udtf.setCollector(new Collector() {
             public void collect(Object input) throws HiveException {
                 // noop
@@ -99,9 +109,12 @@ public final class TestUtils {
         udtf.close();
     }
 
+    // -------------------------------
+    // Hive version of Kryo
+
     @Nonnull
     public static byte[] serializeObjectByKryo(@Nonnull Object obj) {
-        Kryo kryo = getKryo();
+        Kryo kryo = getHiveKryo();
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
         Output output = new Output(bos);
         kryo.writeObject(output, obj);
@@ -111,7 +124,7 @@ public final class TestUtils {
 
     @Nonnull
     public static <T> T deserializeObjectByKryo(@Nonnull byte[] in, @Nonnull 
Class<T> clazz) {
-        Kryo kryo = getKryo();
+        Kryo kryo = getHiveKryo();
         Input inp = new Input(in);
         T t = kryo.readObject(inp, clazz);
         inp.close();
@@ -119,8 +132,45 @@ public final class TestUtils {
     }
 
     @Nonnull
-    private static Kryo getKryo() {
+    private static Kryo getHiveKryo() {
         return Utilities.runtimeSerializationKryo.get();
     }
 
+    // -------------------------------
+    // esotericsoftware's original version of Kryo
+
+    @Nonnull
+    public static byte[] serializeObjectByOriginalKryo(@Nonnull Object obj) {
+        com.esotericsoftware.kryo.Kryo kryo = getOriginalKryo();
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        com.esotericsoftware.kryo.io.Output output = new 
com.esotericsoftware.kryo.io.Output(bos);
+        kryo.writeObject(output, obj);
+        output.close();
+        return bos.toByteArray();
+    }
+
+    @Nonnull
+    public static <T> T deserializeObjectByOriginalKryo(@Nonnull byte[] in,
+            @Nonnull Class<T> clazz) {
+        com.esotericsoftware.kryo.Kryo kryo = getOriginalKryo();
+        com.esotericsoftware.kryo.io.Input inp = new 
com.esotericsoftware.kryo.io.Input(in);
+        T t = kryo.readObject(inp, clazz);
+        inp.close();
+        return t;
+    }
+
+    @Nonnull
+    private static com.esotericsoftware.kryo.Kryo getOriginalKryo() {
+        com.esotericsoftware.kryo.Kryo kryo = new 
com.esotericsoftware.kryo.Kryo();
+
+        // kryo.setReferences(true);
+        // kryo.setRegistrationRequired(false);
+
+        // see https://stackoverflow.com/a/23962797/5332768
+        ((com.esotericsoftware.kryo.Kryo.DefaultInstantiatorStrategy) 
kryo.getInstantiatorStrategy()).setFallbackInstantiatorStrategy(
+            new StdInstantiatorStrategy());
+
+        return kryo;
+    }
+
 }
diff --git a/pom.xml b/pom.xml
index 1b635f7..b75b3aa 100644
--- a/pom.xml
+++ b/pom.xml
@@ -272,6 +272,7 @@
                
<maven-enforcer.requireMavenVersion>[3.3.1,)</maven-enforcer.requireMavenVersion>
                <surefire.version>2.19.1</surefire.version>
                <netty.version>4.1.42.Final</netty.version>
+               <kryo.version>2.24.0</kryo.version>
        </properties>
 
        <distributionManagement>
diff --git a/xgboost/pom.xml b/xgboost/pom.xml
index ca8725a..63f9f64 100644
--- a/xgboost/pom.xml
+++ b/xgboost/pom.xml
@@ -97,7 +97,7 @@
                        <!-- NOTE: This dependency needed for xgboost4j -->
                        <groupId>com.esotericsoftware.kryo</groupId>
                        <artifactId>kryo</artifactId>
-                       <version>2.21</version>
+                       <version>${kryo.version}</version>
                        <scope>compile</scope>
                </dependency>
                <dependency>

Reply via email to