IGNITE-11796: Fix for WAL recovery stopped with 'Partition consistenc… (#6496)

(cherry picked from commit 58dc751dcae1e445720b40c84bb8ec47e61de6d0)
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 69316a2..e08e442 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} */
@@ -583,7 +589,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;
 
@@ -793,7 +799,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;
 
@@ -1023,7 +1029,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;