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 <tkalkir...@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 <ilya.kasnach...@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); } /**