You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by il...@apache.org on 2020/12/17 16:04:07 UTC

[ignite] branch master updated: IGNITE-13847 GridEncryptionManager#onWalSegmentRemoved should be invoked async - Fixes #8576.

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

ilyak 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 6f385d5  IGNITE-13847 GridEncryptionManager#onWalSegmentRemoved should be invoked async - Fixes #8576.
6f385d5 is described below

commit 6f385d5fe9cdb05a12ca39c23e12d94aeffe3f0a
Author: Kirill Tkalenko <tk...@yandex.ru>
AuthorDate: Thu Dec 17 19:02:51 2020 +0300

    IGNITE-13847 GridEncryptionManager#onWalSegmentRemoved should be invoked async - Fixes #8576.
    
    Signed-off-by: Ilya Kasnacheev <il...@gmail.com>
---
 .../managers/encryption/CacheGroupEncryptionKeys.java     |  9 +++++++++
 .../managers/encryption/GridEncryptionManager.java        | 10 ++++++++++
 .../internal/encryption/AbstractEncryptionTest.java       | 15 +++++++++++++++
 .../internal/encryption/CacheGroupKeyChangeTest.java      |  6 +++---
 .../internal/encryption/CacheGroupReencryptionTest.java   |  4 ++--
 5 files changed, 39 insertions(+), 5 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/CacheGroupEncryptionKeys.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/CacheGroupEncryptionKeys.java
index 03b884b..5f44f0e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/CacheGroupEncryptionKeys.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/CacheGroupEncryptionKeys.java
@@ -323,6 +323,15 @@ class CacheGroupEncryptionKeys {
     }
 
     /**
+     * @return {@code True} if any key reserved for WAL reading can be removed.
+     */
+    boolean isReleaseWalKeysRequired(long walIdx) {
+        Iterator<TrackedWalSegment> iter = trackedWalSegments.iterator();
+
+        return iter.hasNext() && iter.next().idx <= walIdx;
+    }
+
+    /**
      * Remove all of the segments that are not greater than the specified index.
      *
      * @param walIdx WAL segment index.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
index d0d467f..592af7e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/encryption/GridEncryptionManager.java
@@ -924,6 +924,16 @@ public class GridEncryptionManager extends GridManagerAdapter<EncryptionSpi> imp
      * @param segmentIdx WAL segment index.
      */
     public void onWalSegmentRemoved(long segmentIdx) {
+        if (grpKeys.isReleaseWalKeysRequired(segmentIdx))
+            ctx.getSystemExecutorService().submit(() -> releaseWalKeys(segmentIdx));
+    }
+
+    /**
+     * Cleanup keys reserved for WAL reading.
+     *
+     * @param segmentIdx WAL segment index.
+     */
+    private void releaseWalKeys(long segmentIdx) {
         withMasterKeyChangeReadLock(() -> {
             synchronized (metaStorageMux) {
                 Map<Integer, Set<Integer>> rmvKeys = grpKeys.releaseWalKeys(segmentIdx);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/encryption/AbstractEncryptionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/encryption/AbstractEncryptionTest.java
index 8c66afe..ed3b9d4 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/encryption/AbstractEncryptionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/encryption/AbstractEncryptionTest.java
@@ -69,6 +69,7 @@ import static org.apache.ignite.configuration.WALMode.FSYNC;
 import static org.apache.ignite.internal.pagemem.PageIdAllocator.INDEX_PARTITION;
 import static org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi.CIPHER_ALGO;
 import static org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi.DEFAULT_MASTER_KEY_NAME;
+import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
 
 /**
  * Abstract encryption test.
@@ -345,6 +346,20 @@ public abstract class AbstractEncryptionTest extends GridCommonAbstractTest {
     }
 
     /**
+     * @param node Ignite node.
+     * @param grpId Cache group ID.
+     * @param keysCnt Expected keys count.
+     */
+    protected void checkKeysCount(IgniteEx node, int grpId, int keysCnt, long timeout)
+        throws IgniteInterruptedCheckedException {
+        GridEncryptionManager encMgr = node.context().encryption();
+
+        waitForCondition(() -> encMgr.groupKeyIds(grpId).size() == keysCnt, timeout);
+
+        assertEquals(keysCnt, encMgr.groupKeyIds(grpId).size());
+    }
+
+    /**
      * Ensures that all pages of page store have expected encryption key identifier.
      *
      * @param grpId Cache group ID.
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupKeyChangeTest.java b/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupKeyChangeTest.java
index 810e05d..fd99d95 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupKeyChangeTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupKeyChangeTest.java
@@ -531,7 +531,7 @@ public class CacheGroupKeyChangeTest extends AbstractEncryptionTest {
         }
 
         // Make sure the previous key has been removed.
-        assertEquals(1, encrMgr0.groupKeyIds(grpId).size());
+        checkKeysCount(node0, grpId, 1, MAX_AWAIT_MILLIS);
         assertEquals(encrMgr1.groupKeyIds(grpId), encrMgr0.groupKeyIds(grpId));
     }
 
@@ -930,8 +930,8 @@ public class CacheGroupKeyChangeTest extends AbstractEncryptionTest {
             encrMgr1.onWalSegmentRemoved(maxWalIdx);
         }
 
-        assertEquals(1, encrMgr1.groupKeyIds(grpId).size());
-        assertEquals(encrMgr0.groupKeyIds(grpId), encrMgr1.groupKeyIds(grpId));
+        checkKeysCount(grid(GRID_1), grpId, 1, MAX_AWAIT_MILLIS);
+        checkKeysCount(grid(GRID_0), grpId, 1, MAX_AWAIT_MILLIS);
 
         startGrid(GRID_2);
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupReencryptionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupReencryptionTest.java
index 19c8351..b464373 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupReencryptionTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/encryption/CacheGroupReencryptionTest.java
@@ -518,12 +518,12 @@ public class CacheGroupReencryptionTest extends AbstractEncryptionTest {
         for (long segment = startIdx1; segment <= endIdx1; segment++)
             grid(GRID_0).context().encryption().onWalSegmentRemoved(segment);
 
-        assertEquals(1, grid(GRID_0).context().encryption().groupKeyIds(grpId).size());
+        checkKeysCount(grid(GRID_0), grpId, 1, MAX_AWAIT_MILLIS);
 
         for (long segment = startIdx2; segment <= endIdx2; segment++)
             grid(GRID_1).context().encryption().onWalSegmentRemoved(segment);
 
-        assertEquals(1, grid(GRID_1).context().encryption().groupKeyIds(grpId).size());
+        checkKeysCount(grid(GRID_1), grpId, 1, MAX_AWAIT_MILLIS);
     }
 
     /**