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