You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2020/03/24 14:32:34 UTC

[ignite] branch master updated: IGNITE-12789 Delta record for tracking page repairing.

This is an automated email from the ASF dual-hosted git repository.

agura pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new fd3065b  IGNITE-12789 Delta record for tracking page repairing.
fd3065b is described below

commit fd3065b80025699c345e367037d7f1efe46c0231
Author: ibessonov <be...@gmail.com>
AuthorDate: Tue Mar 24 17:11:44 2020 +0300

    IGNITE-12789 Delta record for tracking page repairing.
    
    Signed-off-by: Andrey Gura <ag...@apache.org>
---
 .../internal/pagemem/wal/record/WALRecord.java     |  5 ++-
 .../wal/record/delta/TrackingPageDeltaRecord.java  | 30 ++++++-------
 .../delta/TrackingPageRepairDeltaRecord.java       | 51 ++++++++++++++++++++++
 .../cache/persistence/tree/io/TrackingPageIO.java  | 18 ++++----
 .../wal/serializer/RecordDataV1Serializer.java     |  4 +-
 .../wal/serializer/RecordDataV2Serializer.java     | 15 +++++++
 .../testframework/wal/record/RecordUtils.java      |  8 ++++
 7 files changed, 104 insertions(+), 27 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/WALRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/WALRecord.java
