IGNITE-4295: Added specialized methods for memory copying, depending on their nature (heap/offheap). Heap->heap copying is now performed using System.arraycopy when possible. Also it is possible to fallback to byte-by-byte copying until certain threshold is reached (see IgniteSystemProperties.IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD); it could be useful on some JDK implementations with inefficient Unsafe copy routines. E.g. on OpenJDK 8 for PowerPC. This closes #1282.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3c384212 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3c384212 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3c384212 Branch: refs/heads/master Commit: 3c384212603dd31b933205d1c127dc9d0f1785e1 Parents: 2488f34 Author: devozerov <[email protected]> Authored: Mon Dec 5 15:42:24 2016 +0300 Committer: devozerov <[email protected]> Committed: Thu Dec 15 13:45:31 2016 +0300 ---------------------------------------------------------------------- .../apache/ignite/IgniteSystemProperties.java | 8 +++ .../internal/binary/BinaryPrimitives.java | 6 +- .../binary/streams/BinaryHeapInputStream.java | 4 +- .../binary/streams/BinaryHeapOutputStream.java | 2 +- .../streams/BinaryMemoryAllocatorChunk.java | 3 +- .../streams/BinaryOffheapInputStream.java | 4 +- .../streams/BinaryOffheapOutputStream.java | 4 +- .../memory/PlatformInputStreamImpl.java | 4 +- .../memory/PlatformOutputStreamImpl.java | 2 +- .../ignite/internal/util/GridHandleTable.java | 10 ++-- .../apache/ignite/internal/util/GridUnsafe.java | 60 ++++++++++++++++++-- .../ignite/internal/util/IgniteUtils.java | 32 +---------- .../internal/util/io/GridUnsafeDataInput.java | 12 ++-- .../internal/util/io/GridUnsafeDataOutput.java | 12 ++-- .../util/offheap/unsafe/GridUnsafeMemory.java | 10 ++-- .../binary/BinaryFieldsOffheapSelfTest.java | 2 +- .../BinaryFooterOffsetsOffheapSelfTest.java | 2 +- .../binary/BinaryMarshallerSelfTest.java | 2 +- ...naryObjectBuilderDefaultMappersSelfTest.java | 2 +- .../hadoop/shuffle/HadoopShuffleJob.java | 2 +- .../hadoop/shuffle/HadoopShuffleMessage.java | 2 +- .../shuffle/streams/HadoopDataOutStream.java | 2 +- .../HadoopConcurrentHashMultimapSelftest.java | 2 +- .../collections/HadoopSkipListSelfTest.java | 2 +- 24 files changed, 108 insertions(+), 83 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java index 16fc759..d0c0d5e 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java @@ -494,6 +494,14 @@ public final class IgniteSystemProperties { public static final String IGNITE_MEMORY_UNALIGNED_ACCESS = "IGNITE_MEMORY_UNALIGNED_ACCESS"; /** + * When unsafe memory copy if performed below this threshold, Ignite will do it on per-byte basis instead of + * calling to Unsafe.copyMemory(). + * <p> + * Defaults to 0, meaning that threshold is disabled. + */ + public static final String IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD = "IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD"; + + /** * Enforces singleton. */ private IgniteSystemProperties() { http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java index 86f5040..556282d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPrimitives.java @@ -60,7 +60,7 @@ public abstract class BinaryPrimitives { public static byte[] readByteArray(byte[] arr, int off, int len) { byte[] arr0 = new byte[len]; - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF + off, arr0, GridUnsafe.BYTE_ARR_OFF, len); + System.arraycopy(arr, off, arr0, 0, len); return arr0; } @@ -73,7 +73,7 @@ public abstract class BinaryPrimitives { public static byte[] readByteArray(long ptr, int off, int len) { byte[] arr0 = new byte[len]; - GridUnsafe.copyMemory(null, ptr + off, arr0, GridUnsafe.BYTE_ARR_OFF, len); + GridUnsafe.copyOffheapHeap(ptr + off, arr0, GridUnsafe.BYTE_ARR_OFF, len); return arr0; } @@ -215,7 +215,7 @@ public abstract class BinaryPrimitives { public static char[] readCharArray(long ptr, int off, int len) { char[] arr0 = new char[len]; - GridUnsafe.copyMemory(null, ptr + off, arr0, GridUnsafe.CHAR_ARR_OFF, len << 1); + GridUnsafe.copyOffheapHeap(ptr + off, arr0, GridUnsafe.CHAR_ARR_OFF, len << 1); if (BIG_ENDIAN) { for (int i = 0; i < len; i++) http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java index b5edc02..322894e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java @@ -78,7 +78,7 @@ public final class BinaryHeapInputStream extends BinaryAbstractInputStream { if (data.length < len) { byte[] data0 = new byte[len]; - GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, data0, GridUnsafe.BYTE_ARR_OFF, data.length); + System.arraycopy(data, 0, data0, 0, data.length); data = data0; } @@ -105,7 +105,7 @@ public final class BinaryHeapInputStream extends BinaryAbstractInputStream { @Override public byte[] arrayCopy() { byte[] res = new byte[len]; - GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, res, GridUnsafe.BYTE_ARR_OFF, res.length); + System.arraycopy(data, 0, res, 0, len); return res; } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java index f06c980..17bcdf6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java @@ -75,7 +75,7 @@ public final class BinaryHeapOutputStream extends BinaryAbstractOutputStream { @Override public byte[] arrayCopy() { byte[] res = new byte[pos]; - GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, res, GridUnsafe.BYTE_ARR_OFF, pos); + System.arraycopy(data, 0, res, 0, pos); return res; } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java index f9db7da..09f8c3f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.binary.streams; -import org.apache.ignite.internal.util.GridUnsafe; import org.apache.ignite.internal.util.typedef.internal.U; import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHAL_BUFFERS_RECHECK; @@ -72,7 +71,7 @@ public class BinaryMemoryAllocatorChunk { if (this.data == data) this.data = newData; - GridUnsafe.copyMemory(data, GridUnsafe.BYTE_ARR_OFF, newData, GridUnsafe.BYTE_ARR_OFF, data.length); + System.arraycopy(data, 0, newData, 0, data.length); return newData; } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java index 9dc92c6..6f505b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java @@ -79,7 +79,7 @@ public class BinaryOffheapInputStream extends BinaryAbstractInputStream { @Override public byte[] arrayCopy() { byte[] res = new byte[len]; - GridUnsafe.copyMemory(null, ptr, res, GridUnsafe.BYTE_ARR_OFF, res.length); + GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, res.length); return res; } @@ -96,7 +96,7 @@ public class BinaryOffheapInputStream extends BinaryAbstractInputStream { /** {@inheritDoc} */ @Override protected void copyAndShift(Object target, long off, int len) { - GridUnsafe.copyMemory(null, ptr + pos, target, off, len); + GridUnsafe.copyOffheapHeap(ptr + pos, target, off, len); shift(len); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java index be9f7d3..d16e575 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java @@ -77,7 +77,7 @@ public class BinaryOffheapOutputStream extends BinaryAbstractOutputStream { @Override public byte[] arrayCopy() { byte[] res = new byte[pos]; - GridUnsafe.copyMemory(null, ptr, res, GridUnsafe.BYTE_ARR_OFF, pos); + GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, pos); return res; } @@ -101,7 +101,7 @@ public class BinaryOffheapOutputStream extends BinaryAbstractOutputStream { /** {@inheritDoc} */ @Override protected void copyAndShift(Object src, long offset, int len) { - GridUnsafe.copyMemory(src, offset, null, ptr + pos, len); + GridUnsafe.copyHeapOffheap(src, offset, ptr + pos, len); shift(len); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java index 859de39..f5b2c3a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformInputStreamImpl.java @@ -286,7 +286,7 @@ public class PlatformInputStreamImpl implements PlatformInputStream { if (dataCopy == null) { dataCopy = new byte[len]; - GridUnsafe.copyMemory(null, data, dataCopy, GridUnsafe.BYTE_ARR_OFF, dataCopy.length); + GridUnsafe.copyOffheapHeap(data, dataCopy, GridUnsafe.BYTE_ARR_OFF, dataCopy.length); } return dataCopy; @@ -334,7 +334,7 @@ public class PlatformInputStreamImpl implements PlatformInputStream { private void copyAndShift(Object target, long off, int cnt) { ensureEnoughData(cnt); - GridUnsafe.copyMemory(null, data + pos, target, off, cnt); + GridUnsafe.copyOffheapHeap(data + pos, target, off, cnt); shift(cnt); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java index 1ece10b..334afb8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformOutputStreamImpl.java @@ -334,7 +334,7 @@ public class PlatformOutputStreamImpl implements PlatformOutputStream { private void copyAndShift(Object src, long off, int len) { ensureCapacity(pos + len); - GridUnsafe.copyMemory(src, off, null, data + pos, len); + GridUnsafe.copyHeapOffheap(src, off, data + pos, len); shift(len); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java index 41a4da9..aace1ed 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridHandleTable.java @@ -19,8 +19,6 @@ package org.apache.ignite.internal.util; import java.util.Arrays; -import static org.apache.ignite.internal.util.GridUnsafe.INT_ARR_OFF; - /** * Lightweight identity hash table which maps objects to integer handles, * assigned in ascending order. @@ -109,8 +107,8 @@ public class GridHandleTable { * Resets table to its initial (empty) state. */ public void clear() { - GridUnsafe.copyMemory(spineEmpty, INT_ARR_OFF, spine, INT_ARR_OFF, spineEmpty.length << 2); - GridUnsafe.copyMemory(nextEmpty, INT_ARR_OFF, next, INT_ARR_OFF, nextEmpty.length << 2); + System.arraycopy(spineEmpty, 0, spine, 0, spineEmpty.length); + System.arraycopy(nextEmpty, 0, next, 0, nextEmpty.length); Arrays.fill(objs, null); @@ -151,7 +149,7 @@ public class GridHandleTable { Arrays.fill(spineEmpty, -1); - GridUnsafe.copyMemory(spineEmpty, INT_ARR_OFF, spine, INT_ARR_OFF, spineEmpty.length << 2); + System.arraycopy(spineEmpty, 0, spine, 0, spineEmpty.length); for (int i = 0; i < this.size; i++) { Object obj = objs[i]; @@ -169,7 +167,7 @@ public class GridHandleTable { int newLen = (next.length << 1) + 1; int[] newNext = new int[newLen]; - GridUnsafe.copyMemory(next, INT_ARR_OFF, newNext, INT_ARR_OFF, size << 2); + System.arraycopy(next, 0, newNext, 0, size); next = newNext; nextEmpty = new int[newLen]; http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java index 35b793a..6e9efdb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java @@ -51,6 +51,10 @@ public abstract class GridUnsafe { /** Unaligned flag. */ private static final boolean UNALIGNED = unaligned(); + /** Per-byte copy threshold. */ + private static final long PER_BYTE_THRESHOLD = + IgniteSystemProperties.getLong(IgniteSystemProperties.IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD, 0L); + /** Big endian. */ public static final boolean BIG_ENDIAN = ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN; @@ -1027,14 +1031,53 @@ public abstract class GridUnsafe { } /** - * Copies memory. + * Copy memory between offheap locations. + * + * @param srcAddr Source address. + * @param dstAddr Destination address. + * @param len Length. + */ + public static void copyOffheapOffheap(long srcAddr, long dstAddr, long len) { + if (len <= PER_BYTE_THRESHOLD) { + for (int i = 0; i < len; i++) + UNSAFE.putByte(dstAddr + i, UNSAFE.getByte(srcAddr + i)); + } + else + UNSAFE.copyMemory(srcAddr, dstAddr, len); + } + + /** + * Copy memory from offheap to heap. * - * @param src Source. - * @param dst Dst. + * @param srcAddr Source address. + * @param dstBase Destination base. + * @param dstOff Destination offset. * @param len Length. */ - public static void copyMemory(long src, long dst, long len) { - UNSAFE.copyMemory(src, dst, len); + public static void copyOffheapHeap(long srcAddr, Object dstBase, long dstOff, long len) { + if (len <= PER_BYTE_THRESHOLD) { + for (int i = 0; i < len; i++) + UNSAFE.putByte(dstBase, dstOff + i, UNSAFE.getByte(srcAddr + i)); + } + else + UNSAFE.copyMemory(null, srcAddr, dstBase, dstOff, len); + } + + /** + * Copy memory from heap to offheap. + * + * @param srcBase Source base. + * @param srcOff Source offset. + * @param dstAddr Destination address. + * @param len Length. + */ + public static void copyHeapOffheap(Object srcBase, long srcOff, long dstAddr, long len) { + if (len <= PER_BYTE_THRESHOLD) { + for (int i = 0; i < len; i++) + UNSAFE.putByte(dstAddr + i, UNSAFE.getByte(srcBase, srcOff + i)); + } + else + UNSAFE.copyMemory(srcBase, srcOff, null, dstAddr, len); } /** @@ -1047,7 +1090,12 @@ public abstract class GridUnsafe { * @param len Length. */ public static void copyMemory(Object srcBase, long srcOff, Object dstBase, long dstOff, long len) { - UNSAFE.copyMemory(srcBase, srcOff, dstBase, dstOff, len); + if (len <= PER_BYTE_THRESHOLD && srcBase != null && dstBase != null) { + for (int i = 0; i < len; i++) + UNSAFE.putByte(dstBase, dstOff + i, UNSAFE.getByte(srcBase, srcOff + i)); + } + else + UNSAFE.copyMemory(srcBase, srcOff, dstBase, dstOff, len); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java index 3fa3f7b..e1937bb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java @@ -265,9 +265,6 @@ import static org.apache.ignite.internal.util.GridUnsafe.staticFieldOffset; */ @SuppressWarnings({"UnusedReturnValue", "UnnecessaryFullyQualifiedName", "RedundantStringConstructorCall"}) public abstract class IgniteUtils { - /** {@code True} if {@code unsafe} should be used for array copy. */ - private static final boolean UNSAFE_BYTE_ARR_CP = unsafeByteArrayCopyAvailable(); - /** Sun-specific JDK constructor factory for objects that don't have empty constructor. */ private static final Method CTOR_FACTORY; @@ -8482,28 +8479,6 @@ public abstract class IgniteUtils { } /** - * As long as array copying uses JVM-private API, which is not guaranteed - * to be available on all JVM, this method should be called to ensure - * logic could work properly. - * - * @return {@code True} if unsafe copying can work on the current JVM or - * {@code false} if it can't. - */ - @SuppressWarnings("TypeParameterExtendsFinalClass") - private static boolean unsafeByteArrayCopyAvailable() { - try { - Class<? extends Unsafe> unsafeCls = Unsafe.class; - - unsafeCls.getMethod("copyMemory", Object.class, long.class, Object.class, long.class, long.class); - - return true; - } - catch (Exception ignored) { - return false; - } - } - - /** * @param src Buffer to copy from (length included). * @param off Offset in source buffer. * @param resBuf Result buffer. @@ -8514,10 +8489,7 @@ public abstract class IgniteUtils { public static int arrayCopy(byte[] src, int off, byte[] resBuf, int resOff, int len) { assert resBuf.length >= resOff + len; - if (UNSAFE_BYTE_ARR_CP) - GridUnsafe.copyMemory(src, GridUnsafe.BYTE_ARR_OFF + off, resBuf, GridUnsafe.BYTE_ARR_OFF + resOff, len); - else - System.arraycopy(src, off, resBuf, resOff, len); + System.arraycopy(src, off, resBuf, resOff, len); return resOff + len; } @@ -9284,7 +9256,7 @@ public abstract class IgniteUtils { public static byte[] copyMemory(long ptr, int size) { byte[] res = new byte[size]; - GridUnsafe.copyMemory(null, ptr, res, GridUnsafe.BYTE_ARR_OFF, size); + GridUnsafe.copyOffheapHeap(ptr, res, GridUnsafe.BYTE_ARR_OFF, size); return res; } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java index 2f57e59..759b95e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataInput.java @@ -135,7 +135,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput { if (maxOff < halfSize) { byte[] newInBuf = new byte[halfSize]; // Shrink. - GridUnsafe.copyMemory(inBuf, BYTE_ARR_OFF, newInBuf, BYTE_ARR_OFF, off); + System.arraycopy(inBuf, 0, newInBuf, 0, off); buf = inBuf = newInBuf; } @@ -191,7 +191,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput { byte[] arr = new byte[arrSize]; - GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(arrSize), arr, BYTE_ARR_OFF, arrSize); + System.arraycopy(buf, offset(arrSize), arr, 0, arrSize); return arr; } @@ -364,14 +364,14 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput { fromStream(len); - GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(len), b, BYTE_ARR_OFF, len); + System.arraycopy(buf, offset(len), b, 0, len); } /** {@inheritDoc} */ @Override public void readFully(byte[] b, int off, int len) throws IOException { fromStream(len); - GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(len), b, BYTE_ARR_OFF + off, len); + System.arraycopy(buf, offset(len), b, off, len); } /** {@inheritDoc} */ @@ -488,7 +488,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput { else { int toRead = Math.min(len, max - this.off); - GridUnsafe.copyMemory(buf, BYTE_ARR_OFF + offset(toRead), b, BYTE_ARR_OFF + off, toRead); + System.arraycopy(buf, offset(toRead), b, off, toRead); return toRead; } @@ -552,7 +552,7 @@ public class GridUnsafeDataInput extends InputStream implements GridDataInput { else { // shift and refill buffer manually if (avail > 0) - GridUnsafe.copyMemory(utfBuf, BYTE_ARR_OFF + pos, utfBuf, BYTE_ARR_OFF, avail); + System.arraycopy(utfBuf, pos, utfBuf, 0, avail); pos = 0; end = (int)Math.min(MAX_BLOCK_SIZE, utfLen); http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java index c0fe0d3..c45b8fd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/io/GridUnsafeDataOutput.java @@ -97,7 +97,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput @Override public byte[] array() { byte[] bytes0 = new byte[off]; - GridUnsafe.copyMemory(bytes, BYTE_ARR_OFF, bytes0, BYTE_ARR_OFF, off); + System.arraycopy(bytes, 0, bytes0, 0, off); return bytes0; } @@ -130,7 +130,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput if (size > bytes.length) { byte[] newBytes = new byte[size << 1]; // Grow. - GridUnsafe.copyMemory(bytes, BYTE_ARR_OFF, newBytes, BYTE_ARR_OFF, off); + System.arraycopy(bytes, 0, newBytes, 0, off); bytes = newBytes; } @@ -140,7 +140,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput if (maxOff < halfSize) { byte[] newBytes = new byte[halfSize]; // Shrink. - GridUnsafe.copyMemory(bytes, BYTE_ARR_OFF, newBytes, BYTE_ARR_OFF, off); + System.arraycopy(bytes, 0, newBytes, 0, off); bytes = newBytes; } @@ -165,7 +165,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput @Override public void write(byte[] b) throws IOException { requestFreeSize(b.length); - GridUnsafe.copyMemory(b, BYTE_ARR_OFF, bytes, BYTE_ARR_OFF + off, b.length); + System.arraycopy(b, 0, bytes, off, b.length); onWrite(b.length); } @@ -174,7 +174,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput @Override public void write(byte[] b, int off, int len) throws IOException { requestFreeSize(len); - GridUnsafe.copyMemory(b, BYTE_ARR_OFF + off, bytes, BYTE_ARR_OFF + this.off, len); + System.arraycopy(b, off, bytes, this.off, len); onWrite(len); } @@ -293,7 +293,7 @@ public class GridUnsafeDataOutput extends OutputStream implements GridDataOutput requestFreeSize(arr.length); - GridUnsafe.copyMemory(arr, BYTE_ARR_OFF, bytes, BYTE_ARR_OFF + off, arr.length); + System.arraycopy(arr, 0, bytes, off, arr.length); onWrite(arr.length); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java index 718e1a6..41cb586 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java @@ -607,7 +607,7 @@ public class GridUnsafeMemory { * @return The same array as passed in one. */ public byte[] readBytes(long ptr, byte[] arr) { - GridUnsafe.copyMemory(null, ptr, arr, GridUnsafe.BYTE_ARR_OFF, arr.length); + GridUnsafe.copyOffheapHeap(ptr, arr, GridUnsafe.BYTE_ARR_OFF, arr.length); return arr; } @@ -620,7 +620,7 @@ public class GridUnsafeMemory { * @return The same array as passed in one. */ public byte[] readBytes(long ptr, byte[] arr, int off, int len) { - GridUnsafe.copyMemory(null, ptr, arr, GridUnsafe.BYTE_ARR_OFF + off, len); + GridUnsafe.copyOffheapHeap(ptr, arr, GridUnsafe.BYTE_ARR_OFF + off, len); return arr; } @@ -632,7 +632,7 @@ public class GridUnsafeMemory { * @param arr Array. */ public void writeBytes(long ptr, byte[] arr) { - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length); + GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length); } /** @@ -644,7 +644,7 @@ public class GridUnsafeMemory { * @param len Length. */ public void writeBytes(long ptr, byte[] arr, int off, int len) { - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF + off, null, ptr, len); + GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF + off, ptr, len); } /** @@ -655,7 +655,7 @@ public class GridUnsafeMemory { * @param len Length in bytes. */ public void copyMemory(long srcPtr, long destPtr, long len) { - GridUnsafe.copyMemory(srcPtr, destPtr, len); + GridUnsafe.copyOffheapOffheap(srcPtr, destPtr, len); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java index 1546252..ca4bdd2 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFieldsOffheapSelfTest.java @@ -46,7 +46,7 @@ public class BinaryFieldsOffheapSelfTest extends BinaryFieldsAbstractSelfTest { ptrs.add(ptr); - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length); + GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length); return new BinaryObjectOffheapImpl(binaryContext(marsh), ptr, 0, arr.length); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java index 796c027..052e652 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryFooterOffsetsOffheapSelfTest.java @@ -46,7 +46,7 @@ public class BinaryFooterOffsetsOffheapSelfTest extends BinaryFooterOffsetsAbstr ptrs.add(ptr); - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length); + GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length); return new BinaryObjectOffheapImpl(ctx, ptr, 0, arr.length); } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java index 39a4d32..70df1e6 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryMarshallerSelfTest.java @@ -3346,7 +3346,7 @@ public class BinaryMarshallerSelfTest extends GridCommonAbstractTest { long ptr = GridUnsafe.allocateMemory(arr.length); - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr, arr.length); + GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr, arr.length); return ptr; } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java index 4fc5c6c..b623c62 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinaryObjectBuilderDefaultMappersSelfTest.java @@ -791,7 +791,7 @@ public class BinaryObjectBuilderDefaultMappersSelfTest extends GridCommonAbstrac else GridUnsafe.putInt(ptr0, len); - GridUnsafe.copyMemory(arr, GridUnsafe.BYTE_ARR_OFF, null, ptr0 + 4, arr.length); + GridUnsafe.copyHeapOffheap(arr, GridUnsafe.BYTE_ARR_OFF, ptr0 + 4, arr.length); BinaryObject offheapObj = (BinaryObject) ((CacheObjectBinaryProcessorImpl)(grid(0)).context().cacheObjects()).unmarshal(ptr, false); http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java index e5af8f1..025c4da 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleJob.java @@ -311,7 +311,7 @@ public class HadoopShuffleJob<T> implements AutoCloseable { /** */ @Override public void copyTo(long ptr) { - GridUnsafe.copyMemory(buf, GridUnsafe.BYTE_ARR_OFF + off, null, ptr, size); + GridUnsafe.copyHeapOffheap(buf, GridUnsafe.BYTE_ARR_OFF + off, ptr, size); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java index 69dfe64..71a314b 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/HadoopShuffleMessage.java @@ -169,7 +169,7 @@ public class HadoopShuffleMessage implements HadoopMessage { off += 4; - GridUnsafe.copyMemory(null, ptr, buf, GridUnsafe.BYTE_ARR_OFF + off, size); + GridUnsafe.copyOffheapHeap(ptr, buf, GridUnsafe.BYTE_ARR_OFF + off, size); off += size; } http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java index f7b1a73..bb5acba 100644 --- a/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java +++ b/modules/hadoop/src/main/java/org/apache/ignite/internal/processors/hadoop/shuffle/streams/HadoopDataOutStream.java @@ -67,7 +67,7 @@ public class HadoopDataOutStream extends OutputStream implements DataOutput { /** {@inheritDoc} */ @Override public void write(byte[] b, int off, int len) { - GridUnsafe.copyMemory(b, GridUnsafe.BYTE_ARR_OFF + off, null, move(len), len); + GridUnsafe.copyHeapOffheap(b, GridUnsafe.BYTE_ARR_OFF + off, move(len), len); } /** {@inheritDoc} */ http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java index 019b172..7862d6e 100644 --- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopConcurrentHashMultimapSelftest.java @@ -162,7 +162,7 @@ public class HadoopConcurrentHashMultimapSelftest extends HadoopAbstractMapTest private void read(long ptr, int size, Writable w) { assert size == 4 : size; - GridUnsafe.copyMemory(null, ptr, buf, GridUnsafe.BYTE_ARR_OFF, size); + GridUnsafe.copyOffheapHeap(ptr, buf, GridUnsafe.BYTE_ARR_OFF, size); dataInput.bytes(buf, size); http://git-wip-us.apache.org/repos/asf/ignite/blob/3c384212/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java index d04beca..111ea78 100644 --- a/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java +++ b/modules/hadoop/src/test/java/org/apache/ignite/internal/processors/hadoop/impl/shuffle/collections/HadoopSkipListSelfTest.java @@ -202,7 +202,7 @@ public class HadoopSkipListSelfTest extends HadoopAbstractMapTest { private void read(long ptr, int size, Writable w) { assert size == 4 : size; - GridUnsafe.copyMemory(null, ptr, buf, GridUnsafe.BYTE_ARR_OFF, size); + GridUnsafe.copyOffheapHeap(ptr, buf, GridUnsafe.BYTE_ARR_OFF, size); dataInput.bytes(buf, size);
