[
https://issues.apache.org/jira/browse/IGNITE-11367?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Aleksey Plekhanov reassigned IGNITE-11367:
------------------------------------------
Assignee: Aleksey Plekhanov
> Fix several issues in PageMemoryTracker
> ---------------------------------------
>
> Key: IGNITE-11367
> URL: https://issues.apache.org/jira/browse/IGNITE-11367
> Project: Ignite
> Issue Type: Bug
> Reporter: Ivan Rakov
> Assignee: Aleksey Plekhanov
> Priority: Major
> Fix For: 2.8
>
> Attachments: page_memory_tracker_issues_repro.patch
>
>
> I've discovered some issues in PageMemoryTracker while debugging IGNITE-10873:
> 1) Mock page memory doesn't implement PageMemoryImpl#pageBuffer. As a result,
> some delta records (which applies changes via buffer) can't be applied.
> Example:
> {code:java}
> Caused by: java.lang.NullPointerException
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.io.TrackingPageIO.getLastSnapshotTag0(TrackingPageIO.java:235)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.io.TrackingPageIO.getLastSnapshotTag(TrackingPageIO.java:227)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.io.TrackingPageIO.validateSnapshotTag(TrackingPageIO.java:135)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.io.TrackingPageIO.markChanged(TrackingPageIO.java:93)
> at
> org.apache.ignite.internal.pagemem.wal.record.delta.TrackingPageDeltaRecord.applyDelta(TrackingPageDeltaRecord.java:75)
> at
> org.apache.ignite.internal.processors.cache.persistence.wal.memtracker.PageMemoryTracker.applyWalRecord(PageMemoryTracker.java:447)
> at
> org.apache.ignite.internal.processors.cache.persistence.wal.memtracker.PageMemoryTracker.access$000(PageMemoryTracker.java:81)
> at
> org.apache.ignite.internal.processors.cache.persistence.wal.memtracker.PageMemoryTracker$1.log(PageMemoryTracker.java:159)
> at
> org.gridgain.grid.internal.processors.cache.database.snapshot.GridCacheSnapshotManager.onChangeTrackerPage(GridCacheSnapshotManager.java:2801)
> at
> org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$5.applyx(GridCacheDatabaseSharedManager.java:1084)
> at
> org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager$5.applyx(GridCacheDatabaseSharedManager.java:1077)
> at
> org.apache.ignite.internal.util.lang.GridInClosure3X.apply(GridInClosure3X.java:34)
> at
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.writeUnlockPage(PageMemoryImpl.java:1572)
> at
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.writeUnlock(PageMemoryImpl.java:495)
> at
> org.apache.ignite.internal.processors.cache.persistence.pagemem.PageMemoryImpl.writeUnlock(PageMemoryImpl.java:487)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler.writeUnlock(PageHandler.java:394)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.util.PageHandler.writePage(PageHandler.java:369)
> at
> org.apache.ignite.internal.processors.cache.persistence.DataStructure.write(DataStructure.java:285)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.access$11500(BPlusTree.java:92)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree$Put.tryReplace(BPlusTree.java:3638)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.putDown(BPlusTree.java:2565)
> at
> org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.doPut(BPlusTree.java:2293)
> ... 33 more
> {code}
> 2) During binary recovery phase, page memory is changed by applying delta
> records and page snapshots (GridCacheDatabaseSharedManager#applyPageDelta,
> #applyPageSnapshot). Such changes are not replicated by logging delta records
> to WAL (we don't log physical records on binary recovery - we just apply
> already logged ones). This leads to false positive broken consistency
> reports. To prevent this, we should apply changes to both regular page memory
> and mock page memory in PageMemoryTracker.
> 3) PagesList.java:918:
> {code:java}
> // Here we should never write full page, because it
> is known to be new.
> if (needWalDeltaRecord(nextId, nextPage, FALSE))
> wal.log(new PagesListInitNewPageRecord(
> grpId,
> nextId,
> io.getType(),
> io.getVersion(),
> nextId,
> prevId,
> 0L
> ));
> {code}
> Sometimes we may log InitNewPageRecord without logging page snapshot. In case
> page was recycled before, its content in unused page part may trigger false
> positive reports. We may fix this by filling page content with zeros during
> PagesList#setupNextPage call.
> Modified test from attached patch should pass if all mentioned issues will be
> fixed. Please ensure that both Mockito and ignite-indexing are in classpath
> when you run the test.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)