index 67106a9..14c1bc4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/WALRecord.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/WALRecord.java
@@ -227,7 +227,10 @@ public abstract class WALRecord {
         BTREE_META_PAGE_INIT_ROOT_V3(59, PHYSICAL),
 
         /** Master key change record. */
-        MASTER_KEY_CHANGE_RECORD(60, LOGICAL);
+        MASTER_KEY_CHANGE_RECORD(60, LOGICAL),
+
+        /** Record that indicates that "corrupted" flag should be removed from tracking page. */
+        TRACKING_PAGE_REPAIR_DELTA (61, PHYSICAL);
 
         /** Index for serialization. Should be consistent throughout all versions. */
         private final int idx;
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageDeltaRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageDeltaRecord.java
index 3f11c58..62c8fb1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageDeltaRecord.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageDeltaRecord.java
@@ -29,24 +29,24 @@ public class TrackingPageDeltaRecord extends PageDeltaRecord {
     /** Page id to mark. */
     private final long pageIdToMark;
 
-    /** Next snapshot id. */
-    private final long nextSnapshotId;
+    /** Next snapshot tag. */
+    private final long nextSnapshotTag;
 
-    /** Last successful snapshot id. */
-    private final long lastSuccessfulSnapshotId;
+    /** Last successful snapshot tag. */
+    private final long lastSuccessfulSnapshotTag;
 
     /**
      * @param grpId Cache group id.
      * @param pageId Page id.
-     * @param nextSnapshotTag next snapshot tag
-     * @param lastSuccessfulSnapshotId last successful snapshot id
+     * @param nextSnapshotTag Next snapshot tag.
+     * @param lastSuccessfulSnapshotTag Last successful snapshot tag.
      */
-    public TrackingPageDeltaRecord(int grpId, long pageId, long pageIdToMark, long nextSnapshotTag, long lastSuccessfulSnapshotId) {
+    public TrackingPageDeltaRecord(int grpId, long pageId, long pageIdToMark, long nextSnapshotTag, long lastSuccessfulSnapshotTag) {
         super(grpId, pageId);
 
         this.pageIdToMark = pageIdToMark;
-        this.nextSnapshotId = nextSnapshotTag;
-        this.lastSuccessfulSnapshotId = lastSuccessfulSnapshotId;
+        this.nextSnapshotTag = nextSnapshotTag;
+        this.lastSuccessfulSnapshotTag = lastSuccessfulSnapshotTag;
     }
 
     /**
@@ -59,23 +59,23 @@ public class TrackingPageDeltaRecord extends PageDeltaRecord {
     /**
      *
      */
-    public long nextSnapshotId() {
-        return nextSnapshotId;
+    public long nextSnapshotTag() {
+        return nextSnapshotTag;
     }
 
     /**
      *
      */
-    public long lastSuccessfulSnapshotId() {
-        return lastSuccessfulSnapshotId;
+    public long lastSuccessfulSnapshotTag() {
+        return lastSuccessfulSnapshotTag;
     }
 
     /** {@inheritDoc} */
     @Override public void applyDelta(PageMemory pageMem, long pageAddr) throws IgniteCheckedException {
         TrackingPageIO.VERSIONS.forPage(pageAddr).markChanged(pageMem.pageBuffer(pageAddr),
             pageIdToMark,
-            nextSnapshotId,
-            lastSuccessfulSnapshotId,
+            nextSnapshotTag,
+            lastSuccessfulSnapshotTag,
             pageMem.realPageSize(groupId()));
     }
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageRepairDeltaRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageRepairDeltaRecord.java
new file mode 100644
index 0000000..0c0d13a
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/TrackingPageRepairDeltaRecord.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.pagemem.wal.record.delta;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.processors.cache.persistence.tree.io.TrackingPageIO;
+import org.apache.ignite.internal.util.typedef.internal.S;
+
+/**
+ * Record that indicates that "corrupted" flag should be removed from tracking page.
+ */
+public class TrackingPageRepairDeltaRecord extends PageDeltaRecord {
+    /**
+     * @param grpId Cache group ID.
+     * @param pageId Page ID.
+     */
+    public TrackingPageRepairDeltaRecord(int grpId, long pageId) {
+        super(grpId, pageId);
+    }
+
+    /** {@inheritDoc} */
+    @Override public RecordType type() {
+        return RecordType.TRACKING_PAGE_REPAIR_DELTA;
+    }
+
+    /** */
+    @Override public void applyDelta(PageMemory pageMem, long pageAddr) throws IgniteCheckedException {
+        TrackingPageIO.VERSIONS.forPage(pageAddr).resetCorruptFlag(pageAddr);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(TrackingPageRepairDeltaRecord.class, this, "super", super.toString());
+    }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java
index 80dbf25..dee301d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/io/TrackingPageIO.java
@@ -37,12 +37,12 @@ import org.jetbrains.annotations.Nullable;
  * N depends on page size (how many bytes we can use for tracking).
  *
  *
- *                      +-----------------------------------------+-----------------------------------------+
- *                      |                left half                |               right half                |
- * +---------+----------+----+------------------------------------+----+------------------------------------+
- * |  HEADER | Last     |size|                                    |size|                                    |
- * |         |SnapshotId|2b. |  tracking bits                     |2b. |  tracking bits                     |
- * +---------+----------+----+------------------------------------+----+------------------------------------+
+ *                       +-----------------------------------------+-----------------------------------------+
+ *                       |                left half                |               right half                |
+ * +---------+-----------+----+------------------------------------+----+------------------------------------+
+ * |  HEADER | Last      |size|                                    |size|                                    |
+ * |         |SnapshotTag|2b. |  tracking bits                     |2b. |  tracking bits                     |
+ * +---------+--------- -+----+------------------------------------+----+------------------------------------+
  *
  */
 public class TrackingPageIO extends PageIO {
@@ -122,8 +122,8 @@ public class TrackingPageIO extends PageIO {
 
     /**
      * @param buf Buffer.
-     * @param nextSnapshotTag Next snapshot id.
-     * @param lastSuccessfulSnapshotTag Last successful snapshot id.
+     * @param nextSnapshotTag Next snapshot tag.
+     * @param lastSuccessfulSnapshotTag Last successful snapshot tag.
      * @param pageSize Page size.
      *
      * @return <code>-1</code> if everything is ok, otherwise last saved tag.
@@ -134,7 +134,7 @@ public class TrackingPageIO extends PageIO {
 
         long last = getLastSnapshotTag(buf);
 
-        if(last > nextSnapshotTag) { //we have lost snapshot tag therefore should mark this tracking as corrupted
+        if (last > nextSnapshotTag) { //we have lost snapshot tag therefore should mark this tracking as corrupted
             PageHandler.zeroMemory(buf, LAST_SNAPSHOT_TAG_OFFSET, buf.capacity() - LAST_SNAPSHOT_TAG_OFFSET);
 
             setLastSnasphotTag(buf, nextSnapshotTag | CORRUPT_FLAG_MASK);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java
index 829ef58..88fdc9b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV1Serializer.java
@@ -1714,8 +1714,8 @@ public class RecordDataV1Serializer implements RecordDataSerializer {
                 buf.putLong(tpDelta.pageId());
 
                 buf.putLong(tpDelta.pageIdToMark());
-                buf.putLong(tpDelta.nextSnapshotId());
-                buf.putLong(tpDelta.lastSuccessfulSnapshotId());
+                buf.putLong(tpDelta.nextSnapshotTag());
+                buf.putLong(tpDelta.lastSuccessfulSnapshotTag());
 
                 break;
 
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV2Serializer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV2Serializer.java
index 3063a25..21c5c99 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV2Serializer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordDataV2Serializer.java
@@ -43,6 +43,7 @@ import org.apache.ignite.internal.pagemem.wal.record.SnapshotRecord;
 import org.apache.ignite.internal.pagemem.wal.record.TxRecord;
 import org.apache.ignite.internal.pagemem.wal.record.WALRecord;
 import org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType;
+import org.apache.ignite.internal.pagemem.wal.record.delta.TrackingPageRepairDeltaRecord;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.CacheObjectContext;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
@@ -218,6 +219,12 @@ public class RecordDataV2Serializer extends RecordDataV1Serializer {
 
                 return new RollbackRecord(grpId, partId, start, range);
 
+            case TRACKING_PAGE_REPAIR_DELTA:
+                cacheId = in.readInt();
+                pageId = in.readLong();
+
+                return new TrackingPageRepairDeltaRecord(cacheId, pageId);
+
             default:
                 return super.readPlainRecord(type, in, encrypted, recordSize);
         }
@@ -310,6 +317,14 @@ public class RecordDataV2Serializer extends RecordDataV1Serializer {
 
                 break;
 
+            case TRACKING_PAGE_REPAIR_DELTA:
+                TrackingPageRepairDeltaRecord tprDelta = (TrackingPageRepairDeltaRecord)rec;
+
+                buf.putInt(tprDelta.groupId());
+                buf.putLong(tprDelta.pageId());
+
+                break;
+
             default:
                 super.writePlainRecord(rec, buf);
         }
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/wal/record/RecordUtils.java b/modules/core/src/test/java/org/apache/ignite/testframework/wal/record/RecordUtils.java
index 2855de7..37dbeb8 100644
--- a/modules/core/src/test/java/org/apache/ignite/testframework/wal/record/RecordUtils.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/wal/record/RecordUtils.java
@@ -76,6 +76,7 @@ import org.apache.ignite.internal.pagemem.wal.record.delta.ReplaceRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.RotatedIdPartRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.SplitExistingPageRecord;
 import org.apache.ignite.internal.pagemem.wal.record.delta.TrackingPageDeltaRecord;
+import org.apache.ignite.internal.pagemem.wal.record.delta.TrackingPageRepairDeltaRecord;
 import org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState;
 import org.apache.ignite.internal.processors.cache.mvcc.MvccVersionImpl;
 import org.apache.ignite.internal.processors.cache.persistence.wal.FileWALPointer;
@@ -143,6 +144,7 @@ import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType
 import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.SNAPSHOT;
 import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.SWITCH_SEGMENT_RECORD;
 import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.TRACKING_PAGE_DELTA;
+import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.TRACKING_PAGE_REPAIR_DELTA;
 import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.TX_RECORD;
 import static org.apache.ignite.internal.processors.cache.tree.DataInnerIO.VERSIONS;
 
@@ -189,6 +191,7 @@ public class RecordUtils {
             put(PARTITION_META_PAGE_UPDATE_COUNTERS, RecordUtils::buildMetaPageUpdatePartitionDataRecord);
             put(MEMORY_RECOVERY, RecordUtils::buildMemoryRecoveryRecord);
             put(TRACKING_PAGE_DELTA, RecordUtils::buildTrackingPageDeltaRecord);
+            put(TRACKING_PAGE_REPAIR_DELTA, RecordUtils::buildTrackingPageRepairDeltaRecord);
             put(META_PAGE_UPDATE_LAST_SUCCESSFUL_SNAPSHOT_ID, RecordUtils::buildMetaPageUpdateLastSuccessfulSnapshotId);
             put(META_PAGE_UPDATE_LAST_SUCCESSFUL_FULL_SNAPSHOT_ID, RecordUtils::buildMetaPageUpdateLastSuccessfulFullSnapshotId);
             put(META_PAGE_UPDATE_NEXT_SNAPSHOT_ID, RecordUtils::buildMetaPageUpdateNextSnapshotId);
@@ -420,6 +423,11 @@ public class RecordUtils {
     }
 
     /** **/
+    public static TrackingPageRepairDeltaRecord buildTrackingPageRepairDeltaRecord() {
+        return new TrackingPageRepairDeltaRecord(1, 1);
+    }
+
+    /** **/
     public static MetaPageUpdateLastSuccessfulSnapshotId buildMetaPageUpdateLastSuccessfulSnapshotId() {
         return new MetaPageUpdateLastSuccessfulSnapshotId(1, 1, 1, 1);
     }