This is an automated email from the ASF dual-hosted git repository. nizhikov pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push: new e5b795162ef IGNITE-25359 BinaryStreams moved to ignite-binary-impl (#12188) e5b795162ef is described below commit e5b795162ef5bd8e942424b45ebfc6dfb02aa72c Author: Nikolay <nizhi...@apache.org> AuthorDate: Thu Jul 17 10:06:55 2025 +0300 IGNITE-25359 BinaryStreams moved to ignite-binary-impl (#12188) --- assembly/dependencies-apache-ignite-lgpl.xml | 1 + assembly/dependencies-apache-ignite-slim.xml | 1 + assembly/dependencies-apache-ignite.xml | 1 + modules/binary/api/README.txt | 9 +++ .../internal/binary/BinaryPositionReadable.java | 0 .../internal/binary/streams/BinaryInputStream.java | 0 .../binary/streams/BinaryMemoryAllocatorChunk.java | 0 .../binary/streams/BinaryOutputStream.java | 0 .../internal/binary/streams/BinaryStream.java | 0 .../internal/binary/streams/BinaryStreams.java | 35 ++++++--- .../binary/streams/BinaryStreamsFactory.java} | 46 ++++------- modules/binary/impl/README.txt | 8 ++ modules/binary/impl/pom.xml | 75 ++++++++++++++++++ .../binary/streams/BinaryAbstractInputStream.java | 0 .../binary/streams/BinaryAbstractOutputStream.java | 0 .../binary/streams/BinaryAbstractStream.java | 0 .../streams/BinaryByteBufferInputStream.java | 0 .../binary/streams/BinaryHeapInputStream.java | 0 .../binary/streams/BinaryHeapOutputStream.java | 0 .../binary/streams/BinaryMemoryAllocator.java | 16 ++-- .../binary/streams/BinaryOffheapInputStream.java | 0 .../binary/streams/BinaryOffheapOutputStream.java | 0 .../binary/streams/BinaryStreamsFactoryImpl.java | 72 +++++++++++++++++ ...te.internal.binary.streams.BinaryStreamsFactory | 1 + modules/bom/pom.xml | 5 ++ .../ignite/IgniteCommonsSystemProperties.java | 17 ++++ .../apache/ignite/internal/util/CommonUtils.java | 90 ++++++++++++++++++++++ modules/core/pom.xml | 7 ++ .../org/apache/ignite/IgniteSystemProperties.java | 17 ---- .../apache/ignite/internal/binary/BinaryUtils.java | 6 -- .../apache/ignite/internal/util/IgniteUtils.java | 82 -------------------- .../internal/util/io/GridUnsafeDataInput.java | 2 +- .../internal/util/io/GridUnsafeDataOutput.java | 2 +- pom.xml | 1 + 34 files changed, 341 insertions(+), 153 deletions(-) diff --git a/assembly/dependencies-apache-ignite-lgpl.xml b/assembly/dependencies-apache-ignite-lgpl.xml index e976b6593e9..7d7e016459b 100644 --- a/assembly/dependencies-apache-ignite-lgpl.xml +++ b/assembly/dependencies-apache-ignite-lgpl.xml @@ -117,6 +117,7 @@ <exclude>${project.groupId}:ignite-core</exclude> <exclude>${project.groupId}:ignite-commons</exclude> <exclude>${project.groupId}:ignite-binary-api</exclude> + <exclude>${project.groupId}:ignite-binary-impl</exclude> <exclude>${project.groupId}:ignite-clients</exclude> <exclude>${project.groupId}:ignite-spring</exclude> <exclude>${project.groupId}:ignite-tools</exclude> diff --git a/assembly/dependencies-apache-ignite-slim.xml b/assembly/dependencies-apache-ignite-slim.xml index 90d639dd39b..53676f30737 100644 --- a/assembly/dependencies-apache-ignite-slim.xml +++ b/assembly/dependencies-apache-ignite-slim.xml @@ -117,6 +117,7 @@ <exclude>${project.groupId}:ignite-core</exclude> <exclude>${project.groupId}:ignite-commons</exclude> <exclude>${project.groupId}:ignite-binary-api</exclude> + <exclude>${project.groupId}:ignite-binary-impl</exclude> <exclude>${project.groupId}:ignite-clients</exclude> <exclude>${project.groupId}:ignite-spring</exclude> <exclude>${project.groupId}:ignite-tools</exclude> diff --git a/assembly/dependencies-apache-ignite.xml b/assembly/dependencies-apache-ignite.xml index c1560975ef0..54a200fb506 100644 --- a/assembly/dependencies-apache-ignite.xml +++ b/assembly/dependencies-apache-ignite.xml @@ -118,6 +118,7 @@ <exclude>${project.groupId}:ignite-core</exclude> <exclude>${project.groupId}:ignite-commons</exclude> <exclude>${project.groupId}:ignite-binary-api</exclude> + <exclude>${project.groupId}:ignite-binary-impl</exclude> <exclude>${project.groupId}:ignite-clients</exclude> <exclude>${project.groupId}:ignite-spring</exclude> <exclude>${project.groupId}:ignite-tools</exclude> diff --git a/modules/binary/api/README.txt b/modules/binary/api/README.txt new file mode 100644 index 00000000000..3df8a0b837a --- /dev/null +++ b/modules/binary/api/README.txt @@ -0,0 +1,9 @@ +Apache Ignite Binary API Module +------------------------ + +ignite-binary-api module is internal module to separate binary API and implementation. +Other modules like ignite-core must depend on ignite-binary-api, only. +Implementation of API in ignite-binary-impl, it added in runtime. + +Note, class files of this module are copied in ignite-core.jar during project assembly +to ensure compatibility with previous Ignite releases. \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPositionReadable.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryPositionReadable.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryPositionReadable.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryPositionReadable.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryInputStream.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryInputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryInputStream.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryInputStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocatorChunk.java rename to modules/binary/api/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/BinaryOutputStream.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOutputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOutputStream.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOutputStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java similarity index 75% copy from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java copy to modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java index 4bd1f494a72..7aa287d2ccb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java @@ -18,11 +18,28 @@ package org.apache.ignite.internal.binary.streams; import java.nio.ByteBuffer; +import java.util.Iterator; +import org.apache.ignite.internal.util.CommonUtils; +import org.apache.ignite.internal.util.typedef.internal.A; /** * Utility class to provide static methods to create {@link BinaryInputStream} or {@link BinaryOutputStream} in different modes. */ public class BinaryStreams { + /** Streams factory implementation. */ + private static final BinaryStreamsFactory factory; + + static { + Iterator<BinaryStreamsFactory> factories = CommonUtils.loadService(BinaryStreamsFactory.class).iterator(); + + A.ensure( + factories.hasNext(), + "Implementation for BinaryStreamsFactory service not found. Please add ignite-binary-impl to classpath" + ); + + factory = factories.next(); + } + /** * Create stream with pointer set at the given position. * @@ -31,7 +48,7 @@ public class BinaryStreams { * @return Stream. */ public static BinaryInputStream inputStream(byte[] data, int pos) { - return BinaryHeapInputStream.create(data, pos); + return factory.inputStream(data, pos); } /** @@ -41,7 +58,7 @@ public class BinaryStreams { * @return Stream. */ public static BinaryInputStream inputStream(byte[] data) { - return new BinaryHeapInputStream(data); + return factory.inputStream(data); } /** @@ -49,7 +66,7 @@ public class BinaryStreams { * @return Stream. */ public static BinaryInputStream inputStream(ByteBuffer buf) { - return new BinaryByteBufferInputStream(buf); + return factory.inputStream(buf); } /** @@ -58,7 +75,7 @@ public class BinaryStreams { * @return Stream. */ public static BinaryInputStream inputStream(long ptr, int cap) { - return new BinaryOffheapInputStream(ptr, cap); + return factory.inputStream(ptr, cap); } /** @@ -69,7 +86,7 @@ public class BinaryStreams { * @return Stream. */ public static BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap) { - return new BinaryOffheapInputStream(ptr, cap, forceHeap); + return factory.inputStream(ptr, cap, forceHeap); } /** @@ -79,7 +96,7 @@ public class BinaryStreams { * @return Binary output stream data. */ public static BinaryOutputStream createPooledOutputStream(int cap, boolean disableAutoClose) { - return new BinaryHeapOutputStream(cap, BinaryMemoryAllocator.POOLED.chunk(), disableAutoClose); + return factory.createPooledOutputStream(cap, disableAutoClose); } /** @@ -87,7 +104,7 @@ public class BinaryStreams { * @return Binary output stream data. */ public static BinaryOutputStream outputStream(int cap) { - return new BinaryHeapOutputStream(cap); + return factory.outputStream(cap); } /** @@ -96,13 +113,13 @@ public class BinaryStreams { * @return Binary output stream. */ public static BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk) { - return new BinaryHeapOutputStream(cap, chunk); + return factory.outputStream(cap, chunk); } /** * @return Thread local binary memory allocator. */ public static BinaryMemoryAllocatorChunk threadLocalChunk() { - return BinaryMemoryAllocator.THREAD_LOCAL.chunk(); + return factory.threadLocalChunk(); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java similarity index 60% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java rename to modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java index 4bd1f494a72..ad4d7df2b26 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreams.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactory.java @@ -18,11 +18,17 @@ package org.apache.ignite.internal.binary.streams; import java.nio.ByteBuffer; +import java.util.ServiceLoader; +import org.apache.ignite.internal.util.CommonUtils; /** - * Utility class to provide static methods to create {@link BinaryInputStream} or {@link BinaryOutputStream} in different modes. + * Binary streams factory. + * Implementation loaded via {@link ServiceLoader} mechanism. + * + * @see CommonUtils#loadService(Class) + * @see BinaryStreams */ -public class BinaryStreams { +public interface BinaryStreamsFactory { /** * Create stream with pointer set at the given position. * @@ -30,9 +36,7 @@ public class BinaryStreams { * @param pos Position. * @return Stream. */ - public static BinaryInputStream inputStream(byte[] data, int pos) { - return BinaryHeapInputStream.create(data, pos); - } + public BinaryInputStream inputStream(byte[] data, int pos); /** * Create stream with pointer set at the given position. @@ -40,26 +44,20 @@ public class BinaryStreams { * @param data Data. * @return Stream. */ - public static BinaryInputStream inputStream(byte[] data) { - return new BinaryHeapInputStream(data); - } + public BinaryInputStream inputStream(byte[] data); /** * @param buf Buffer to wrap. * @return Stream. */ - public static BinaryInputStream inputStream(ByteBuffer buf) { - return new BinaryByteBufferInputStream(buf); - } + public BinaryInputStream inputStream(ByteBuffer buf); /** * @param ptr Pointer. * @param cap Capacity. * @return Stream. */ - public static BinaryInputStream inputStream(long ptr, int cap) { - return new BinaryOffheapInputStream(ptr, cap); - } + public BinaryInputStream inputStream(long ptr, int cap); /** * @param ptr Pointer. @@ -68,9 +66,7 @@ public class BinaryStreams { * create heap-based objects. * @return Stream. */ - public static BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap) { - return new BinaryOffheapInputStream(ptr, cap, forceHeap); - } + public BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap); /** * @param cap Capacity. @@ -78,31 +74,23 @@ public class BinaryStreams { * so that an explicit {@link BinaryOutputStream#release()} call is required. * @return Binary output stream data. */ - public static BinaryOutputStream createPooledOutputStream(int cap, boolean disableAutoClose) { - return new BinaryHeapOutputStream(cap, BinaryMemoryAllocator.POOLED.chunk(), disableAutoClose); - } + public BinaryOutputStream createPooledOutputStream(int cap, boolean disableAutoClose); /** * @param cap Capacity. * @return Binary output stream data. */ - public static BinaryOutputStream outputStream(int cap) { - return new BinaryHeapOutputStream(cap); - } + public BinaryOutputStream outputStream(int cap); /** * @param cap Capacity. * @param chunk Memory allocator chunk. * @return Binary output stream. */ - public static BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk) { - return new BinaryHeapOutputStream(cap, chunk); - } + public BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk); /** * @return Thread local binary memory allocator. */ - public static BinaryMemoryAllocatorChunk threadLocalChunk() { - return BinaryMemoryAllocator.THREAD_LOCAL.chunk(); - } + public BinaryMemoryAllocatorChunk threadLocalChunk(); } diff --git a/modules/binary/impl/README.txt b/modules/binary/impl/README.txt new file mode 100644 index 00000000000..ea2416062bb --- /dev/null +++ b/modules/binary/impl/README.txt @@ -0,0 +1,8 @@ +Apache Ignite Binary Implementation Module +------------------------ + +ignite-binary-impl module is internal module to separate binary API and implementation. +Other modules like ignite-core must not depend on ignite-binary-impl, and use ignite-binary-api. + +Note, class files of this module are copied in ignite-core.jar during project assembly +to ensure compatibility with previous Ignite releases. \ No newline at end of file diff --git a/modules/binary/impl/pom.xml b/modules/binary/impl/pom.xml new file mode 100644 index 00000000000..b56dbf5b739 --- /dev/null +++ b/modules/binary/impl/pom.xml @@ -0,0 +1,75 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> + +<!-- + POM file. +--> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>org.apache.ignite</groupId> + <artifactId>ignite-parent-internal</artifactId> + <version>${revision}</version> + <relativePath>../../../parent-internal/pom.xml</relativePath> + </parent> + + <artifactId>ignite-binary-impl</artifactId> + + <url>http://ignite.apache.org</url> + + <dependencies> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>ignite-commons</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>ignite-binary-api</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>ignite-grid-unsafe</artifactId> + <scope>provided</scope> + </dependency> + + <dependency> + <groupId>org.jetbrains</groupId> + <artifactId>annotations</artifactId> + <version>${jetbrains.annotations.version}</version> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-deploy-plugin</artifactId> + <version>2.8.2</version> + <configuration> + <skip>false</skip> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractInputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractInputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractInputStream.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractInputStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractOutputStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractStream.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryAbstractStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryByteBufferInputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryByteBufferInputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryByteBufferInputStream.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryByteBufferInputStream.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapInputStream.java rename to modules/binary/impl/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/BinaryHeapOutputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryHeapOutputStream.java rename to modules/binary/impl/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/BinaryMemoryAllocator.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java similarity index 92% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java index b2b16a1ec26..b4f24f48ae8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryMemoryAllocator.java @@ -19,12 +19,12 @@ package org.apache.ignite.internal.binary.streams; import java.util.ArrayDeque; import java.util.Arrays; -import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.internal.util.CommonUtils; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; -import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHAL_BUFFERS_RECHECK; -import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; -import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_MARSHAL_BUFFERS_RECHECK; +import static org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; +import static org.apache.ignite.IgniteCommonsSystemProperties.IGNITE_MARSHAL_BUFFERS_RECHECK; +import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; +import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_RECHECK; /** * On-heap memory allocator. @@ -129,7 +129,7 @@ abstract class BinaryMemoryAllocator { long nowNanos = System.nanoTime(); - if (U.nanosToMillis(nowNanos - lastCheckNanos) >= CHECK_FREQ) { + if (CommonUtils.nanosToMillis(nowNanos - lastCheckNanos) >= CHECK_FREQ) { int halfSize = data.length >> 1; if (this.maxMsgSize < halfSize) @@ -212,12 +212,12 @@ abstract class BinaryMemoryAllocator { cntr = cntr == Integer.MAX_VALUE ? 0 : cntr + 1; long now = System.nanoTime(); - if (U.nanosToMillis(now - lastCheckNanos) >= CHECK_FREQ && cntr > history.length) { + if (CommonUtils.nanosToMillis(now - lastCheckNanos) >= CHECK_FREQ && cntr > history.length) { lastCheckNanos = now; int[] tmp = Arrays.copyOf(history, history.length); Arrays.sort(tmp); - int adjusted = U.nextPowerOf2(tmp[tmp.length / 2]); + int adjusted = CommonUtils.nextPowerOf2(tmp[tmp.length / 2]); if (adjusted < data.length) data = new byte[adjusted]; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapInputStream.java rename to modules/binary/impl/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/BinaryOffheapOutputStream.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java similarity index 100% rename from modules/core/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryOffheapOutputStream.java diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java new file mode 100644 index 00000000000..40f0b9f1113 --- /dev/null +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/streams/BinaryStreamsFactoryImpl.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.ignite.internal.binary.streams; + +import java.nio.ByteBuffer; +import org.apache.ignite.internal.util.CommonUtils; + +/** + * Binary streams factory implementation. + * @see CommonUtils#loadService(Class) + */ +public class BinaryStreamsFactoryImpl implements BinaryStreamsFactory { + /** {@inheritDoc} */ + @Override public BinaryInputStream inputStream(byte[] data, int pos) { + return BinaryHeapInputStream.create(data, pos); + } + + /** {@inheritDoc} */ + @Override public BinaryInputStream inputStream(byte[] data) { + return new BinaryHeapInputStream(data); + } + + /** {@inheritDoc} */ + @Override public BinaryInputStream inputStream(ByteBuffer buf) { + return new BinaryByteBufferInputStream(buf); + } + + /** {@inheritDoc} */ + @Override public BinaryInputStream inputStream(long ptr, int cap) { + return new BinaryOffheapInputStream(ptr, cap); + } + + /** {@inheritDoc} */ + @Override public BinaryInputStream inputStream(long ptr, int cap, boolean forceHeap) { + return new BinaryOffheapInputStream(ptr, cap, forceHeap); + } + + /** {@inheritDoc} */ + @Override public BinaryOutputStream createPooledOutputStream(int cap, boolean disableAutoClose) { + return new BinaryHeapOutputStream(cap, BinaryMemoryAllocator.POOLED.chunk(), disableAutoClose); + } + + /** {@inheritDoc} */ + @Override public BinaryOutputStream outputStream(int cap) { + return new BinaryHeapOutputStream(cap); + } + + /** {@inheritDoc} */ + @Override public BinaryOutputStream outputStream(int cap, BinaryMemoryAllocatorChunk chunk) { + return new BinaryHeapOutputStream(cap, chunk); + } + + /** {@inheritDoc} */ + @Override public BinaryMemoryAllocatorChunk threadLocalChunk() { + return BinaryMemoryAllocator.THREAD_LOCAL.chunk(); + } +} diff --git a/modules/binary/impl/src/main/resources/META-INF/services/org.apache.ignite.internal.binary.streams.BinaryStreamsFactory b/modules/binary/impl/src/main/resources/META-INF/services/org.apache.ignite.internal.binary.streams.BinaryStreamsFactory new file mode 100644 index 00000000000..0862373ed81 --- /dev/null +++ b/modules/binary/impl/src/main/resources/META-INF/services/org.apache.ignite.internal.binary.streams.BinaryStreamsFactory @@ -0,0 +1 @@ +org.apache.ignite.internal.binary.streams.BinaryStreamsFactoryImpl \ No newline at end of file diff --git a/modules/bom/pom.xml b/modules/bom/pom.xml index bd67b5d4332..db4ee73a175 100644 --- a/modules/bom/pom.xml +++ b/modules/bom/pom.xml @@ -171,6 +171,11 @@ <artifactId>ignite-binary-api</artifactId> <version>${revision}</version> </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>ignite-binary-impl</artifactId> + <version>${revision}</version> + </dependency> <dependency> <groupId>${project.groupId}</groupId> <artifactId>ignite-commons</artifactId> diff --git a/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java b/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java index 08db4e746c0..b0957c244c5 100644 --- a/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java +++ b/modules/commons/src/main/java/org/apache/ignite/IgniteCommonsSystemProperties.java @@ -19,6 +19,8 @@ package org.apache.ignite; import org.jetbrains.annotations.Nullable; +import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; +import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_RECHECK; import static org.apache.ignite.internal.util.CommonUtils.DFLT_MEMORY_PER_BYTE_COPY_THRESHOLD; import static org.apache.ignite.internal.util.tostring.GridToStringBuilder.DFLT_TO_STRING_COLLECTION_LIMIT; import static org.apache.ignite.internal.util.tostring.GridToStringBuilder.DFLT_TO_STRING_INCLUDE_SENSITIVE; @@ -68,6 +70,21 @@ public class IgniteCommonsSystemProperties { "meaning that unaligned access will be performed only on x86 architecture") public static final String IGNITE_MEMORY_UNALIGNED_ACCESS = "IGNITE_MEMORY_UNALIGNED_ACCESS"; + /** + * System property to specify how often in milliseconds marshal buffers + * should be rechecked and potentially trimmed. Default value is {@code 10,000ms}. + */ + @SystemProperty(value = "How often in milliseconds marshal buffers should be rechecked and potentially trimmed", + type = Long.class, defaults = "" + DFLT_MARSHAL_BUFFERS_RECHECK) + public static final String IGNITE_MARSHAL_BUFFERS_RECHECK = "IGNITE_MARSHAL_BUFFERS_RECHECK"; + + /** + * System property to specify per thread binary allocator chunk pool size. Default value is {@code 32}. + */ + @SystemProperty(value = "Per thread binary allocator chunk pool size", + type = Integer.class, defaults = "" + DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE) + public static final String IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE = "IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE"; + /** * @param enumCls Enum type. * @param name Name of the system property or environment variable. diff --git a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java index e491a0f4e82..3eef1ac12d2 100644 --- a/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java +++ b/modules/commons/src/main/java/org/apache/ignite/internal/util/CommonUtils.java @@ -20,9 +20,14 @@ package org.apache.ignite.internal.util; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.ServiceLoader; +import java.util.concurrent.TimeUnit; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCommonsSystemProperties; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.A; import org.jetbrains.annotations.Nullable; /** @@ -41,6 +46,12 @@ public abstract class CommonUtils { /** @see IgniteCommonsSystemProperties#IGNITE_MEMORY_PER_BYTE_COPY_THRESHOLD */ public static final long DFLT_MEMORY_PER_BYTE_COPY_THRESHOLD = 0L; + /** @see IgniteCommonsSystemProperties#IGNITE_MARSHAL_BUFFERS_RECHECK */ + public static final int DFLT_MARSHAL_BUFFERS_RECHECK = 10000; + + /** @see IgniteCommonsSystemProperties#IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE */ + public static final int DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE = 32; + /** Sun-specific JDK constructor factory for objects that don't have empty constructor. */ private static final Method CTOR_FACTORY; @@ -244,4 +255,83 @@ public abstract class CommonUtils { return (int)y; } + + /** + * @param svcCls Service class to load. + * @param <S> Type of loaded interfaces. + * @return Lazy iterable structure over loaded class implementations. + */ + public static <S> Iterable<S> loadService(Class<S> svcCls) { + return AccessController.doPrivileged(new PrivilegedAction<Iterable<S>>() { + @Override public Iterable<S> run() { + return ServiceLoader.load(svcCls); + } + }); + } + + /** + * Convert milliseconds time interval to nanoseconds. + * + * @param millis Original time interval. + * @return Calculated time interval. + */ + public static long millisToNanos(long millis) { + return TimeUnit.MILLISECONDS.toNanos(millis); + } + + /** + * Convert nanoseconds time interval to milliseconds. + * + * @param nanos Original time interval. + * @return Calculated time interval. + */ + public static long nanosToMillis(long nanos) { + return TimeUnit.NANOSECONDS.toMillis(nanos); + } + + /** + * Returns number of milliseconds passed after the given nanos timestamp. + * + * @param nanos Nanos timestamp. + * @return Number of milliseconds passed after the given nanos timestamp. + * @see System#nanoTime() + */ + public static long millisSinceNanos(long nanos) { + return nanosToMillis(System.nanoTime() - nanos); + } + + /** + * Gets nearest power of 2 larger or equal than v. + * + * @param v Value. + * @return Nearest power of 2. + */ + public static int ceilPow2(int v) { + int i = v - 1; + + return Integer.highestOneBit(i) << 1 - (i >>> 30 ^ v >> 31); + } + + /** + * @param i Value. + * @return {@code true} If the given value is power of 2 (0 is not power of 2). + */ + public static boolean isPow2(int i) { + return i > 0 && (i & (i - 1)) == 0; + } + + /** + * Round up the argument to the next highest power of 2; + * + * @param v Value to round up. + * @return Next closest power of 2. + */ + public static int nextPowerOf2(int v) { + A.ensure(v >= 0, "v must not be negative"); + + if (v == 0) + return 1; + + return 1 << (32 - Integer.numberOfLeadingZeros(v - 1)); + } } diff --git a/modules/core/pom.xml b/modules/core/pom.xml index 4d6fd825bb2..f2f5bb93336 100644 --- a/modules/core/pom.xml +++ b/modules/core/pom.xml @@ -68,6 +68,12 @@ <scope>compile</scope> </dependency> + <dependency> + <groupId>${project.groupId}</groupId> + <artifactId>ignite-binary-impl</artifactId> + <scope>compile</scope> + </dependency> + <dependency> <groupId>${project.groupId}</groupId> <artifactId>ignite-codegen2</artifactId> @@ -345,6 +351,7 @@ <includes> <include>org.apache.ignite:ignite-commons</include> <include>org.apache.ignite:ignite-binary-api</include> + <include>org.apache.ignite:ignite-binary-impl</include> <include>org.apache.ignite:ignite-grid-unsafe</include> </includes> </artifactSet> 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 35b0d06165f..c513375495b 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java @@ -59,8 +59,6 @@ import static org.apache.ignite.internal.LongJVMPauseDetector.DEFAULT_JVM_PAUSE_ import static org.apache.ignite.internal.LongJVMPauseDetector.DFLT_JVM_PAUSE_DETECTOR_LAST_EVENTS_COUNT; import static org.apache.ignite.internal.LongJVMPauseDetector.DFLT_JVM_PAUSE_DETECTOR_PRECISION; import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_IGNITE_USE_BINARY_ARRAYS; -import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE; -import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_MARSHAL_BUFFERS_RECHECK; import static org.apache.ignite.internal.cache.query.index.sorted.inline.InlineRecommender.DFLT_THROTTLE_INLINE_SIZE_CALCULATION; import static org.apache.ignite.internal.managers.discovery.GridDiscoveryManager.DFLT_DISCOVERY_HISTORY_SIZE; import static org.apache.ignite.internal.processors.affinity.AffinityAssignment.DFLT_AFFINITY_BACKUPS_THRESHOLD; @@ -501,21 +499,6 @@ public final class IgniteSystemProperties extends IgniteCommonsSystemProperties defaults = "" + DFLT_PRELOAD_RESEND_TIMEOUT) public static final String IGNITE_PRELOAD_RESEND_TIMEOUT = "IGNITE_PRELOAD_RESEND_TIMEOUT"; - /** - * System property to specify how often in milliseconds marshal buffers - * should be rechecked and potentially trimmed. Default value is {@code 10,000ms}. - */ - @SystemProperty(value = "How often in milliseconds marshal buffers should be rechecked and potentially trimmed", - type = Long.class, defaults = "" + DFLT_MARSHAL_BUFFERS_RECHECK) - public static final String IGNITE_MARSHAL_BUFFERS_RECHECK = "IGNITE_MARSHAL_BUFFERS_RECHECK"; - - /** - * System property to specify per thread binary allocator chunk pool size. Default value is {@code 32}. - */ - @SystemProperty(value = "Per thread binary allocator chunk pool size", - type = Integer.class, defaults = "" + DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE) - public static final String IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE = "IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE"; - /** * System property to disable {@link HostnameVerifier} for SSL connections. * Can be used for development with self-signed certificates. Default value is {@code false}. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index 7fff65e3721..cedac3b1a24 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -100,12 +100,6 @@ import static org.apache.ignite.internal.util.GridUnsafe.align; * Binary utils. */ public class BinaryUtils { - /** @see IgniteSystemProperties#IGNITE_MARSHAL_BUFFERS_RECHECK */ - public static final int DFLT_MARSHAL_BUFFERS_RECHECK = 10000; - - /** @see IgniteSystemProperties#IGNITE_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE */ - public static final int DFLT_MARSHAL_BUFFERS_PER_THREAD_POOL_SIZE = 32; - /** * Actual file name "{type_id}.classname{platform_id}". * Where {@code type_id} is integer type id and {@code platform_id} is byte from {@link PlatformType} 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 f21b0dc2cc9..4f86eb8023f 100755 --- 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 @@ -79,8 +79,6 @@ import java.nio.charset.Charset; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; -import java.security.AccessController; -import java.security.PrivilegedAction; import java.security.ProtectionDomain; import java.sql.Connection; import java.sql.SQLException; @@ -106,7 +104,6 @@ import java.util.Map; import java.util.Objects; import java.util.Properties; import java.util.Random; -import java.util.ServiceLoader; import java.util.Set; import java.util.TreeMap; import java.util.UUID; @@ -868,19 +865,6 @@ public abstract class IgniteUtils extends CommonUtils { Collections.emptyList(); } - /** - * @param svcCls Service class to load. - * @param <S> Type of loaded interfaces. - * @return Lazy iterable structure over loaded class implementations. - */ - public static <S> Iterable<S> loadService(Class<S> svcCls) { - return AccessController.doPrivileged(new PrivilegedAction<Iterable<S>>() { - @Override public Iterable<S> run() { - return ServiceLoader.load(svcCls); - } - }); - } - /** * Converts exception, but unlike {@link #convertException(IgniteCheckedException)} * does not wrap passed in exception if none suitable converter found. @@ -940,57 +924,6 @@ public abstract class IgniteUtils extends CommonUtils { return curTimeMillis; } - /** - * Convert milliseconds time interval to nanoseconds. - * - * @param millis Original time interval. - * @return Calculated time interval. - */ - public static long millisToNanos(long millis) { - return TimeUnit.MILLISECONDS.toNanos(millis); - } - - /** - * Convert nanoseconds time interval to milliseconds. - * - * @param nanos Original time interval. - * @return Calculated time interval. - */ - public static long nanosToMillis(long nanos) { - return TimeUnit.NANOSECONDS.toMillis(nanos); - } - - /** - * Returns number of milliseconds passed after the given nanos timestamp. - * - * @param nanos Nanos timestamp. - * @return Number of milliseconds passed after the given nanos timestamp. - * @see System#nanoTime() - */ - public static long millisSinceNanos(long nanos) { - return nanosToMillis(System.nanoTime() - nanos); - } - - /** - * Gets nearest power of 2 larger or equal than v. - * - * @param v Value. - * @return Nearest power of 2. - */ - public static int ceilPow2(int v) { - int i = v - 1; - - return Integer.highestOneBit(i) << 1 - (i >>> 30 ^ v >> 31); - } - - /** - * @param i Value. - * @return {@code true} If the given value is power of 2 (0 is not power of 2). - */ - public static boolean isPow2(int i) { - return i > 0 && (i & (i - 1)) == 0; - } - /** * Gets name for given grid event type. * @@ -7022,21 +6955,6 @@ public abstract class IgniteUtils extends CommonUtils { } } - /** - * Round up the argument to the next highest power of 2; - * - * @param v Value to round up. - * @return Next closest power of 2. - */ - public static int nextPowerOf2(int v) { - A.ensure(v >= 0, "v must not be negative"); - - if (v == 0) - return 1; - - return 1 << (32 - Integer.numberOfLeadingZeros(v - 1)); - } - /** * Gets absolute value for integer. If integer is {@link Integer#MIN_VALUE}, then {@code 0} is returned. * 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 19a71e486bf..08666e0fa63 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 @@ -28,7 +28,7 @@ import org.apache.ignite.internal.util.typedef.internal.SB; import org.apache.ignite.internal.util.typedef.internal.U; import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHAL_BUFFERS_RECHECK; -import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_MARSHAL_BUFFERS_RECHECK; +import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_RECHECK; import static org.apache.ignite.internal.util.GridUnsafe.BIG_ENDIAN; import static org.apache.ignite.internal.util.GridUnsafe.BYTE_ARR_OFF; import static org.apache.ignite.internal.util.GridUnsafe.CHAR_ARR_OFF; 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 7314a71bbef..f2331d84a09 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 @@ -25,7 +25,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import static org.apache.ignite.IgniteSystemProperties.IGNITE_MARSHAL_BUFFERS_RECHECK; -import static org.apache.ignite.internal.binary.BinaryUtils.DFLT_MARSHAL_BUFFERS_RECHECK; +import static org.apache.ignite.internal.util.CommonUtils.DFLT_MARSHAL_BUFFERS_RECHECK; import static org.apache.ignite.internal.util.CommonUtils.MAX_ARRAY_SIZE; import static org.apache.ignite.internal.util.GridUnsafe.BIG_ENDIAN; import static org.apache.ignite.internal.util.GridUnsafe.BYTE_ARR_OFF; diff --git a/pom.xml b/pom.xml index 3d3fc9c4b94..d1cf7cd2cb4 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,7 @@ <module>modules/tools</module> <module>modules/commons</module> <module>modules/binary/api</module> + <module>modules/binary/impl</module> <module>modules/unsafe</module> <module>modules/core</module> <module>modules/compress</module>