Repository: ignite Updated Branches: refs/heads/master 9c57baac1 -> 62df2d9be
IGNITE-8957 testFailGetLock() constantly fails. Last entry checkpoint history can be emp - Fixes #4334. Signed-off-by: Ivan Rakov <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/62df2d9b Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/62df2d9b Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/62df2d9b Branch: refs/heads/master Commit: 62df2d9be4bb1826e61fa9edac8f324e86a4be7b Parents: 9c57baa Author: AMedvedev <[email protected]> Authored: Fri Jul 13 13:51:25 2018 +0300 Committer: Ivan Rakov <[email protected]> Committed: Fri Jul 13 13:51:25 2018 +0300 ---------------------------------------------------------------------- .../GridCacheDatabaseSharedManager.java | 32 ++++++++-- .../checkpoint/CheckpointHistory.java | 67 ++++++++++++-------- .../checkpoint/IgniteMassLoadSandboxTest.java | 2 +- 3 files changed, 66 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/62df2d9b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java index 2a0ba44..3c78e55 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java @@ -3208,7 +3208,9 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan if (chp.hasDelta() || destroyedPartitionsCnt > 0) { if (printCheckpointStats) { - if (log.isInfoEnabled()) + if (log.isInfoEnabled()) { + String walSegsCoveredMsg = prepareWalSegsCoveredMsg(chp.walSegsCoveredRange); + log.info(String.format("Checkpoint finished [cpId=%s, pages=%d, markPos=%s, " + "walSegmentsCleared=%d, walSegmentsCovered=%s, markDuration=%dms, pagesWrite=%dms, fsync=%dms, " + "total=%dms]", @@ -3216,11 +3218,12 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan chp.pagesSize, chp.cpEntry != null ? chp.cpEntry.checkpointMark() : "", chp.walFilesDeleted, - chp.walSegmentsCovered, + walSegsCoveredMsg, tracker.markDuration(), tracker.pagesWriteDuration(), tracker.fsyncDuration(), tracker.totalDuration())); + } } persStoreMetrics.onCheckpoint( @@ -3251,6 +3254,23 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan } } + /** */ + private String prepareWalSegsCoveredMsg(IgniteBiTuple<Long, Long> walRange) { + String res; + + long startIdx = walRange.get1(); + long endIdx = walRange.get2(); + + if (endIdx < 0 || endIdx < startIdx) + res = "[]"; + else if (endIdx == startIdx) + res = "[" + endIdx + "]"; + else + res = "[" + startIdx + " - " + endIdx + "]"; + + return res; + } + /** * Processes all evicted partitions scheduled for destroy. * @@ -3930,7 +3950,7 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan private int walFilesDeleted; /** WAL segments fully covered by this checkpoint. */ - private List<Long> walSegmentsCovered; + private IgniteBiTuple<Long, Long> walSegsCoveredRange; /** */ private final int pagesSize; @@ -3967,10 +3987,10 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan } /** - * @param walSegmentsCovered WAL segments fully covered by this checkpoint. + * @param walSegsCoveredRange WAL segments fully covered by this checkpoint. */ - public void walSegmentsCovered(final List<Long> walSegmentsCovered) { - this.walSegmentsCovered = walSegmentsCovered; + public void walSegsCoveredRange(final IgniteBiTuple<Long, Long> walSegsCoveredRange) { + this.walSegsCoveredRange = walSegsCoveredRange; } } http://git-wip-us.apache.org/repos/asf/ignite/blob/62df2d9b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointHistory.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointHistory.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointHistory.java index 95f150b..3fb8457 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointHistory.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/checkpoint/CheckpointHistory.java @@ -38,6 +38,7 @@ import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabase import org.apache.ignite.internal.processors.cache.persistence.wal.FileWALPointer; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteBiTuple; import org.jetbrains.annotations.Nullable; import static org.apache.ignite.IgniteSystemProperties.IGNITE_PDS_MAX_CHECKPOINT_MEMORY_HISTORY_SIZE; @@ -198,33 +199,9 @@ public class CheckpointHistory { * @return List of checkpoints removed from history. */ public List<CheckpointEntry> onCheckpointFinished(GridCacheDatabaseSharedManager.Checkpoint chp, boolean truncateWal) { - List<CheckpointEntry> removed = new ArrayList<>(); - - final Map.Entry<Long, CheckpointEntry> lastEntry = histMap.lastEntry(); - - assert lastEntry != null; + List<CheckpointEntry> rmv = new ArrayList<>(); - final Map.Entry<Long, CheckpointEntry> previousEntry = histMap.lowerEntry(lastEntry.getKey()); - - final WALPointer lastWALPointer = lastEntry.getValue().checkpointMark(); - - long lastIdx = 0; - - long prevIdx = 0; - - final ArrayList<Long> walSegmentsCovered = new ArrayList<>(); - - if (lastWALPointer instanceof FileWALPointer) { - lastIdx = ((FileWALPointer)lastWALPointer).index(); - - if (previousEntry != null) - prevIdx = ((FileWALPointer)previousEntry.getValue().checkpointMark()).index(); - } - - for (long walCovered = prevIdx; walCovered < lastIdx; walCovered++) - walSegmentsCovered.add(walCovered); - - chp.walSegmentsCovered(walSegmentsCovered); + chp.walSegsCoveredRange(calculateWalSegmentsCovered()); int deleted = 0; @@ -245,12 +222,46 @@ public class CheckpointHistory { histMap.remove(entry.getKey()); - removed.add(cpEntry); + rmv.add(cpEntry); } chp.walFilesDeleted(deleted); - return removed; + return rmv; + } + + /** + * Calculates indexes of WAL segments covered by last checkpoint. + * + * @return list of indexes or empty list if there are no checkpoints. + */ + private IgniteBiTuple<Long, Long> calculateWalSegmentsCovered() { + IgniteBiTuple<Long, Long> tup = new IgniteBiTuple<>(-1L, -1L); + + Map.Entry<Long, CheckpointEntry> lastEntry = histMap.lastEntry(); + + if (lastEntry == null) + return tup; + + Map.Entry<Long, CheckpointEntry> previousEntry = histMap.lowerEntry(lastEntry.getKey()); + + WALPointer lastWALPointer = lastEntry.getValue().checkpointMark(); + + long lastIdx = 0; + + long prevIdx = 0; + + if (lastWALPointer instanceof FileWALPointer) { + lastIdx = ((FileWALPointer)lastWALPointer).index(); + + if (previousEntry != null) + prevIdx = ((FileWALPointer)previousEntry.getValue().checkpointMark()).index(); + } + + tup.set1(prevIdx); + tup.set2(lastIdx - 1); + + return tup; } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/62df2d9b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/IgniteMassLoadSandboxTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/IgniteMassLoadSandboxTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/IgniteMassLoadSandboxTest.java index 7fb277c..79dc48e 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/IgniteMassLoadSandboxTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/IgniteMassLoadSandboxTest.java @@ -377,7 +377,7 @@ public class IgniteMassLoadSandboxTest extends GridCommonAbstractTest { final String coveredMatcherGrp = coveredMatcher.group(1); final long[] covered = coveredMatcherGrp.length() > 0 ? - Arrays.stream(coveredMatcherGrp.split(",")).mapToLong(e -> Integer.valueOf(e.trim())).toArray() : + Arrays.stream(coveredMatcherGrp.split(" - ")).mapToLong(e -> Integer.valueOf(e.trim())).toArray() : new long[0]; assertEquals(nextCovered, covered[0]);
