You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2020/12/15 14:09:50 UTC

[ignite-3] 01/03: Rework reflection-based Serializer with using VarHandles.

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

amashenkov pushed a commit to branch ignite-13618-javapoet
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit b993d6b7a8a6da702b167abcd442f545f4470c4d
Author: Andrew Mashenkov <an...@gmail.com>
AuthorDate: Fri Dec 11 13:12:21 2020 +0300

    Rework reflection-based Serializer with using VarHandles.
---
 modules/commons/pom.xml                            |   5 +-
 ...UnsafeFieldAccessor.java => FieldAccessor.java} | 166 +++++++++------------
 .../schema/marshaller/reflection/Marshaller.java   |  14 +-
 .../benchmarks/SerializerBenchmarkTest.java        |   2 +-
 .../schema/marshaller/JavaSerializerTest.java      |   4 +-
 .../marshaller/reflection/FieldAccessorTest.java   |  14 +-
 pom.xml                                            |   5 +-
 7 files changed, 94 insertions(+), 116 deletions(-)

diff --git a/modules/commons/pom.xml b/modules/commons/pom.xml
index fc78231..05a2fff 100644
--- a/modules/commons/pom.xml
+++ b/modules/commons/pom.xml
@@ -29,7 +29,7 @@
         <artifactId>apache-ignite</artifactId>
         <groupId>org.apache.ignite</groupId>
         <version>3.0.0-SNAPSHOT</version>
-        <relativePath>../..</relativePath>
+        <relativePath>../../pom.xml</relativePath>
     </parent>
 
     <artifactId>ignite-commons</artifactId>
@@ -56,11 +56,10 @@
             <version>${junit.jupiter.version}</version>
             <scope>test</scope>
         </dependency>
-
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
-            <version>${mockito.version}</version>
+            <version>${mockito.core.version}</version>
             <scope>test</scope>
         </dependency>
 
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/UnsafeFieldAccessor.java b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java
similarity index 69%
rename from modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/UnsafeFieldAccessor.java
rename to modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java
index 72b2491..97ea038 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/UnsafeFieldAccessor.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessor.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.schema.marshaller.reflection;
 
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.VarHandle;
 import java.lang.reflect.Field;
 import java.util.Objects;
 import org.apache.ignite.internal.schema.Column;
@@ -26,32 +28,18 @@ import org.apache.ignite.internal.schema.TupleAssembler;
 import org.apache.ignite.internal.schema.marshaller.BinaryMode;
 import org.apache.ignite.internal.schema.marshaller.MarshallerUtil;
 import org.apache.ignite.internal.schema.marshaller.SerializationException;
-import org.apache.ignite.internal.util.IgniteUnsafeUtils;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Field accessor to speedup access.
  */
