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]);

Reply via email to