From b365c7fb7283360e4a51656b4a503e6d8de86797 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 9 Sep 2026 09:58:33 +0300 Subject: [PATCH 1/6] CheapString prototype --- .../ignite/internal/binary/BinaryUtils.java | 240 -------------- .../binary/BinaryWriterSchemaHolder.java | 2 +- .../internal/binary/BinaryImplUtils.java | 302 ++++++++++++++++++ .../internal/binary/BinaryObjectImpl.java | 22 +- .../binary/BinaryObjectOffheapImpl.java | 14 +- .../internal/binary/BinaryReaderExImpl.java | 28 +- .../binary/CrossObjectReferenceResolver.java | 22 +- .../internal/binary/ObjectDetachHelper.java | 4 +- .../builder/BinaryObjectBuilderImpl.java | 27 +- ...inarySerialiedFieldComparatorSelfTest.java | 2 +- 10 files changed, 363 insertions(+), 300 deletions(-) create mode 100644 modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index e10222a6593cd..4e0186f2d5f5d 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -86,7 +86,6 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.T2; import org.apache.ignite.internal.util.typedef.internal.A; -import org.apache.ignite.lang.IgniteBiTuple; import org.apache.ignite.lang.IgniteUuid; import org.apache.ignite.logger.NullLogger; import org.apache.ignite.marshaller.Marshallers; @@ -140,40 +139,6 @@ TreeSet.class, new BinaryTreeSetWriteReplacer() /** Class for SingletonList obtained at runtime. */ static final Class SINGLETON_LIST_CLS = Collections.singletonList(null).getClass(); - /** Flag: user type. */ - static final short FLAG_USR_TYP = 0x0001; - - /** Flag: only raw data exists. */ - static final short FLAG_HAS_SCHEMA = 0x0002; - - /** Flag indicating that object has raw data. */ - static final short FLAG_HAS_RAW = 0x0004; - - /** Flag: offsets take 1 byte. */ - static final short FLAG_OFFSET_ONE_BYTE = 0x0008; - - /** Flag: offsets take 2 bytes. */ - static final short FLAG_OFFSET_TWO_BYTES = 0x0010; - - /** Flag: compact footer, no field IDs. */ - public static final short FLAG_COMPACT_FOOTER = 0x0020; - - /** Flag: raw data contains .NET type information. Always 0 in Java. Keep it here for information only. */ - @SuppressWarnings("unused") - public static final short FLAG_CUSTOM_DOTNET_TYPE = 0x0040; - - /** Offset which fits into 1 byte. */ - static final int OFFSET_1 = 1; - - /** Offset which fits into 2 bytes. */ - static final int OFFSET_2 = 2; - - /** Offset which fits into 4 bytes. */ - static final int OFFSET_4 = 4; - - /** Field ID length. */ - static final int FIELD_ID_LEN = 4; - /** Whether to sort field in binary objects (doesn't affect Binarylizable). */ public static boolean FIELDS_SORTED_ORDER = IgniteCommonsSystemProperties.getBoolean(IgniteCommonsSystemProperties.IGNITE_BINARY_SORT_OBJECT_FIELDS); @@ -326,57 +291,6 @@ TreeSet.class, new BinaryTreeSetWriteReplacer() FIELD_TYPE_NAMES[GridBinaryMarshaller.BINARY_ENUM] = "Enum"; } - /** - * Check if user type flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - static boolean isUserType(short flags) { - return isFlagSet(flags, FLAG_USR_TYP); - } - - /** - * Check if raw-only flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - public static boolean hasSchema(short flags) { - return isFlagSet(flags, FLAG_HAS_SCHEMA); - } - - /** - * Check if raw-only flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - static boolean hasRaw(short flags) { - return isFlagSet(flags, FLAG_HAS_RAW); - } - - /** - * Check if "no-field-ids" flag is set. - * - * @param flags Flags. - * @return {@code True} if set. - */ - static boolean isCompactFooter(short flags) { - return isFlagSet(flags, FLAG_COMPACT_FOOTER); - } - - /** - * Check whether particular flag is set. - * - * @param flags Flags. - * @param flag Flag. - * @return {@code True} if flag is set in flags. - */ - static boolean isFlagSet(short flags, short flag) { - return (flags & flag) == flag; - } - /** * Schema initial ID. * @@ -784,160 +698,6 @@ public static int length(BinaryPositionReadable in, int start) { return in.readIntPositioned(start + GridBinaryMarshaller.TOTAL_LEN_POS); } - /** */ - static int dataStartRelative(BinaryPositionReadable in, int start) { - int typeId = in.readIntPositioned(start + GridBinaryMarshaller.TYPE_ID_POS); - - if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) { - // Gets the length of the type name which is stored as string. - int len = in.readIntPositioned(start + GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1); - - return GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1 + /** string length */ 4 + len; - } - else - return GridBinaryMarshaller.DFLT_HDR_LEN; - } - - /** - * Get footer start of the object. - * - * @param in Input stream. - * @param start Object start position inside the stream. - * @return Footer start. - */ - private static int footerStartRelative(BinaryPositionReadable in, int start) { - short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); - - if (hasSchema(flags)) - // Schema exists, use offset. - return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - else - // No schema, footer start equals to object end. - return length(in, start); - } - - /** - * Get object's footer. - * - * @param in Input stream. - * @param start Start position. - * @return Footer start. - */ - public static int footerStartAbsolute(BinaryPositionReadable in, int start) { - return footerStartRelative(in, start) + start; - } - - /** - * Get object's footer. - * - * @param in Input stream. - * @param start Start position. - * @return Footer. - */ - public static IgniteBiTuple footerAbsolute(BinaryPositionReadable in, int start) { - short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); - - int footerEnd = length(in, start); - - if (hasSchema(flags)) { - // Schema exists. - int footerStart = in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - - if (hasRaw(flags)) - footerEnd -= 4; - - assert footerStart <= footerEnd; - - return F.t(start + footerStart, start + footerEnd); - } - else - // No schema. - return F.t(start + footerEnd, start + footerEnd); - } - - /** - * Get relative raw offset of the object. - * - * @param in Input stream. - * @param start Object start position inside the stream. - * @return Raw offset. - */ - private static int rawOffsetRelative(BinaryPositionReadable in, int start) { - short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); - - int len = length(in, start); - - if (hasSchema(flags)) { - // Schema exists. - if (hasRaw(flags)) - // Raw offset is set, it is at the very end of the object. - return in.readIntPositioned(start + len - 4); - else - // Raw offset is not set, so just return schema offset. - return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - } - else - // No schema, raw offset is located on schema offset position. - return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); - } - - /** - * Get absolute raw offset of the object. - * - * @param in Input stream. - * @param start Object start position inside the stream. - * @return Raw offset. - */ - public static int rawOffsetAbsolute(BinaryPositionReadable in, int start) { - return start + rawOffsetRelative(in, start); - } - - /** - * Get offset length for the given flags. - * - * @param flags Flags. - * @return Offset size. - */ - public static int fieldOffsetLength(short flags) { - if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE) - return OFFSET_1; - else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES) - return OFFSET_2; - else - return OFFSET_4; - } - - /** - * Get field ID length. - * - * @param flags Flags. - * @return Field ID length. - */ - public static int fieldIdLength(short flags) { - return isCompactFooter(flags) ? 0 : FIELD_ID_LEN; - } - - /** - * Get relative field offset. - * - * @param stream Stream. - * @param pos Position. - * @param fieldOffsetSize Field offset size. - * @return Relative field offset. - */ - public static int fieldOffsetRelative(BinaryPositionReadable stream, int pos, int fieldOffsetSize) { - int res; - - if (fieldOffsetSize == OFFSET_1) - res = (int)stream.readBytePositioned(pos) & 0xFF; - else if (fieldOffsetSize == OFFSET_2) - res = (int)stream.readShortPositioned(pos) & 0xFFFF; - else - res = stream.readIntPositioned(pos); - - return res; - } - /** * Merge old and new metas. * diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java index cd2d8c5d76124..8e5eab4f9f6ee 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java @@ -134,7 +134,7 @@ else if (lastOffset < MAX_OFFSET_2) { out.unsafeWriteInt(data[curIdx++]); } - res = BinaryUtils.OFFSET_4; + res = BinaryImplUtils.OFFSET_4; } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java new file mode 100644 index 0000000000000..2e23d5ca265dc --- /dev/null +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -0,0 +1,302 @@ +/* + * 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; + +import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.lang.IgniteBiTuple; + +import static org.apache.ignite.internal.binary.BinaryUtils.length; + +/** + * Binary utils used only in implementation. + */ +public class BinaryImplUtils { + /** Flag: user type. */ + static final short FLAG_USR_TYP = 0x0001; + + /** Flag: only raw data exists. */ + static final short FLAG_HAS_SCHEMA = 0x0002; + + /** Flag indicating that object has raw data. */ + static final short FLAG_HAS_RAW = 0x0004; + + /** Flag: offsets take 1 byte. */ + static final short FLAG_OFFSET_ONE_BYTE = 0x0008; + + /** Flag: offsets take 2 bytes. */ + static final short FLAG_OFFSET_TWO_BYTES = 0x0010; + + /** Flag: compact footer, no field IDs. */ + public static final short FLAG_COMPACT_FOOTER = 0x0020; + + /** Flag: raw data contains .NET type information. Always 0 in Java. Keep it here for information only. */ + @SuppressWarnings("unused") + public static final short FLAG_CUSTOM_DOTNET_TYPE = 0x0040; + + /** Offset which fits into 1 byte. */ + static final int OFFSET_1 = 1; + + /** Offset which fits into 2 bytes. */ + static final int OFFSET_2 = 2; + + /** Offset which fits into 4 bytes. */ + static final int OFFSET_4 = 4; + + /** Field ID length. */ + static final int FIELD_ID_LEN = 4; + + /** {@code true} if serialized value of this type cannot contain references to objects. */ + private static final boolean[] PLAIN_TYPE_FLAG = new boolean[102]; + + static { + for (byte b : new byte[] { + GridBinaryMarshaller.BYTE, GridBinaryMarshaller.SHORT, GridBinaryMarshaller.INT, GridBinaryMarshaller.LONG, + GridBinaryMarshaller.FLOAT, GridBinaryMarshaller.DOUBLE, GridBinaryMarshaller.CHAR, GridBinaryMarshaller.BOOLEAN, + GridBinaryMarshaller.DECIMAL, GridBinaryMarshaller.STRING, GridBinaryMarshaller.UUID, GridBinaryMarshaller.DATE, + GridBinaryMarshaller.TIMESTAMP, GridBinaryMarshaller.TIME, GridBinaryMarshaller.BYTE_ARR, GridBinaryMarshaller.SHORT_ARR, + GridBinaryMarshaller.INT_ARR, GridBinaryMarshaller.LONG_ARR, GridBinaryMarshaller.FLOAT_ARR, GridBinaryMarshaller.DOUBLE_ARR, + GridBinaryMarshaller.TIME_ARR, GridBinaryMarshaller.CHAR_ARR, GridBinaryMarshaller.BOOLEAN_ARR, + GridBinaryMarshaller.DECIMAL_ARR, GridBinaryMarshaller.STRING_ARR, GridBinaryMarshaller.UUID_ARR, GridBinaryMarshaller.DATE_ARR, + GridBinaryMarshaller.TIMESTAMP_ARR, GridBinaryMarshaller.ENUM, GridBinaryMarshaller.ENUM_ARR, GridBinaryMarshaller.NULL}) { + + PLAIN_TYPE_FLAG[b] = true; + } + } + + /** + * Check if user type flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + static boolean isUserType(short flags) { + return isFlagSet(flags, FLAG_USR_TYP); + } + + /** + * Check if raw-only flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + public static boolean hasSchema(short flags) { + return isFlagSet(flags, FLAG_HAS_SCHEMA); + } + + /** + * Check if raw-only flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + static boolean hasRaw(short flags) { + return isFlagSet(flags, FLAG_HAS_RAW); + } + + /** + * Check if "no-field-ids" flag is set. + * + * @param flags Flags. + * @return {@code True} if set. + */ + static boolean isCompactFooter(short flags) { + return isFlagSet(flags, FLAG_COMPACT_FOOTER); + } + + /** + * Check whether particular flag is set. + * + * @param flags Flags. + * @param flag Flag. + * @return {@code True} if flag is set in flags. + */ + static boolean isFlagSet(short flags, short flag) { + return (flags & flag) == flag; + } + + /** */ + static int dataStartRelative(BinaryPositionReadable in, int start) { + int typeId = in.readIntPositioned(start + GridBinaryMarshaller.TYPE_ID_POS); + + if (typeId == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) { + // Gets the length of the type name which is stored as string. + int len = in.readIntPositioned(start + GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1); + + return GridBinaryMarshaller.DFLT_HDR_LEN + /** object type */1 + /** string length */ 4 + len; + } + else + return GridBinaryMarshaller.DFLT_HDR_LEN; + } + + /** + * Get footer start of the object. + * + * @param in Input stream. + * @param start Object start position inside the stream. + * @return Footer start. + */ + private static int footerStartRelative(BinaryPositionReadable in, int start) { + short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); + + if (hasSchema(flags)) + // Schema exists, use offset. + return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + else + // No schema, footer start equals to object end. + return length(in, start); + } + + /** + * Get object's footer. + * + * @param in Input stream. + * @param start Start position. + * @return Footer start. + */ + public static int footerStartAbsolute(BinaryPositionReadable in, int start) { + return footerStartRelative(in, start) + start; + } + + /** + * Get object's footer. + * + * @param in Input stream. + * @param start Start position. + * @return Footer. + */ + public static IgniteBiTuple footerAbsolute(BinaryPositionReadable in, int start) { + short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); + + int footerEnd = length(in, start); + + if (hasSchema(flags)) { + // Schema exists. + int footerStart = in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + + if (hasRaw(flags)) + footerEnd -= 4; + + assert footerStart <= footerEnd; + + return F.t(start + footerStart, start + footerEnd); + } + else + // No schema. + return F.t(start + footerEnd, start + footerEnd); + } + + /** + * Get relative raw offset of the object. + * + * @param in Input stream. + * @param start Object start position inside the stream. + * @return Raw offset. + */ + private static int rawOffsetRelative(BinaryPositionReadable in, int start) { + short flags = in.readShortPositioned(start + GridBinaryMarshaller.FLAGS_POS); + + int len = length(in, start); + + if (hasSchema(flags)) { + // Schema exists. + if (hasRaw(flags)) + // Raw offset is set, it is at the very end of the object. + return in.readIntPositioned(start + len - 4); + else + // Raw offset is not set, so just return schema offset. + return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + } + else + // No schema, raw offset is located on schema offset position. + return in.readIntPositioned(start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); + } + + /** + * Get absolute raw offset of the object. + * + * @param in Input stream. + * @param start Object start position inside the stream. + * @return Raw offset. + */ + public static int rawOffsetAbsolute(BinaryPositionReadable in, int start) { + return start + rawOffsetRelative(in, start); + } + + /** + * Get offset length for the given flags. + * + * @param flags Flags. + * @return Offset size. + */ + public static int fieldOffsetLength(short flags) { + if ((flags & FLAG_OFFSET_ONE_BYTE) == FLAG_OFFSET_ONE_BYTE) + return OFFSET_1; + else if ((flags & FLAG_OFFSET_TWO_BYTES) == FLAG_OFFSET_TWO_BYTES) + return OFFSET_2; + else + return OFFSET_4; + } + + /** + * Get field ID length. + * + * @param flags Flags. + * @return Field ID length. + */ + public static int fieldIdLength(short flags) { + return isCompactFooter(flags) ? 0 : FIELD_ID_LEN; + } + + /** + * Get relative field offset. + * + * @param stream Stream. + * @param pos Position. + * @param fieldOffsetSize Field offset size. + * @return Relative field offset. + */ + public static int fieldOffsetRelative(BinaryPositionReadable stream, int pos, int fieldOffsetSize) { + int res; + + if (fieldOffsetSize == OFFSET_1) + res = (int)stream.readBytePositioned(pos) & 0xFF; + else if (fieldOffsetSize == OFFSET_2) + res = (int)stream.readShortPositioned(pos) & 0xFFFF; + else + res = stream.readIntPositioned(pos); + + return res; + } + + /** + * @return {@code true} if content of serialized value cannot contain references to other object. + */ + public static boolean isPlainType(int type) { + return type > 0 && type < PLAIN_TYPE_FLAG.length && PLAIN_TYPE_FLAG[type]; + } + + /** + * Checks whether an array type values can or can not contain references to other object. + * + * @param type Array type. + * @return {@code true} if content of serialized array value cannot contain references to other object. + */ + public static boolean isPlainArrayType(int type) { + return (type >= GridBinaryMarshaller.BYTE_ARR && type <= GridBinaryMarshaller.DATE_ARR) + || type == GridBinaryMarshaller.TIMESTAMP_ARR || type == GridBinaryMarshaller.TIME_ARR; + } +} diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index 7dd2bebdf86af..a0a9c9c9c90af 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -345,7 +345,7 @@ public void context(BinaryContext ctx) { @Override public boolean isFlagSet(short flag) { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.isFlagSet(flags, flag); + return BinaryImplUtils.isFlagSet(flags, flag); } /** {@inheritDoc} */ @@ -406,7 +406,7 @@ public void context(BinaryContext ctx) { @Override public int footerStartOffset() { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - if (!BinaryUtils.hasSchema(flags)) + if (!BinaryImplUtils.hasSchema(flags)) return start + length(); return start + BinaryPrimitives.readInt(arr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); @@ -424,16 +424,16 @@ public void context(BinaryContext ctx) { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int fieldOffsetPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen; int fieldPos; - if (fieldOffLen == BinaryUtils.OFFSET_1) + if (fieldOffLen == BinaryImplUtils.OFFSET_1) fieldPos = start + ((int)BinaryPrimitives.readByte(arr, fieldOffsetPos) & 0xFF); - else if (fieldOffLen == BinaryUtils.OFFSET_2) + else if (fieldOffLen == BinaryImplUtils.OFFSET_2) fieldPos = start + ((int)BinaryPrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF); else fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos); @@ -570,16 +570,16 @@ else if (fieldOffLen == BinaryUtils.OFFSET_2) short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags); int fieldOffsetPos = start + schemaOffset + order * (fieldIdLen + fieldOffsetLen) + fieldIdLen; int fieldPos; - if (fieldOffsetLen == BinaryUtils.OFFSET_1) + if (fieldOffsetLen == BinaryImplUtils.OFFSET_1) fieldPos = start + ((int)BinaryPrimitives.readByte(arr, fieldOffsetPos) & 0xFF); - else if (fieldOffsetLen == BinaryUtils.OFFSET_2) + else if (fieldOffsetLen == BinaryImplUtils.OFFSET_2) fieldPos = start + ((int)BinaryPrimitives.readShort(arr, fieldOffsetPos) & 0xFFFF); else fieldPos = start + BinaryPrimitives.readInt(arr, fieldOffsetPos); @@ -728,7 +728,7 @@ else if (fieldOffsetLen == BinaryUtils.OFFSET_2) @Override public boolean hasSchema() { short flags = BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.hasSchema(flags); + return BinaryImplUtils.hasSchema(flags); } /** {@inheritDoc} */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java index e2ac1b89b4e42..665607bc109a0 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java @@ -117,7 +117,7 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) @Override public boolean hasSchema() { short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.hasSchema(flags); + return BinaryImplUtils.hasSchema(flags); } /** {@inheritDoc} */ @@ -175,7 +175,7 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) @Override public boolean isFlagSet(short flag) { short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - return BinaryUtils.isFlagSet(flags, flag); + return BinaryImplUtils.isFlagSet(flags, flag); } /** {@inheritDoc} */ @@ -215,7 +215,7 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) @Override public int footerStartOffset() { short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - if (!BinaryUtils.hasSchema(flags)) + if (!BinaryImplUtils.hasSchema(flags)) return start + length(); return start + BinaryPrimitives.readInt(ptr, start + GridBinaryMarshaller.SCHEMA_OR_RAW_OFF_POS); @@ -233,16 +233,16 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) short flags = BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; + int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int fieldOffsetPos = start + schemaOff + order * (fieldIdLen + fieldOffLen) + fieldIdLen; int fieldPos; - if (fieldOffLen == BinaryUtils.OFFSET_1) + if (fieldOffLen == BinaryImplUtils.OFFSET_1) fieldPos = start + ((int)BinaryPrimitives.readByte(ptr, fieldOffsetPos) & 0xFF); - else if (fieldOffLen == BinaryUtils.OFFSET_2) + else if (fieldOffLen == BinaryImplUtils.OFFSET_2) fieldPos = start + ((int)BinaryPrimitives.readShort(ptr, fieldOffsetPos) & 0xFFFF); else fieldPos = start + BinaryPrimitives.readInt(ptr, fieldOffsetPos); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java index 888494a185c6e..1fe574d811e48 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryReaderExImpl.java @@ -233,16 +233,16 @@ public BinaryReaderExImpl(BinaryContext ctx, int offset = in.readInt(); // Get trivial flag values. - userType = BinaryUtils.isUserType(flags); - fieldIdLen = BinaryUtils.fieldIdLength(flags); - fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + userType = BinaryImplUtils.isUserType(flags); + fieldIdLen = BinaryImplUtils.fieldIdLength(flags); + fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); // Calculate footer borders and raw offset. - if (BinaryUtils.hasSchema(flags)) { + if (BinaryImplUtils.hasSchema(flags)) { // Schema exists. footerStart = start + offset; - if (BinaryUtils.hasRaw(flags)) { + if (BinaryImplUtils.hasRaw(flags)) { footerLen = len - offset; rawOff = start + in.readIntPositioned(start + len - 4); } @@ -256,7 +256,7 @@ public BinaryReaderExImpl(BinaryContext ctx, footerStart = start + len; footerLen = 0; - if (BinaryUtils.hasRaw(flags)) + if (BinaryImplUtils.hasRaw(flags)) rawOff = start + offset; else rawOff = start + len; @@ -286,7 +286,7 @@ public BinaryReaderExImpl(BinaryContext ctx, } mapper = userType ? ctx.userTypeMapper(typeId) : BinaryContext.defaultMapper(); - schema = BinaryUtils.hasSchema(flags) ? getOrCreateSchema() : null; + schema = BinaryImplUtils.hasSchema(flags) ? getOrCreateSchema() : null; } else { dataStart = 0; @@ -1989,7 +1989,7 @@ private int fieldId(String name) { BinarySchema schema = ctx.schemaRegistry(typeId).schema(schemaId); if (schema == null) { - if (fieldIdLen != BinaryUtils.FIELD_ID_LEN) { + if (fieldIdLen != BinaryImplUtils.FIELD_ID_LEN) { BinaryTypeImpl type = (BinaryTypeImpl)ctx.metadata(typeId, schemaId); BinaryMetadata meta = type != null ? type.metadata() : null; @@ -2041,7 +2041,7 @@ private int fieldId(String name) { * @return Schema. */ private BinarySchema createSchema() { - assert fieldIdLen == BinaryUtils.FIELD_ID_LEN; + assert fieldIdLen == BinaryImplUtils.FIELD_ID_LEN; BinarySchema.Builder builder = BinarySchema.Builder.newBuilder(); @@ -2053,7 +2053,7 @@ private BinarySchema createSchema() { builder.addField(fieldId); - searchPos += BinaryUtils.FIELD_ID_LEN + fieldOffLen; + searchPos += BinaryImplUtils.FIELD_ID_LEN + fieldOffLen; } return builder.build(); @@ -2184,7 +2184,7 @@ private boolean trySetUserFieldPosition(int order) { if (order != BinarySchema.ORDER_NOT_FOUND) { int offsetPos = footerStart + order * (fieldIdLen + fieldOffLen) + fieldIdLen; - int pos = start + BinaryUtils.fieldOffsetRelative(in, offsetPos, fieldOffLen); + int pos = start + BinaryImplUtils.fieldOffsetRelative(in, offsetPos, fieldOffLen); streamPosition(pos); @@ -2202,7 +2202,7 @@ private boolean trySetUserFieldPosition(int order) { */ private boolean trySetSystemFieldPosition(int id) { // System types are never written with compact footers because they do not have metadata. - assert fieldIdLen == BinaryUtils.FIELD_ID_LEN; + assert fieldIdLen == BinaryImplUtils.FIELD_ID_LEN; int searchPos = footerStart; int searchTail = searchPos + footerLen; @@ -2214,7 +2214,7 @@ private boolean trySetSystemFieldPosition(int id) { int id0 = in.readIntPositioned(searchPos); if (id0 == id) { - int pos = start + BinaryUtils.fieldOffsetRelative(in, searchPos + BinaryUtils.FIELD_ID_LEN, + int pos = start + BinaryImplUtils.fieldOffsetRelative(in, searchPos + BinaryImplUtils.FIELD_ID_LEN, fieldOffLen); streamPosition(pos); @@ -2222,7 +2222,7 @@ private boolean trySetSystemFieldPosition(int id) { return true; } - searchPos += BinaryUtils.FIELD_ID_LEN + fieldOffLen; + searchPos += BinaryImplUtils.FIELD_ID_LEN + fieldOffLen; } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java index 845f057fe8f3d..42815f6b8f3b0 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java @@ -21,18 +21,18 @@ import java.util.Map; import org.apache.ignite.internal.binary.streams.BinaryOutputStream; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_OFFSET_ONE_BYTE; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_OFFSET_TWO_BYTES; -import static org.apache.ignite.internal.binary.BinaryUtils.OFFSET_1; -import static org.apache.ignite.internal.binary.BinaryUtils.OFFSET_2; -import static org.apache.ignite.internal.binary.BinaryUtils.dataStartRelative; -import static org.apache.ignite.internal.binary.BinaryUtils.fieldOffsetLength; -import static org.apache.ignite.internal.binary.BinaryUtils.footerStartAbsolute; -import static org.apache.ignite.internal.binary.BinaryUtils.hasRaw; -import static org.apache.ignite.internal.binary.BinaryUtils.hasSchema; -import static org.apache.ignite.internal.binary.BinaryUtils.isCompactFooter; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_OFFSET_ONE_BYTE; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_OFFSET_TWO_BYTES; +import static org.apache.ignite.internal.binary.BinaryImplUtils.OFFSET_1; +import static org.apache.ignite.internal.binary.BinaryImplUtils.OFFSET_2; +import static org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative; +import static org.apache.ignite.internal.binary.BinaryImplUtils.fieldOffsetLength; +import static org.apache.ignite.internal.binary.BinaryImplUtils.footerStartAbsolute; +import static org.apache.ignite.internal.binary.BinaryImplUtils.hasRaw; +import static org.apache.ignite.internal.binary.BinaryImplUtils.hasSchema; +import static org.apache.ignite.internal.binary.BinaryImplUtils.isCompactFooter; +import static org.apache.ignite.internal.binary.BinaryImplUtils.rawOffsetAbsolute; import static org.apache.ignite.internal.binary.BinaryUtils.length; -import static org.apache.ignite.internal.binary.BinaryUtils.rawOffsetAbsolute; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.DFLT_HDR_LEN; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.FLAGS_POS; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.HASH_CODE_POS; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java index 1c9edee42b18e..d5e40860186e0 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/ObjectDetachHelper.java @@ -21,9 +21,9 @@ import org.apache.ignite.internal.binary.streams.BinaryOutputStream; import org.apache.ignite.internal.binary.streams.BinaryStreams; -import static org.apache.ignite.internal.binary.BinaryUtils.dataStartRelative; +import static org.apache.ignite.internal.binary.BinaryImplUtils.dataStartRelative; +import static org.apache.ignite.internal.binary.BinaryImplUtils.rawOffsetAbsolute; import static org.apache.ignite.internal.binary.BinaryUtils.length; -import static org.apache.ignite.internal.binary.BinaryUtils.rawOffsetAbsolute; /** */ class ObjectDetachHelper { diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 65c312283032b..9a19d3dcb994c 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -33,6 +33,7 @@ import org.apache.ignite.internal.binary.BinariesFactoryImpl; import org.apache.ignite.internal.binary.BinaryContext; import org.apache.ignite.internal.binary.BinaryFieldMetadata; +import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.binary.BinaryUtils; @@ -231,16 +232,16 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { assignedFldsById = Collections.emptyMap(); // Get footer details. - int fieldIdLen = BinaryUtils.fieldIdLength(flags); - int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.fieldIdLength(flags); + int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags); - IgniteBiTuple footer = BinaryUtils.footerAbsolute(reader, start); + IgniteBiTuple footer = BinaryImplUtils.footerAbsolute(reader, start); int footerPos = footer.get1(); int footerEnd = footer.get2(); // Get raw position. - int rawPos = BinaryUtils.rawOffsetAbsolute(reader, start); + int rawPos = BinaryImplUtils.rawOffsetAbsolute(reader, start); // Position reader on data. reader.position(start + hdrLen); @@ -268,7 +269,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { else { int type = fieldLen != 0 ? reader.readByte(0) : 0; - if (fieldLen != 0 && !BinaryUtils.isPlainArrayType(type) && BinaryUtils.isPlainType(type)) { + if (fieldLen != 0 && !BinaryImplUtils.isPlainArrayType(type) && BinaryImplUtils.isPlainType(type)) { writer.writeFieldId(fieldId); writer.write(reader.array(), reader.position(), fieldLen); @@ -322,8 +323,8 @@ else if (readCache == null) { if (reader != null) { // Write raw data if any. - int rawOff = BinaryUtils.rawOffsetAbsolute(reader, start); - int footerStart = BinaryUtils.footerStartAbsolute(reader, start); + int rawOff = BinaryImplUtils.rawOffsetAbsolute(reader, start); + int footerStart = BinaryImplUtils.footerStartAbsolute(reader, start); if (rawOff < footerStart) { writer.rawWriter(); @@ -432,7 +433,7 @@ else if (!nullFieldVal) { private IgniteBiTuple fieldPositionAndLength(int footerPos, int footerEnd, int rawPos, int fieldIdLen, int fieldOffsetLen) { // Get field offset first. - int fieldOffset = BinaryUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen, fieldOffsetLen); + int fieldOffset = BinaryImplUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen, fieldOffsetLen); int fieldPos = start + fieldOffset; // Get field length. @@ -443,7 +444,7 @@ private IgniteBiTuple fieldPositionAndLength(int footerPos, in fieldLen = rawPos - fieldPos; else { // Field is somewhere in the middle, get difference with the next offset. - int nextFieldOffset = BinaryUtils.fieldOffsetRelative(reader, + int nextFieldOffset = BinaryImplUtils.fieldOffsetRelative(reader, footerPos + fieldIdLen + fieldOffsetLen + fieldIdLen, fieldOffsetLen); fieldLen = nextFieldOffset - fieldOffset; @@ -459,17 +460,17 @@ private void ensureReadCacheInit() { assert reader != null; if (readCache == null) { - int fieldIdLen = BinaryUtils.fieldIdLength(flags); - int fieldOffsetLen = BinaryUtils.fieldOffsetLength(flags); + int fieldIdLen = BinaryImplUtils.fieldIdLength(flags); + int fieldOffsetLen = BinaryImplUtils.fieldOffsetLength(flags); Map readCache = new HashMap<>(); - IgniteBiTuple footer = BinaryUtils.footerAbsolute(reader, start); + IgniteBiTuple footer = BinaryImplUtils.footerAbsolute(reader, start); int footerPos = footer.get1(); int footerEnd = footer.get2(); - int rawPos = BinaryUtils.rawOffsetAbsolute(reader, start); + int rawPos = BinaryImplUtils.rawOffsetAbsolute(reader, start); int idx = 0; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java index bacc6fb1e3490..868e35223e4dd 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java @@ -504,7 +504,7 @@ private BinarySerializedFieldComparator comparator(BinaryObjectExImpl obj) { : BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; - int fieldOffLen = BinaryUtils.fieldOffsetLength(flags); + int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int orderBase = start + schemaOff + fieldIdLen; int orderMultiplier = fieldIdLen + fieldOffLen; From 810cf79480317f35bd68cfa312060c37fdc0d525 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 9 Sep 2026 10:23:59 +0300 Subject: [PATCH 2/6] IGNITE-29044 Move BinaryWriterSchemaHolder to binary-impl --- .../org/apache/ignite/internal/binary/BinariesFactory.java | 3 +-- .../java/org/apache/ignite/internal/binary/BinaryUtils.java | 4 ++-- .../apache/ignite/internal/binary/BinariesFactoryImpl.java | 4 ++-- .../apache/ignite/internal/binary/BinaryWriterExImpl.java | 4 ++-- .../ignite/internal/binary/BinaryWriterSchemaHolder.java | 0 .../org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java | 5 ++--- .../internal/processors/odbc/ClientListenerNioListener.java | 2 +- .../ignite/internal/client/thin/events/FakeIgniteServer.java | 2 +- .../ignite/platform/PlatformGetInternalCachesTask.java | 2 +- .../ignite/internal/client/thin/ClientAtomicLongImpl.java | 2 +- .../internal/client/thin/ClientCacheAffinityContext.java | 2 +- .../internal/client/thin/ClientCacheAffinityMapping.java | 2 +- .../org/apache/ignite/internal/client/thin/ClientUtils.java | 4 ++-- .../apache/ignite/internal/client/thin/TcpClientCache.java | 2 +- .../apache/ignite/internal/client/thin/TcpClientChannel.java | 2 +- .../ignite/internal/client/thin/TcpClientTransactions.java | 2 +- .../apache/ignite/internal/client/thin/TcpIgniteClient.java | 2 +- 17 files changed, 21 insertions(+), 23 deletions(-) rename modules/binary/{api => impl}/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java (100%) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java index 3538c2b452f1d..c06e669ee2887 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinariesFactory.java @@ -90,10 +90,9 @@ public BinaryReaderEx reader(BinaryContext ctx, /** * @param ctx Context. * @param out Output stream. - * @param schema Schema holder * @return Writer instance. */ - public BinaryWriterEx writer(BinaryContext ctx, BinaryOutputStream out, BinaryWriterSchemaHolder schema); + public BinaryWriterEx writerWithoutSchema(BinaryContext ctx, BinaryOutputStream out); /** * Create accessor for the field. diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index e10222a6593cd..45146bb29d2fc 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -2897,8 +2897,8 @@ public static BinaryWriterEx writer(BinaryContext ctx, BinaryOutputStream out) { * @param out Output stream. * @return Writer instance. */ - public static BinaryWriterEx writer(BinaryContext ctx, BinaryOutputStream out, BinaryWriterSchemaHolder schema) { - return binariesFactory.writer(ctx, out, schema); + public static BinaryWriterEx writerWithoutSchema(BinaryContext ctx, BinaryOutputStream out) { + return binariesFactory.writerWithoutSchema(ctx, out); } /** @return Instance of caching handler. */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java index 0064ab7cb6e30..211eb67c17e8e 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinariesFactoryImpl.java @@ -90,8 +90,8 @@ public class BinariesFactoryImpl implements BinariesFactory { } /** {@inheritDoc} */ - @Override public BinaryWriterEx writer(BinaryContext ctx, BinaryOutputStream out, BinaryWriterSchemaHolder schema) { - return new BinaryWriterExImpl(ctx, out, schema, null, false, GridBinaryMarshaller.UNREGISTERED_TYPE_ID); + @Override public BinaryWriterEx writerWithoutSchema(BinaryContext ctx, BinaryOutputStream out) { + return new BinaryWriterExImpl(ctx, out, null, null, false, GridBinaryMarshaller.UNREGISTERED_TYPE_ID); } /** {@inheritDoc} */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 033be969abcf7..176a1ec9eb155 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -60,7 +60,7 @@ class BinaryWriterExImpl implements BinaryWriterEx { private final BinaryOutputStream out; /** Schema. */ - private final BinaryWriterSchemaHolder schema; + private final @Nullable BinaryWriterSchemaHolder schema; /** */ private int typeId; @@ -96,7 +96,7 @@ class BinaryWriterExImpl implements BinaryWriterEx { public BinaryWriterExImpl( BinaryContext ctx, BinaryOutputStream out, - BinaryWriterSchemaHolder schema, + @Nullable BinaryWriterSchemaHolder schema, BinaryWriterHandles handles, boolean failIfUnregistered, int typeId diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java similarity index 100% rename from modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java rename to modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 4a3bf02a87c71..faa6d7a5c4c0a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -275,7 +275,7 @@ private HandshakeResult handshake(ClientListenerProtocolVersion ver) throws IOEx marsh.setContext(new MarshallerContextImpl(null)); - BinaryWriterEx writer = BinaryUtils.writer(U.binaryContext(marsh), BinaryStreams.outputStream(HANDSHAKE_MSG_SIZE), null); + BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(U.binaryContext(marsh), BinaryStreams.outputStream(HANDSHAKE_MSG_SIZE)); writer.writeByte((byte)ClientListenerRequest.HANDSHAKE); @@ -436,8 +436,7 @@ else if (VER_2_1_0.equals(srvProtoVer0)) * @throws SQLException On connection reject. */ private HandshakeResult handshake_2_1_0() throws IOException, SQLException { - BinaryWriterEx writer = BinaryUtils.writer(null, BinaryStreams.outputStream(HANDSHAKE_MSG_SIZE), - null); + BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(null, BinaryStreams.outputStream(HANDSHAKE_MSG_SIZE)); writer.writeByte((byte)ClientListenerRequest.HANDSHAKE); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java index 2f9382a44fde7..b72125fad2625 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/ClientListenerNioListener.java @@ -374,7 +374,7 @@ private void onHandshake(GridNioSession ses, ClientMessage msg) { ClientListenerProtocolVersion ver = ClientListenerProtocolVersion.create(verMajor, verMinor, verMaintenance); - BinaryWriterEx writer = BinaryUtils.writer(null, BinaryStreams.outputStream(8), null); + BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(null, BinaryStreams.outputStream(8)); byte clientType = reader.readByte(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/events/FakeIgniteServer.java b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/events/FakeIgniteServer.java index 6288699c7b2d3..db6b74e69bc4a 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/client/thin/events/FakeIgniteServer.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/client/thin/events/FakeIgniteServer.java @@ -224,7 +224,7 @@ public void stop() { /** */ private ByteBuffer createMessage(Consumer writerAction) { - try (BinaryWriterEx writer = BinaryUtils.writer(null, BinaryStreams.outputStream(32), null)) { + try (BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(null, BinaryStreams.outputStream(32))) { writer.writeInt(0); writerAction.accept(writer); diff --git a/modules/core/src/test/java/org/apache/ignite/platform/PlatformGetInternalCachesTask.java b/modules/core/src/test/java/org/apache/ignite/platform/PlatformGetInternalCachesTask.java index ee76745387351..af4d47d929645 100644 --- a/modules/core/src/test/java/org/apache/ignite/platform/PlatformGetInternalCachesTask.java +++ b/modules/core/src/test/java/org/apache/ignite/platform/PlatformGetInternalCachesTask.java @@ -68,7 +68,7 @@ private static class InternalCachesJob extends ComputeJobAdapter { @Override public byte[] execute() { IgniteEx ign = (IgniteEx)ignite; - try (BinaryWriterEx writer = BinaryUtils.writer(U.binaryContext(null), BinaryStreams.outputStream(512), null)) { + try (BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(U.binaryContext(null), BinaryStreams.outputStream(512))) { Collection> caches = ign.cachesx(); writer.writeInt(caches.size()); diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java index 29055ea3d3fc3..17e2df8063328 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientAtomicLongImpl.java @@ -134,7 +134,7 @@ public ClientAtomicLongImpl(String name, @Nullable String groupName, ReliableCha * @param out Output channel. */ private void writeName(PayloadOutputChannel out) { - try (BinaryWriterEx w = BinaryUtils.writer(null, out.out(), null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(null, out.out())) { w.writeString(name); w.writeString(groupName); } diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java index fb3877dbdee6d..322e6227b9685 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityContext.java @@ -250,7 +250,7 @@ else if (newMapping.topologyVersion().equals(oldMapping.topologyVersion())) * @param ch Payload output channel. */ public void writeDataCenterNodesRequest(PayloadOutputChannel ch) { - try (BinaryWriterEx w = BinaryUtils.writer(null, ch.out(), null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(null, ch.out())) { w.writeString(dataCenterId); } } diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java index 1ee7b28fb7eef..c967987809ace 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientCacheAffinityMapping.java @@ -173,7 +173,7 @@ public static void writeRequest( out.writeBoolean(customMappingsRequired); if (ctx.isFeatureSupported(DC_AWARE)) { - try (BinaryWriterEx w = BinaryUtils.writer(null, out, null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(null, out)) { w.writeString(dcId); } } diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java index 0bf8047dd3a1c..c6d720c5565ce 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/ClientUtils.java @@ -224,7 +224,7 @@ BinaryMetadata binaryMetadata(BinaryInputStream in) throws IOException { /** Serialize binary type metadata to stream. */ void binaryMetadata(BinaryMetadata meta, BinaryOutputStream out) { - try (BinaryWriterEx w = BinaryUtils.writer(marsh.context(), out, null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(marsh.context(), out)) { w.writeInt(meta.typeId()); w.writeString(meta.typeName()); w.writeString(meta.affinityKeyFieldName()); @@ -269,7 +269,7 @@ void binaryMetadata(BinaryMetadata meta, BinaryOutputStream out) { /** Serialize configuration to stream. */ void cacheConfiguration(ClientCacheConfiguration cfg, boolean sql, BinaryOutputStream out, ProtocolContext protocolCtx) { - try (BinaryWriterEx writer = BinaryUtils.writer(marsh.context(), out, null)) { + try (BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(marsh.context(), out)) { if (protocolCtx.isFeatureSupported(ProtocolBitmaskFeature.SQL_CACHE_CREATION)) out.writeBoolean(sql); diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java index ab574b9cf3eb4..ad634260e35c3 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientCache.java @@ -1300,7 +1300,7 @@ private QueryCursor> indexQuery(IndexQuery qry) { BinaryOutputStream out = payloadCh.out(); - try (BinaryWriterEx w = BinaryUtils.writer(marsh.context(), out, null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(marsh.context(), out)) { w.writeInt(qry.getPageSize()); w.writeBoolean(qry.isLocal()); w.writeInt(qry.getPartition() == null ? -1 : qry.getPartition()); diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java index a7109e0e02ea2..a90fbd3437b4a 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java @@ -845,7 +845,7 @@ else if (!supportedVers.contains(srvVer) || /** Send handshake request. */ private void handshakeReq(ProtocolVersion proposedVer, String user, String pwd, Map userAttrs) throws ClientConnectionException { - try (BinaryWriterEx writer = BinaryUtils.writer(BinaryUtils.binaryContext(null), BinaryStreams.outputStream(32), null)) { + try (BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(BinaryUtils.binaryContext(null), BinaryStreams.outputStream(32))) { ProtocolContext protocolCtx = protocolContextFromVersion(proposedVer); writer.writeInt(0); // reserve an integer for the request size diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java index 8dee96182ab78..4030782258b9c 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpClientTransactions.java @@ -101,7 +101,7 @@ private ClientTransaction txStart0(TransactionConcurrency concurrency, Transacti protocolCtx.version(), TRANSACTIONS.verIntroduced())); } - try (BinaryWriterEx writer = BinaryUtils.writer(marsh.context(), req.out(), null)) { + try (BinaryWriterEx writer = BinaryUtils.writerWithoutSchema(marsh.context(), req.out())) { writer.writeByte((byte)(concurrency == null ? txCfg.getDefaultTxConcurrency() : concurrency).ordinal()); writer.writeByte((byte)(isolation == null ? txCfg.getDefaultTxIsolation() : isolation).ordinal()); writer.writeLong(timeout == null ? txCfg.getDefaultTxTimeout() : timeout); diff --git a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java index 2db974818cc63..94a49d930a6d5 100644 --- a/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java +++ b/modules/thin-client/impl/src/main/java/org/apache/ignite/internal/client/thin/TcpIgniteClient.java @@ -555,7 +555,7 @@ private static void ensureCacheConfiguration(ClientCacheConfiguration cfg) { /** Serialize string. */ private void writeString(String s, BinaryOutputStream out) { - try (BinaryWriterEx w = BinaryUtils.writer(marsh.context(), out, null)) { + try (BinaryWriterEx w = BinaryUtils.writerWithoutSchema(marsh.context(), out)) { w.writeString(s); } } From 5587e948e7a6b9fee564cde4ef20cb635deea6d8 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 9 Sep 2026 12:49:38 +0300 Subject: [PATCH 3/6] IGNITE-29044 Move BinaryWriterSchemaHolder to binary-impl --- .../internal/binary/BinaryWriterExImpl.java | 18 +++++++++--------- .../binary/BinaryWriterSchemaHolder.java | 10 +++++----- .../builder/BinaryObjectBuilderImpl.java | 2 +- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java index 176a1ec9eb155..8eb2efe962281 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterExImpl.java @@ -235,11 +235,11 @@ int position() { if (userType) { if (ctx.isCompactFooter()) { - flags = BinaryUtils.FLAG_USR_TYP | BinaryUtils.FLAG_COMPACT_FOOTER; + flags = BinaryImplUtils.FLAG_USR_TYP | BinaryImplUtils.FLAG_COMPACT_FOOTER; useCompactFooter = true; } else { - flags = BinaryUtils.FLAG_USR_TYP; + flags = BinaryImplUtils.FLAG_USR_TYP; useCompactFooter = false; } } @@ -254,18 +254,18 @@ int position() { offset = out.position() - start; // Write the schema. - flags |= BinaryUtils.FLAG_HAS_SCHEMA; + flags |= BinaryImplUtils.FLAG_HAS_SCHEMA; int offsetByteCnt = schema.write(out, fieldCnt, useCompactFooter); - if (offsetByteCnt == BinaryUtils.OFFSET_1) - flags |= BinaryUtils.FLAG_OFFSET_ONE_BYTE; - else if (offsetByteCnt == BinaryUtils.OFFSET_2) - flags |= BinaryUtils.FLAG_OFFSET_TWO_BYTES; + if (offsetByteCnt == BinaryImplUtils.OFFSET_1) + flags |= BinaryImplUtils.FLAG_OFFSET_ONE_BYTE; + else if (offsetByteCnt == BinaryImplUtils.OFFSET_2) + flags |= BinaryImplUtils.FLAG_OFFSET_TWO_BYTES; // Write raw offset if needed. if (rawOffPos != 0) { - flags |= BinaryUtils.FLAG_HAS_RAW; + flags |= BinaryImplUtils.FLAG_HAS_RAW; out.writeInt(rawOffPos - start); } @@ -275,7 +275,7 @@ else if (offsetByteCnt == BinaryUtils.OFFSET_2) offset = rawOffPos - start; // If there is no schema, we are free to write raw offset to schema offset. - flags |= BinaryUtils.FLAG_HAS_RAW; + flags |= BinaryImplUtils.FLAG_HAS_RAW; } else offset = GridBinaryMarshaller.DFLT_HDR_LEN; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java index 8e5eab4f9f6ee..fecb10aa23927 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryWriterSchemaHolder.java @@ -96,19 +96,19 @@ public int write(BinaryOutputStream out, int fieldCnt, boolean compactFooter) { for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2) out.unsafeWriteByte((byte)data[curIdx]); - res = BinaryUtils.OFFSET_1; + res = BinaryImplUtils.OFFSET_1; } else if (lastOffset < MAX_OFFSET_2) { for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2) out.unsafeWriteShort((short)data[curIdx]); - res = BinaryUtils.OFFSET_2; + res = BinaryImplUtils.OFFSET_2; } else { for (int curIdx = startIdx + 1; curIdx < idx; curIdx += 2) out.unsafeWriteInt(data[curIdx]); - res = BinaryUtils.OFFSET_4; + res = BinaryImplUtils.OFFSET_4; } } else { @@ -118,7 +118,7 @@ else if (lastOffset < MAX_OFFSET_2) { out.unsafeWriteByte((byte)data[curIdx++]); } - res = BinaryUtils.OFFSET_1; + res = BinaryImplUtils.OFFSET_1; } else if (lastOffset < MAX_OFFSET_2) { for (int curIdx = startIdx; curIdx < idx;) { @@ -126,7 +126,7 @@ else if (lastOffset < MAX_OFFSET_2) { out.unsafeWriteShort((short)data[curIdx++]); } - res = BinaryUtils.OFFSET_2; + res = BinaryImplUtils.OFFSET_2; } else { for (int curIdx = startIdx; curIdx < idx;) { diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index 9a19d3dcb994c..d1ef8426cc90a 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -208,7 +208,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { Map fieldsMeta = null; - if (reader != null && BinaryUtils.hasSchema(flags)) { + if (reader != null && BinaryImplUtils.hasSchema(flags)) { Map assignedFldsById; if (assignedVals != null) { From 788e0ed0781f1f1821eefa659c9d38ac6e602798 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 9 Sep 2026 13:48:23 +0300 Subject: [PATCH 4/6] IGNITE-29044 Move BinaryWriterSchemaHolder to binary-impl --- .../org/apache/ignite/internal/binary/BinaryObjectEx.java | 5 +++++ .../org/apache/ignite/internal/binary/BinaryObjectImpl.java | 6 ++++++ .../ignite/internal/binary/BinaryObjectOffheapImpl.java | 6 ++++++ .../internal/processors/cache/verify/IdleVerifyUtility.java | 3 +-- .../org/apache/ignite/client/BinaryConfigurationTest.java | 2 +- .../binary/BinarySerialiedFieldComparatorSelfTest.java | 2 +- .../internal/binary/BinarySerializedFieldComparator.java | 4 ++-- 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java index f8e5c067810b0..f5d8d61d62e47 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryObjectEx.java @@ -141,4 +141,9 @@ public default void detachAllowed(boolean detachAllowed) { public default boolean hasCircularReferences() { return false; } + + /** @return {@code true} if binary object has compact footer. */ + public default boolean isCompactFooter() { + return false; + } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java index a0a9c9c9c90af..d41d6a3160d1a 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectImpl.java @@ -45,6 +45,7 @@ import org.jetbrains.annotations.Nullable; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER; import static org.apache.ignite.internal.binary.GridBinaryMarshaller.TRANSFORMED; /** @@ -348,6 +349,11 @@ public void context(BinaryContext ctx) { return BinaryImplUtils.isFlagSet(flags, flag); } + /** {@inheritDoc} */ + @Override public boolean isCompactFooter() { + return isFlagSet(FLAG_COMPACT_FOOTER); + } + /** {@inheritDoc} */ @Override public int typeId() { int off = start + GridBinaryMarshaller.TYPE_ID_POS; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java index 665607bc109a0..9ad6c06a605d4 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryObjectOffheapImpl.java @@ -43,6 +43,7 @@ import org.jetbrains.annotations.Nullable; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER; /** * Binary object implementation over offheap memory @@ -178,6 +179,11 @@ public BinaryObjectOffheapImpl(BinaryContext ctx, long ptr, int start, int size) return BinaryImplUtils.isFlagSet(flags, flag); } + /** {@inheritDoc} */ + @Override public boolean isCompactFooter() { + return isFlagSet(FLAG_COMPACT_FOOTER); + } + /** {@inheritDoc} */ @Nullable @Override public BinaryType type() throws BinaryObjectException { return BinaryUtils.typeProxy(ctx, this); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java index 9e9b2b6a90ccb..3cccbb3e72a3a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/verify/IdleVerifyUtility.java @@ -55,7 +55,6 @@ import org.apache.ignite.lang.IgniteInClosure; import org.jetbrains.annotations.Nullable; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_COMPACT_FOOTER; import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_AUX; import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_DATA; import static org.apache.ignite.internal.pagemem.PageIdAllocator.FLAG_IDX; @@ -421,7 +420,7 @@ public void update( if (key.cacheObjectType() == TYPE_BINARY) { binary++; - if (((BinaryObjectEx)key).isFlagSet(FLAG_COMPACT_FOOTER)) + if (((BinaryObjectEx)key).isCompactFooter()) cf++; else noCf++; diff --git a/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java index 543e020ccddf2..965616d14db6d 100644 --- a/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/client/BinaryConfigurationTest.java @@ -31,7 +31,7 @@ import org.apache.ignite.testframework.LogListener; import org.junit.Test; -import static org.apache.ignite.internal.binary.BinaryUtils.FLAG_COMPACT_FOOTER; +import static org.apache.ignite.internal.binary.BinaryImplUtils.FLAG_COMPACT_FOOTER; /** * Tests binary configuration behavior. diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java index 868e35223e4dd..1fafa4eaa3fb3 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerialiedFieldComparatorSelfTest.java @@ -503,7 +503,7 @@ private BinarySerializedFieldComparator comparator(BinaryObjectExImpl obj) { ? BinaryPrimitives.readShort(ptr, start + GridBinaryMarshaller.FLAGS_POS) : BinaryPrimitives.readShort(arr, start + GridBinaryMarshaller.FLAGS_POS); - int fieldIdLen = BinaryUtils.isCompactFooter(flags) ? 0 : BinaryUtils.FIELD_ID_LEN; + int fieldIdLen = BinaryImplUtils.isCompactFooter(flags) ? 0 : BinaryImplUtils.FIELD_ID_LEN; int fieldOffLen = BinaryImplUtils.fieldOffsetLength(flags); int orderBase = start + schemaOff + fieldIdLen; diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java index 150c1475bda26..5768886f2a3f9 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java @@ -94,12 +94,12 @@ public void findField(int order) { else { int pos = orderBase + order * orderMultiplier; - if (fieldOffLen == BinaryUtils.OFFSET_1) { + if (fieldOffLen == BinaryImplUtils.OFFSET_1) { byte val = offheap() ? BinaryPrimitives.readByte(ptr, pos) : BinaryPrimitives.readByte(arr, pos); curFieldPos = startOff + ((int)val & 0xFF); } - else if (fieldOffLen == BinaryUtils.OFFSET_2) { + else if (fieldOffLen == BinaryImplUtils.OFFSET_2) { short val = offheap() ? BinaryPrimitives.readShort(ptr, pos) : BinaryPrimitives.readShort(arr, pos); curFieldPos = startOff + ((int)val & 0xFFFF); From 02bb629fea2fa1c58037493827f25a79235de32c Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 9 Sep 2026 18:40:25 +0300 Subject: [PATCH 5/6] IGNITE-29044 Move BinaryWriterSchemaHolder to binary-impl --- .../ignite/internal/binary/BinaryUtils.java | 268 ++---------------- .../binary/BinaryArrayIdentityResolver.java | 2 +- .../internal/binary/BinaryImplUtils.java | 200 +++++++++++++ .../binary/CrossObjectReferenceResolver.java | 2 +- .../builder/BinaryBuilderSerializer.java | 5 +- .../builder/BinaryObjectBuilderImpl.java | 6 +- .../BinarySerializedFieldComparator.java | 2 +- .../metric/MetricsConfigurationTest.java | 2 +- .../ignite/testframework/GridTestUtils.java | 40 +++ 9 files changed, 267 insertions(+), 260 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index c4b1bffabc013..1829370cc4ef2 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -38,7 +38,6 @@ import java.sql.Time; import java.sql.Timestamp; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Date; @@ -331,172 +330,6 @@ public static String fieldTypeName(int typeId) { return FIELD_TYPE_NAMES[typeId]; } - /** - * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. - * - * @param writer W - * @param val Value. - */ - public static void writePlainObject(BinaryWriterEx writer, Object val) { - Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); - - if (flag == null) - throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); - - switch (flag) { - case GridBinaryMarshaller.BYTE: - writer.writeByte(flag); - writer.writeByte((Byte)val); - - break; - - case GridBinaryMarshaller.SHORT: - writer.writeByte(flag); - writer.writeShort((Short)val); - - break; - - case GridBinaryMarshaller.INT: - writer.writeByte(flag); - writer.writeInt((Integer)val); - - break; - - case GridBinaryMarshaller.LONG: - writer.writeByte(flag); - writer.writeLong((Long)val); - - break; - - case GridBinaryMarshaller.FLOAT: - writer.writeByte(flag); - writer.writeFloat((Float)val); - - break; - - case GridBinaryMarshaller.DOUBLE: - writer.writeByte(flag); - writer.writeDouble((Double)val); - - break; - - case GridBinaryMarshaller.CHAR: - writer.writeByte(flag); - writer.writeChar((Character)val); - - break; - - case GridBinaryMarshaller.BOOLEAN: - writer.writeByte(flag); - writer.writeBoolean((Boolean)val); - - break; - - case GridBinaryMarshaller.DECIMAL: - writer.writeDecimal((BigDecimal)val); - - break; - - case GridBinaryMarshaller.STRING: - writer.writeString((String)val); - - break; - - case GridBinaryMarshaller.UUID: - writer.writeUuid((UUID)val); - - break; - - case GridBinaryMarshaller.DATE: - writer.writeDate((Date)val); - - break; - - case GridBinaryMarshaller.TIMESTAMP: - writer.writeTimestamp((Timestamp)val); - - break; - - case GridBinaryMarshaller.TIME: - writer.writeTime((Time)val); - - break; - - case GridBinaryMarshaller.BYTE_ARR: - writer.writeByteArray((byte[])val); - - break; - - case GridBinaryMarshaller.SHORT_ARR: - writer.writeShortArray((short[])val); - - break; - - case GridBinaryMarshaller.INT_ARR: - writer.writeIntArray((int[])val); - - break; - - case GridBinaryMarshaller.LONG_ARR: - writer.writeLongArray((long[])val); - - break; - - case GridBinaryMarshaller.FLOAT_ARR: - writer.writeFloatArray((float[])val); - - break; - - case GridBinaryMarshaller.DOUBLE_ARR: - writer.writeDoubleArray((double[])val); - - break; - - case GridBinaryMarshaller.CHAR_ARR: - writer.writeCharArray((char[])val); - - break; - - case GridBinaryMarshaller.BOOLEAN_ARR: - writer.writeBooleanArray((boolean[])val); - - break; - - case GridBinaryMarshaller.DECIMAL_ARR: - writer.writeDecimalArray((BigDecimal[])val); - - break; - - case GridBinaryMarshaller.STRING_ARR: - writer.writeStringArray((String[])val); - - break; - - case GridBinaryMarshaller.UUID_ARR: - writer.writeUuidArray((UUID[])val); - - break; - - case GridBinaryMarshaller.DATE_ARR: - writer.writeDateArray((Date[])val); - - break; - - case GridBinaryMarshaller.TIMESTAMP_ARR: - writer.writeTimestampArray((Timestamp[])val); - - break; - - case GridBinaryMarshaller.TIME_ARR: - writer.writeTimeArray((Time[])val); - - break; - - default: - throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); - } - } - /** * @param obj Value to unwrap. * @return Unwrapped value. @@ -2535,14 +2368,6 @@ public static Map, Function> unwrapFuncForSizeCalc() { ); } - /** - * @param val Value to check. - * @return {@code True} if {@code val} instance of {@link BinaryEnumArray}. - */ - public static boolean isBinaryEnumArray(Object val) { - return val instanceof BinaryEnumArray; - } - /** * @param val Value to check. * @return {@code True} if {@code val} instance of binary Enum object. @@ -2573,10 +2398,10 @@ public static BinaryReaderEx reader(BinaryContext ctx, BinaryInputStream in, Cla * @param forUnmarshal {@code True} if reader is need to unmarshal object. */ public static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - BinaryReaderEx reader, - boolean forUnmarshal) { + BinaryInputStream in, + ClassLoader ldr, + BinaryReaderEx reader, + boolean forUnmarshal) { return reader(ctx, in, ldr, reader.handles(), forUnmarshal); } @@ -2590,10 +2415,10 @@ public static BinaryReaderEx reader(BinaryContext ctx, * @param forUnmarshal {@code True} if reader is need to unmarshal object. */ static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - @Nullable BinaryReaderHandles hnds, - boolean forUnmarshal) { + BinaryInputStream in, + ClassLoader ldr, + @Nullable BinaryReaderHandles hnds, + boolean forUnmarshal) { return binariesFactory.reader(ctx, in, ldr, hnds, forUnmarshal); } @@ -2607,10 +2432,10 @@ static BinaryReaderEx reader(BinaryContext ctx, * @param forUnmarshal {@code True} if reader is need to unmarshal object. */ public static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - boolean skipHdrCheck, - boolean forUnmarshal) { + BinaryInputStream in, + ClassLoader ldr, + boolean skipHdrCheck, + boolean forUnmarshal) { return reader(ctx, in, ldr, null, skipHdrCheck, forUnmarshal); } @@ -2625,11 +2450,11 @@ public static BinaryReaderEx reader(BinaryContext ctx, * @param forUnmarshal {@code True} if reader is need to unmarshal object. */ static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - @Nullable BinaryReaderHandles hnds, - boolean skipHdrCheck, - boolean forUnmarshal) { + BinaryInputStream in, + ClassLoader ldr, + @Nullable BinaryReaderHandles hnds, + boolean skipHdrCheck, + boolean forUnmarshal) { return binariesFactory.reader(ctx, in, ldr, hnds, skipHdrCheck, forUnmarshal); } @@ -2721,45 +2546,6 @@ public static Object field(Object obj, int fieldId) { return ((BinaryObjectExImpl)obj).field(fieldId); } - /** - * Check for arrays equality. - * - * @param a1 Value 1. - * @param a2 Value 2. - * @return {@code True} if arrays equal. - */ - public static boolean arrayEq(Object a1, Object a2) { - if (a1 == a2) - return true; - - if (a1 == null || a2 == null) - return a1 != null || a2 != null; - - if (a1.getClass() != a2.getClass()) - return false; - - if (a1 instanceof byte[]) - return Arrays.equals((byte[])a1, (byte[])a2); - else if (a1 instanceof boolean[]) - return Arrays.equals((boolean[])a1, (boolean[])a2); - else if (a1 instanceof short[]) - return Arrays.equals((short[])a1, (short[])a2); - else if (a1 instanceof char[]) - return Arrays.equals((char[])a1, (char[])a2); - else if (a1 instanceof int[]) - return Arrays.equals((int[])a1, (int[])a2); - else if (a1 instanceof long[]) - return Arrays.equals((long[])a1, (long[])a2); - else if (a1 instanceof float[]) - return Arrays.equals((float[])a1, (float[])a2); - else if (a1 instanceof double[]) - return Arrays.equals((double[])a1, (double[])a2); - else if (isBinaryArray(a1)) - return a1.equals(a2); - - return Arrays.deepEquals((Object[])a1, (Object[])a2); - } - /** * @param o Object to detach. * @return Detached object. @@ -2785,16 +2571,6 @@ public static Collection> schemasAndFieldsIds(BinaryMetadata return F.viewReadOnly(meta.schemas(), s -> new T2<>(s.schemaId(), s.fieldIds())); } - /** - * Gets field by its order. - * - * @param reader Reader. - * @param order Order. - */ - public static int fieldId(BinaryReaderEx reader, int order) { - return reader.getOrCreateSchema().fieldId(order); - } - /** * @param obj Value. * @return {@code True} if object is of known immutable type. @@ -2830,16 +2606,6 @@ public static BinaryMetadata binaryMetadata( return new BinaryMetadata(typeId, typeName, fields, affKeyFieldName, schemas, isEnum, enumMap); } - /** */ - public static int hashCode(byte[] data, int startPos, int endPos) { - int hash = 1; - - for (int i = startPos; i < endPos; i++) - hash = 31 * hash + data[i]; - - return hash; - } - /** * Enum type. */ diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java index 86109b19b6264..3603a98c7bbe1 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryArrayIdentityResolver.java @@ -57,7 +57,7 @@ private BinaryArrayIdentityResolver() { int end = ex.footerStartOffset(); if (ex.hasBytes()) - return BinaryUtils.hashCode(ex.bytes(), start, end); + return BinaryImplUtils.hashCode(ex.bytes(), start, end); else { // Handle offheap object. int hash = 1; diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index 2e23d5ca265dc..73769935858e8 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -16,9 +16,15 @@ */ package org.apache.ignite.internal.binary; +import java.math.BigDecimal; +import java.sql.Time; +import java.sql.Timestamp; +import java.util.Date; +import java.util.UUID; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; +import static org.apache.ignite.internal.binary.BinaryUtils.PLAIN_CLASS_TO_FLAG; import static org.apache.ignite.internal.binary.BinaryUtils.length; /** @@ -299,4 +305,198 @@ public static boolean isPlainArrayType(int type) { return (type >= GridBinaryMarshaller.BYTE_ARR && type <= GridBinaryMarshaller.DATE_ARR) || type == GridBinaryMarshaller.TIMESTAMP_ARR || type == GridBinaryMarshaller.TIME_ARR; } + + /** + * Write value with flag. e.g. writePlainObject(writer, (byte)77) will write two byte: {BYTE, 77}. + * + * @param writer W + * @param val Value. + */ + public static void writePlainObject(BinaryWriterEx writer, Object val) { + Byte flag = PLAIN_CLASS_TO_FLAG.get(val.getClass()); + + if (flag == null) + throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); + + switch (flag) { + case GridBinaryMarshaller.BYTE: + writer.writeByte(flag); + writer.writeByte((Byte)val); + + break; + + case GridBinaryMarshaller.SHORT: + writer.writeByte(flag); + writer.writeShort((Short)val); + + break; + + case GridBinaryMarshaller.INT: + writer.writeByte(flag); + writer.writeInt((Integer)val); + + break; + + case GridBinaryMarshaller.LONG: + writer.writeByte(flag); + writer.writeLong((Long)val); + + break; + + case GridBinaryMarshaller.FLOAT: + writer.writeByte(flag); + writer.writeFloat((Float)val); + + break; + + case GridBinaryMarshaller.DOUBLE: + writer.writeByte(flag); + writer.writeDouble((Double)val); + + break; + + case GridBinaryMarshaller.CHAR: + writer.writeByte(flag); + writer.writeChar((Character)val); + + break; + + case GridBinaryMarshaller.BOOLEAN: + writer.writeByte(flag); + writer.writeBoolean((Boolean)val); + + break; + + case GridBinaryMarshaller.DECIMAL: + writer.writeDecimal((BigDecimal)val); + + break; + + case GridBinaryMarshaller.STRING: + writer.writeString((String)val); + + break; + + case GridBinaryMarshaller.UUID: + writer.writeUuid((UUID)val); + + break; + + case GridBinaryMarshaller.DATE: + writer.writeDate((Date)val); + + break; + + case GridBinaryMarshaller.TIMESTAMP: + writer.writeTimestamp((Timestamp)val); + + break; + + case GridBinaryMarshaller.TIME: + writer.writeTime((Time)val); + + break; + + case GridBinaryMarshaller.BYTE_ARR: + writer.writeByteArray((byte[])val); + + break; + + case GridBinaryMarshaller.SHORT_ARR: + writer.writeShortArray((short[])val); + + break; + + case GridBinaryMarshaller.INT_ARR: + writer.writeIntArray((int[])val); + + break; + + case GridBinaryMarshaller.LONG_ARR: + writer.writeLongArray((long[])val); + + break; + + case GridBinaryMarshaller.FLOAT_ARR: + writer.writeFloatArray((float[])val); + + break; + + case GridBinaryMarshaller.DOUBLE_ARR: + writer.writeDoubleArray((double[])val); + + break; + + case GridBinaryMarshaller.CHAR_ARR: + writer.writeCharArray((char[])val); + + break; + + case GridBinaryMarshaller.BOOLEAN_ARR: + writer.writeBooleanArray((boolean[])val); + + break; + + case GridBinaryMarshaller.DECIMAL_ARR: + writer.writeDecimalArray((BigDecimal[])val); + + break; + + case GridBinaryMarshaller.STRING_ARR: + writer.writeStringArray((String[])val); + + break; + + case GridBinaryMarshaller.UUID_ARR: + writer.writeUuidArray((UUID[])val); + + break; + + case GridBinaryMarshaller.DATE_ARR: + writer.writeDateArray((Date[])val); + + break; + + case GridBinaryMarshaller.TIMESTAMP_ARR: + writer.writeTimestampArray((Timestamp[])val); + + break; + + case GridBinaryMarshaller.TIME_ARR: + writer.writeTimeArray((Time[])val); + + break; + + default: + throw new IllegalArgumentException("Can't write object with type: " + val.getClass()); + } + } + + /** + * @param val Value to check. + * @return {@code True} if {@code val} instance of {@link BinaryEnumArray}. + */ + public static boolean isBinaryEnumArray(Object val) { + return val instanceof BinaryEnumArray; + } + + /** + * Gets field by its order. + * + * @param reader Reader. + * @param order Order. + */ + public static int fieldId(BinaryReaderEx reader, int order) { + return reader.getOrCreateSchema().fieldId(order); + } + + /** */ + public static int hashCode(byte[] data, int startPos, int endPos) { + int hash = 1; + + for (int i = startPos; i < endPos; i++) + hash = 31 * hash + data[i]; + + return hash; + } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java index 42815f6b8f3b0..d5c06d7032e44 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/CrossObjectReferenceResolver.java @@ -188,7 +188,7 @@ private void doObjectProcessing() { overrideHeader( outObjStartPos, /** flags */ setFieldOffsetFlag(inObjDesc.flags, footerFieldOffsetLen), - /** hash */ BinaryUtils.hashCode(out.array(), outObjStartPos + DFLT_HDR_LEN, outFooterStartPos), + /** hash */ BinaryImplUtils.hashCode(out.array(), outObjStartPos + DFLT_HDR_LEN, outFooterStartPos), /** total length */ out.position() - outObjStartPos, schemaOrRawOffsetPos ); diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java index c30f1daf9a915..f2e1926a30d1a 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderSerializer.java @@ -22,6 +22,7 @@ import java.util.Map; import org.apache.ignite.binary.BinaryObject; import org.apache.ignite.internal.binary.BinariesFactoryImpl; +import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryUtils; import org.apache.ignite.internal.binary.BinaryWriterEx; @@ -174,12 +175,12 @@ public void writeValue(BinaryWriterEx writer, Object val, boolean forceCol, bool Byte flag = BinaryUtils.PLAIN_CLASS_TO_FLAG.get(val.getClass()); if (flag != null) { - BinaryUtils.writePlainObject(writer, val); + BinaryImplUtils.writePlainObject(writer, val); return; } - if (BinaryUtils.isBinaryEnumArray(val)) { + if (BinaryImplUtils.isBinaryEnumArray(val)) { BinaryObjectEx val0 = (BinaryObjectEx)val; if (val0.componentTypeId() == GridBinaryMarshaller.UNREGISTERED_TYPE_ID) diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java index d1ef8426cc90a..33d372f374181 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryObjectBuilderImpl.java @@ -249,7 +249,7 @@ void serializeTo(BinaryWriterEx writer, BinaryBuilderSerializer serializer) { int idx = 0; while (reader.position() < rawPos) { - int fieldId = BinaryUtils.fieldId(reader.reader(), idx++); + int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++); int fieldLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen).get2(); @@ -382,7 +382,7 @@ else if (newVal.getClass().isArray() && else if (newVal.getClass().isArray() && BinaryObject.class.isAssignableFrom(newVal.getClass().getComponentType())) newFldTypeId = GridBinaryMarshaller.OBJ_ARR; - else if (BinaryUtils.isBinaryEnumArray(newVal)) + else if (BinaryImplUtils.isBinaryEnumArray(newVal)) newFldTypeId = GridBinaryMarshaller.ENUM_ARR; else if (BinaryUtils.isBinaryArray(newVal)) @@ -475,7 +475,7 @@ private void ensureReadCacheInit() { int idx = 0; while (footerPos + fieldIdLen < footerEnd) { - int fieldId = BinaryUtils.fieldId(reader.reader(), idx++); + int fieldId = BinaryImplUtils.fieldId(reader.reader(), idx++); IgniteBiTuple posAndLen = fieldPositionAndLength(footerPos, footerEnd, rawPos, fieldIdLen, fieldOffsetLen); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java index 5768886f2a3f9..b3421ba9416e0 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/binary/BinarySerializedFieldComparator.java @@ -21,7 +21,7 @@ import org.apache.ignite.internal.util.offheap.unsafe.GridUnsafeMemory; import org.apache.ignite.internal.util.typedef.F; -import static org.apache.ignite.internal.binary.BinaryUtils.arrayEq; +import static org.apache.ignite.testframework.GridTestUtils.arrayEq; /** * Compares fields in serialized form when possible. diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java index 704907816c32a..9b4d472b58f0b 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsConfigurationTest.java @@ -37,7 +37,6 @@ import org.junit.Test; import static org.apache.ignite.configuration.WALMode.FSYNC; -import static org.apache.ignite.internal.binary.BinaryUtils.arrayEq; import static org.apache.ignite.internal.processors.cache.transactions.TransactionMetricsAdapter.METRIC_SYSTEM_TIME_HISTOGRAM; import static org.apache.ignite.internal.processors.metric.GridMetricManager.HISTOGRAM_CFG_PREFIX; import static org.apache.ignite.internal.processors.metric.GridMetricManager.HITRATE_CFG_PREFIX; @@ -47,6 +46,7 @@ import static org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName; import static org.apache.ignite.internal.processors.pool.PoolProcessor.TASK_EXEC_TIME; import static org.apache.ignite.internal.processors.pool.PoolProcessor.THREAD_POOLS; +import static org.apache.ignite.testframework.GridTestUtils.arrayEq; import static org.apache.ignite.testframework.GridTestUtils.assertThrowsWithCause; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertNotEquals; diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java index 02e9a4d21d250..6a8736060caf4 100644 --- a/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/GridTestUtils.java @@ -144,6 +144,7 @@ import static java.lang.Long.parseLong; import static java.util.Comparator.comparingLong; import static org.apache.ignite.IgniteSystemProperties.IGNITE_HOME; +import static org.apache.ignite.internal.binary.BinaryUtils.isBinaryArray; import static org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION; import static org.apache.ignite.internal.processors.cache.persistence.filename.NodeFileTree.partitionFileName; import static org.apache.ignite.internal.util.lang.ClusterNodeFunc.nodeIds; @@ -2751,4 +2752,43 @@ public static long sizeOfDirectory(File dir) throws IOException { return size[0]; } + + /** + * Check for arrays equality. + * + * @param a1 Value 1. + * @param a2 Value 2. + * @return {@code True} if arrays equal. + */ + public static boolean arrayEq(Object a1, Object a2) { + if (a1 == a2) + return true; + + if (a1 == null || a2 == null) + return a1 != null || a2 != null; + + if (a1.getClass() != a2.getClass()) + return false; + + if (a1 instanceof byte[]) + return Arrays.equals((byte[])a1, (byte[])a2); + else if (a1 instanceof boolean[]) + return Arrays.equals((boolean[])a1, (boolean[])a2); + else if (a1 instanceof short[]) + return Arrays.equals((short[])a1, (short[])a2); + else if (a1 instanceof char[]) + return Arrays.equals((char[])a1, (char[])a2); + else if (a1 instanceof int[]) + return Arrays.equals((int[])a1, (int[])a2); + else if (a1 instanceof long[]) + return Arrays.equals((long[])a1, (long[])a2); + else if (a1 instanceof float[]) + return Arrays.equals((float[])a1, (float[])a2); + else if (a1 instanceof double[]) + return Arrays.equals((double[])a1, (double[])a2); + else if (isBinaryArray(a1)) + return a1.equals(a2); + + return Arrays.deepEquals((Object[])a1, (Object[])a2); + } } From 7eae07c49c38932fe30440fdfd05668ebeca5ff1 Mon Sep 17 00:00:00 2001 From: Nikolay Izhikov Date: Wed, 9 Sep 2026 19:01:34 +0300 Subject: [PATCH 6/6] IGNITE-29044 Move BinaryWriterSchemaHolder to binary-impl --- .../ignite/internal/binary/BinaryUtils.java | 17 ----------------- .../internal/binary/BinaryImplUtils.java | 18 ++++++++++++++++++ .../binary/builder/BinaryBuilderReader.java | 3 ++- 3 files changed, 20 insertions(+), 18 deletions(-) diff --git a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java index 1829370cc4ef2..245ec20f67d11 100644 --- a/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java +++ b/modules/binary/api/src/main/java/org/apache/ignite/internal/binary/BinaryUtils.java @@ -2388,23 +2388,6 @@ public static BinaryReaderEx reader(BinaryContext ctx, BinaryInputStream in, Cla return binariesFactory.reader(ctx, in, ldr, forUnmarshal); } - /** - * Creates reader instance. - * - * @param ctx Context. - * @param in Input stream. - * @param ldr Class loader. - * @param reader BinaryReaderEx. - * @param forUnmarshal {@code True} if reader is need to unmarshal object. - */ - public static BinaryReaderEx reader(BinaryContext ctx, - BinaryInputStream in, - ClassLoader ldr, - BinaryReaderEx reader, - boolean forUnmarshal) { - return reader(ctx, in, ldr, reader.handles(), forUnmarshal); - } - /** * Creates reader instance. * diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java index 73769935858e8..6d59f0519b52f 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/BinaryImplUtils.java @@ -21,6 +21,7 @@ import java.sql.Timestamp; import java.util.Date; import java.util.UUID; +import org.apache.ignite.internal.binary.streams.BinaryInputStream; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiTuple; @@ -499,4 +500,21 @@ public static int hashCode(byte[] data, int startPos, int endPos) { return hash; } + + /** + * Creates reader instance. + * + * @param ctx Context. + * @param in Input stream. + * @param ldr Class loader. + * @param reader BinaryReaderEx. + * @param forUnmarshal {@code True} if reader is need to unmarshal object. + */ + public static BinaryReaderEx reader(BinaryContext ctx, + BinaryInputStream in, + ClassLoader ldr, + BinaryReaderEx reader, + boolean forUnmarshal) { + return BinaryUtils.binariesFactory.reader(ctx, in, ldr, reader.handles(), forUnmarshal); + } } diff --git a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java index cc5f6da0a1b3f..6f2a505f7b94f 100644 --- a/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java +++ b/modules/binary/impl/src/main/java/org/apache/ignite/internal/binary/builder/BinaryBuilderReader.java @@ -24,6 +24,7 @@ import java.util.Map; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryContext; +import org.apache.ignite.internal.binary.BinaryImplUtils; import org.apache.ignite.internal.binary.BinaryObjectEx; import org.apache.ignite.internal.binary.BinaryObjectImpl; import org.apache.ignite.internal.binary.BinaryPositionReadable; @@ -87,7 +88,7 @@ class BinaryBuilderReader implements BinaryPositionReadable { this.arr = other.arr; this.pos = start; - reader = BinaryUtils.reader(ctx, + reader = BinaryImplUtils.reader(ctx, BinaryStreams.inputStream(arr, start), null, other.reader,