diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InitNewPageRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InitNewPageRecord.java index 9ed7f35e58b72..5c20167ad3eb8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InitNewPageRecord.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/InitNewPageRecord.java @@ -18,12 +18,14 @@ package org.apache.ignite.internal.pagemem.wal.record.delta; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.pagemem.PageIdUtils; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.Nullable; /** * Initializes new page by calling {@link PageIO#initNewPage(long, long, int)}. @@ -47,6 +49,18 @@ public class InitNewPageRecord extends PageDeltaRecord { * @param newPageId New page ID. */ public InitNewPageRecord(int grpId, long pageId, int ioType, int ioVer, long newPageId) { + this(grpId, pageId, ioType, ioVer, newPageId, null); + } + + /** + * @param grpId Cache group ID. + * @param pageId Page ID. + * @param ioType IO type. + * @param ioVer IO version. + * @param newPageId New page ID. + * @param log Logger for case data is invalid. Can be {@code null}, but is needed when processing existing storage. + */ + public InitNewPageRecord(int grpId, long pageId, int ioType, int ioVer, long newPageId, @Nullable IgniteLogger log) { super(grpId, pageId); this.ioType = ioType; @@ -56,10 +70,19 @@ public InitNewPageRecord(int grpId, long pageId, int ioType, int ioVer, long new int newPartId = PageIdUtils.partId(newPageId); int partId = PageIdUtils.partId(pageId); - if (newPartId != partId) { - throw new AssertionError("Partition consistency failure: " + - "newPageId=" + Long.toHexString(newPageId) + " (newPartId: " + newPartId + ") " + + if (newPartId == 0 && newPartId != partId) { + U.warn(log, "Partition consistency warning: " + + "newPageId=" + Long.toHexString(newPageId) + " (newPartId: 0) " + "pageId=" + Long.toHexString(pageId) + " (partId: " + partId + ")"); + + // Partition consistency failure came from https://issues.apache.org/jira/browse/IGNITE-11030 + // This invalid record can come from persistent stores, version < 2.7.5 where this bug was not fixed. + newPartId = partId; // Just hack new page ID to make this record to be correctly applied. + + this.newPageId = PageIdUtils.pageId( + newPartId, + PageIdUtils.flag(newPageId), + PageIdUtils.pageIndex(newPageId)); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRecord.java index 7b3f3a9b32c4f..d683a5a034342 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRecord.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRecord.java @@ -18,10 +18,12 @@ package org.apache.ignite.internal.pagemem.wal.record.delta; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageMetaIO; import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; /** * @@ -40,11 +42,26 @@ public class MetaPageInitRecord extends InitNewPageRecord { * @param grpId Cache group ID. * @param pageId Page ID. * @param ioType IO type. + * @param ioVer Io version. * @param treeRoot Tree root. * @param reuseListRoot Reuse list root. */ public MetaPageInitRecord(int grpId, long pageId, int ioType, int ioVer, long treeRoot, long reuseListRoot) { - super(grpId, pageId, ioType, ioVer, pageId); + this(grpId, pageId, ioType, ioVer, treeRoot, reuseListRoot, null); + } + + /** + * @param grpId Cache group ID. + * @param pageId Page ID. + * @param ioType IO type. + * @param ioVer Io version. + * @param treeRoot Tree root. + * @param reuseListRoot Reuse list root. + * @param log Logger for case data is invalid. Can be {@code null}, but is needed when processing existing storage. + */ + public MetaPageInitRecord(int grpId, long pageId, int ioType, int ioVer, long treeRoot, long reuseListRoot, + @Nullable IgniteLogger log) { + super(grpId, pageId, ioType, ioVer, pageId, log); assert ioType == PageIO.T_META || ioType == PageIO.T_PART_META; @@ -53,6 +70,7 @@ public MetaPageInitRecord(int grpId, long pageId, int ioType, int ioVer, long tr this.ioType = ioType; } + /** * @return Tree root. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/PagesListInitNewPageRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/PagesListInitNewPageRecord.java index 53c23b1b1528b..456314a18228c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/PagesListInitNewPageRecord.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/PagesListInitNewPageRecord.java @@ -18,12 +18,14 @@ package org.apache.ignite.internal.pagemem.wal.record.delta; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.pagemem.PageMemory; import org.apache.ignite.internal.processors.cache.persistence.freelist.io.PagesListNodeIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; import org.apache.ignite.internal.util.tostring.GridToStringExclude; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; +import org.jetbrains.annotations.Nullable; /** * @@ -40,6 +42,9 @@ public class PagesListInitNewPageRecord extends InitNewPageRecord { /** * @param grpId Cache group ID. * @param pageId Page ID. + * @param ioType IO type. + * @param ioVer IO version. + * @param newPageId New page ID. * @param prevPageId Previous page ID. * @param addDataPageId Optional page ID to add. */ @@ -52,7 +57,30 @@ public PagesListInitNewPageRecord( long prevPageId, long addDataPageId ) { - super(grpId, pageId, ioType, ioVer, newPageId); + this(grpId, pageId, ioType, ioVer, newPageId, prevPageId, addDataPageId, null); + } + + /** + * @param grpId Cache group ID. + * @param pageId Page ID. + * @param ioType IO type. + * @param ioVer IO version. + * @param newPageId New page ID. + * @param prevPageId Previous page ID. + * @param addDataPageId Optional page ID to add. + * @param log Logger for case data is invalid. Can be {@code null}, but is needed when processing existing storage. + */ + public PagesListInitNewPageRecord( + int grpId, + long pageId, + int ioType, + int ioVer, + long newPageId, + long prevPageId, + long addDataPageId, + @Nullable IgniteLogger log + ) { + super(grpId, pageId, ioType, ioVer, newPageId, log); this.prevPageId = prevPageId; this.addDataPageId = addDataPageId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java index 4ca65f467dd1c..19e8d7c19bf12 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java @@ -29,6 +29,7 @@ import java.util.Map; import java.util.UUID; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.IgniteLogger; import org.apache.ignite.internal.managers.encryption.GridEncryptionManager; import org.apache.ignite.internal.pagemem.FullPageId; import org.apache.ignite.internal.pagemem.wal.record.CacheState; @@ -136,6 +137,9 @@ public class RecordDataV1Serializer implements RecordDataSerializer { /** Cache object processor to reading {@link DataEntry DataEntries}. */ protected final IgniteCacheObjectProcessor co; + /** Logger. */ + private final IgniteLogger log; + /** Serializer of {@link TxRecord} records. */ private TxRecordSerializer txRecordSerializer; @@ -172,6 +176,8 @@ public RecordDataV1Serializer(GridCacheSharedContext cctx) { this.realPageSize = CU.encryptedPageSize(pageSize, encSpi); else this.realPageSize = pageSize; + + log = cctx.logger(getClass()); } /** {@inheritDoc} */ @@ -585,7 +591,7 @@ WALRecord readPlainRecord(RecordType type, ByteBufferBackedDataInput in, long treeRoot = in.readLong(); long reuseListRoot = in.readLong(); - res = new MetaPageInitRecord(cacheId, pageId, ioType, ioVer, treeRoot, reuseListRoot); + res = new MetaPageInitRecord(cacheId, pageId, ioType, ioVer, treeRoot, reuseListRoot, log); break; @@ -795,7 +801,7 @@ WALRecord readPlainRecord(RecordType type, ByteBufferBackedDataInput in, ioVer = in.readUnsignedShort(); long virtualPageId = in.readLong(); - res = new InitNewPageRecord(cacheId, pageId, ioType, ioVer, virtualPageId); + res = new InitNewPageRecord(cacheId, pageId, ioType, ioVer, virtualPageId, log); break; @@ -1025,7 +1031,7 @@ WALRecord readPlainRecord(RecordType type, ByteBufferBackedDataInput in, prevPageId = in.readLong(); long addDataPageId = in.readLong(); - res = new PagesListInitNewPageRecord(cacheId, pageId, ioType, ioVer, newPageId, prevPageId, addDataPageId); + res = new PagesListInitNewPageRecord(cacheId, pageId, ioType, ioVer, newPageId, prevPageId, addDataPageId, log); break;