IGNITE-11796: Fix for WAL recovery stopped with 'Partition consistenc… (#6496)
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 9ed7f35..5c20167 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 @@ * @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 @@ 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 7b3f3a9..d683a5a 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 @@ * @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 @@ 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 53c23b1..456314a 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 @@ /** * @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 @@ 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 4ca65f4..19e8d7c 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 @@ /** 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 @@ this.realPageSize = CU.encryptedPageSize(pageSize, encSpi); else this.realPageSize = pageSize; + + log = cctx.logger(getClass()); } /** {@inheritDoc} */ @@ -585,7 +591,7 @@ 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 @@ 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 @@ 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;