-// TODO: Extract interface, move to java-8 profile and add Java9+ implementation using VarHandles.
-public abstract class UnsafeFieldAccessor {
-    /**
-     * TODO: implement sesitive information filtering.
-     *
-     * @return {@code False} if sensitive information exoising is prohibited, {@code false} otherwise.
-     */
-    private static boolean includeSensitive() {
-        return true;
-    }
-
-    /** Offset. */
-    protected final long offset;
+public abstract class FieldAccessor {
+    /** VarHandle. */
+    protected final VarHandle varHandle;
 
     /** Mode. */
     protected final BinaryMode mode;
 
-    /** Field name */
-    protected final String name;
-
     /**
      * Mapped column position in schema.
      * <p>
@@ -67,7 +55,7 @@ public abstract class UnsafeFieldAccessor {
      * @param colIdx Column index in schema.
      * @return Accessor.
      */
-    static UnsafeFieldAccessor create(Class<?> type, Column col, int colIdx) {
+    static FieldAccessor create(Class<?> type, Column col, int colIdx) {
         try {
             final Field field = type.getDeclaredField(col.name());
 
@@ -75,25 +63,28 @@ public abstract class UnsafeFieldAccessor {
                 throw new IllegalArgumentException("Failed to map non-nullable field to nullable column [name=" + field.getName() + ']');
 
             BinaryMode mode = MarshallerUtil.mode(field.getType());
+            final MethodHandles.Lookup lookup = MethodHandles.privateLookupIn(type, MethodHandles.lookup());
+
+            VarHandle varHandle = lookup.unreflectVarHandle(field);
 
             switch (mode) {
                 case P_BYTE:
-                    return new BytePrimitiveAccessor(field, colIdx);
+                    return new BytePrimitiveAccessor(varHandle, colIdx);
 
                 case P_SHORT:
-                    return new ShortPrimitiveAccessor(field, colIdx);
+                    return new ShortPrimitiveAccessor(varHandle, colIdx);
 
                 case P_INT:
-                    return new IntPrimitiveAccessor(field, colIdx);
+                    return new IntPrimitiveAccessor(varHandle, colIdx);
 
                 case P_LONG:
-                    return new LongPrimitiveAccessor(field, colIdx);
+                    return new LongPrimitiveAccessor(varHandle, colIdx);
 
                 case P_FLOAT:
-                    return new FloatPrimitiveAccessor(field, colIdx);
+                    return new FloatPrimitiveAccessor(varHandle, colIdx);
 
                 case P_DOUBLE:
-                    return new DoublePrimitiveAccessor(field, colIdx);
+                    return new DoublePrimitiveAccessor(varHandle, colIdx);
 
                 case BYTE:
                 case SHORT:
@@ -105,7 +96,7 @@ public abstract class UnsafeFieldAccessor {
                 case UUID:
                 case BYTE_ARR:
                 case BITSET:
-                    return new ReferenceFieldAccessor(field, colIdx, mode);
+                    return new ReferenceFieldAccessor(varHandle, colIdx, mode);
 
                 default:
                     assert false : "Invalid mode " + mode;
@@ -113,7 +104,7 @@ public abstract class UnsafeFieldAccessor {
 
             throw new IllegalArgumentException("Failed to create accessor for field [name=" + field.getName() + ']');
         }
-        catch (NoSuchFieldException | SecurityException ex) {
+        catch (NoSuchFieldException | SecurityException | IllegalAccessException ex) {
             throw new IllegalArgumentException(ex);
         }
     }
@@ -126,7 +117,7 @@ public abstract class UnsafeFieldAccessor {
      * @param mode Binary mode.
      * @return Accessor.
      */
-    static UnsafeFieldAccessor createIdentityAccessor(Column col, int colIdx, BinaryMode mode) {
+    static FieldAccessor createIdentityAccessor(Column col, int colIdx, BinaryMode mode) {
         switch (mode) {
             //  Marshaller read/write object contract methods allowed boxed types only.
             case P_BYTE:
@@ -159,19 +150,18 @@ public abstract class UnsafeFieldAccessor {
     /**
      * Protected constructor.
      *
-     * @param field Field.
+     * @param varHandle Field.
      * @param colIdx Column index.
      * @param mode Binary mode;
      */
-    protected UnsafeFieldAccessor(Field field, int colIdx, BinaryMode mode) {
-        assert field != null;
+    protected FieldAccessor(VarHandle varHandle, int colIdx, BinaryMode mode) {
+        assert varHandle != null;
         assert colIdx >= 0;
         assert mode != null;
 
         this.colIdx = colIdx;
         this.mode = mode;
-        offset = IgniteUnsafeUtils.objectFieldOffset(field);
-        name = field.getName();
+        this.varHandle = varHandle;
     }
 
     /**
@@ -180,23 +170,13 @@ public abstract class UnsafeFieldAccessor {
      * @param colIdx Column index.
      * @param mode Binary mode;
      */
-    private UnsafeFieldAccessor(int colIdx, BinaryMode mode) {
+    private FieldAccessor(int colIdx, BinaryMode mode) {
         assert colIdx >= 0;
         assert mode != null;
 
         this.colIdx = colIdx;
         this.mode = mode;
-        offset = 0;
-        name = null;
-    }
-
-    /**
-     * Get binary read/write mode.
-     *
-     * @return Binary mode.
-     */
-    public BinaryMode mode() {
-        return mode;
+        varHandle = null;
     }
 
     /**
@@ -211,10 +191,7 @@ public abstract class UnsafeFieldAccessor {
             write0(Objects.requireNonNull(obj), writer);
         }
         catch (Exception ex) {
-            if (includeSensitive() && name != null)
-                throw new SerializationException("Failed to read field [id=" + colIdx + ']', ex);
-            else
-                throw new SerializationException("Failed to write field [id=" + colIdx + ']', ex);
+            throw new SerializationException("Failed to write field [id=" + colIdx + ']', ex);
         }
     }
 
@@ -239,10 +216,7 @@ public abstract class UnsafeFieldAccessor {
             read0(Objects.requireNonNull(obj), reader);
         }
         catch (Exception ex) {
-            if (includeSensitive() && name != null)
-                throw new SerializationException("Failed to read field [name=" + name + ']', ex);
-            else
-                throw new SerializationException("Failed to read field [id=" + colIdx + ']', ex);
+            throw new SerializationException("Failed to read field [id=" + colIdx + ']', ex);
         }
     }
 
@@ -272,13 +246,13 @@ public abstract class UnsafeFieldAccessor {
      * @return Field value of given object.
      */
     @Nullable Object value(Object obj) {
-        return IgniteUnsafeUtils.getObjectField(Objects.requireNonNull(obj), offset);
+        return varHandle.get(Objects.requireNonNull(obj));
     }
 
     /**
      * Accessor for field of primitive {@code byte} type.
      */
-    private static class IdentityAccessor extends UnsafeFieldAccessor {
+    private static class IdentityAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
@@ -313,20 +287,20 @@ public abstract class UnsafeFieldAccessor {
     /**
      * Accessor for field of primitive {@code byte} type.
      */
-    private static class BytePrimitiveAccessor extends UnsafeFieldAccessor {
+    private static class BytePrimitiveAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          */
-        public BytePrimitiveAccessor(Field field, int colIdx) {
-            super(field, colIdx, BinaryMode.P_BYTE);
+        public BytePrimitiveAccessor(VarHandle varHandle, int colIdx) {
+            super(varHandle, colIdx, BinaryMode.P_BYTE);
         }
 
         /** {@inheritDoc} */
         @Override protected void write0(Object obj, TupleAssembler writer) {
-            final byte val = IgniteUnsafeUtils.getByteField(obj, offset);
+            final byte val = (byte)varHandle.get(obj);
 
             writer.appendByte(val);
         }
@@ -335,27 +309,27 @@ public abstract class UnsafeFieldAccessor {
         @Override protected void read0(Object obj, Tuple reader) {
             final byte val = reader.byteValue(colIdx);
 
-            IgniteUnsafeUtils.putByteField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 
     /**
      * Accessor for field of primitive {@code short} type.
      */
-    private static class ShortPrimitiveAccessor extends UnsafeFieldAccessor {
+    private static class ShortPrimitiveAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          */
-        public ShortPrimitiveAccessor(Field field, int colIdx) {
-            super(field, colIdx, BinaryMode.P_SHORT);
+        public ShortPrimitiveAccessor(VarHandle varHandle, int colIdx) {
+            super(varHandle, colIdx, BinaryMode.P_SHORT);
         }
 
         /** {@inheritDoc} */
         @Override protected void write0(Object obj, TupleAssembler writer) {
-            final short val = IgniteUnsafeUtils.getShortField(obj, offset);
+            final short val = (short)varHandle.get(obj);
 
             writer.appendShort(val);
         }
@@ -364,27 +338,27 @@ public abstract class UnsafeFieldAccessor {
         @Override protected void read0(Object obj, Tuple reader) {
             final short val = reader.shortValue(colIdx);
 
-            IgniteUnsafeUtils.putShortField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 
     /**
      * Accessor for field of primitive {@code int} type.
      */
-    private static class IntPrimitiveAccessor extends UnsafeFieldAccessor {
+    private static class IntPrimitiveAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          */
-        public IntPrimitiveAccessor(Field field, int colIdx) {
-            super(field, colIdx, BinaryMode.P_INT);
+        public IntPrimitiveAccessor(VarHandle varHandle, int colIdx) {
+            super(varHandle, colIdx, BinaryMode.P_INT);
         }
 
         /** {@inheritDoc} */
         @Override protected void write0(Object obj, TupleAssembler writer) {
-            final int val = IgniteUnsafeUtils.getIntField(obj, offset);
+            final int val = (int)varHandle.get(obj);
 
             writer.appendInt(val);
         }
@@ -393,27 +367,27 @@ public abstract class UnsafeFieldAccessor {
         @Override protected void read0(Object obj, Tuple reader) {
             final int val = reader.intValue(colIdx);
 
-            IgniteUnsafeUtils.putIntField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 
     /**
      * Accessor for field of primitive {@code long} type.
      */
-    private static class LongPrimitiveAccessor extends UnsafeFieldAccessor {
+    private static class LongPrimitiveAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          */
-        public LongPrimitiveAccessor(Field field, int colIdx) {
-            super(field, colIdx, BinaryMode.P_LONG);
+        public LongPrimitiveAccessor(VarHandle varHandle, int colIdx) {
+            super(varHandle, colIdx, BinaryMode.P_LONG);
         }
 
         /** {@inheritDoc} */
         @Override protected void write0(Object obj, TupleAssembler writer) {
-            final long val = IgniteUnsafeUtils.getLongField(obj, offset);
+            final long val = (long)varHandle.get(obj);
 
             writer.appendLong(val);
         }
@@ -422,27 +396,27 @@ public abstract class UnsafeFieldAccessor {
         @Override protected void read0(Object obj, Tuple reader) {
             final long val = reader.longValue(colIdx);
 
-            IgniteUnsafeUtils.putLongField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 
     /**
      * Accessor for field of primitive {@code float} type.
      */
-    private static class FloatPrimitiveAccessor extends UnsafeFieldAccessor {
+    private static class FloatPrimitiveAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          */
-        public FloatPrimitiveAccessor(Field field, int colIdx) {
-            super(field, colIdx, BinaryMode.P_FLOAT);
+        public FloatPrimitiveAccessor(VarHandle varHandle, int colIdx) {
+            super(varHandle, colIdx, BinaryMode.P_FLOAT);
         }
 
         /** {@inheritDoc} */
         @Override protected void write0(Object obj, TupleAssembler writer) {
-            final float val = IgniteUnsafeUtils.getFloatField(obj, offset);
+            final float val = (float)varHandle.get(obj);
 
             writer.appendFloat(val);
         }
@@ -451,27 +425,27 @@ public abstract class UnsafeFieldAccessor {
         @Override protected void read0(Object obj, Tuple reader) {
             final float val = reader.floatValue(colIdx);
 
-            IgniteUnsafeUtils.putFloatField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 
     /**
      * Accessor for field of primitive {@code double} type.
      */
-    private static class DoublePrimitiveAccessor extends UnsafeFieldAccessor {
+    private static class DoublePrimitiveAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          */
-        public DoublePrimitiveAccessor(Field field, int colIdx) {
-            super(field, colIdx, BinaryMode.P_DOUBLE);
+        public DoublePrimitiveAccessor(VarHandle varHandle, int colIdx) {
+            super(varHandle, colIdx, BinaryMode.P_DOUBLE);
         }
 
         /** {@inheritDoc} */
         @Override protected void write0(Object obj, TupleAssembler writer) {
-            final double val = IgniteUnsafeUtils.getDoubleField(obj, offset);
+            final double val = (double)varHandle.get(obj);
 
             writer.appendDouble(val);
         }
@@ -480,23 +454,23 @@ public abstract class UnsafeFieldAccessor {
         @Override protected void read0(Object obj, Tuple reader) {
             final double val = reader.doubleValue(colIdx);
 
-            IgniteUnsafeUtils.putDoubleField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 
     /**
      * Accessor for field of reference type.
      */
-    private static class ReferenceFieldAccessor extends UnsafeFieldAccessor {
+    private static class ReferenceFieldAccessor extends FieldAccessor {
         /**
          * Constructor.
          *
-         * @param field Field.
+         * @param varHandle VarHandle.
          * @param colIdx Column index.
          * @param mode Binary mode.
          */
-        ReferenceFieldAccessor(Field field, int colIdx, BinaryMode mode) {
-            super(field, colIdx, mode);
+        ReferenceFieldAccessor(VarHandle varHandle, int colIdx, BinaryMode mode) {
+            super(varHandle, colIdx, mode);
         }
 
         /** {@inheritDoc} */
@@ -506,7 +480,7 @@ public abstract class UnsafeFieldAccessor {
 
             Object val;
 
-            val = IgniteUnsafeUtils.getObjectField(obj, offset);
+            val = varHandle.get(obj);
 
             if (val == null) {
                 writer.appendNull();
@@ -521,7 +495,7 @@ public abstract class UnsafeFieldAccessor {
         @Override public void read0(Object obj, Tuple reader) {
             Object val = JavaSerializer.readRefValue(reader, colIdx, mode);
 
-            IgniteUnsafeUtils.putObjectField(obj, offset, val);
+            varHandle.set(obj, val);
         }
     }
 }
diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/Marshaller.java b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/Marshaller.java
index 506c3a3..a89158b 100644
--- a/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/Marshaller.java
+++ b/modules/commons/src/main/java/org/apache/ignite/internal/schema/marshaller/reflection/Marshaller.java
@@ -51,17 +51,17 @@ public class Marshaller {
             assert mode.typeSpec() == col.type().spec() : "Target type is not compatible.";
             assert !aClass.isPrimitive() : "Non-nullable types are not allowed.";
 
-            return new Marshaller(UnsafeFieldAccessor.createIdentityAccessor(col, firstColId, mode));
+            return new Marshaller(FieldAccessor.createIdentityAccessor(col, firstColId, mode));
         }
 
-        UnsafeFieldAccessor[] fieldAccessors = new UnsafeFieldAccessor[cols.length()];
+        FieldAccessor[] fieldAccessors = new FieldAccessor[cols.length()];
 
         // Build accessors
         for (int i = 0; i < cols.length(); i++) {
             final Column col = cols.column(i);
 
             final int colIdx = firstColId + i; /* Absolute column idx in schema. */
-            fieldAccessors[i] = UnsafeFieldAccessor.create(aClass, col, colIdx);
+            fieldAccessors[i] = FieldAccessor.create(aClass, col, colIdx);
         }
 
         return new Marshaller(new ObjectFactory<>(aClass), fieldAccessors);
@@ -71,7 +71,7 @@ public class Marshaller {
      * Field accessors for mapped columns.
      * Array has same size and order as columns.
      */
-    private final UnsafeFieldAccessor[] fieldAccessors;
+    private final FieldAccessor[] fieldAccessors;
 
     /**
      * Object factory for complex types or {@code null} for basic type.
@@ -86,7 +86,7 @@ public class Marshaller {
      * @param fieldAccessors Object field accessors for mapped columns.
      */
     @SuppressWarnings("AssignmentOrReturnOfFieldWithMutableType")
-    public Marshaller(Factory<?> factory, UnsafeFieldAccessor[] fieldAccessors) {
+    public Marshaller(Factory<?> factory, FieldAccessor[] fieldAccessors) {
         this.fieldAccessors = fieldAccessors;
         this.factory = Objects.requireNonNull(factory);
     }
@@ -97,8 +97,8 @@ public class Marshaller {
      *
      * @param fieldAccessor Identity field accessor for object of basic type.
      */
-    public Marshaller(UnsafeFieldAccessor fieldAccessor) {
-        fieldAccessors = new UnsafeFieldAccessor[] {fieldAccessor};
+    public Marshaller(FieldAccessor fieldAccessor) {
+        fieldAccessors = new FieldAccessor[] {fieldAccessor};
         factory = null;
     }
 
diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
index 23193ba..1f0ebef 100644
--- a/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
+++ b/modules/commons/src/test/java/org/apache/ignite/internal/benchmarks/SerializerBenchmarkTest.java
@@ -56,7 +56,7 @@ import static org.apache.ignite.internal.schema.NativeType.LONG;
 @Measurement(time = 10, iterations = 5, timeUnit = TimeUnit.SECONDS)
 @BenchmarkMode({Mode.Throughput, Mode.AverageTime})
 @OutputTimeUnit(TimeUnit.MICROSECONDS)
-@Fork(1)
+@Fork(jvmArgs = "-Djava.lang.invoke.stringConcat=BC_SB" /* Workaround for Java 9+ */, value = 1)
 public class SerializerBenchmarkTest {
     /** Random. */
     private Random rnd = new Random();
diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
index 49ef554..d172e86 100644
--- a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
+++ b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/JavaSerializerTest.java
@@ -245,7 +245,7 @@ public class JavaSerializerTest {
      */
     @ParameterizedTest
     @MethodSource("serializerFactoryProvider")
-    public void testClassWithNoDefaultConstructor(SerializerFactory factory) throws SerializationException {
+    public void testClassWithNoDefaultConstructor(SerializerFactory factory) {
         Column[] cols = new Column[] {
             new Column("pLongCol", LONG, false),
         };
@@ -340,7 +340,9 @@ public class JavaSerializerTest {
             obj.longCol = rnd.nextLong();
             obj.floatCol = rnd.nextFloat();
             obj.doubleCol = rnd.nextDouble();
+            obj.nullLongCol = null;
 
+            obj.nullBytesCol = null;
             obj.uuidCol = new UUID(rnd.nextLong(), rnd.nextLong());
             obj.bitmaskCol = TestUtils.randomBitSet(rnd, 42);
             obj.stringCol = TestUtils.randomString(rnd, rnd.nextInt(255));
diff --git a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java
index 8e864d6..2cec0b3 100644
--- a/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java
+++ b/modules/commons/src/test/java/org/apache/ignite/internal/schema/marshaller/reflection/FieldAccessorTest.java
@@ -103,7 +103,7 @@ public class FieldAccessorTest {
         final TestObject obj = TestObject.randomObject(rnd);
 
         for (int i = 0; i < cols.length; i++) {
-            UnsafeFieldAccessor accessor = UnsafeFieldAccessor.create(TestObject.class, cols[i], i);
+            FieldAccessor accessor = FieldAccessor.create(TestObject.class, cols[i], i);
 
             accessor.write(obj, tupleAssembler);
         }
@@ -111,7 +111,7 @@ public class FieldAccessorTest {
         final TestObject restoredObj = new TestObject();
 
         for (int i = 0; i < cols.length; i++) {
-            UnsafeFieldAccessor accessor = UnsafeFieldAccessor.create(TestObject.class, cols[i], i);
+            FieldAccessor accessor = FieldAccessor.create(TestObject.class, cols[i], i);
 
             accessor.read(restoredObj, tuple);
         }
@@ -159,7 +159,7 @@ public class FieldAccessorTest {
         obj.stringCol = TestUtils.randomString(rnd, 255);
 
         for (int i = 0; i < cols.length; i++) {
-            UnsafeFieldAccessor accessor = UnsafeFieldAccessor.create(TestSimpleObject.class, cols[i], i);
+            FieldAccessor accessor = FieldAccessor.create(TestSimpleObject.class, cols[i], i);
 
             accessor.write(obj, tupleAssembler);
         }
@@ -167,7 +167,7 @@ public class FieldAccessorTest {
         final TestSimpleObject restoredObj = new TestSimpleObject();
 
         for (int i = 0; i < cols.length; i++) {
-            UnsafeFieldAccessor accessor = UnsafeFieldAccessor.create(TestSimpleObject.class, cols[i], i);
+            FieldAccessor accessor = FieldAccessor.create(TestSimpleObject.class, cols[i], i);
 
             accessor.read(restoredObj, tuple);
         }
@@ -184,7 +184,7 @@ public class FieldAccessorTest {
      */
     @Test
     public void testIdentityAccessor() throws Exception {
-        final UnsafeFieldAccessor accessor = UnsafeFieldAccessor.createIdentityAccessor(
+        final FieldAccessor accessor = FieldAccessor.createIdentityAccessor(
             new Column("col0", STRING, true),
             0,
             BinaryMode.STRING);
@@ -202,7 +202,7 @@ public class FieldAccessorTest {
      */
     @Test
     public void testWrongIdentityAccessor() throws Exception {
-        final UnsafeFieldAccessor accessor = UnsafeFieldAccessor.createIdentityAccessor(
+        final FieldAccessor accessor = FieldAccessor.createIdentityAccessor(
             new Column("col0", STRING, true),
             42,
             BinaryMode.UUID);
@@ -242,7 +242,7 @@ public class FieldAccessorTest {
 
         final Answer<Object> tupleAnswer = new Answer<Object>() {
             @Override public Object answer(InvocationOnMock invocation) {
-                final int idx = invocation.getArgumentAt(0, Integer.class);
+                final int idx = invocation.getArgument(0, Integer.class);
 
                 return vals.get(idx);
             }
diff --git a/pom.xml b/pom.xml
index 2d460d4..7d1a734 100644
--- a/pom.xml
+++ b/pom.xml
@@ -54,9 +54,12 @@
         <jetbrains.annotations.version>20.1.0</jetbrains.annotations.version>
         <jmh.framework.verion>1.9.3</jmh.framework.verion>
         <junit.jupiter.version>5.7.0</junit.jupiter.version>
-        <mockito.version>1.10.19</mockito.version>
+        <mockito.core.version>3.6.28</mockito.core.version>
 
         <!-- Maven plugins -->
+        <maven.compiler.source>11</maven.compiler.source> <!-- Requires for correct compilation in IDEA. -->
+        <maven.compiler.target>11</maven.compiler.target>
+
         <maven.compiler.plugin.version>3.8.1</maven.compiler.plugin.version>
         <maven.surefire.plugin.version>3.0.0-M4</maven.surefire.plugin.version>
         <apache.rat.plugin.version>0.13</apache.rat.plugin.version>