You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by iv...@apache.org on 2022/09/30 10:05:53 UTC
[ignite] branch master updated: IGNITE-17749 Remove unneeded zeroing of page, optimize memory zeroing (#10270)
This is an automated email from the ASF dual-hosted git repository.
ivandasch pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 5ad698dab98 IGNITE-17749 Remove unneeded zeroing of page, optimize memory zeroing (#10270)
5ad698dab98 is described below
commit 5ad698dab9835f6e6efb6a8b12da34515bd78349
Author: Ivan Daschinskiy <iv...@apache.org>
AuthorDate: Fri Sep 30 13:05:45 2022 +0300
IGNITE-17749 Remove unneeded zeroing of page, optimize memory zeroing (#10270)
---
.../pagemem/impl/PageMemoryNoStoreImpl.java | 2 +-
.../store/OffHeapPageMetaInfoStore.java | 2 +-
.../evict/Random2LruPageEvictionTracker.java | 2 +-
.../evict/RandomLruPageEvictionTracker.java | 6 +++---
.../pagemem/ClockPageReplacementFlags.java | 2 +-
.../cache/persistence/pagemem/FullPageIdTable.java | 2 +-
.../cache/persistence/pagemem/PageMemoryImpl.java | 14 ++++++--------
.../pagemem/RobinHoodBackwardShiftHashMap.java | 2 +-
.../persistence/pagemem/SegmentedLruPageList.java | 2 +-
.../cache/persistence/tree/util/PageHandler.java | 4 ++--
.../platform/memory/PlatformMemoryUtils.java | 2 +-
.../apache/ignite/internal/util/GridUnsafe.java | 22 ++++++++++++++++++++++
.../util/offheap/unsafe/GridUnsafeMemory.java | 2 +-
.../persistence/tree/io/PageIOFreeSizeTest.java | 2 +-
.../wal/memtracker/PageMemoryTracker.java | 4 ++--
15 files changed, 45 insertions(+), 25 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
index 4023536db1d..969c8e4c24d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
@@ -369,7 +369,7 @@ public class PageMemoryNoStoreImpl implements PageMemory {
writePageId(absPtr, pageId);
// TODO pass an argument to decide whether the page should be cleaned.
- GridUnsafe.setMemory(absPtr + PAGE_OVERHEAD, sysPageSize - PAGE_OVERHEAD, (byte)0);
+ GridUnsafe.zeroMemory(absPtr + PAGE_OVERHEAD, sysPageSize - PAGE_OVERHEAD);
return pageId;
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/store/OffHeapPageMetaInfoStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/store/OffHeapPageMetaInfoStore.java
index 9055d5b654b..ac0983ffd91 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/store/OffHeapPageMetaInfoStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/store/OffHeapPageMetaInfoStore.java
@@ -77,7 +77,7 @@ public class OffHeapPageMetaInfoStore implements PageMetaInfoStore {
private long allocate(int size) {
long ptr = GridUnsafe.allocateMemory(size);
- GridUnsafe.setMemory(ptr, size, (byte)0);
+ GridUnsafe.zeroMemory(ptr, size);
return ptr;
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/Random2LruPageEvictionTracker.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/Random2LruPageEvictionTracker.java
index 69bdf4dfdb3..54afb346ac6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/Random2LruPageEvictionTracker.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/Random2LruPageEvictionTracker.java
@@ -71,7 +71,7 @@ public class Random2LruPageEvictionTracker extends PageAbstractEvictionTracker {
@Override public void start() throws IgniteException {
trackingArrPtr = GridUnsafe.allocateMemory(trackingSize * 8l);
- GridUnsafe.setMemory(trackingArrPtr, trackingSize * 8l, (byte)0);
+ GridUnsafe.zeroMemory(trackingArrPtr, trackingSize * 8l);
}
/** {@inheritDoc} */
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/RandomLruPageEvictionTracker.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/RandomLruPageEvictionTracker.java
index 001cb38fceb..e926a3386d6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/RandomLruPageEvictionTracker.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/evict/RandomLruPageEvictionTracker.java
@@ -73,7 +73,7 @@ public class RandomLruPageEvictionTracker extends PageAbstractEvictionTracker {
@Override public void start() throws IgniteException {
trackingArrPtr = GridUnsafe.allocateMemory(trackingSize * 4l);
- GridUnsafe.setMemory(trackingArrPtr, trackingSize * 4l, (byte)0);
+ GridUnsafe.zeroMemory(trackingArrPtr, trackingSize * 4l);
}
/** {@inheritDoc} */
@@ -86,9 +86,9 @@ public class RandomLruPageEvictionTracker extends PageAbstractEvictionTracker {
int pageIdx = PageIdUtils.pageIndex(pageId);
long res = compactTimestamp(U.currentTimeMillis());
-
+
assert res >= 0 && res < Integer.MAX_VALUE;
-
+
GridUnsafe.putIntVolatile(null, trackingArrPtr + trackingIdx(pageIdx) * 4, (int)res);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/ClockPageReplacementFlags.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/ClockPageReplacementFlags.java
index 84b06d259e8..a5f783a973a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/ClockPageReplacementFlags.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/ClockPageReplacementFlags.java
@@ -44,7 +44,7 @@ public class ClockPageReplacementFlags {
pagesCnt = totalPagesCnt;
flagsPtr = memPtr;
- GridUnsafe.setMemory(flagsPtr, (totalPagesCnt + 7) >> 3, (byte)0);
+ GridUnsafe.zeroMemory(flagsPtr, (totalPagesCnt + 7) >> 3);
}
/**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/FullPageIdTable.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/FullPageIdTable.java
index 2541672e270..613e14a57e9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/FullPageIdTable.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/FullPageIdTable.java
@@ -602,7 +602,7 @@ public class FullPageIdTable implements LoadedPagesMap {
*
*/
public void clear() {
- GridUnsafe.setMemory(valPtr, (long)capacity * BYTES_PER_ENTRY + 8, (byte)0);
+ GridUnsafe.zeroMemory(valPtr, (long)capacity * BYTES_PER_ENTRY + 8);
}
/**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
index b487ec7c688..d10372b1691 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java
@@ -595,7 +595,7 @@ public class PageMemoryImpl implements PageMemoryEx {
long absPtr = seg.absolute(relPtr);
- GridUnsafe.setMemory(absPtr + PAGE_OVERHEAD, pageSize(), (byte)0);
+ GridUnsafe.zeroMemory(absPtr + PAGE_OVERHEAD, pageSize());
PageHeader.fullPageId(absPtr, fullId);
@@ -848,7 +848,7 @@ public class PageMemoryImpl implements PageMemoryEx {
readPageFromStore = true;
}
else {
- GridUnsafe.setMemory(absPtr + PAGE_OVERHEAD, pageSize(), (byte)0);
+ GridUnsafe.zeroMemory(absPtr + PAGE_OVERHEAD, pageSize());
// Must init page ID in order to ensure RWLock tag consistency.
PageIO.setPageId(pageAddr, pageId);
@@ -873,7 +873,7 @@ public class PageMemoryImpl implements PageMemoryEx {
long pageAddr = absPtr + PAGE_OVERHEAD;
- GridUnsafe.setMemory(pageAddr, pageSize(), (byte)0);
+ GridUnsafe.zeroMemory(pageAddr, pageSize());
PageHeader.fullPageId(absPtr, fullId);
@@ -1336,7 +1336,7 @@ public class PageMemoryImpl implements PageMemoryEx {
PageHeader.fullPageId(tmpAbsPtr, NULL_PAGE);
- GridUnsafe.setMemory(tmpAbsPtr + PAGE_OVERHEAD, pageSize(), (byte)0);
+ GridUnsafe.zeroMemory(tmpAbsPtr + PAGE_OVERHEAD, pageSize());
if (tracker != null)
tracker.onCowPageWritten();
@@ -2276,14 +2276,14 @@ public class PageMemoryImpl implements PageMemoryEx {
long absPtr = absolute(relPtr);
- GridUnsafe.setMemory(absPtr + PAGE_OVERHEAD, pageSize(), (byte)0);
+ GridUnsafe.zeroMemory(absPtr + PAGE_OVERHEAD, pageSize());
PageHeader.dirty(absPtr, false);
long tmpBufPtr = PageHeader.tempBufferPointer(absPtr);
if (tmpBufPtr != INVALID_REL_PTR) {
- GridUnsafe.setMemory(checkpointPool.absolute(tmpBufPtr) + PAGE_OVERHEAD, pageSize(), (byte)0);
+ GridUnsafe.zeroMemory(checkpointPool.absolute(tmpBufPtr) + PAGE_OVERHEAD, pageSize());
PageHeader.tempBufferPointer(absPtr, INVALID_REL_PTR);
@@ -2608,8 +2608,6 @@ public class PageMemoryImpl implements PageMemoryEx {
seg.dirtyPagesCntr.decrementAndGet();
}
- GridUnsafe.setMemory(absPtr + PAGE_OVERHEAD, pageSize, (byte)0);
-
seg.pageReplacementPolicy.onRemove(relPtr);
seg.pool.releaseFreePage(relPtr);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/RobinHoodBackwardShiftHashMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/RobinHoodBackwardShiftHashMap.java
index a9afeefda82..74d9a8bf41f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/RobinHoodBackwardShiftHashMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/RobinHoodBackwardShiftHashMap.java
@@ -141,7 +141,7 @@ public class RobinHoodBackwardShiftHashMap implements LoadedPagesMap {
this.numBuckets = (int)((size - MAPSIZE_SIZE - MAPSIZE_PADDING) / BYTES_PER_CELL);
this.baseAddr = baseAddr;
- GridUnsafe.setMemory(baseAddr, size, (byte)0);
+ GridUnsafe.zeroMemory(baseAddr, size);
}
/**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/SegmentedLruPageList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/SegmentedLruPageList.java
index 725fd3983d2..73d1848c61e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/SegmentedLruPageList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/SegmentedLruPageList.java
@@ -62,7 +62,7 @@ public class SegmentedLruPageList {
flagsPtr = memPtr + (((long)totalPagesCnt) << 3);
GridUnsafe.setMemory(linksPtr, ((long)totalPagesCnt) << 3, (byte)0xFF);
- GridUnsafe.setMemory(flagsPtr, (totalPagesCnt + 7) >> 3, (byte)0);
+ GridUnsafe.zeroMemory(flagsPtr, (totalPagesCnt + 7) >> 3);
protectedPagesLimit = (int)(totalPagesCnt * PROTECTED_TO_TOTAL_PAGES_RATIO);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java
index 0899c63b47b..fe651ddd870 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/util/PageHandler.java
@@ -521,7 +521,7 @@ public abstract class PageHandler<X, R> {
*/
public static void zeroMemory(ByteBuffer buf, int off, int len) {
if (buf.isDirect())
- GridUnsafe.setMemory(GridUnsafe.bufferAddress(buf) + off, len, (byte)0);
+ GridUnsafe.zeroMemory(GridUnsafe.bufferAddress(buf) + off, len);
else {
for (int i = off; i < off + len; i++)
@@ -546,6 +546,6 @@ public abstract class PageHandler<X, R> {
* @param len Length.
*/
public static void zeroMemory(long addr, int off, int len) {
- GridUnsafe.setMemory(addr + off, len, (byte)0);
+ GridUnsafe.zeroMemory(addr + off, len);
}
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformMemoryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformMemoryUtils.java
index 79ad159fafa..117ebebd9ef 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformMemoryUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/memory/PlatformMemoryUtils.java
@@ -261,7 +261,7 @@ public class PlatformMemoryUtils {
public static long allocatePool() {
long poolPtr = GridUnsafe.allocateMemory(POOL_HDR_LEN);
- GridUnsafe.setMemory(poolPtr, POOL_HDR_LEN, (byte)0);
+ GridUnsafe.zeroMemory(poolPtr, POOL_HDR_LEN);
flags(poolPtr + POOL_HDR_OFF_MEM_1, FLAG_POOLED);
flags(poolPtr + POOL_HDR_OFF_MEM_2, FLAG_POOLED);
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 19f7f641de2..ac7a9d1fe9e 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
@@ -62,6 +62,12 @@ public abstract class GridUnsafe {
/** Unsafe. */
private static final Unsafe UNSAFE = unsafe();
+ /** Page size. */
+ private static final int PAGE_SIZE = UNSAFE.pageSize();
+
+ /** Empty page. */
+ private static final byte[] EMPTY_PAGE = new byte[PAGE_SIZE];
+
/** Unaligned flag. */
private static final boolean UNALIGNED = unaligned();
@@ -1233,6 +1239,22 @@ public abstract class GridUnsafe {
UNSAFE.setMemory(addr, len, val);
}
+ /**
+ * Fills memory with zeroes.
+ *
+ * @param addr Address.
+ * @param len Length.
+ */
+ public static void zeroMemory(long addr, long len) {
+ long off = 0;
+
+ for (; off + PAGE_SIZE <= len; off += PAGE_SIZE)
+ UNSAFE.copyMemory(EMPTY_PAGE, BYTE_ARR_OFF, null, addr + off, PAGE_SIZE);
+
+ if (len != off)
+ UNSAFE.copyMemory(EMPTY_PAGE, BYTE_ARR_OFF, null, addr + off, len - off);
+ }
+
/**
* Copy memory between offheap locations.
*
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
index b378b74220a..377d0a436fe 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridUnsafeMemory.java
@@ -168,7 +168,7 @@ public class GridUnsafeMemory {
long ptr = GridUnsafe.allocateMemory(size);
if (init)
- fill(ptr, size, FREE);
+ GridUnsafe.zeroMemory(ptr, size);
if (lsnr != null)
lsnr.onEvent(ALLOCATE);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java
index dd5c59ba7e9..a73a956e267 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/PageIOFreeSizeTest.java
@@ -208,7 +208,7 @@ public class PageIOFreeSizeTest extends GridCommonAbstractTest {
private <I extends PageIO> I io(IOVersions<I> versions) {
I io = versions.latest();
- GridUnsafe.setMemory(addr, pageSz, (byte)0);
+ GridUnsafe.zeroMemory(addr, pageSz);
io.initNewPage(addr, 1, pageSz, mock);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTracker.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTracker.java
index 1b5933ba20c..9bd4f0eaae1 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTracker.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/memtracker/PageMemoryTracker.java
@@ -250,7 +250,7 @@ public class PageMemoryTracker implements IgnitePlugin {
memoryRegion = memoryProvider.nextRegion();
- GridUnsafe.setMemory(memoryRegion.address(), memoryRegion.size(), (byte)0);
+ GridUnsafe.zeroMemory(memoryRegion.address(), memoryRegion.size());
maxPages = (int)(maxMemorySize / pageSize);
@@ -426,7 +426,7 @@ public class PageMemoryTracker implements IgnitePlugin {
if (pageSlot.owningPage() != null) {
// Clear memory if slot was already used.
- GridUnsafe.setMemory(pageAddr, pageSize, (byte)0);
+ GridUnsafe.zeroMemory(pageAddr, pageSize);
}
pageSlot.owningPage(page);