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 2a0ba444c8162..3c78e559427d4 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 @@ private void doCheckpoint() { 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 @@ private void doCheckpoint() { 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 @@ private void doCheckpoint() { } } + /** */ + private String prepareWalSegsCoveredMsg(IgniteBiTuple 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 static class Checkpoint { private int walFilesDeleted; /** WAL segments fully covered by this checkpoint. */ - private List walSegmentsCovered; + private IgniteBiTuple walSegsCoveredRange; /** */ private final int pagesSize; @@ -3967,10 +3987,10 @@ public void walFilesDeleted(int walFilesDeleted) { } /** - * @param walSegmentsCovered WAL segments fully covered by this checkpoint. + * @param walSegsCoveredRange WAL segments fully covered by this checkpoint. */ - public void walSegmentsCovered(final List walSegmentsCovered) { - this.walSegmentsCovered = walSegmentsCovered; + public void walSegsCoveredRange(final IgniteBiTuple walSegsCoveredRange) { + this.walSegsCoveredRange = walSegsCoveredRange; } } 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 95f150b2f79f8..3fb845754fdcc 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.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 List onWalTruncated(WALPointer ptr) { * @return List of checkpoints removed from history. */ public List onCheckpointFinished(GridCacheDatabaseSharedManager.Checkpoint chp, boolean truncateWal) { - List removed = new ArrayList<>(); - - final Map.Entry lastEntry = histMap.lastEntry(); - - assert lastEntry != null; + List rmv = new ArrayList<>(); - final Map.Entry previousEntry = histMap.lowerEntry(lastEntry.getKey()); - - final WALPointer lastWALPointer = lastEntry.getValue().checkpointMark(); - - long lastIdx = 0; - - long prevIdx = 0; - - final ArrayList 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 List onCheckpointFinished(GridCacheDatabaseSharedManager 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 calculateWalSegmentsCovered() { + IgniteBiTuple tup = new IgniteBiTuple<>(-1L, -1L); + + Map.Entry lastEntry = histMap.lastEntry(); + + if (lastEntry == null) + return tup; + + Map.Entry 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; } /** 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 7fb277ca9f11e..79dc48e995127 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 void testCoveredWalLogged() throws Exception { 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]);