You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tk...@apache.org on 2025/08/18 17:12:01 UTC
(ignite-3) branch ignite-26232 created (now 2bce4741965)
This is an automated email from the ASF dual-hosted git repository.
tkalkirill pushed a change to branch ignite-26232
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
at 2bce4741965 IGNITE-26232 wip
This branch includes the following new commits:
new 2bce4741965 IGNITE-26232 wip
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(ignite-3) 01/01: IGNITE-26232 wip
Posted by tk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
tkalkirill pushed a commit to branch ignite-26232
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 2bce4741965dfc30f908b3c61a57450110eae5fb
Author: Kirill Tkalenko <tk...@yandex.ru>
AuthorDate: Mon Aug 18 20:11:42 2025 +0300
IGNITE-26232 wip
---
.../ItBplusTreePersistentPageMemoryTest.java | 3 +-
...BplusTreeReuseListPersistentPageMemoryTest.java | 3 +-
.../pagememory/persistence/PageHeader.java | 97 ++++++++-------
.../internal/pagememory/persistence/PagePool.java | 4 +-
.../persistence/PersistentPageMemory.java | 35 +++---
.../RandomLruPageReplacementPolicy.java | 4 +-
.../pagememory/persistence/PageHeaderTest.java | 134 +++++++++++++++++++++
.../RandomLruPageReplacementPolicySelfTest.java | 2 +-
.../pagememory/PersistentPageMemoryNoLoadTest.java | 8 +-
9 files changed, 215 insertions(+), 75 deletions(-)
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 a58d5104c4e..249344ce57b 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
@@ -43,19 +43,33 @@ import org.apache.ignite.internal.pagememory.FullPageId;
*
* <p>Additional information:</p>
* <ul>
- * <li>Size of the page header in {@link PersistentPageMemory#PAGE_OVERHEAD}.</li>
+ * <li>Size of the page header in {@link #PAGE_OVERHEAD}.</li>
* <li>Flags currently store only one value, whether the page is dirty or not. Only one byte is used for now, the rest can be reused
* later, we do not remove them only for alignment.</li>
* </ul>
*/
-// TODO: IGNITE-16350 Improve documentation and refactoring
public class PageHeader {
/** Page marker. */
- public static final long PAGE_MARKER = 0x0000000000000001L;
+ static final long PAGE_MARKER = 0x0000000000000001L;
/** Dirty flag. */
private static final int DIRTY_FLAG = 0x01000000;
+ /** Unknown partition generation. */
+ static final int UNKNOWN_PARTITION_GENERATION = -1;
+
+ /** 8b Marker/timestamp, 4b Partition generation, 4b flags, 8b Page ID, 4b Group ID, 4b Pin count, 8b Lock, 8b Temporary buffer. */
+ public static final int PAGE_OVERHEAD = 48;
+
+ /** Marker or timestamp offset. */
+ private static final int MARKER_OR_TIMESTAMP_OFFSET = 0;
+
+ /** Partition generation offset. */
+ private static final int PARTITION_GENERATION_OFFSET = 8;
+
+ /** Flags offset. */
+ private static final int FLAGS_OFFSET = 12;
+
/** Page ID offset. */
private static final int PAGE_ID_OFFSET = 16;
@@ -65,28 +79,23 @@ public class PageHeader {
/** Page pin counter offset. */
private static final int PAGE_PIN_CNT_OFFSET = 28;
+ /** Page lock offset. */
+ public static final int PAGE_LOCK_OFFSET = 32;
+
/** Page temp copy buffer relative pointer offset. */
private static final int PAGE_TMP_BUF_OFFSET = 40;
- private static final int PARTITION_GENERATION_OFFSET = 8;
-
- private static final int FLAGS_OFFSET = 12;
-
- /** Unknown partition generation. */
- static final int UNKNOWN_PARTITION_GENERATION = -1;
-
/**
* Initializes the header of the page.
*
* @param absPtr Absolute pointer to initialize.
- * @param relative Relative pointer to write.
*/
- public static void initNew(long absPtr, long relative) {
- writePartitionGeneration(absPtr, UNKNOWN_PARTITION_GENERATION);
+ public static void initNew(long absPtr) {
+ partitionGeneration(absPtr, UNKNOWN_PARTITION_GENERATION);
tempBufferPointer(absPtr, INVALID_REL_PTR);
- putLong(absPtr, PAGE_MARKER);
+ putLong(absPtr + MARKER_OR_TIMESTAMP_OFFSET, PAGE_MARKER);
putInt(absPtr + PAGE_PIN_CNT_OFFSET, 0);
}
@@ -114,37 +123,37 @@ public class PageHeader {
* Returns flag value.
*
* @param absPtr Absolute pointer.
- * @param flag Flag mask.
+ * @param flagMask Flag mask.
*/
- private static boolean flag(long absPtr, int flag) {
- assert (flag & 0xFFFFFF) == 0;
- assert Long.bitCount(flag) == 1;
+ private static boolean flag(long absPtr, int flagMask) {
+ assert (flagMask & 0xFFFFFF) == 0 : Integer.toHexString(flagMask);
+ assert Long.bitCount(flagMask) == 1 : Integer.toHexString(flagMask);
int flags = getInt(absPtr + FLAGS_OFFSET);
- return (flags & flag) != 0;
+ return (flags & flagMask) != 0;
}
/**
* Sets flag value.
*
* @param absPtr Absolute pointer.
- * @param flag Flag mask.
+ * @param flagMask Flag mask.
* @param set New flag value.
* @return Previous flag value.
*/
- private static boolean flag(long absPtr, int flag, boolean set) {
- assert (flag & 0xFFFFFF) == 0;
- assert Long.bitCount(flag) == 1;
+ private static boolean flag(long absPtr, int flagMask, boolean set) {
+ assert (flagMask & 0xFFFFFF) == 0 : Integer.toHexString(flagMask);
+ assert Long.bitCount(flagMask) == 1 : Integer.toHexString(flagMask);
int flags = getInt(absPtr + FLAGS_OFFSET);
- boolean was = (flags & flag) != 0;
+ boolean was = (flags & flagMask) != 0;
if (set) {
- flags |= flag;
+ flags |= flagMask;
} else {
- flags &= ~flag;
+ flags &= ~flagMask;
}
putInt(absPtr + FLAGS_OFFSET, flags);
@@ -186,20 +195,20 @@ public class PageHeader {
*
* @param absPtr Absolute pointer.
*/
- public static int pinCount(long absPtr) {
- return getIntVolatile(null, absPtr);
+ static int pinCount(long absPtr) {
+ return getIntVolatile(null, absPtr + PAGE_PIN_CNT_OFFSET);
}
/**
* Volatile write for current timestamp to page in {@code absAddr} address.
*
* @param absPtr Absolute page address.
- * @param tstamp Timestamp.
+ * @param timestamp Timestamp.
*/
- public static void writeTimestamp(final long absPtr, long tstamp) {
- tstamp &= 0xFFFFFFFFFFFFFF00L;
+ public static void timestamp(long absPtr, long timestamp) {
+ timestamp &= 0xFFFFFFFFFFFFFF00L;
- putLongVolatile(null, absPtr, tstamp | 0x01);
+ putLongVolatile(null, absPtr + MARKER_OR_TIMESTAMP_OFFSET, timestamp | 0x01);
}
/**
@@ -208,8 +217,8 @@ public class PageHeader {
* @param absPtr Absolute page address.
* @return Timestamp.
*/
- public static long readTimestamp(final long absPtr) {
- long markerAndTs = getLong(absPtr);
+ public static long timestamp(long absPtr) {
+ long markerAndTs = getLong(absPtr + MARKER_OR_TIMESTAMP_OFFSET);
// Clear last byte as it is occupied by page marker.
return markerAndTs & ~0xFF;
@@ -222,7 +231,7 @@ public class PageHeader {
* @param tmpRelPtr Temp 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) {
+ static void tempBufferPointer(long absPtr, long tmpRelPtr) {
putLong(absPtr + PAGE_TMP_BUF_OFFSET, tmpRelPtr);
}
@@ -232,7 +241,7 @@ public class PageHeader {
* @param absPtr Page absolute pointer.
* @return Temp buffer relative pointer.
*/
- public static long tempBufferPointer(long absPtr) {
+ static long tempBufferPointer(long absPtr) {
return getLong(absPtr + PAGE_TMP_BUF_OFFSET);
}
@@ -242,7 +251,7 @@ public class PageHeader {
* @param absPtr Absolute memory pointer to the page header.
* @return Page ID written to the page.
*/
- public static long readPageId(long absPtr) {
+ static long pageId(long absPtr) {
return getLong(absPtr + PAGE_ID_OFFSET);
}
@@ -262,7 +271,7 @@ public class PageHeader {
* @param absPtr Absolute memory pointer to the page header.
* @return Group ID written to the page.
*/
- private static int readPageGroupId(final long absPtr) {
+ private static int pageGroupId(long absPtr) {
return getInt(absPtr + PAGE_GROUP_ID_OFFSET);
}
@@ -272,7 +281,7 @@ public class PageHeader {
* @param absPtr Absolute memory pointer to the page header.
* @param grpId Group ID to write.
*/
- private static void pageGroupId(final long absPtr, final int grpId) {
+ private static void pageGroupId(long absPtr, int grpId) {
putInt(absPtr + PAGE_GROUP_ID_OFFSET, grpId);
}
@@ -282,8 +291,8 @@ public class PageHeader {
* @param absPtr Absolute memory pointer to the page header.
* @return Full page ID written to the page.
*/
- public static FullPageId fullPageId(final long absPtr) {
- return new FullPageId(readPageId(absPtr), readPageGroupId(absPtr));
+ public static FullPageId fullPageId(long absPtr) {
+ return new FullPageId(pageId(absPtr), pageGroupId(absPtr));
}
/**
@@ -292,7 +301,7 @@ public class PageHeader {
* @param absPtr Absolute memory pointer to the page header.
* @param fullPageId Full page ID to write.
*/
- public static void fullPageId(final long absPtr, final FullPageId fullPageId) {
+ public static void fullPageId(long absPtr, FullPageId fullPageId) {
pageId(absPtr, fullPageId.pageId());
pageGroupId(absPtr, fullPageId.groupId());
@@ -303,7 +312,7 @@ public class PageHeader {
*
* @param absPtr Absolute memory pointer to the page header.
*/
- public static int readPartitionGeneration(long absPtr) {
+ public static int partitionGeneration(long absPtr) {
return getInt(absPtr + PARTITION_GENERATION_OFFSET);
}
@@ -313,7 +322,7 @@ public class PageHeader {
* @param absPtr Absolute memory pointer to page header.
* @param partitionGeneration Partition generation, strictly positive or {@link #UNKNOWN_PARTITION_GENERATION} if reset is required.
*/
- static void writePartitionGeneration(long absPtr, int partitionGeneration) {
+ static void partitionGeneration(long absPtr, int partitionGeneration) {
assert partitionGeneration > 0 || partitionGeneration == UNKNOWN_PARTITION_GENERATION : partitionGeneration;
putInt(absPtr + PARTITION_GENERATION_OFFSET, partitionGeneration);
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..e0bee13d249 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,11 @@
package org.apache.ignite.internal.pagememory.persistence;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_LOCK_OFFSET;
import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId;
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.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;
@@ -189,7 +189,7 @@ public class PagePool {
assert relative != INVALID_REL_PTR;
- initNew(absPtr, relative);
+ initNew(absPtr);
rwLock.init(absPtr + PAGE_LOCK_OFFSET, tag);
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 3ba17e416af..2f1a4971aee 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,13 +27,14 @@ 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.PAGE_LOCK_OFFSET;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD;
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.isAcquired;
-import static org.apache.ignite.internal.pagememory.persistence.PageHeader.readPageId;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.partitionGeneration;
import static org.apache.ignite.internal.pagememory.persistence.PageHeader.tempBufferPointer;
-import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writePartitionGeneration;
-import static org.apache.ignite.internal.pagememory.persistence.PageHeader.writeTimestamp;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.timestamp;
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;
import static org.apache.ignite.internal.pagememory.util.PageIdUtils.effectivePageId;
@@ -145,12 +146,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, 4b Partition generation, 4b flags, 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;
@@ -442,7 +437,7 @@ public class PersistentPageMemory implements PageMemory {
}
if (touch) {
- writeTimestamp(absPtr, coarseCurrentTimeMillis());
+ timestamp(absPtr, coarseCurrentTimeMillis());
}
assert getCrc(absPtr + PAGE_OVERHEAD) == 0; // TODO IGNITE-16612
@@ -584,8 +579,8 @@ public class PersistentPageMemory implements PageMemory {
zeroMemory(absPtr + PAGE_OVERHEAD, pageSize());
fullPageId(absPtr, fullId);
- writeTimestamp(absPtr, coarseCurrentTimeMillis());
- writePartitionGeneration(absPtr, seg.partGeneration(grpId, partId));
+ timestamp(absPtr, coarseCurrentTimeMillis());
+ partitionGeneration(absPtr, seg.partGeneration(grpId, partId));
rwLock.init(absPtr + PAGE_LOCK_OFFSET, tag(pageId));
@@ -741,8 +736,8 @@ public class PersistentPageMemory implements PageMemory {
absPtr = seg.absolute(relPtr);
fullPageId(absPtr, fullId);
- writeTimestamp(absPtr, coarseCurrentTimeMillis());
- writePartitionGeneration(absPtr, seg.partGeneration(grpId, partId));
+ timestamp(absPtr, coarseCurrentTimeMillis());
+ partitionGeneration(absPtr, seg.partGeneration(grpId, partId));
assert !isAcquired(absPtr) :
"Pin counter must be 0 for a new page [relPtr=" + hexLong(relPtr) + ", absPtr=" + hexLong(absPtr) + ']';
@@ -793,8 +788,8 @@ public class PersistentPageMemory implements PageMemory {
zeroMemory(pageAddr, pageSize());
fullPageId(absPtr, fullId);
- writeTimestamp(absPtr, coarseCurrentTimeMillis());
- writePartitionGeneration(absPtr, seg.partGeneration(grpId, partId));
+ timestamp(absPtr, coarseCurrentTimeMillis());
+ partitionGeneration(absPtr, seg.partGeneration(grpId, partId));
setPageId(pageAddr, pageId);
assert !isAcquired(absPtr) :
@@ -1116,7 +1111,7 @@ public class PersistentPageMemory implements PageMemory {
}
private long postWriteLockPage(long absPtr, FullPageId fullId) {
- writeTimestamp(absPtr, coarseCurrentTimeMillis());
+ timestamp(absPtr, coarseCurrentTimeMillis());
// Create a buffer copy if the page is scheduled for a checkpoint.
if (isInCheckpoint(fullId) && tempBufferPointer(absPtr) == INVALID_REL_PTR) {
@@ -1161,8 +1156,8 @@ public class PersistentPageMemory implements PageMemory {
// info for checkpoint buffer cleaner.
fullPageId(tmpAbsPtr, fullId);
- assert getCrc(absPtr + PAGE_OVERHEAD) == 0; // TODO GG-11480
- assert getCrc(tmpAbsPtr + PAGE_OVERHEAD) == 0; // TODO GG-11480
+ assert getCrc(absPtr + PAGE_OVERHEAD) == 0; // TODO IGNITE-16612
+ assert getCrc(tmpAbsPtr + PAGE_OVERHEAD) == 0; // TODO IGNITE-16612
}
assert getCrc(absPtr + PAGE_OVERHEAD) == 0; // TODO IGNITE-16612
@@ -1188,7 +1183,7 @@ public class PersistentPageMemory implements PageMemory {
long pageId = getPageId(page + PAGE_OVERHEAD);
try {
- assert pageId != 0 : hexLong(readPageId(page));
+ assert pageId != 0 : hexLong(PageHeader.pageId(page));
rwLock.writeUnlock(page + PAGE_LOCK_OFFSET, tag(pageId));
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..774b60869c0 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,9 @@
package org.apache.ignite.internal.pagememory.persistence.replacement;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD;
import static org.apache.ignite.internal.pagememory.persistence.PageHeader.fullPageId;
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;
@@ -125,7 +125,7 @@ public class RandomLruPageReplacementPolicy extends PageReplacementPolicy {
continue;
}
- long pageTs = PageHeader.readTimestamp(absPageAddr);
+ long pageTs = PageHeader.timestamp(absPageAddr);
boolean storMeta = isStoreMetadataPage(absPageAddr);
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageHeaderTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageHeaderTest.java
new file mode 100644
index 00000000000..f619d1ffc70
--- /dev/null
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageHeaderTest.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.pagememory.persistence;
+
+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.UNKNOWN_PARTITION_GENERATION;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.acquirePage;
+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.initNew;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.isAcquired;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.partitionGeneration;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.pinCount;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.releasePage;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.tempBufferPointer;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.timestamp;
+import static org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory.INVALID_REL_PTR;
+import static org.apache.ignite.internal.util.GridUnsafe.allocateMemory;
+import static org.apache.ignite.internal.util.GridUnsafe.freeMemory;
+import static org.apache.ignite.internal.util.GridUnsafe.getLong;
+import static org.apache.ignite.internal.util.GridUnsafe.zeroMemory;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.apache.ignite.internal.pagememory.FullPageId;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+/** For {@link PageHeader} testing. */
+public class PageHeaderTest {
+ private static long pageHeaderAddr = -1;
+
+ @BeforeAll
+ static void beforeAll() {
+ pageHeaderAddr = allocateMemory(PAGE_OVERHEAD);
+ }
+
+ @AfterAll
+ static void afterAll() {
+ if (pageHeaderAddr != -1) {
+ freeMemory(pageHeaderAddr);
+ }
+ }
+
+ @BeforeEach
+ void setUp() {
+ initNew(pageHeaderAddr);
+ }
+
+ @AfterEach
+ void tearDown() {
+ zeroMemory(pageHeaderAddr, PAGE_OVERHEAD);
+ }
+
+ @Test
+ void testInitNew() {
+ zeroMemory(pageHeaderAddr, PAGE_OVERHEAD);
+ initNew(pageHeaderAddr);
+
+ assertEquals(0L, timestamp(pageHeaderAddr));
+ assertEquals(UNKNOWN_PARTITION_GENERATION, partitionGeneration(pageHeaderAddr));
+ assertFalse(dirty(pageHeaderAddr));
+ assertEquals(new FullPageId(0, 0), fullPageId(pageHeaderAddr));
+ assertEquals(0, pinCount(pageHeaderAddr));
+ assertEquals(0L, getLong(pageHeaderAddr + PAGE_LOCK_OFFSET));
+ assertEquals(INVALID_REL_PTR, tempBufferPointer(pageHeaderAddr));
+ }
+
+ @Test
+ void testReadWriteTimeStamp() {
+ long timestamp = System.currentTimeMillis();
+
+ timestamp(pageHeaderAddr, timestamp);
+ assertEquals(timestamp & ~0xFF, timestamp(pageHeaderAddr));
+ }
+
+ @Test
+ void testReadWritePartitionGeneration() {
+ partitionGeneration(pageHeaderAddr, 42);
+ assertEquals(42, partitionGeneration(pageHeaderAddr));
+ }
+
+ @Test
+ void testReadWriteDirtyFlagValue() {
+ assertFalse(dirty(pageHeaderAddr, true));
+ assertTrue(dirty(pageHeaderAddr));
+
+ assertTrue(dirty(pageHeaderAddr, false));
+ assertFalse(dirty(pageHeaderAddr));
+ }
+
+ @Test
+ void testReadWriteFullPageId() {
+ fullPageId(pageHeaderAddr, new FullPageId(4, 2));
+ assertEquals(new FullPageId(4, 2), fullPageId(pageHeaderAddr));
+ }
+
+ @Test
+ void testAcquireRelease() {
+ assertEquals(1, acquirePage(pageHeaderAddr));
+ assertEquals(1, pinCount(pageHeaderAddr));
+ assertTrue(isAcquired(pageHeaderAddr));
+
+ assertEquals(0, releasePage(pageHeaderAddr));
+ assertEquals(0, pinCount(pageHeaderAddr));
+ assertFalse(isAcquired(pageHeaderAddr));
+ }
+
+ @Test
+ void testReadWriteCheckpointTempBufferRelativePointer() {
+ tempBufferPointer(pageHeaderAddr, 42);
+ assertEquals(42, tempBufferPointer(pageHeaderAddr));
+ }
+}
\ No newline at end of file
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..7e68b8c678a 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,8 @@
package org.apache.ignite.internal.pagememory.persistence.replacement;
+import static org.apache.ignite.internal.pagememory.persistence.PageHeader.PAGE_OVERHEAD;
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.util.Constants.MiB;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
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 4c1263cc91b..e6e53d4c4db 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;
@@ -596,7 +596,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
// Absolute memory pointer to page with header.
long absPtr = mem.acquirePage(fullPageId.groupId(), fullPageId.pageId());
- assertEquals(1, PageHeader.readPartitionGeneration(absPtr));
+ assertEquals(1, PageHeader.partitionGeneration(absPtr));
});
}
@@ -610,7 +610,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
// Absolute memory pointer to page with header.
long absPtr = mem.acquirePage(fullPageId.groupId(), fullPageId.pageId());
- assertEquals(2, PageHeader.readPartitionGeneration(absPtr));
+ assertEquals(2, PageHeader.partitionGeneration(absPtr));
});
}
@@ -634,7 +634,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
// Absolute memory pointer to page with header.
long absPtr = mem.acquirePage(fullPageId.groupId(), fullPageId.pageId());
- assertEquals(2, PageHeader.readPartitionGeneration(absPtr));
+ assertEquals(2, PageHeader.partitionGeneration(absPtr));
});
}