This is an automated email from the ASF dual-hosted git repository. ibessonov 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 277fbb2234a IGNITE-17272 Fix logical recovery of encrypted caches (#10122) 277fbb2234a is described below commit 277fbb2234a86c14f5e660ec8dfbedcee1540bd2 Author: Alexander Polovtcev <alex.polovt...@gmail.com> AuthorDate: Fri Jul 1 11:41:23 2022 +0300 IGNITE-17272 Fix logical recovery of encrypted caches (#10122) --- .../internal/pagemem/wal/record/WALRecord.java | 4 +- .../wal/serializer/RecordV2Serializer.java | 36 ++++--- .../cache/mvcc/CacheMvccTxFailoverTest.java | 4 +- .../db/IgniteLogicalRecoveryEncryptionTest.java | 114 +++++++++++++++++++++ .../wal/AbstractWalDeltaConsistencyTest.java | 4 +- .../cache/transactions/TxStateChangeEventTest.java | 4 +- .../testframework/junits/GridAbstractTest.java | 36 +++---- .../H2DynamicColumnsAbstractBasicSelfTest.java | 22 ++-- .../IgnitePdsWithIndexingCoreTestSuite.java | 2 + 9 files changed, 174 insertions(+), 52 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 fe3f1965478..c726ee24766 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 @@ -205,7 +205,7 @@ public abstract class WALRecord { MVCC_DATA_PAGE_NEW_TX_STATE_HINT_UPDATED_RECORD(51, PHYSICAL), /** Encrypted WAL-record. */ - ENCRYPTED_RECORD(52, PHYSICAL), + ENCRYPTED_RECORD(52, MIXED), /** * Ecnrypted data record. @@ -242,7 +242,7 @@ public abstract class WALRecord { OUT_OF_ORDER_UPDATE(62, LOGICAL), /** Encrypted WAL-record. */ - ENCRYPTED_RECORD_V2(63, PHYSICAL), + ENCRYPTED_RECORD_V2(63, MIXED), /** * Ecnrypted data record. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordV2Serializer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordV2Serializer.java index 35a89477e68..f2c8b7f50d5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordV2Serializer.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/serializer/RecordV2Serializer.java @@ -37,9 +37,12 @@ import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.lang.IgniteBiPredicate; import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType; +import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.ENCRYPTED_RECORD; +import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.ENCRYPTED_RECORD_V2; import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.SWITCH_SEGMENT_RECORD; import static org.apache.ignite.internal.processors.cache.persistence.wal.serializer.RecordV1Serializer.CRC_SIZE; import static org.apache.ignite.internal.processors.cache.persistence.wal.serializer.RecordV1Serializer.REC_TYPE_SIZE; +import static org.apache.ignite.internal.processors.cache.persistence.wal.serializer.RecordV1Serializer.readRecordType; /** * Record V2 serializer. @@ -72,15 +75,8 @@ public class RecordV2Serializer implements RecordSerializer { private final boolean skipPositionCheck; /** Thread-local heap byte buffer. */ - private final ThreadLocal<ByteBuffer> heapTlb = new ThreadLocal<ByteBuffer>() { - @Override protected ByteBuffer initialValue() { - ByteBuffer buf = ByteBuffer.allocate(4096); - - buf.order(GridUnsafe.NATIVE_BYTE_ORDER); - - return buf; - } - }; + private final ThreadLocal<ByteBuffer> heapTlb = + ThreadLocal.withInitial(() -> ByteBuffer.allocate(4096).order(GridUnsafe.NATIVE_BYTE_ORDER)); /** * Record type filter. @@ -107,7 +103,7 @@ public class RecordV2Serializer implements RecordSerializer { ByteBufferBackedDataInput in, WALPointer expPtr ) throws IOException, IgniteCheckedException { - WALRecord.RecordType recType = RecordV1Serializer.readRecordType(in); + RecordType recType = readRecordType(in); if (recType == SWITCH_SEGMENT_RECORD) throw new SegmentEofException("Reached end of segment", null); @@ -119,8 +115,22 @@ public class RecordV2Serializer implements RecordSerializer { ", expected pointer [idx=" + expPtr.index() + ", offset=" + expPtr.fileOffset() + "]"); } - if (recType.purpose() != WALRecord.RecordPurpose.INTERNAL - && recordFilter != null && !recordFilter.apply(recType, ptr)) { + RecordType actualType = recType; + + // In case of encrypted records we should check the type of the nested record + if (recType == ENCRYPTED_RECORD || recType == ENCRYPTED_RECORD_V2) { + in.buffer().mark(); + + // Ignore grpId (4 bytes) and record size (4 bytes) + in.skipBytes(4 + 4); + + actualType = readRecordType(in); + + in.buffer().reset(); + } + + if (actualType.purpose() != WALRecord.RecordPurpose.INTERNAL + && recordFilter != null && !recordFilter.apply(actualType, ptr)) { int toSkip = ptr.length() - REC_TYPE_SIZE - FILE_WAL_POINTER_SIZE - CRC_SIZE; assert toSkip >= 0 : "Too small saved record length: ptr=" + ptr + ", type=" + recType; @@ -245,7 +255,7 @@ public class RecordV2Serializer implements RecordSerializer { DataInput in, WALPointer expPtr, boolean skipPositionCheck, - WALRecord.RecordType type + RecordType type ) throws IgniteCheckedException, IOException { long idx = in.readLong(); int fileOff = in.readInt(); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTxFailoverTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTxFailoverTest.java index fb5d5cd8ceb..bc1275e8c70 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTxFailoverTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/mvcc/CacheMvccTxFailoverTest.java @@ -37,6 +37,7 @@ import org.apache.ignite.internal.processors.cache.persistence.wal.FileWriteAhea import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor; import org.apache.ignite.internal.util.typedef.X; import org.apache.ignite.testframework.GridTestUtils; +import org.apache.ignite.testframework.junits.GridAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.transactions.Transaction; import org.apache.ignite.transactions.TransactionConcurrency; @@ -75,9 +76,8 @@ public class CacheMvccTxFailoverTest extends GridCommonAbstractTest { /** * @return Cache configuration. */ - @SuppressWarnings("unchecked") protected CacheConfiguration<Integer, Integer> cacheConfiguration() { - return defaultCacheConfiguration() + return GridAbstractTest.<Integer, Integer>defaultCacheConfiguration() .setNearConfiguration(null) .setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL_SNAPSHOT) .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteLogicalRecoveryEncryptionTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteLogicalRecoveryEncryptionTest.java new file mode 100644 index 00000000000..9274bc58e9d --- /dev/null +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgniteLogicalRecoveryEncryptionTest.java @@ -0,0 +1,114 @@ +/* + * 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.processors.cache.persistence.db; + +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cluster.ClusterState; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.DataRegionConfiguration; +import org.apache.ignite.configuration.DataStorageConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteEx; +import org.apache.ignite.internal.encryption.AbstractEncryptionTest; +import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager; +import org.apache.ignite.spi.encryption.keystore.KeystoreEncryptionSpi; +import org.apache.ignite.testframework.junits.GridAbstractTest; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; +import org.junit.Test; + +/** + * Class containing tests for logical recovery of encrypted caches. + */ +public class IgniteLogicalRecoveryEncryptionTest extends GridCommonAbstractTest { + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { + KeystoreEncryptionSpi encSpi = new KeystoreEncryptionSpi(); + + encSpi.setKeyStorePath(AbstractEncryptionTest.KEYSTORE_PATH); + encSpi.setKeyStorePassword(AbstractEncryptionTest.KEYSTORE_PASSWORD.toCharArray()); + + return super.getConfiguration(igniteInstanceName) + .setEncryptionSpi(encSpi) + .setDataStorageConfiguration(new DataStorageConfiguration() + .setDefaultDataRegionConfiguration(new DataRegionConfiguration() + .setPersistenceEnabled(true) + )); + } + + /** {@inheritDoc} */ + @Override protected void beforeTest() throws Exception { + stopAllGrids(); + + cleanPersistenceDir(); + } + + /** {@inheritDoc} */ + @Override protected void afterTest() throws Exception { + stopAllGrids(); + + cleanPersistenceDir(); + } + + /** + * Tests a scenario that partition states of encrypted caches are successfully restored by logical recovery. + */ + @Test + public void testRecoverPartitionStates() throws Exception { + IgniteEx ignite = startTestGrid(); + + // Disable checkpoints to force logical recovery + GridCacheDatabaseSharedManager dbMgr = (GridCacheDatabaseSharedManager)ignite + .context() + .cache() + .context() + .database(); + + dbMgr.enableCheckpoints(false).get(); + + // Create a dynamic cache to ensure that partition states get restored (static caches may skip that step) + CacheConfiguration<Integer, Integer> cacheCfg = GridAbstractTest.<Integer, Integer>defaultCacheConfiguration() + .setEncryptionEnabled(true); + + IgniteCache<Integer, Integer> cache = ignite.createCache(cacheCfg); + + for (int i = 0; i < 100; i++) + cache.put(i, i); + + stopAllGrids(); + + ignite = startTestGrid(); + + cache = ignite.cache(DEFAULT_CACHE_NAME); + + for (int i = 0; i < 100; i++) + assertEquals(i, cache.get(i).intValue()); + } + + /** + * Creates a cluster of two nodes. + */ + private IgniteEx startTestGrid() throws Exception { + IgniteEx ignite = startGrids(2); + + ignite.cluster().state(ClusterState.ACTIVE); + + awaitPartitionMapExchange(); + + return ignite; + } +} diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/AbstractWalDeltaConsistencyTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/AbstractWalDeltaConsistencyTest.java index 1d5b345896b..dc6894e85bc 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/AbstractWalDeltaConsistencyTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/AbstractWalDeltaConsistencyTest.java @@ -27,6 +27,7 @@ import org.apache.ignite.failure.FailureHandler; import org.apache.ignite.failure.FailureType; import org.apache.ignite.failure.StopNodeFailureHandler; import org.apache.ignite.internal.processors.cache.persistence.wal.memtracker.PageMemoryTrackerConfiguration; +import org.apache.ignite.testframework.junits.GridAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; /** @@ -51,9 +52,8 @@ public abstract class AbstractWalDeltaConsistencyTest extends GridCommonAbstract * @param name Cache name. * @return Cache configuration. */ - @SuppressWarnings("unchecked") protected <K, V> CacheConfiguration<K, V> cacheConfiguration(String name) { - return defaultCacheConfiguration().setName(name); + return GridAbstractTest.<K, V>defaultCacheConfiguration().setName(name); } /** diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java index 3761594f75c..e8eae496b49 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/transactions/TxStateChangeEventTest.java @@ -31,6 +31,7 @@ import org.apache.ignite.internal.IgniteInterruptedCheckedException; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.testframework.MvccFeatureChecker; +import org.apache.ignite.testframework.junits.GridAbstractTest; import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; import org.apache.ignite.transactions.Transaction; import org.apache.ignite.transactions.TransactionConcurrency; @@ -131,9 +132,8 @@ public class TxStateChangeEventTest extends GridCommonAbstractTest { } /** */ - @SuppressWarnings("unchecked") private CacheConfiguration<Integer, Integer> getCacheConfig() { - return defaultCacheConfiguration().setBackups(2); + return GridAbstractTest.<Integer, Integer>defaultCacheConfiguration().setBackups(2); } /** diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java index dfeb9c2c1f9..70144a12f41 100755 --- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java +++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/GridAbstractTest.java @@ -199,10 +199,10 @@ public abstract class GridAbstractTest extends JUnitAssertAware { private static final int DFLT_TOP_WAIT_TIMEOUT = 2000; /** */ - private static final transient Map<Class<?>, IgniteTestResources> tests = new ConcurrentHashMap<>(); + private static final Map<Class<?>, IgniteTestResources> tests = new ConcurrentHashMap<>(); /** Loggers with changed log level for test's purposes. */ - private static final transient Map<Logger, Level> changedLevels = new ConcurrentHashMap<>(); + private static final Map<Logger, Level> changedLevels = new ConcurrentHashMap<>(); /** */ private static final MemoryMXBean memoryMxBean = ManagementFactory.getMemoryMXBean(); @@ -258,16 +258,16 @@ public abstract class GridAbstractTest extends JUnitAssertAware { .around(runRule); /** */ - private static transient boolean startGrid; + private static boolean startGrid; /** */ - protected static transient IgniteLogger log; + protected static IgniteLogger log; /** */ - private static transient ClassLoader clsLdr; + private static ClassLoader clsLdr; /** */ - private static transient boolean stopGridErr; + private static boolean stopGridErr; /** Timestamp for tests. */ private static long ts = System.currentTimeMillis(); @@ -345,8 +345,8 @@ public abstract class GridAbstractTest extends JUnitAssertAware { */ protected void afterTest() throws Exception { try { - for (Logger logger : changedLevels.keySet()) - logger.setLevel(changedLevels.get(logger)); + for (Map.Entry<Logger, Level> entry : changedLevels.entrySet()) + entry.getKey().setLevel(entry.getValue()); } finally { changedLevels.clear(); @@ -2112,9 +2112,8 @@ public abstract class GridAbstractTest extends JUnitAssertAware { /** * @return New cache configuration with modified defaults. */ - @SuppressWarnings("unchecked") - public static CacheConfiguration defaultCacheConfiguration() { - CacheConfiguration cfg = new CacheConfiguration(DEFAULT_CACHE_NAME); + public static <K, V> CacheConfiguration<K, V> defaultCacheConfiguration() { + CacheConfiguration<K, V> cfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME); if (MvccFeatureChecker.forcedMvcc()) cfg.setAtomicityMode(TRANSACTIONAL_SNAPSHOT); @@ -2403,13 +2402,8 @@ public abstract class GridAbstractTest extends JUnitAssertAware { /** * @return Test resources. */ - private synchronized IgniteTestResources getIgniteTestResources() throws IgniteCheckedException { - IgniteTestResources rsrcs = tests.get(getClass()); - - if (rsrcs == null) - tests.put(getClass(), rsrcs = new IgniteTestResources()); - - return rsrcs; + private IgniteTestResources getIgniteTestResources() { + return tests.computeIfAbsent(getClass(), cls -> new IgniteTestResources()); } /** @@ -2768,7 +2762,7 @@ public abstract class GridAbstractTest extends JUnitAssertAware { /** * */ - private static interface WriteReplaceOwner { + private interface WriteReplaceOwner { /** * */ @@ -2865,7 +2859,7 @@ public abstract class GridAbstractTest extends JUnitAssertAware { } /** */ - public static interface TestIgniteCallable<R> extends Serializable { + public interface TestIgniteCallable<R> extends Serializable { /** * @param ignite Ignite. */ @@ -2922,7 +2916,7 @@ public abstract class GridAbstractTest extends JUnitAssertAware { } /** */ - public static interface TestCacheCallable<K, V, R> extends Serializable { + public interface TestCacheCallable<K, V, R> extends Serializable { /** * @param ignite Ignite. * @param cache Cache. diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java index f0953e2fb47..797a8383ed8 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicColumnsAbstractBasicSelfTest.java @@ -32,6 +32,7 @@ import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.processors.query.QueryField; import org.apache.ignite.internal.processors.query.QueryUtils; import org.apache.ignite.testframework.config.GridTestProperties; +import org.apache.ignite.testframework.junits.GridAbstractTest; import org.h2.jdbc.JdbcSQLException; import org.junit.Assert; import org.junit.Test; @@ -164,7 +165,6 @@ public abstract class H2DynamicColumnsAbstractBasicSelfTest extends DynamicColum } /** */ - @SuppressWarnings("unchecked") @Test public void testComplexOperations() { IgniteCache<BinaryObject, BinaryObject> cache = ignite(nodeIndex()) @@ -178,8 +178,10 @@ public abstract class H2DynamicColumnsAbstractBasicSelfTest extends DynamicColum run(cache, "CREATE INDEX pidx1 ON Person(name, city desc)"); - CacheConfiguration<Integer, City> ccfg = defaultCacheConfiguration().setName("City") - .setIndexedTypes(Integer.class, City.class).setSqlSchema(QueryUtils.DFLT_SCHEMA); + CacheConfiguration<Integer, City> ccfg = GridAbstractTest.<Integer, City>defaultCacheConfiguration() + .setName("City") + .setIndexedTypes(Integer.class, City.class) + .setSqlSchema(QueryUtils.DFLT_SCHEMA); ccfg.getQueryEntities().iterator().next().setKeyFieldName("id"); @@ -252,10 +254,10 @@ public abstract class H2DynamicColumnsAbstractBasicSelfTest extends DynamicColum /** * Test that we can add columns dynamically to tables associated with non dynamic caches storing user types as well. */ - @SuppressWarnings("unchecked") @Test public void testAddColumnToNonDynamicCacheWithRealValueType() throws SQLException { - CacheConfiguration<Integer, City> ccfg = defaultCacheConfiguration().setName("City") + CacheConfiguration<Integer, City> ccfg = GridAbstractTest.<Integer, City>defaultCacheConfiguration() + .setName("City") .setIndexedTypes(Integer.class, City.class); IgniteCache<Integer, ?> cache = ignite(nodeIndex()).getOrCreateCache(ccfg); @@ -299,11 +301,11 @@ public abstract class H2DynamicColumnsAbstractBasicSelfTest extends DynamicColum * * @throws SQLException If failed. */ - @SuppressWarnings("unchecked") @Test public void testAddColumnUUID() throws SQLException { - CacheConfiguration<Integer, Object> ccfg = defaultCacheConfiguration().setName("GuidTest") - .setIndexedTypes(Integer.class, GuidTest.class); + CacheConfiguration<Integer, Object> ccfg = GridAbstractTest.<Integer, Object>defaultCacheConfiguration() + .setName("GuidTest") + .setIndexedTypes(Integer.class, GuidTest.class); Random rnd = new Random(); @@ -674,10 +676,10 @@ public abstract class H2DynamicColumnsAbstractBasicSelfTest extends DynamicColum * * @throws SQLException if failed. */ - @SuppressWarnings("unchecked") @Test public void testDropColumnFromNonDynamicCacheWithRealValueType() throws SQLException { - CacheConfiguration<Integer, City> ccfg = defaultCacheConfiguration().setName("City") + CacheConfiguration<Integer, City> ccfg = GridAbstractTest.<Integer, City>defaultCacheConfiguration() + .setName("City") .setIndexedTypes(Integer.class, City.class); IgniteCache<Integer, ?> cache = ignite(nodeIndex()).getOrCreateCache(ccfg); diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java index c84a63a1b1d..7790acd7015 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgnitePdsWithIndexingCoreTestSuite.java @@ -30,6 +30,7 @@ import org.apache.ignite.internal.processors.cache.persistence.IgnitePersistentS import org.apache.ignite.internal.processors.cache.persistence.PersistenceDirectoryWarningLoggingTest; import org.apache.ignite.internal.processors.cache.persistence.RestorePartitionStateDuringCheckpointTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgniteCacheGroupsWithRestartsTest; +import org.apache.ignite.internal.processors.cache.persistence.db.IgniteLogicalRecoveryEncryptionTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgniteLogicalRecoveryTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgniteLogicalRecoveryWithParamsTest; import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsMultiNodePutGetRestartTest; @@ -98,6 +99,7 @@ import org.junit.runners.Suite; IgniteLogicalRecoveryTest.class, IgniteLogicalRecoveryWithParamsTest.class, + IgniteLogicalRecoveryEncryptionTest.class, IgniteSequentialNodeCrashRecoveryTest.class,