Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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)}.
Expand All @@ -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;
Expand All @@ -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));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
*
Expand All @@ -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;

Expand All @@ -53,6 +70,7 @@ public MetaPageInitRecord(int grpId, long pageId, int ioType, int ioVer, long tr
this.ioType = ioType;
}


/**
* @return Tree root.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

/**
*
Expand All @@ -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.
*/
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -172,6 +176,8 @@ public RecordDataV1Serializer(GridCacheSharedContext cctx) {
this.realPageSize = CU.encryptedPageSize(pageSize, encSpi);
else
this.realPageSize = pageSize;

log = cctx.logger(getClass());
}

/** {@inheritDoc} */
Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down Expand Up @@ -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;

Expand Down