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;