[ 
https://issues.apache.org/jira/browse/IGNITE-9854?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16660785#comment-16660785
 ] 

Ivan Daschinskiy commented on IGNITE-9854:
------------------------------------------

[~NIzhikov] Nikolay, beginCheckpoint is called under checkpointLock.writeLock 
(see Checkpointer#markCheckpointBegin). But all operations in PageMemoryImpl, 
where refreshOutdatedPage called, is run under checkpointReadLock(). So the 
case mentioned by you above is not possible.
However, finishCheckpoint is not called under that lock (see 
Checkpointer#markCheckpointEnd) so NPE is possible. 

> NullPointerException in PageMemoryImpl.refreshOutdatedPages during removing 
> from segCheckpointPages
> ---------------------------------------------------------------------------------------------------
>
>                 Key: IGNITE-9854
>                 URL: https://issues.apache.org/jira/browse/IGNITE-9854
>             Project: Ignite
>          Issue Type: Bug
>          Components: persistence
>    Affects Versions: 2.6
>            Reporter: Ivan Daschinskiy
>            Assignee: Ivan Daschinskiy
>            Priority: Critical
>             Fix For: 2.8
>
>
> Because of possibility of concurrently setting segCheckpointPages to null of 
> segment not under segment writeLock (i.e. in 
> PageMemoryImpl#finishCheckpoint), NullPointerException is possible. This 
> causes immediate node failure. 
> Example stack trace is attached (failure during iteration in rebalance 
> supplier).
> {code:java}
> java.lang.NullPointerException: null
>         at 
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.refreshOutdatedPage(PageMemoryImpl.java:840)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.access$5100(PageMemoryImpl.java:120)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl$Segment.removePageForReplacement(PageMemoryImpl.java:2175)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl$Segment.access$900(PageMemoryImpl.java:1841)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.acquirePage(PageMemoryImpl.java:686)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.acquirePage(PageMemoryImpl.java:627)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter.initFromLink(CacheDataRowAdapter.java:140)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.CacheDataRowAdapter.initFromLink(CacheDataRowAdapter.java:102)
>         at 
> org.apache.ignite.internal.processors.cache.tree.DataRow.<init>(DataRow.java:54)
>         at 
> org.apache.ignite.internal.processors.cache.tree.CacheDataRowStore.dataRow(CacheDataRowStore.java:73)
>         at 
> org.apache.ignite.internal.processors.cache.tree.CacheDataTree.getRow(CacheDataTree.java:146)
>         at 
> org.apache.ignite.internal.processors.cache.tree.CacheDataTree.getRow(CacheDataTree.java:41)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$ForwardCursor.fillFromBuffer(BPlusTree.java:4660)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$ForwardCursor.nextPage(BPlusTree.java:4760)
>         at 
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$ForwardCursor.next(BPlusTree.java:4689)
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to