You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2019/12/16 16:34:19 UTC

[ignite] 02/02: IGNITE-12412 Fixed ABA issue in PagePool#releaseFreePage

This is an automated email from the ASF dual-hosted git repository.

agoncharuk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git

commit 20571410eaf1776b532ea686be464f0b2a831813
Author: Alexey Goncharuk <al...@gmail.com>
AuthorDate: Tue Dec 10 12:22:22 2019 +0300

    IGNITE-12412 Fixed ABA issue in PagePool#releaseFreePage
---
 .../processors/cache/persistence/pagemem/PagePool.java   | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PagePool.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PagePool.java
index d267b36..d87044d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PagePool.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PagePool.java
@@ -120,14 +120,14 @@ public class PagePool {
      */
     private long borrowFreePage() {
         while (true) {
-            long freePageRelPtrMasked = GridUnsafe.getLong(null, freePageListPtr);
+            long freePageRelPtrMasked = GridUnsafe.getLongVolatile(null, freePageListPtr);
 
             long freePageRelPtr = freePageRelPtrMasked & ADDRESS_MASK;
 
             if (freePageRelPtr != PageMemoryImpl.INVALID_REL_PTR) {
                 long freePageAbsPtr = absolute(freePageRelPtr);
 
-                long nextFreePageRelPtr = GridUnsafe.getLong(null, freePageAbsPtr) & ADDRESS_MASK;
+                long nextFreePageRelPtr = GridUnsafe.getLongVolatile(null, freePageAbsPtr) & ADDRESS_MASK;
 
                 // nextFreePageRelPtr may be invalid because a concurrent thread may have already polled this value
                 // and used it.
@@ -153,7 +153,7 @@ public class PagePool {
         long limit = region.address() + region.size();
 
         while (true) {
-            long lastIdx = GridUnsafe.getLong(null, lastAllocatedIdxPtr);
+            long lastIdx = GridUnsafe.getLongVolatile(null, lastAllocatedIdxPtr);
 
             // Check if we have enough space to allocate a page.
             if (pagesBase + (lastIdx + 1) * sysPageSize > limit)
@@ -192,13 +192,17 @@ public class PagePool {
             resCntr = pagesCntr.decrementAndGet();
 
         while (true) {
-            long freePageRelPtrMasked = GridUnsafe.getLong(null, freePageListPtr);
+            long freePageRelPtrMasked = GridUnsafe.getLongVolatile(null, freePageListPtr);
 
             long freePageRelPtr = freePageRelPtrMasked & PageMemoryImpl.RELATIVE_PTR_MASK;
 
-            GridUnsafe.putLong(null, absPtr, freePageRelPtr);
+            GridUnsafe.putLongVolatile(null, absPtr, freePageRelPtr);
 
-            if (GridUnsafe.compareAndSwapLong(null, freePageListPtr, freePageRelPtrMasked, relPtr))
+            long cnt = freePageRelPtrMasked & COUNTER_MASK;
+
+            long relPtrWithCnt = (relPtr & ADDRESS_MASK) | cnt;
+
+            if (GridUnsafe.compareAndSwapLong(null, freePageListPtr, freePageRelPtrMasked, relPtrWithCnt))
                 return resCntr;
         }
     }