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);
}
/**