This is an automated email from the ASF dual-hosted git repository. tkalkirill pushed a commit to branch ignite-26216 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit e102924cf89abecba4f4807ab3fc21f79fcaed6e Author: Kirill Tkalenko <tkalkir...@yandex.ru> AuthorDate: Fri Aug 15 15:46:06 2025 +0300 IGNITE-26216 wip --- .../apache/ignite/internal/util/GridUnsafe.java | 5 +- .../ItBplusTreePersistentPageMemoryTest.java | 3 +- ...BplusTreeReuseListPersistentPageMemoryTest.java | 3 +- .../pagememory/persistence/PageHeader.java | 246 ++++++++++++--------- .../internal/pagememory/persistence/PagePool.java | 9 +- .../persistence/PersistentPageMemory.java | 139 ++++++------ .../replacement/ClockPageReplacementPolicy.java | 4 +- .../RandomLruPageReplacementPolicy.java | 24 +- .../SegmentedLruPageReplacementPolicy.java | 4 +- .../RandomLruPageReplacementPolicySelfTest.java | 16 +- .../pagememory/PersistentPageMemoryNoLoadTest.java | 2 +- 11 files changed, 244 insertions(+), 211 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java index f1d6cb6aa3a..eecb398697f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/util/GridUnsafe.java @@ -27,6 +27,7 @@ import java.security.AccessController; import java.security.PrivilegedAction; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; +import org.jetbrains.annotations.Nullable; import sun.misc.Unsafe; /** @@ -1324,7 +1325,7 @@ public abstract class GridUnsafe { * @param off Offset. * @return Integer value. */ - public static int getIntVolatile(Object obj, long off) { + public static int getIntVolatile(@Nullable Object obj, long off) { return UNSAFE.getIntVolatile(obj, off); } @@ -1357,7 +1358,7 @@ public abstract class GridUnsafe { * @param off Offset. * @param val Value. */ - public static void putLongVolatile(Object obj, long off, long val) { + public static void putLongVolatile(@Nullable Object obj, long off, long val) { UNSAFE.putLongVolatile(obj, off, val); } diff --git a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreePersistentPageMemoryTest.java b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreePersistentPageMemoryTest.java index 1b72c95a5ec..7bb5761eb51 100644 --- a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreePersistentPageMemoryTest.java +++ b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreePersistentPageMemoryTest.java @@ -26,6 +26,7 @@ import org.apache.ignite.internal.lang.IgniteSystemProperties; import org.apache.ignite.internal.pagememory.PageMemory; import org.apache.ignite.internal.pagememory.TestPageIoRegistry; import org.apache.ignite.internal.pagememory.configuration.PersistentDataRegionConfiguration; +import org.apache.ignite.internal.pagememory.persistence.PageHeader; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemoryMetricSource; import org.apache.ignite.internal.pagememory.persistence.TestPageReadWriteManager; @@ -50,7 +51,7 @@ public class ItBplusTreePersistentPageMemoryTest extends AbstractBplusTreePageMe @BeforeAll static void initLockOffset() { - lockOffset = PersistentPageMemory.PAGE_LOCK_OFFSET; + lockOffset = PageHeader.PAGE_LOCK_OFFSET; } /** {@inheritDoc} */ diff --git a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreeReuseListPersistentPageMemoryTest.java b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreeReuseListPersistentPageMemoryTest.java index a771351f0fc..cc3f96239b6 100644 --- a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreeReuseListPersistentPageMemoryTest.java +++ b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/persistence/ItBplusTreeReuseListPersistentPageMemoryTest.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.configuration.testframework.ConfigurationExten import org.apache.ignite.internal.pagememory.PageMemory; import org.apache.ignite.internal.pagememory.TestPageIoRegistry; import org.apache.ignite.internal.pagememory.configuration.PersistentDataRegionConfiguration; +import org.apache.ignite.internal.pagememory.persistence.PageHeader; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemoryMetricSource; import org.apache.ignite.internal.pagememory.persistence.TestPageReadWriteManager; @@ -40,7 +41,7 @@ import org.junit.jupiter.api.extension.ExtendWith; public class ItBplusTreeReuseListPersistentPageMemoryTest extends AbstractBplusTreeReusePageMemoryTest { @BeforeAll static void initLockOffset() { - lockOffset = PersistentPageMemory.PAGE_LOCK_OFFSET; + lockOffset = PageHeader.PAGE_LOCK_OFFSET; } /** {@inheritDoc} */ diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageHeader.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageHeader.java index 52f6db69602..f00858d39f6 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageHeader.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageHeader.java @@ -27,19 +27,47 @@ import static org.apache.ignite.internal.util.GridUnsafe.incrementAndGetInt; import static org.apache.ignite.internal.util.GridUnsafe.putInt; import static org.apache.ignite.internal.util.GridUnsafe.putLong; import static org.apache.ignite.internal.util.GridUnsafe.putLongVolatile; +import static org.apache.ignite.internal.util.StringUtils.hexLong; import org.apache.ignite.internal.pagememory.FullPageId; /** - * Page header. + * Helper class for working with the page header that is stored in memory for {@link PersistentPageMemory}. + * + * <p>Page header has the following structure:</p> + * <pre> + * +-----------------+-----------------------------+--------+---------+----------+----------+----------------------+ + * | 8 bytes | 8 bytes |8 bytes |4 bytes |4 bytes |8 bytes | 8 bytes | + * +-----------------+-----------------------------+--------+---------+----------+----------+----------------------+ + * |Marker/Timestamp |Partition generation + flags |Page ID |Group ID |Pin count |Lock data |Checkpoint tmp buffer | + * +-----------------+-----------------------------+--------+---------+----------+----------+----------------------+ + * </pre> */ public class PageHeader { /** Page marker. */ - public static final long PAGE_MARKER = 0x0000000000000001L; + private static final long PAGE_MARKER = 0x0000000000000001L; /** Dirty flag. */ private static final long DIRTY_FLAG = 0x0100000000000000L; + /** + * Page overhead in bytes. + * <ol> + * <li>8 bytes - Marker/Timestamp.</li> + * <li>8 bytes - Partition generation(4 bytes) + flags(1 byte) + reserved(3 bytes).</li> + * <li>8 bytes - Page ID.</li> + * <li>4 bytes - Page group ID.</li> + * <li>4 bytes - Page pin counter.</li> + * <li>8 bytes - Page lack data.</li> + * <li>8 bytes - Checkpoint temporal copy buffer relative pointer.</li> + * </ol> + */ + public static final int PAGE_OVERHEAD = 48; + + /** Marker or timestamp offset. */ + private static final int MARKER_OR_TIMESTAMP_OFFSET = 0; + + // TODO: IGNITE-26216 испрвить документацию /** Page relative pointer. Does not change once a page is allocated. */ private static final int RELATIVE_PTR_OFFSET = 8; @@ -47,84 +75,91 @@ public class PageHeader { private static final int PAGE_ID_OFFSET = 16; /** Page group ID offset. */ - private static final int PAGE_GROUP_ID_OFFSET = 24; + private static final int GROUP_ID_OFFSET = 24; /** Page pin counter offset. */ - private static final int PAGE_PIN_CNT_OFFSET = 28; + private static final int PIN_COUNT_OFFSET = 28; - /** Page temp copy buffer relative pointer offset. */ - private static final int PAGE_TMP_BUF_OFFSET = 40; + /** Page lock data offset. */ + public static final int PAGE_LOCK_OFFSET = 32; + + /** Page temporal copy buffer relative pointer offset. */ + private static final int CHECKPOINT_TMP_BUFFER_OFFSET = 40; /** - * Initializes the header of the page. + * Initializes the header of page. * - * @param absPtr Absolute pointer to initialize. + * @param absPtr Absolute memory pointer to page header. * @param relative Relative pointer to write. */ + // TODO: IGNITE-26216 вот тут еще исправить придется! public static void initNew(long absPtr, long relative) { + writePageMarker(absPtr); + relative(absPtr, relative); - tempBufferPointer(absPtr, INVALID_REL_PTR); + writeCheckpointTempBufferRelativePointer(absPtr, INVALID_REL_PTR); - putLong(absPtr, PAGE_MARKER); - putInt(absPtr + PAGE_PIN_CNT_OFFSET, 0); + putInt(absPtr + PIN_COUNT_OFFSET, 0); } /** - * Returns value of dirty flag. + * Reads value of dirty flag from page header. * - * @param absPtr Absolute pointer. + * @param absPtr Absolute memory pointer to page header. */ - public static boolean dirty(long absPtr) { + public static boolean readDirtyFlag(long absPtr) { return flag(absPtr, DIRTY_FLAG); } /** - * Updates value of dirty flag. + * Write value of dirty flag to page header. * - * @param absPtr Page absolute pointer. - * @param dirty Dirty flag. + * @param absPtr Absolute memory pointer to page header. + * @param dirty Value dirty flag. * @return Previous value of dirty flag. */ - public static boolean dirty(long absPtr, boolean dirty) { + public static boolean writeDirtyFlag(long absPtr, boolean dirty) { return flag(absPtr, DIRTY_FLAG, dirty); } /** - * Returns flag value. + * Reads flag value from page header. * - * @param absPtr Absolute pointer. - * @param flag Flag mask. + * @param absPtr Absolute memory pointer to page header. + * @param flagMask Flag mask. */ - private static boolean flag(long absPtr, long flag) { - assert (flag & 0xFFFFFFFFFFFFFFL) == 0; - assert Long.bitCount(flag) == 1; + // TODO: IGNITE-26216 Испрвить + private static boolean flag(long absPtr, long flagMask) { + assert (flagMask & 0xFFFFFFFFFFFFFFL) == 0 : hexLong(flagMask); + assert Long.bitCount(flagMask) == 1 : hexLong(flagMask); long relPtrWithFlags = getLong(absPtr + RELATIVE_PTR_OFFSET); - return (relPtrWithFlags & flag) != 0; + return (relPtrWithFlags & flagMask) != 0; } /** - * Sets flag value. + * Writes flag value to page header. * - * @param absPtr Absolute pointer. - * @param flag Flag mask. + * @param absPtr Absolute memory pointer to page header. + * @param flagMask Flag mask. * @param set New flag value. * @return Previous flag value. */ - private static boolean flag(long absPtr, long flag, boolean set) { - assert (flag & 0xFFFFFFFFFFFFFFL) == 0; - assert Long.bitCount(flag) == 1; + // TODO: IGNITE-26216 Испрвить + private static boolean flag(long absPtr, long flagMask, boolean set) { + assert (flagMask & 0xFFFFFFFFFFFFFFL) == 0 : hexLong(flagMask); + assert Long.bitCount(flagMask) == 1 : hexLong(flagMask); long relPtrWithFlags = getLong(absPtr + RELATIVE_PTR_OFFSET); - boolean was = (relPtrWithFlags & flag) != 0; + boolean was = (relPtrWithFlags & flagMask) != 0; if (set) { - relPtrWithFlags |= flag; + relPtrWithFlags |= flagMask; } else { - relPtrWithFlags &= ~flag; + relPtrWithFlags &= ~flagMask; } putLong(absPtr + RELATIVE_PTR_OFFSET, relPtrWithFlags); @@ -133,56 +168,47 @@ public class PageHeader { } /** - * Checks if page is pinned. + * Checks if page is pinned from page header. * - * @param absPtr Page pointer. + * @param absPtr Absolute memory pointer to page header. */ public static boolean isAcquired(long absPtr) { - return getInt(absPtr + PAGE_PIN_CNT_OFFSET) > 0; + return getInt(absPtr + PIN_COUNT_OFFSET) > 0; } /** - * Acquires a page. + * Atomically acquires a page in page header. * - * @param absPtr Absolute pointer. - * @return Number of acquires for the page. + * @param absPtr Absolute memory pointer to page header. + * @return Number of acquires for page. */ public static int acquirePage(long absPtr) { - return incrementAndGetInt(absPtr + PAGE_PIN_CNT_OFFSET); + return incrementAndGetInt(absPtr + PIN_COUNT_OFFSET); } /** - * Releases the page. + * Atomically releases the page in page header. * - * @param absPtr Absolute pointer. - * @return Number of acquires for the page. + * @param absPtr Absolute memory pointer to page header. + * @return Number of acquires for page. */ public static int releasePage(long absPtr) { - return decrementAndGetInt(absPtr + PAGE_PIN_CNT_OFFSET); + return decrementAndGetInt(absPtr + PIN_COUNT_OFFSET); } /** - * Returns number of acquires for the page. + * Volatile reads count of acquires for the page from page header. * - * @param absPtr Absolute pointer. + * @param absPtr Absolute memory pointer to page header. */ - public static int pinCount(long absPtr) { + static int readAcquiresCount(long absPtr) { return getIntVolatile(null, absPtr); } - /** - * Reads relative pointer from the page at the given absolute position. - * - * @param absPtr Absolute memory pointer to the page header. - */ - public static long readRelative(long absPtr) { - return getLong(absPtr + RELATIVE_PTR_OFFSET) & RELATIVE_PTR_MASK; - } - /** * Writes relative pointer to the page at the given absolute position. * - * @param absPtr Absolute memory pointer to the page header. + * @param absPtr Absolute memory pointer to page header. * @param relPtr Relative pointer to write. */ public static void relative(long absPtr, long relPtr) { @@ -190,24 +216,23 @@ public class PageHeader { } /** - * Volatile write for current timestamp to page in {@code absAddr} address. + * Volatile writes timestamp to page header. * - * @param absPtr Absolute page address. - * @param tstamp Timestamp. + * @param absPtr Absolute memory pointer to page header. + * @param timestamp Timestamp. */ - public static void writeTimestamp(final long absPtr, long tstamp) { - tstamp &= 0xFFFFFFFFFFFFFF00L; + static void writeTimestamp(long absPtr, long timestamp) { + timestamp &= 0xFFFFFFFFFFFFFF00L; - putLongVolatile(null, absPtr, tstamp | 0x01); + putLongVolatile(null, absPtr, timestamp | 0x01); } /** - * Read for timestamp from page in {@code absAddr} address. + * Reads timestamp from page header. * - * @param absPtr Absolute page address. - * @return Timestamp. + * @param absPtr Absolute memory pointer to page header. */ - public static long readTimestamp(final long absPtr) { + public static long readTimestamp(long absPtr) { long markerAndTs = getLong(absPtr); // Clear last byte as it is occupied by page marker. @@ -215,85 +240,92 @@ public class PageHeader { } /** - * Sets pointer to checkpoint buffer. + * Writes relative pointer to checkpoint temporal copy buffer to page header. * - * @param absPtr Page absolute pointer. - * @param tmpRelPtr Temp buffer relative pointer or {@link PersistentPageMemory#INVALID_REL_PTR} if page is not copied to checkpoint - * buffer. + * @param absPtr Absolute memory pointer to page header. + * @param tmpRelPtr Temporal copy buffer relative pointer or {@link PersistentPageMemory#INVALID_REL_PTR} if page is not copied + * to checkpoint buffer. */ - public static void tempBufferPointer(long absPtr, long tmpRelPtr) { - putLong(absPtr + PAGE_TMP_BUF_OFFSET, tmpRelPtr); + static void writeCheckpointTempBufferRelativePointer(long absPtr, long tmpRelPtr) { + putLong(absPtr + CHECKPOINT_TMP_BUFFER_OFFSET, tmpRelPtr); } /** - * Gets pointer to checkpoint buffer or {@link PersistentPageMemory#INVALID_REL_PTR} if page is not copied to checkpoint buffer. + * Reads relative pointer to checkpoint temporal copy buffer or {@link PersistentPageMemory#INVALID_REL_PTR} if page is not copied to + * checkpoint buffer from page header. * - * @param absPtr Page absolute pointer. - * @return Temp buffer relative pointer. + * @param absPtr Absolute memory pointer to page header. */ - public static long tempBufferPointer(long absPtr) { - return getLong(absPtr + PAGE_TMP_BUF_OFFSET); + static long readCheckpointTempBufferRelativePointer(long absPtr) { + return getLong(absPtr + CHECKPOINT_TMP_BUFFER_OFFSET); } /** - * Reads page ID from the page at the given absolute position. + * Reads page ID from page header. * - * @param absPtr Absolute memory pointer to the page header. - * @return Page ID written to the page. + * @param absPtr Absolute memory pointer to page header. */ - public static long readPageId(long absPtr) { + static long readPageId(long absPtr) { return getLong(absPtr + PAGE_ID_OFFSET); } /** - * Writes page ID to the page at the given absolute position. + * Writes page ID to page header. * - * @param absPtr Absolute memory pointer to the page header. - * @param pageId Page ID to write. + * @param absPtr Absolute memory pointer to page header. + * @param pageId Page ID. */ - private static void pageId(long absPtr, long pageId) { + private static void writePageId(long absPtr, long pageId) { putLong(absPtr + PAGE_ID_OFFSET, pageId); } /** - * Reads group ID from the page at the given absolute pointer. + * Reads page group ID from page header. * - * @param absPtr Absolute memory pointer to the page header. - * @return Group ID written to the page. + * @param absPtr Absolute memory pointer to page header. + * @return Page group ID. */ - private static int readPageGroupId(final long absPtr) { - return getInt(absPtr + PAGE_GROUP_ID_OFFSET); + private static int readPageGroupId(long absPtr) { + return getInt(absPtr + GROUP_ID_OFFSET); } /** - * Writes group ID from the page at the given absolute pointer. + * Writes page group ID to page header. * - * @param absPtr Absolute memory pointer to the page header. - * @param grpId Group ID to write. + * @param absPtr Absolute memory pointer to page header. + * @param groupId Page group ID. */ - private static void pageGroupId(final long absPtr, final int grpId) { - putInt(absPtr + PAGE_GROUP_ID_OFFSET, grpId); + private static void writePageGroupId(long absPtr, int groupId) { + putInt(absPtr + GROUP_ID_OFFSET, groupId); } /** - * Reads page ID and group ID from the page at the given absolute pointer. + * Reads full page ID from page header. * - * @param absPtr Absolute memory pointer to the page header. - * @return Full page ID written to the page. + * @param absPtr Absolute memory pointer to page header. */ - public static FullPageId fullPageId(final long absPtr) { + public static FullPageId readFullPageId(long absPtr) { return new FullPageId(readPageId(absPtr), readPageGroupId(absPtr)); } /** - * Writes page ID and group ID from the page at the given absolute pointer. + * Writes full page ID to page header. * - * @param absPtr Absolute memory pointer to the page header. - * @param fullPageId Full page ID to write. + * @param absPtr Absolute memory pointer to page header. + * @param fullPageId Full page ID. */ - public static void fullPageId(final long absPtr, final FullPageId fullPageId) { - pageId(absPtr, fullPageId.pageId()); + static void writeFullPageId(long absPtr, FullPageId fullPageId) { + writePageId(absPtr, fullPageId.pageId()); + + writePageGroupId(absPtr, fullPageId.groupId()); + } - pageGroupId(absPtr, fullPageId.groupId()); + /** + * Volatile writes a page marker to page header. + * + * @param absPtr Absolute memory pointer to page header. + */ + static void writePageMarker(long absPtr) { + putLongVolatile(null, absPtr + MARKER_OR_TIMESTAMP_OFFSET, PAGE_MARKER); } } diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PagePool.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PagePool.java index 417a549a62c..219643155f4 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PagePool.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PagePool.java @@ -17,11 +17,12 @@ package org.apache.ignite.internal.pagememory.persistence; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_LOCK_OFFSET; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readFullPageId; import static org.apache.ignite.internal.pagememory.persistence.PageHeader.initNew; import static org.apache.ignite.internal.pagememory.persistence.PageHeader.isAcquired; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writePageMarker; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.INVALID_REL_PTR; -import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.PAGE_LOCK_OFFSET; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.RELATIVE_PTR_MASK; import static org.apache.ignite.internal.util.GridUnsafe.compareAndSwapLong; import static org.apache.ignite.internal.util.GridUnsafe.getLongVolatile; @@ -153,7 +154,7 @@ public class PagePool { long cnt = ((freePageRelPtrMasked & COUNTER_MASK) + COUNTER_INC) & COUNTER_MASK; if (compareAndSwapLong(null, freePageListPtr, freePageRelPtrMasked, nextFreePageRelPtr | cnt)) { - putLongVolatile(null, freePageAbsPtr, PageHeader.PAGE_MARKER); + writePageMarker(freePageAbsPtr); return freePageRelPtr; } @@ -206,7 +207,7 @@ public class PagePool { public int releaseFreePage(long relPtr) { long absPtr = absolute(relPtr); - assert !isAcquired(absPtr) : "Release pinned page: " + fullPageId(absPtr); + assert !isAcquired(absPtr) : "Release pinned page: " + readFullPageId(absPtr); int resCntr = 0; diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java index 653565cc7e0..4d3f30e8939 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java @@ -27,11 +27,17 @@ import static org.apache.ignite.internal.pagememory.io.PageIo.setPageId; import static org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency.MUST_TRIGGER; import static org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency.NOT_REQUIRED; import static org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency.SHOULD_TRIGGER; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.dirty; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_LOCK_OFFSET; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readFullPageId; import static org.apache.ignite.internal.pagememory.persistence.PageHeader.isAcquired; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readAcquiresCount; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readCheckpointTempBufferRelativePointer; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readDirtyFlag; import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readPageId; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.tempBufferPointer; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writeCheckpointTempBufferRelativePointer; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writeDirtyFlag; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writeFullPageId; import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writeTimestamp; import static org.apache.ignite.internal.pagememory.persistence.PagePool.SEGMENT_INDEX_MASK; import static org.apache.ignite.internal.pagememory.persistence.throttling.PagesWriteThrottlePolicy.CP_BUF_FILL_THRESHOLD; @@ -145,12 +151,6 @@ public class PersistentPageMemory implements PageMemory { /** Pointer which means that this page is outdated (for example, group was destroyed, partition eviction'd happened. */ public static final long OUTDATED_REL_PTR = INVALID_REL_PTR + 1; - /** Page lock offset. */ - public static final int PAGE_LOCK_OFFSET = 32; - - /** 8b Marker/timestamp 8b Relative pointer 8b Page ID 4b Group ID 4b Pin count 8b Lock 8b Temporary buffer. */ - public static final int PAGE_OVERHEAD = 48; - /** Try again tag. */ public static final int TRY_AGAIN_TAG = -1; @@ -521,7 +521,7 @@ public class PersistentPageMemory implements PageMemory { public boolean isDirty(int grpId, long pageId, long page) { assert started; - return isDirty(page); + return readDirtyFlag(page); } /** @@ -529,8 +529,8 @@ public class PersistentPageMemory implements PageMemory { * * @param absPtr Absolute pointer. */ - boolean isDirty(long absPtr) { - return dirty(absPtr); + private boolean isDirty(long absPtr) { + return readDirtyFlag(absPtr); } @Override @@ -583,7 +583,7 @@ public class PersistentPageMemory implements PageMemory { zeroMemory(absPtr + PAGE_OVERHEAD, pageSize()); - fullPageId(absPtr, fullId); + writeFullPageId(absPtr, fullId); writeTimestamp(absPtr, coarseCurrentTimeMillis()); rwLock.init(absPtr + PAGE_LOCK_OFFSET, tag(pageId)); @@ -592,7 +592,7 @@ public class PersistentPageMemory implements PageMemory { assert !isAcquired(absPtr) : "Pin counter must be 0 for a new page [relPtr=" + hexLong(relPtr) - + ", absPtr=" + hexLong(absPtr) + ", pinCntr=" + PageHeader.pinCount(absPtr) + ']'; + + ", absPtr=" + hexLong(absPtr) + ", pinCntr=" + readAcquiresCount(absPtr) + ']'; setDirty(fullId, absPtr, true, true); @@ -739,7 +739,7 @@ public class PersistentPageMemory implements PageMemory { absPtr = seg.absolute(relPtr); - fullPageId(absPtr, fullId); + writeFullPageId(absPtr, fullId); writeTimestamp(absPtr, coarseCurrentTimeMillis()); assert !isAcquired(absPtr) : @@ -790,7 +790,7 @@ public class PersistentPageMemory implements PageMemory { zeroMemory(pageAddr, pageSize()); - fullPageId(absPtr, fullId); + writeFullPageId(absPtr, fullId); writeTimestamp(absPtr, coarseCurrentTimeMillis()); setPageId(pageAddr, pageId); @@ -1076,14 +1076,8 @@ public class PersistentPageMemory implements PageMemory { rwLock.readUnlock(absPtr + PAGE_LOCK_OFFSET); } - /** - * Checks if a page has temp copy buffer. - * - * @param absPtr Absolute pointer. - * @return {@code True} if a page has temp buffer. - */ - public boolean hasTempCopy(long absPtr) { - return tempBufferPointer(absPtr) != INVALID_REL_PTR; + private static boolean hasCheckpointTempBufferRelativePointer(long absPtr) { + return readCheckpointTempBufferRelativePointer(absPtr) != INVALID_REL_PTR; } /** @@ -1112,68 +1106,69 @@ public class PersistentPageMemory implements PageMemory { return locked ? postWriteLockPage(absPtr, fullId) : 0; } - private long postWriteLockPage(long absPtr, FullPageId fullId) { + private long postWriteLockPage(long absPtr, FullPageId fullPageId) { writeTimestamp(absPtr, coarseCurrentTimeMillis()); // Create a buffer copy if the page is scheduled for a checkpoint. - if (isInCheckpoint(fullId) && tempBufferPointer(absPtr) == INVALID_REL_PTR) { - long tmpRelPtr; - - PagePool checkpointPool = this.checkpointPool; - - while (true) { - tmpRelPtr = checkpointPool.borrowOrAllocateFreePage(tag(fullId.pageId())); - - if (tmpRelPtr != INVALID_REL_PTR) { - break; - } - - // TODO https://issues.apache.org/jira/browse/IGNITE-23106 Replace spin-wait with a proper wait. - try { - Thread.sleep(1); - } catch (InterruptedException ignore) { - // No-op. - } - } + if (isInCheckpoint(fullPageId) && !hasCheckpointTempBufferRelativePointer(absPtr)) { + long checkpointTmpRelPtr = borrowOrAllocateCheckpointCopyBuffer(fullPageId); // Pin the page until checkpoint is not finished. PageHeader.acquirePage(absPtr); - long tmpAbsPtr = checkpointPool.absolute(tmpRelPtr); + long checkpointTmpAbsPtr = checkpointPool.absolute(checkpointTmpRelPtr); copyMemory( null, absPtr + PAGE_OVERHEAD, null, - tmpAbsPtr + PAGE_OVERHEAD, + checkpointTmpAbsPtr + PAGE_OVERHEAD, pageSize() ); - assert getType(tmpAbsPtr + PAGE_OVERHEAD) != 0 : "Invalid state. Type is 0! pageId = " + hexLong(fullId.pageId()); - assert getVersion(tmpAbsPtr + PAGE_OVERHEAD) != 0 : - "Invalid state. Version is 0! pageId = " + hexLong(fullId.pageId()); + assert getType(checkpointTmpAbsPtr + PAGE_OVERHEAD) != 0 : hexLong(fullPageId.pageId()); + assert getVersion(checkpointTmpAbsPtr + PAGE_OVERHEAD) != 0 : hexLong(fullPageId.pageId()); - dirty(absPtr, false); - tempBufferPointer(absPtr, tmpRelPtr); + writeDirtyFlag(absPtr, false); + writeCheckpointTempBufferRelativePointer(absPtr, checkpointTmpRelPtr); // info for checkpoint buffer cleaner. - fullPageId(tmpAbsPtr, fullId); + writeFullPageId(checkpointTmpAbsPtr, fullPageId); - assert getCrc(absPtr + PAGE_OVERHEAD) == 0; // TODO GG-11480 - assert getCrc(tmpAbsPtr + PAGE_OVERHEAD) == 0; // TODO GG-11480 + assert getCrc(absPtr + PAGE_OVERHEAD) == 0 : hexLong(fullPageId.pageId()); // TODO GG-11480 + assert getCrc(checkpointTmpAbsPtr + PAGE_OVERHEAD) == 0 : hexLong(fullPageId.pageId()); // TODO GG-11480 } - assert getCrc(absPtr + PAGE_OVERHEAD) == 0; // TODO IGNITE-16612 + assert getCrc(absPtr + PAGE_OVERHEAD) == 0 : hexLong(fullPageId.pageId()); // TODO IGNITE-16612 return absPtr + PAGE_OVERHEAD; } + private long borrowOrAllocateCheckpointCopyBuffer(FullPageId fullPageId) { + PagePool checkpointPool = this.checkpointPool; + + while (true) { + long checkpointTmpRelPtr = checkpointPool.borrowOrAllocateFreePage(tag(fullPageId.pageId())); + + if (checkpointTmpRelPtr != INVALID_REL_PTR) { + return checkpointTmpRelPtr; + } + + // TODO https://issues.apache.org/jira/browse/IGNITE-23106 Replace spin-wait with a proper wait. + try { + Thread.sleep(1); + } catch (InterruptedException ignore) { + // No-op. + } + } + } + private void writeUnlockPage( long page, FullPageId fullId, boolean markDirty, boolean restore ) { - boolean wasDirty = isDirty(page); + boolean wasDirty = readDirtyFlag(page); try { assert getCrc(page + PAGE_OVERHEAD) == 0; // TODO IGNITE-16612 @@ -1265,7 +1260,7 @@ public class PersistentPageMemory implements PageMemory { * or not. */ private void setDirty(FullPageId pageId, long absPtr, boolean dirty, boolean forceAdd) { - boolean wasDirty = dirty(absPtr, dirty); + boolean wasDirty = writeDirtyFlag(absPtr, dirty); if (dirty) { assert checkpointTimeoutLock.checkpointLockIsHeldByThread(); @@ -1620,19 +1615,19 @@ public class PersistentPageMemory implements PageMemory { zeroMemory(absPtr + PAGE_OVERHEAD, pageSize()); - dirty(absPtr, false); + writeDirtyFlag(absPtr, false); - long tmpBufPtr = tempBufferPointer(absPtr); + long checkpointTmpBufPtr = readCheckpointTempBufferRelativePointer(absPtr); - if (tmpBufPtr != INVALID_REL_PTR) { - zeroMemory(checkpointPool.absolute(tmpBufPtr) + PAGE_OVERHEAD, pageSize()); + if (checkpointTmpBufPtr != INVALID_REL_PTR) { + zeroMemory(checkpointPool.absolute(checkpointTmpBufPtr) + PAGE_OVERHEAD, pageSize()); - tempBufferPointer(absPtr, INVALID_REL_PTR); + writeCheckpointTempBufferRelativePointer(absPtr, INVALID_REL_PTR); // We pinned the page when allocated the temp buffer, release it now. PageHeader.releasePage(absPtr); - releaseCheckpointBufferPage(tmpBufPtr); + releaseCheckpointBufferPage(checkpointTmpBufPtr); } if (rmv) { @@ -1968,22 +1963,22 @@ public class PersistentPageMemory implements PageMemory { boolean canWrite = false; try { - long tmpRelPtr = tempBufferPointer(absPtr); + long checkpointTmpRelPtr = readCheckpointTempBufferRelativePointer(absPtr); - if (tmpRelPtr != INVALID_REL_PTR) { - tempBufferPointer(absPtr, INVALID_REL_PTR); + if (checkpointTmpRelPtr != INVALID_REL_PTR) { + writeCheckpointTempBufferRelativePointer(absPtr, INVALID_REL_PTR); - long tmpAbsPtr = checkpointPool.absolute(tmpRelPtr); + long tmpAbsPtr = checkpointPool.absolute(checkpointTmpRelPtr); copyInBuffer(tmpAbsPtr, buf); - fullPageId(tmpAbsPtr, NULL_PAGE); + writeFullPageId(tmpAbsPtr, NULL_PAGE); zeroMemory(tmpAbsPtr + PAGE_OVERHEAD, pageSize()); tracker.onCopyOnWritePageWritten(); - releaseCheckpointBufferPage(tmpRelPtr); + releaseCheckpointBufferPage(checkpointTmpRelPtr); // Need release again because we pin page when resolve abs pointer, // and page did not have tmp buffer page. @@ -1993,7 +1988,7 @@ public class PersistentPageMemory implements PageMemory { } else { copyInBuffer(absPtr, buf); - dirty(absPtr, false); + writeDirtyFlag(absPtr, false); } assert getType(buf) != 0 : "Invalid state. Type is 0! pageId = " + hexLong(fullId.pageId()); @@ -2067,7 +2062,7 @@ public class PersistentPageMemory implements PageMemory { absPtr = seg.absolute(relPtr); // Pin the page until page will not be copied. This helpful to prevent page replacement of this page. - if (tempBufferPointer(absPtr) == INVALID_REL_PTR) { + if (!hasCheckpointTempBufferRelativePointer(absPtr)) { PageHeader.acquirePage(absPtr); } else { pageSingleAcquire = true; @@ -2133,7 +2128,7 @@ public class PersistentPageMemory implements PageMemory { long freePageAbsPtr = checkpointPool.absolute(relative); - FullPageId fullPageId = fullPageId(freePageAbsPtr); + FullPageId fullPageId = readFullPageId(freePageAbsPtr); if (fullPageId.pageId() == NULL_PAGE.pageId() || fullPageId.groupId() == NULL_PAGE.groupId()) { continue; diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/ClockPageReplacementPolicy.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/ClockPageReplacementPolicy.java index f14e80b918c..a327ac7a7f8 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/ClockPageReplacementPolicy.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/ClockPageReplacementPolicy.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.pagememory.persistence.replacement; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readFullPageId; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.INVALID_REL_PTR; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.OUTDATED_REL_PTR; import static org.apache.ignite.internal.pagememory.util.PageIdUtils.partitionId; @@ -74,7 +74,7 @@ public class ClockPageReplacementPolicy extends PageReplacementPolicy { long relPtr = seg.relative(pageIdx); long absPtr = seg.absolute(relPtr); - FullPageId fullId = fullPageId(absPtr); + FullPageId fullId = readFullPageId(absPtr); // Check loaded pages map for outdated page. relPtr = loadedPages.get( diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicy.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicy.java index ae019a32ba0..0e183c29e05 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicy.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicy.java @@ -17,9 +17,12 @@ package org.apache.ignite.internal.pagememory.persistence.replacement; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.isAcquired; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readDirtyFlag; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readFullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readTimestamp; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.INVALID_REL_PTR; -import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.PAGE_OVERHEAD; import static org.apache.ignite.internal.pagememory.util.PageIdUtils.partitionId; import java.util.HashSet; @@ -30,7 +33,6 @@ import org.apache.ignite.internal.pagememory.FullPageId; import org.apache.ignite.internal.pagememory.freelist.io.PagesListMetaIo; import org.apache.ignite.internal.pagememory.io.PageIo; import org.apache.ignite.internal.pagememory.persistence.LoadedPagesMap; -import org.apache.ignite.internal.pagememory.persistence.PageHeader; import org.apache.ignite.internal.pagememory.persistence.PagePool; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.Segment; import org.apache.ignite.internal.pagememory.persistence.ReplaceCandidate; @@ -99,7 +101,7 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy { long absPageAddr = seg.absolute(rndAddr); - FullPageId fullId = fullPageId(absPageAddr); + FullPageId fullId = readFullPageId(absPageAddr); // Check page mapping consistency. assert fullId.equals(nearest.fullId()) : "Invalid page mapping [tableId=" + nearest.fullId() @@ -111,11 +113,11 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy { return seg.refreshOutdatedPage(fullId.groupId(), fullId.pageId(), true); } - boolean pinned = PageHeader.isAcquired(absPageAddr); + boolean pinned = isAcquired(absPageAddr); boolean skip = ignored != null && ignored.contains(rndAddr); - boolean dirty = PageHeader.dirty(absPageAddr); + boolean dirty = readDirtyFlag(absPageAddr); CheckpointPages checkpointPages = seg.checkpointPages(); @@ -125,7 +127,7 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy { continue; } - long pageTs = PageHeader.readTimestamp(absPageAddr); + long pageTs = readTimestamp(absPageAddr); boolean storMeta = isStoreMetadataPage(absPageAddr); @@ -158,7 +160,7 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy { long absRmvAddr = seg.absolute(relRmvAddr); - FullPageId fullPageId = fullPageId(absRmvAddr); + FullPageId fullPageId = readFullPageId(absRmvAddr); if (!seg.tryToRemovePage(fullPageId, absRmvAddr)) { if (iterations > 10) { @@ -220,13 +222,13 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy { long absPageAddr = seg.absolute(addr); - FullPageId fullId = fullPageId(absPageAddr); + FullPageId fullId = readFullPageId(absPageAddr); if (partGen < seg.partGeneration(fullId.groupId(), partitionId(fullId.pageId()))) { return seg.refreshOutdatedPage(fullId.groupId(), fullId.pageId(), true); } - boolean pinned = PageHeader.isAcquired(absPageAddr); + boolean pinned = isAcquired(absPageAddr); if (addr == prevAddr || pinned) { continue; @@ -234,7 +236,7 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy { long absEvictAddr = seg.absolute(addr); - FullPageId fullPageId = fullPageId(absEvictAddr); + FullPageId fullPageId = readFullPageId(absEvictAddr); if (seg.tryToRemovePage(fullPageId, absEvictAddr)) { return addr; diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/SegmentedLruPageReplacementPolicy.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/SegmentedLruPageReplacementPolicy.java index 541acd23ae9..723389409fa 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/SegmentedLruPageReplacementPolicy.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/SegmentedLruPageReplacementPolicy.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.pagememory.persistence.replacement; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readFullPageId; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.INVALID_REL_PTR; import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.OUTDATED_REL_PTR; import static org.apache.ignite.internal.pagememory.util.PageIdUtils.partitionId; @@ -82,7 +82,7 @@ public class SegmentedLruPageReplacementPolicy extends PageReplacementPolicy { long relPtr = seg.relative(pageIdx); long absPtr = seg.absolute(relPtr); - FullPageId fullId = fullPageId(absPtr); + FullPageId fullId = readFullPageId(absPtr); // Check loaded pages map for outdated page. relPtr = loadedPages.get( diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicySelfTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicySelfTest.java index 2f4cfb518c3..0fe2f83c071 100644 --- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicySelfTest.java +++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/RandomLruPageReplacementPolicySelfTest.java @@ -17,8 +17,9 @@ package org.apache.ignite.internal.pagememory.persistence.replacement; -import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId; -import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.PAGE_OVERHEAD; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readFullPageId; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writeDirtyFlag; import static org.apache.ignite.internal.util.Constants.MiB; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -38,7 +39,6 @@ import org.apache.ignite.internal.pagememory.mem.DirectMemoryProvider; import org.apache.ignite.internal.pagememory.mem.DirectMemoryRegion; import org.apache.ignite.internal.pagememory.mem.unsafe.UnsafeMemoryProvider; import org.apache.ignite.internal.pagememory.persistence.LoadedPagesMap; -import org.apache.ignite.internal.pagememory.persistence.PageHeader; import org.apache.ignite.internal.pagememory.persistence.PagePool; import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.Segment; import org.apache.ignite.internal.pagememory.persistence.ReplaceCandidate; @@ -119,9 +119,9 @@ class RandomLruPageReplacementPolicySelfTest extends BaseIgniteAbstractTest { long pageAbsPtr = pagePool.absolute(pageRelPtr); - PageHeader.dirty(pageAbsPtr, true); + writeDirtyFlag(pageAbsPtr, true); - FullPageId fullPageId = fullPageId(pageAbsPtr); + FullPageId fullPageId = readFullPageId(pageAbsPtr); when(checkpointPages.contains(fullPageId)).thenReturn(true); @@ -145,12 +145,12 @@ class RandomLruPageReplacementPolicySelfTest extends BaseIgniteAbstractTest { when(segment.tryToRemovePage(any(), eq(pageAbsPtr))) .thenReturn(true); - PageHeader.dirty(dirtyPageAbsPtr, true); + writeDirtyFlag(dirtyPageAbsPtr, true); when(loadedPagesMap.getNearestAt(0)) - .thenReturn(new ReplaceCandidate(42, pageRelPtr, fullPageId(pageAbsPtr))); + .thenReturn(new ReplaceCandidate(42, pageRelPtr, readFullPageId(pageAbsPtr))); when(loadedPagesMap.getNearestAt(1)) - .thenReturn(new ReplaceCandidate(42, dirtyPageRelPtr, fullPageId(dirtyPageAbsPtr))); + .thenReturn(new ReplaceCandidate(42, dirtyPageRelPtr, readFullPageId(dirtyPageAbsPtr))); // Only gets called during fallback to the sequential search. lenient().when(segment.getWriteHoldCount()).thenReturn(1); diff --git a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java index 2a980a19a42..72bfa70dcb1 100644 --- a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java +++ b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java @@ -21,7 +21,7 @@ import static java.util.concurrent.TimeUnit.SECONDS; import static org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency.MUST_TRIGGER; import static org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency.NOT_REQUIRED; import static org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency.SHOULD_TRIGGER; -import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.PAGE_OVERHEAD; +import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD; import static org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.FINISHED; import static org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.PAGES_SORTED; import static org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointTestUtils.mockCheckpointTimeoutLock;