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);