Repository: ignite Updated Branches: refs/heads/master a38cbb2d6 -> c46dd5ce2
IGNITE-7507: Ignite node performance drop during checkpoint start: store metapage eviction causes long checkpoint lock hold time - Fixes #3423. Signed-off-by: Alexey Goncharuk <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/c46dd5ce Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/c46dd5ce Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/c46dd5ce Branch: refs/heads/master Commit: c46dd5ce2088044d1482ef3cbc244a98a0a34611 Parents: a38cbb2 Author: dspavlov <[email protected]> Authored: Wed Jan 24 19:05:55 2018 +0300 Committer: Alexey Goncharuk <[email protected]> Committed: Wed Jan 24 19:05:55 2018 +0300 ---------------------------------------------------------------------- .../persistence/pagemem/PageMemoryImpl.java | 49 ++++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/c46dd5ce/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/pagemem/PageMemoryImpl.java ---------------------------------------------------------------------- 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 bcc8939..2c0601a 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 @@ -61,8 +61,11 @@ import org.apache.ignite.internal.processors.cache.GridCacheSharedContext; import org.apache.ignite.internal.processors.cache.persistence.CheckpointLockStateChecker; import org.apache.ignite.internal.processors.cache.persistence.DataRegionMetricsImpl; import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; +import org.apache.ignite.internal.processors.cache.persistence.freelist.io.PagesListMetaIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.DataPageIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.PageIO; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.PagePartitionCountersIO; +import org.apache.ignite.internal.processors.cache.persistence.tree.io.PagePartitionMetaIO; import org.apache.ignite.internal.processors.cache.persistence.tree.io.TrackingPageIO; import org.apache.ignite.internal.processors.cache.persistence.wal.crc.IgniteDataIntegrityViolationException; import org.apache.ignite.internal.processors.query.GridQueryRowCacheCleaner; @@ -1972,8 +1975,10 @@ public class PageMemoryImpl implements PageMemoryEx { while (true) { long cleanAddr = INVALID_REL_PTR; long cleanTs = Long.MAX_VALUE; - long dirtyTs = Long.MAX_VALUE; long dirtyAddr = INVALID_REL_PTR; + long dirtyTs = Long.MAX_VALUE; + long metaAddr = INVALID_REL_PTR; + long metaTs = Long.MAX_VALUE; for (int i = 0; i < RANDOM_PAGES_EVICT_NUM; i++) { ++iterations; @@ -2018,19 +2023,33 @@ public class PageMemoryImpl implements PageMemoryEx { final long pageTs = PageHeader.readTimestamp(absPageAddr); final boolean dirty = isDirty(absPageAddr); + final boolean storMeta = isStoreMetadataPage(absPageAddr); - if (pageTs < cleanTs && !dirty) { + if (pageTs < cleanTs && !dirty && !storMeta) { cleanAddr = rndAddr; cleanTs = pageTs; } - else if (pageTs < dirtyTs && dirty) { + else if (pageTs < dirtyTs && dirty && !storMeta) { dirtyAddr = rndAddr; dirtyTs = pageTs; } + else if (pageTs < metaTs && storMeta) { + metaAddr = rndAddr; - relEvictAddr = cleanAddr == INVALID_REL_PTR ? dirtyAddr : cleanAddr; + metaTs = pageTs; + } + + if (cleanAddr != INVALID_REL_PTR) { + relEvictAddr = cleanAddr; + } + else if (dirtyAddr != INVALID_REL_PTR) { + relEvictAddr = dirtyAddr; + } + else { + relEvictAddr = metaAddr; + } } assert relEvictAddr != INVALID_REL_PTR; @@ -2067,6 +2086,28 @@ public class PageMemoryImpl implements PageMemoryEx { } /** + * @param absPageAddr Absolute page address + * @return {@code True} if page is related to partition metadata, which is loaded in saveStoreMetadata(). + */ + private boolean isStoreMetadataPage(long absPageAddr) { + try { + long dataAddr = absPageAddr + PAGE_OVERHEAD; + + int type = PageIO.getType(dataAddr); + int ver = PageIO.getVersion(dataAddr); + + PageIO io = PageIO.getPageIO(type, ver); + + return io instanceof PagePartitionMetaIO + || io instanceof PagesListMetaIO + || io instanceof PagePartitionCountersIO; + } + catch (IgniteCheckedException ignored) { + return false; + } + } + + /** * Will scan all segment pages to find one to evict it * * @param cap Capacity.
