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

sdanilov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 9641a01366 IGNITE-18032 Do not implement AutoCloseable on classes 
instances of which are not meant to be used in try-with-resources (#1291)
9641a01366 is described below

commit 9641a013665e7012941b2362e9cba64fac4ba0e6
Author: Roman Puchkovskiy <[email protected]>
AuthorDate: Fri Nov 4 22:43:35 2022 +0400

    IGNITE-18032 Do not implement AutoCloseable on classes instances of which 
are not meant to be used in try-with-resources (#1291)
---
 .../ignite/client/fakes/FakeInternalTable.java     |   2 +-
 .../management/raft/ItCmgRaftServiceTest.java      |   2 +-
 .../management/ClusterManagementGroupManager.java  |   2 +-
 .../management/raft/ClusterStateStorage.java       |   9 +-
 .../raft/RocksDbClusterStateStorage.java           |   4 +-
 .../cluster/management/raft/ValidationManager.java |   3 +-
 .../AbstractClusterStateStorageManagerTest.java    |   2 +-
 .../raft/AbstractClusterStateStorageTest.java      |   2 +-
 .../management/raft/CmgRaftGroupListenerTest.java  |   2 +-
 .../management/raft/TestClusterStateStorage.java   |   2 +-
 modules/configuration/build.gradle                 |   1 +
 .../configuration/ConfigurationChanger.java        |   2 +-
 .../storage/ConfigurationStorage.java              |   9 +-
 .../storage/TestConfigurationStorage.java          |   2 +-
 modules/core/build.gradle                          |   1 +
 modules/core/pom.xml                               |   6 +
 .../ignite/internal/close/ManuallyCloseable.java   |  39 ++++
 .../ItMetaStorageServicePersistenceTest.java       |   2 +-
 .../metastorage/server/KeyValueStorage.java        |   9 +-
 .../server/persistence/RocksDbKeyValueStorage.java |   5 +-
 .../server/raft/MetaStorageListener.java           |   2 +-
 .../server/AbstractKeyValueStorageTest.java        |   2 +-
 .../internal/metastorage/MetaStorageManager.java   |   2 +-
 .../internal/pagememory/util/PageLockListener.java |   6 +-
 modules/raft/build.gradle                          |   1 +
 modules/raft/pom.xml                               |   5 +
 .../internal/raft/storage/LogStorageFactory.java   |   9 +-
 .../storage/impl/DefaultLogStorageFactory.java     |   6 +-
 .../raft/storage/impl/LocalLogStorageFactory.java  |   2 +-
 .../storage/impl/VolatileLogStorageFactory.java    |   3 +-
 .../impl/RocksDbSharedLogStorageAdvancedTest.java  |   2 +-
 .../storage/impl/RocksDbSharedLogStorageTest.java  |   2 +-
 .../jraft/storage/impl/BaseLogStorageTest.java     |   2 +-
 modules/rocksdb-common/build.gradle                |   3 +
 modules/rocksdb-common/pom.xml                     |  24 ++
 .../apache/ignite/internal/rocksdb/RocksUtils.java |  45 ++++
 .../ignite/internal/rocksdb/RocksUtilsTest.java    | 113 ++++++++++
 .../storage/DistributedConfigurationStorage.java   |   2 +-
 .../storage/LocalConfigurationStorage.java         |   2 +-
 .../DistributedConfigurationCatchUpTest.java       |  17 +-
 .../DistributedConfigurationStorageTest.java       |   5 +-
 .../internal/sql/engine/exec/RuntimeIndex.java     |  10 +-
 .../sql/engine/exec/rel/IndexSpoolNode.java        |   2 +-
 .../internal/storage/MvPartitionStorage.java       |   9 +-
 .../storage/AbstractMvPartitionStorageTest.java    |   4 +-
 .../storage/impl/TestMvPartitionStorage.java       |   2 +-
 .../pagememory/AbstractPageMemoryTableStorage.java |   2 +-
 ...PersistentPageMemoryMvPartitionStorageTest.java |   2 +-
 .../VolatilePageMemoryMvPartitionStorageTest.java  |   2 +-
 .../storage/rocksdb/RocksDbMvPartitionStorage.java |   4 +-
 .../storage/rocksdb/RocksDbTableStorage.java       |  16 +-
 .../internal/storage/rocksdb/SortedIndex.java      |   5 +-
 .../rocksdb/RocksDbMvPartitionStorageTest.java     |   2 +-
 .../ignite/internal/table/InternalTable.java       |   9 +-
 .../distributed/raft/PartitionDataStorage.java     |   9 +-
 .../table/distributed/raft/PartitionListener.java  |   2 +-
 .../SnapshotAwarePartitionDataStorage.java         |   2 +-
 .../distributed/storage/InternalTableImpl.java     |   2 +-
 .../SnapshotAwarePartitionDataStorageTest.java     |   2 +-
 .../distributed/TestPartitionDataStorage.java      |   2 +-
 .../internal/tx/storage/state/TxStateStorage.java  |   9 +-
 .../tx/storage/state/TxStateTableStorage.java      |   9 +-
 .../state/rocksdb/TxStateRocksDbStorage.java       |   9 +-
 .../state/rocksdb/TxStateRocksDbTableStorage.java  |   8 +-
 .../storage/state/TxStateStorageAbstractTest.java  | 249 +++++++++++----------
 .../tx/storage/state/test/TestTxStateStorage.java  |   4 +-
 .../state/test/TestTxStateTableStorage.java        |   6 +-
 .../ItPersistencePropertiesVaultServiceTest.java   |  30 ++-
 .../apache/ignite/internal/vault/VaultManager.java |   2 +-
 .../apache/ignite/internal/vault/VaultService.java |   9 +-
 .../vault/persistence/PersistentVaultService.java  |   5 +-
 .../ignite/internal/vault/VaultServiceTest.java    |   2 +-
 72 files changed, 581 insertions(+), 210 deletions(-)

diff --git 
a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
 
b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
index 654f4840ef..b1fe700605 100644
--- 
a/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
+++ 
b/modules/client/src/test/java/org/apache/ignite/client/fakes/FakeInternalTable.java
@@ -414,7 +414,7 @@ public class FakeInternalTable implements InternalTable {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
         // No-op.
     }
 
diff --git 
a/modules/cluster-management/src/integrationTest/java/org/apache/ignite/internal/cluster/management/raft/ItCmgRaftServiceTest.java
 
b/modules/cluster-management/src/integrationTest/java/org/apache/ignite/internal/cluster/management/raft/ItCmgRaftServiceTest.java
index c62e079067..910b5386c2 100644
--- 
a/modules/cluster-management/src/integrationTest/java/org/apache/ignite/internal/cluster/management/raft/ItCmgRaftServiceTest.java
+++ 
b/modules/cluster-management/src/integrationTest/java/org/apache/ignite/internal/cluster/management/raft/ItCmgRaftServiceTest.java
@@ -133,7 +133,7 @@ public class ItCmgRaftServiceTest {
             try {
                 IgniteUtils.closeAll(
                         raftManager::stop,
-                        raftStorage,
+                        raftStorage::close,
                         clusterService::stop
                 );
             } catch (Exception e) {
diff --git 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
index 040928be05..5153251113 100644
--- 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
+++ 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/ClusterManagementGroupManager.java
@@ -616,7 +616,7 @@ public class ClusterManagementGroupManager implements 
IgniteComponent {
 
         IgniteUtils.closeAll(
                 () -> raftManager.stopRaftGroup(INSTANCE),
-                clusterStateStorage
+                clusterStateStorage::close
         );
 
         // Fail the future to unblock dependent operations
diff --git 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ClusterStateStorage.java
 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ClusterStateStorage.java
index 01e6ae31c1..fe000a1a51 100644
--- 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ClusterStateStorage.java
+++ 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ClusterStateStorage.java
@@ -21,13 +21,14 @@ import java.nio.file.Path;
 import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
 import java.util.function.BiFunction;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.util.Cursor;
 import org.jetbrains.annotations.Nullable;
 
 /**
  * Storage for the CMG Raft service.
  */
-public interface ClusterStateStorage extends AutoCloseable {
+public interface ClusterStateStorage extends ManuallyCloseable {
     /**
      * Starts the storage.
      */
@@ -104,6 +105,12 @@ public interface ClusterStateStorage extends AutoCloseable 
{
      */
     void restoreSnapshot(Path snapshotPath);
 
+    /**
+     * Closes this storage.
+     */
+    @Override
+    void close();
+
     /**
      * Removes all data from the storage and frees all resources.
      */
diff --git 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorage.java
 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorage.java
index e606a369c5..dbd797dbd9 100644
--- 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorage.java
+++ 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/RocksDbClusterStateStorage.java
@@ -209,10 +209,10 @@ public class RocksDbClusterStateStorage implements 
ClusterStateStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         IgniteUtils.shutdownAndAwaitTermination(snapshotExecutor, 10, 
TimeUnit.SECONDS);
 
-        IgniteUtils.closeAll(options, db);
+        RocksUtils.closeAll(options, db);
 
         db = null;
 
diff --git 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ValidationManager.java
 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ValidationManager.java
index e2802e3903..02d638dee3 100644
--- 
a/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ValidationManager.java
+++ 
b/modules/cluster-management/src/main/java/org/apache/ignite/internal/cluster/management/raft/ValidationManager.java
@@ -23,6 +23,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.cluster.management.ClusterState;
 import org.apache.ignite.internal.cluster.management.ClusterTag;
 import 
org.apache.ignite.internal.cluster.management.raft.commands.InitCmgStateCommand;
@@ -43,7 +44,7 @@ import org.jetbrains.annotations.Nullable;
  * After the node finishes local recovery procedures, it sends a {@link 
JoinReadyCommand} containing the validation
  * token. If the local token and the received token match, the node will be 
added to the logical topology and the token will be invalidated.
  */
-class ValidationManager implements AutoCloseable {
+class ValidationManager implements ManuallyCloseable {
     private static final IgniteLogger LOG = 
Loggers.forClass(CmgRaftGroupListener.class);
 
     private final ScheduledExecutorService executor =
diff --git 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageManagerTest.java
 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageManagerTest.java
index f46d67f41c..63e695b37d 100644
--- 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageManagerTest.java
+++ 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageManagerTest.java
@@ -68,7 +68,7 @@ public abstract class AbstractClusterStateStorageManagerTest {
     }
 
     @AfterEach
-    void tearDown() throws Exception {
+    void tearDown() {
         storage.close();
     }
 
diff --git 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageTest.java
 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageTest.java
index a5cc68014e..b963cd3a6c 100644
--- 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageTest.java
+++ 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/AbstractClusterStateStorageTest.java
@@ -65,7 +65,7 @@ public abstract class AbstractClusterStateStorageTest {
     }
 
     @AfterEach
-    void tearDown() throws Exception {
+    void tearDown() {
         storage.close();
     }
 
diff --git 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListenerTest.java
 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListenerTest.java
index 7e403a1c1d..802ef03497 100644
--- 
a/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListenerTest.java
+++ 
b/modules/cluster-management/src/test/java/org/apache/ignite/internal/cluster/management/raft/CmgRaftGroupListenerTest.java
@@ -54,7 +54,7 @@ public class CmgRaftGroupListenerTest {
     }
 
     @AfterEach
-    void tearDown() throws Exception {
+    void tearDown() {
         storage.close();
     }
 
diff --git 
a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/raft/TestClusterStateStorage.java
 
b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/raft/TestClusterStateStorage.java
index c0851c522b..678081ba5d 100644
--- 
a/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/raft/TestClusterStateStorage.java
+++ 
b/modules/cluster-management/src/testFixtures/java/org/apache/ignite/internal/cluster/management/raft/TestClusterStateStorage.java
@@ -203,7 +203,7 @@ public class TestClusterStateStorage implements 
ClusterStateStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         isStarted = false;
     }
 }
diff --git a/modules/configuration/build.gradle 
b/modules/configuration/build.gradle
index 7641349c64..897b4efbfb 100644
--- a/modules/configuration/build.gradle
+++ b/modules/configuration/build.gradle
@@ -52,6 +52,7 @@ dependencies {
     testImplementation libs.micronaut.http.server.netty
 
     testFixturesAnnotationProcessor 
project(':ignite-configuration-annotation-processor')
+    testFixturesImplementation project(':ignite-core')
     testFixturesImplementation libs.jetbrains.annotations
     testFixturesImplementation libs.junit5.api
     testFixturesImplementation libs.mockito.core
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
index ea943fe82d..8c6c948f71 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationChanger.java
@@ -440,7 +440,7 @@ public abstract class ConfigurationChanger implements 
DynamicConfigurationChange
     }
 
     /** Stop component. */
-    public void stop() throws Exception {
+    public void stop() {
         IgniteUtils.shutdownAndAwaitTermination(pool, 10, TimeUnit.SECONDS);
 
         StorageRoots roots = storageRoots;
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
index 1cc57cf98c..e31f7d4e33 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/storage/ConfigurationStorage.java
@@ -21,11 +21,12 @@ import java.io.Serializable;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 
 /**
  * Common interface for configuration storage.
  */
-public interface ConfigurationStorage extends AutoCloseable {
+public interface ConfigurationStorage extends ManuallyCloseable {
     /**
      * Reads all configuration values and current storage version during the 
recovery phase.
      *
@@ -88,4 +89,10 @@ public interface ConfigurationStorage extends AutoCloseable {
      * @return A future that will be completed when revisions are written to 
the storage.
      */
     CompletableFuture<Void> writeConfigurationRevision(long prevRevision, long 
currentRevision);
+
+    /**
+     * Closes the storage.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
index febc9385fa..997026312c 100644
--- 
a/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
+++ 
b/modules/configuration/src/testFixtures/java/org/apache/ignite/internal/configuration/storage/TestConfigurationStorage.java
@@ -58,7 +58,7 @@ public class TestConfigurationStorage implements 
ConfigurationStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         // No-op.
     }
 
diff --git a/modules/core/build.gradle b/modules/core/build.gradle
index 25d2bf9ded..a0b667955d 100644
--- a/modules/core/build.gradle
+++ b/modules/core/build.gradle
@@ -33,6 +33,7 @@ dependencies {
     testImplementation libs.junit.testkit
     testImplementation libs.mockito.core
     testImplementation libs.mockito.inline
+    testImplementation libs.mockito.junit
 
     testFixturesImplementation libs.hamcrest.core
     testFixturesImplementation libs.mockito.core
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index 140ab38220..04a85f659e 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -80,6 +80,12 @@
             <artifactId>mockito-inline</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+          <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/close/ManuallyCloseable.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/close/ManuallyCloseable.java
new file mode 100644
index 0000000000..ca289d50ae
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/close/ManuallyCloseable.java
@@ -0,0 +1,39 @@
+/*
+ * 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.close;
+
+/**
+ * Represents something that must be eventually closed. It is different from 
{@link AutoCloseable} which is for being
+ * used in try-with-resources; IDEs treat any usage of an AutoCloseable 
outside of a try-with-resources block as a suspicious
+ * and issue a warning, so it becomes a drag to work with code that uses 
AutoCloseable for classes which instances
+ * are used with patterns different from the try-with-resources pattern.
+ *
+ * <p>The main reason of this interface appearance was the desire to mark 
'must-be-eventually-closed' types so that
+ * we don't forget closing their instances.
+ *
+ * <p>Subinterfaces and classes implementing this interface should declare a 
narrower {@code throws} declaration (either
+ * having concrete subclasses of {@link Exception} or declaring no exceptions 
at all).
+ */
+public interface ManuallyCloseable {
+    /**
+     * Closes the object.
+     *
+     * @throws Exception If something fails during the closure.
+     */
+    void close() throws Exception;
+}
diff --git 
a/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ItMetaStorageServicePersistenceTest.java
 
b/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ItMetaStorageServicePersistenceTest.java
index 7b1bb1cf88..33396b42b7 100644
--- 
a/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ItMetaStorageServicePersistenceTest.java
+++ 
b/modules/metastorage-client/src/integrationTest/java/org/apache/ignite/internal/metastorage/client/ItMetaStorageServicePersistenceTest.java
@@ -56,7 +56,7 @@ public class ItMetaStorageServicePersistenceTest extends 
ItAbstractListenerSnaps
 
     /** After each. */
     @AfterEach
-    void tearDown() throws Exception {
+    void tearDown() {
         if (storage != null) {
             storage.close();
         }
diff --git 
a/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
 
b/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
index 00c0045a48..41154a601c 100644
--- 
a/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
+++ 
b/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/KeyValueStorage.java
@@ -21,6 +21,7 @@ import java.nio.file.Path;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.util.Cursor;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -28,7 +29,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Defines key/value storage interface.
  */
-public interface KeyValueStorage extends AutoCloseable {
+public interface KeyValueStorage extends ManuallyCloseable {
     /**
      * Starts the given storage, allocating the necessary resources.
      */
@@ -237,4 +238,10 @@ public interface KeyValueStorage extends AutoCloseable {
      * @param snapshotPath Path to the snapshot's directory.
      */
     void restoreSnapshot(Path snapshotPath);
+
+    /**
+     * Closes the storage.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
 
b/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
index 21873d6e7c..027ed2621f 100644
--- 
a/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
+++ 
b/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java
@@ -64,6 +64,7 @@ import org.apache.ignite.internal.metastorage.server.Value;
 import org.apache.ignite.internal.metastorage.server.WatchEvent;
 import org.apache.ignite.internal.rocksdb.ColumnFamily;
 import org.apache.ignite.internal.rocksdb.RocksBiPredicate;
+import org.apache.ignite.internal.rocksdb.RocksUtils;
 import org.apache.ignite.internal.rocksdb.snapshot.RocksSnapshotManager;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -226,10 +227,10 @@ public class RocksDbKeyValueStorage implements 
KeyValueStorage {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
         IgniteUtils.shutdownAndAwaitTermination(snapshotExecutor, 10, 
TimeUnit.SECONDS);
 
-        IgniteUtils.closeAll(db, options);
+        RocksUtils.closeAll(db, options);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
 
b/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
index 6bbebb81ea..d25169f0d2 100644
--- 
a/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
+++ 
b/modules/metastorage-server/src/main/java/org/apache/ignite/internal/metastorage/server/raft/MetaStorageListener.java
@@ -418,7 +418,7 @@ public class MetaStorageListener implements 
RaftGroupListener {
     public void onShutdown() {
         try {
             storage.close();
-        } catch (Exception e) {
+        } catch (RuntimeException e) {
             throw new MetaStorageException(CLOSING_STORAGE_ERR, "Failed to 
close storage: " + e.getMessage(), e);
         }
     }
diff --git 
a/modules/metastorage-server/src/test/java/org/apache/ignite/internal/metastorage/server/AbstractKeyValueStorageTest.java
 
b/modules/metastorage-server/src/test/java/org/apache/ignite/internal/metastorage/server/AbstractKeyValueStorageTest.java
index afbedaa42a..d08af4c177 100644
--- 
a/modules/metastorage-server/src/test/java/org/apache/ignite/internal/metastorage/server/AbstractKeyValueStorageTest.java
+++ 
b/modules/metastorage-server/src/test/java/org/apache/ignite/internal/metastorage/server/AbstractKeyValueStorageTest.java
@@ -63,7 +63,7 @@ public abstract class AbstractKeyValueStorageTest {
      * After each.
      */
     @AfterEach
-    void tearDown() throws Exception {
+    void tearDown() {
         storage.close();
     }
 
diff --git 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
index aaba0e1a5b..f81007d89c 100644
--- 
a/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
+++ 
b/modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/MetaStorageManager.java
@@ -227,7 +227,7 @@ public class MetaStorageManager implements IgniteComponent {
             IgniteUtils.closeAll(
                     this::stopDeployedWatches,
                     () -> raftMgr.stopRaftGroup(INSTANCE),
-                    storage
+                    storage::close
             );
         }
     }
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/util/PageLockListener.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/util/PageLockListener.java
index 7ba35189fc..4df624e30c 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/util/PageLockListener.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/util/PageLockListener.java
@@ -17,11 +17,13 @@
 
 package org.apache.ignite.internal.pagememory.util;
 
+import org.apache.ignite.internal.close.ManuallyCloseable;
+
 /**
  * Page lock listener.
  */
 //TODO IGNITE-16350 Consider froper Before/After naming convention for all 
methods in this class.
-public interface PageLockListener extends AutoCloseable {
+public interface PageLockListener extends ManuallyCloseable {
     /**
      * Callback that's called before write lock acquiring.
      *
@@ -82,5 +84,5 @@ public interface PageLockListener extends AutoCloseable {
 
     /** {@inheritDoc} */
     @Override
-    public void close();
+    void close();
 }
diff --git a/modules/raft/build.gradle b/modules/raft/build.gradle
index 8e91adfea1..074e7563f3 100644
--- a/modules/raft/build.gradle
+++ b/modules/raft/build.gradle
@@ -28,6 +28,7 @@ dependencies {
     implementation project(':ignite-configuration')
     implementation project(':ignite-raft-client')
     implementation project(':ignite-network')
+    implementation project(':ignite-rocksdb-common')
     implementation libs.jetbrains.annotations
     implementation libs.fastutil.core
     implementation libs.disruptor
diff --git a/modules/raft/pom.xml b/modules/raft/pom.xml
index 7f697ac57f..63b5f77534 100644
--- a/modules/raft/pom.xml
+++ b/modules/raft/pom.xml
@@ -48,6 +48,11 @@
             <artifactId>ignite-raft-client</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.ignite</groupId>
+            <artifactId>ignite-rocksdb-common</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.lmax</groupId>
             <artifactId>disruptor</artifactId>
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/LogStorageFactory.java
 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/LogStorageFactory.java
index 5dea0c3397..75f1bcff02 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/LogStorageFactory.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/LogStorageFactory.java
@@ -17,11 +17,12 @@
 
 package org.apache.ignite.internal.raft.storage;
 
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.raft.jraft.option.RaftOptions;
 import org.apache.ignite.raft.jraft.storage.LogStorage;
 
 /** Log storage factory interface. */
-public interface LogStorageFactory extends AutoCloseable {
+public interface LogStorageFactory extends ManuallyCloseable {
     /**
      * Starts the log storage factory.
      */
@@ -35,4 +36,10 @@ public interface LogStorageFactory extends AutoCloseable {
      * @return Log storage.
      */
     LogStorage createLogStorage(String uri, RaftOptions raftOptions);
+
+    /**
+     * Closes the factory.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/DefaultLogStorageFactory.java
 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/DefaultLogStorageFactory.java
index dd28d85c39..f4b62d10b3 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/DefaultLogStorageFactory.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/DefaultLogStorageFactory.java
@@ -30,8 +30,8 @@ import java.util.concurrent.Executors;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.raft.storage.LogStorageFactory;
+import org.apache.ignite.internal.rocksdb.RocksUtils;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
-import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.raft.jraft.option.RaftOptions;
 import org.apache.ignite.raft.jraft.storage.LogStorage;
 import org.apache.ignite.raft.jraft.util.ExecutorServiceHelper;
@@ -127,10 +127,10 @@ public class DefaultLogStorageFactory implements 
LogStorageFactory {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
         ExecutorServiceHelper.shutdownAndAwaitTermination(executorService);
 
-        IgniteUtils.closeAll(confHandle, dataHandle, db, dbOptions);
+        RocksUtils.closeAll(confHandle, dataHandle, db, dbOptions);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/LocalLogStorageFactory.java
 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/LocalLogStorageFactory.java
index f90d808cbc..4680ff29f1 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/LocalLogStorageFactory.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/LocalLogStorageFactory.java
@@ -37,7 +37,7 @@ public class LocalLogStorageFactory implements 
LogStorageFactory {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         // no-op
     }
 }
diff --git 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/VolatileLogStorageFactory.java
 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/VolatileLogStorageFactory.java
index 2892a460bd..e1ad2f4b3f 100644
--- 
a/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/VolatileLogStorageFactory.java
+++ 
b/modules/raft/src/main/java/org/apache/ignite/internal/raft/storage/impl/VolatileLogStorageFactory.java
@@ -126,6 +126,7 @@ public class VolatileLogStorageFactory implements 
LogStorageFactory {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
+        // No-op.
     }
 }
diff --git 
a/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageAdvancedTest.java
 
b/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageAdvancedTest.java
index 15ef08d593..6fa84c4f49 100644
--- 
a/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageAdvancedTest.java
+++ 
b/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageAdvancedTest.java
@@ -65,7 +65,7 @@ public class RocksDbSharedLogStorageAdvancedTest {
     }
 
     @AfterEach
-    public void tearDown() throws Exception {
+    public void tearDown() {
         logStorageProvider.close();
     }
 
diff --git 
a/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageTest.java
 
b/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageTest.java
index 89f5b75daf..3bb919ab9e 100644
--- 
a/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageTest.java
+++ 
b/modules/raft/src/test/java/org/apache/ignite/internal/raft/storage/impl/RocksDbSharedLogStorageTest.java
@@ -42,7 +42,7 @@ public class RocksDbSharedLogStorageTest extends 
BaseLogStorageTest {
     /** {@inheritDoc} */
     @AfterEach
     @Override
-    public void teardown() throws Exception {
+    public void teardown() {
         super.teardown();
 
         logStorageProvider.close();
diff --git 
a/modules/raft/src/test/java/org/apache/ignite/raft/jraft/storage/impl/BaseLogStorageTest.java
 
b/modules/raft/src/test/java/org/apache/ignite/raft/jraft/storage/impl/BaseLogStorageTest.java
index 70941d47f7..6b0d4d6907 100644
--- 
a/modules/raft/src/test/java/org/apache/ignite/raft/jraft/storage/impl/BaseLogStorageTest.java
+++ 
b/modules/raft/src/test/java/org/apache/ignite/raft/jraft/storage/impl/BaseLogStorageTest.java
@@ -68,7 +68,7 @@ public abstract class BaseLogStorageTest extends 
BaseStorageTest {
     }
 
     @AfterEach
-    public void teardown() throws Exception {
+    public void teardown() {
         this.logStorage.shutdown();
     }
 
diff --git a/modules/rocksdb-common/build.gradle 
b/modules/rocksdb-common/build.gradle
index 5d1841d4cb..fa00cda017 100644
--- a/modules/rocksdb-common/build.gradle
+++ b/modules/rocksdb-common/build.gradle
@@ -23,6 +23,9 @@ dependencies {
     implementation project(':ignite-core')
     implementation libs.jetbrains.annotations
     api libs.rocksdb.jni
+
+    testImplementation libs.hamcrest.core
+    testImplementation libs.mockito.junit
 }
 
 description = 'ignite-rocksdb-common'
diff --git a/modules/rocksdb-common/pom.xml b/modules/rocksdb-common/pom.xml
index a05ce57397..8aaca40299 100644
--- a/modules/rocksdb-common/pom.xml
+++ b/modules/rocksdb-common/pom.xml
@@ -43,5 +43,29 @@
             <groupId>org.rocksdb</groupId>
             <artifactId>rocksdbjni</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-engine</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter-params</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.hamcrest</groupId>
+            <artifactId>hamcrest</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git 
a/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/RocksUtils.java
 
b/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/RocksUtils.java
index 14b8877f26..28a0a68b47 100644
--- 
a/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/RocksUtils.java
+++ 
b/modules/rocksdb-common/src/main/java/org/apache/ignite/internal/rocksdb/RocksUtils.java
@@ -17,8 +17,11 @@
 
 package org.apache.ignite.internal.rocksdb;
 
+import java.util.Arrays;
+import java.util.Collection;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.jetbrains.annotations.Nullable;
+import org.rocksdb.AbstractNativeReference;
 import org.rocksdb.RocksDBException;
 import org.rocksdb.RocksIterator;
 
@@ -107,4 +110,46 @@ public class RocksUtils {
             return result;
         }
     }
+
+    /**
+     * Closes all the provided reference on best-effort basis. This means 
that, if an exception is thrown when closing
+     * one of the references, other references will still tried to be closed. 
First exception thrown will be rethrown;
+     * subsequent exceptions will be added to it as suppressed exceptions.
+     *
+     * @param references References to close.
+     */
+    public static void closeAll(AbstractNativeReference... references) {
+        closeAll(Arrays.asList(references));
+    }
+
+    /**
+     * Closes all the provided reference on best-effort basis. This means 
that, if an exception is thrown when closing
+     * one of the references, other references will still tried to be closed. 
First exception thrown will be rethrown;
+     * subsequent exceptions will be added to it as suppressed exceptions.
+     *
+     * @param references References to close.
+     */
+    public static void closeAll(Collection<AbstractNativeReference> 
references) {
+        RuntimeException exception = null;
+
+        for (AbstractNativeReference reference : references) {
+            if (reference == null) {
+                continue;
+            }
+
+            try {
+                reference.close();
+            } catch (RuntimeException e) {
+                if (exception == null) {
+                    exception = e;
+                } else {
+                    exception.addSuppressed(e);
+                }
+            }
+        }
+
+        if (exception != null) {
+            throw exception;
+        }
+    }
 }
diff --git 
a/modules/rocksdb-common/src/test/java/org/apache/ignite/internal/rocksdb/RocksUtilsTest.java
 
b/modules/rocksdb-common/src/test/java/org/apache/ignite/internal/rocksdb/RocksUtilsTest.java
new file mode 100644
index 0000000000..ad6bea142a
--- /dev/null
+++ 
b/modules/rocksdb-common/src/test/java/org/apache/ignite/internal/rocksdb/RocksUtilsTest.java
@@ -0,0 +1,113 @@
+/*
+ * 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.rocksdb;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+
+import java.util.Arrays;
+import org.jetbrains.annotations.Nullable;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.rocksdb.AbstractNativeReference;
+
+@ExtendWith(MockitoExtension.class)
+class RocksUtilsTest {
+    @Mock
+    private AbstractNativeReference ref1;
+
+    @Mock
+    private AbstractNativeReference ref2;
+
+    @ParameterizedTest
+    @EnumSource(CloseAll.class)
+    void closeAllClosesAll(CloseAll action) {
+        action.closeAll(ref1, ref2);
+
+        verify(ref1).close();
+        verify(ref2).close();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloseAll.class)
+    void closeAllClosesEvenIfExceptionHappens(CloseAll action) {
+        doThrow(new RuntimeException("Oops")).when(ref1).close();
+
+        assertThrows(RuntimeException.class, () -> action.closeAll(ref1, 
ref2));
+
+        verify(ref1).close();
+        verify(ref2).close();
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloseAll.class)
+    void firstExceptionFromCloseAllIsThrown(CloseAll action) {
+        RuntimeException cause = new RuntimeException("Oops");
+        doThrow(cause).when(ref1).close();
+
+        RuntimeException ex = assertThrows(RuntimeException.class, () -> 
action.closeAll(ref1, ref2));
+
+        assertThat(ex, is(cause));
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloseAll.class)
+    void secondExceptionFromCloseAllIsAddedToSuppressed(CloseAll action) {
+        RuntimeException cause = new RuntimeException("Oops");
+        doThrow(cause).when(ref1).close();
+
+        RuntimeException cause2 = new RuntimeException("Oops2");
+        doThrow(cause2).when(ref2).close();
+
+        RuntimeException ex = assertThrows(RuntimeException.class, () -> 
action.closeAll(ref1, ref2));
+
+        assertThat(ex.getSuppressed().length, is(1));
+        assertThat(ex.getSuppressed()[0], is(cause2));
+    }
+
+    @ParameterizedTest
+    @EnumSource(CloseAll.class)
+    void closeAllToleratesNulls(CloseAll action) {
+        action.closeAll(null, ref2);
+
+        verify(ref2).close();
+    }
+
+    private enum CloseAll {
+        ARRAY {
+            @Override
+            void closeAll(@Nullable AbstractNativeReference ref1, @Nullable 
AbstractNativeReference ref2) {
+                RocksUtils.closeAll(ref1, ref2);
+            }
+        },
+        COLLECTION {
+            @Override
+            void closeAll(@Nullable AbstractNativeReference ref1, @Nullable 
AbstractNativeReference ref2) {
+                RocksUtils.closeAll(Arrays.asList(ref1, ref2));
+            }
+        };
+
+        abstract void closeAll(@Nullable AbstractNativeReference ref1, 
@Nullable AbstractNativeReference ref2);
+    }
+}
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
 
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
index d9e2ba5bad..cba14d829f 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorage.java
@@ -131,7 +131,7 @@ public class DistributedConfigurationStorage implements 
ConfigurationStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         IgniteUtils.shutdownAndAwaitTermination(threadPool, 10, 
TimeUnit.SECONDS);
 
         futureTracker.cancelInFlightFutures();
diff --git 
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
 
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
index 41535e0b0e..e81129304c 100644
--- 
a/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
+++ 
b/modules/runner/src/main/java/org/apache/ignite/internal/configuration/storage/LocalConfigurationStorage.java
@@ -91,7 +91,7 @@ public class LocalConfigurationStorage implements 
ConfigurationStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         IgniteUtils.shutdownAndAwaitTermination(threadPool, 10, 
TimeUnit.SECONDS);
 
         futureTracker.cancelInFlightFutures();
diff --git 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationCatchUpTest.java
 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationCatchUpTest.java
index d6432e136c..21e9f2adf8 100644
--- 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationCatchUpTest.java
+++ 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationCatchUpTest.java
@@ -94,7 +94,9 @@ public class DistributedConfigurationCatchUpTest {
 
         MetaStorageMockWrapper wrapper = new MetaStorageMockWrapper();
 
-        try (var storage = new 
DistributedConfigurationStorage(wrapper.metaStorageManager(), vaultManager)) {
+        DistributedConfigurationStorage storage = storage(wrapper);
+
+        try {
             var changer = new TestConfigurationChanger(cgen, List.of(rootKey), 
Collections.emptyMap(),
                     storage, Collections.emptyList(), Collections.emptyList());
 
@@ -112,6 +114,8 @@ public class DistributedConfigurationCatchUpTest {
             } finally {
                 changer.stop();
             }
+        } finally {
+            storage.close();
         }
 
         // Put a value to the configuration, so we start on non-empty vault.
@@ -120,7 +124,10 @@ public class DistributedConfigurationCatchUpTest {
         // This emulates a change in MetaStorage that is not related to the 
configuration.
         vaultManager.put(MetaStorageManager.APPLIED_REV, 
ByteUtils.longToBytes(2)).get();
 
-        try (var storage = new 
DistributedConfigurationStorage(wrapper.metaStorageManager(), vaultManager)) {
+        storage = storage(wrapper);
+
+        try {
+
             var changer = new TestConfigurationChanger(cgen, List.of(rootKey), 
Collections.emptyMap(),
                     storage, Collections.emptyList(), Collections.emptyList());
 
@@ -135,9 +142,15 @@ public class DistributedConfigurationCatchUpTest {
             } finally {
                 changer.stop();
             }
+        } finally {
+            storage.close();
         }
     }
 
+    private DistributedConfigurationStorage storage(MetaStorageMockWrapper 
wrapper) {
+        return new 
DistributedConfigurationStorage(wrapper.metaStorageManager(), vaultManager);
+    }
+
     /**
      * This class stores data for {@link MetaStorageManager}'s mock.
      */
diff --git 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorageTest.java
 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorageTest.java
index 24b210803a..7e9b75fa51 100644
--- 
a/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorageTest.java
+++ 
b/modules/runner/src/test/java/org/apache/ignite/internal/configuration/storage/DistributedConfigurationStorageTest.java
@@ -30,6 +30,7 @@ import org.apache.ignite.internal.metastorage.client.Entry;
 import org.apache.ignite.internal.metastorage.client.Operation;
 import org.apache.ignite.internal.metastorage.client.SimpleCondition;
 import org.apache.ignite.internal.metastorage.common.OperationType;
+import org.apache.ignite.internal.metastorage.server.Condition;
 import org.apache.ignite.internal.metastorage.server.ExistenceCondition;
 import org.apache.ignite.internal.metastorage.server.KeyValueStorage;
 import org.apache.ignite.internal.metastorage.server.RevisionCondition;
@@ -115,9 +116,9 @@ public class DistributedConfigurationStorageTest extends 
ConfigurationStorageTes
     }
 
     /**
-     * Converts a {@link SimpleCondition} to a {@link 
org.apache.ignite.internal.metastorage.server.Condition}.
+     * Converts a {@link SimpleCondition} to a {@link Condition}.
      */
-    private static org.apache.ignite.internal.metastorage.server.Condition 
toServerCondition(SimpleCondition condition) {
+    private static Condition toServerCondition(SimpleCondition condition) {
         switch (condition.type()) {
             case REV_LESS_OR_EQUAL:
                 return new RevisionCondition(
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RuntimeIndex.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RuntimeIndex.java
index da9d002c35..818ac14ce6 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RuntimeIndex.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RuntimeIndex.java
@@ -17,12 +17,20 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
+import org.apache.ignite.internal.close.ManuallyCloseable;
+
 /**
  * Runtime index interface. The temporary index is built and available only on 
query execution. Not stored at the schema.
  */
-public interface RuntimeIndex<RowT> extends AutoCloseable {
+public interface RuntimeIndex<RowT> extends ManuallyCloseable {
     /**
      * Add row to index.
      */
     void push(RowT r);
+
+    /**
+     * Closes the index.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexSpoolNode.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexSpoolNode.java
index a452324a54..30dbd7c52d 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexSpoolNode.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexSpoolNode.java
@@ -152,7 +152,7 @@ public class IndexSpoolNode<RowT> extends 
AbstractNode<RowT> implements SingleNo
 
         try {
             idx.close();
-        } catch (Exception ex) {
+        } catch (RuntimeException ex) {
             onError(ex);
         }
 
diff --git 
a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/MvPartitionStorage.java
 
b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/MvPartitionStorage.java
index cd0dac8c5a..7f7ea69fe1 100644
--- 
a/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/MvPartitionStorage.java
+++ 
b/modules/storage-api/src/main/java/org/apache/ignite/internal/storage/MvPartitionStorage.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.storage;
 
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.util.Cursor;
@@ -37,7 +38,7 @@ import org.jetbrains.annotations.Nullable;
  * <p>Each MvPartitionStorage instance represents exactly one partition. All 
RowIds within a partition are sorted consistently with the
  * {@link RowId#compareTo} comparison order.
  */
-public interface MvPartitionStorage extends AutoCloseable {
+public interface MvPartitionStorage extends ManuallyCloseable {
     /**
      * Closure for executing write operations on the storage.
      *
@@ -197,4 +198,10 @@ public interface MvPartitionStorage extends AutoCloseable {
      */
     @Deprecated
     long rowsCount() throws StorageException;
+
+    /**
+     * Closes the storage.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
 
b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
index d55d99fb8f..be64bbe287 100644
--- 
a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
+++ 
b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/AbstractMvPartitionStorageTest.java
@@ -72,7 +72,7 @@ public abstract class AbstractMvPartitionStorageTest extends 
BaseMvStoragesTest
     private final TestValue value = new TestValue(20, "bar");
     protected final BinaryRow binaryRow = binaryRow(key, value);
     private final TestValue value2 = new TestValue(21, "bar2");
-    protected final BinaryRow binaryRow2 = binaryRow(key, value2);
+    private final BinaryRow binaryRow2 = binaryRow(key, value2);
     private final BinaryRow binaryRow3 = binaryRow(key, new TestValue(22, 
"bar3"));
 
     /**
@@ -142,7 +142,7 @@ public abstract class AbstractMvPartitionStorageTest 
extends BaseMvStoragesTest
     /**
      * Creates a new transaction id.
      */
-    protected UUID newTransactionId() {
+    private static UUID newTransactionId() {
         return Timestamp.nextVersion().toUuid();
     }
 
diff --git 
a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
 
b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
index 51600ef38f..f8a81a989d 100644
--- 
a/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
+++ 
b/modules/storage-api/src/testFixtures/java/org/apache/ignite/internal/storage/impl/TestMvPartitionStorage.java
@@ -386,7 +386,7 @@ public class TestMvPartitionStorage implements 
MvPartitionStorage {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
         // No-op.
     }
 
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
index 969a798710..4e5f545021 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java
@@ -185,7 +185,7 @@ public abstract class AbstractPageMemoryTableStorage 
implements MvTableStorage {
             AbstractPageMemoryMvPartitionStorage partition = 
mvPartitions.getAndUpdate(i, p -> null);
 
             if (partition != null) {
-                closeables.add(destroy ? partition::destroy : partition);
+                closeables.add(destroy ? partition::destroy : 
partition::close);
             }
         }
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
index d6eed10be8..9b04ba7d37 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
@@ -78,7 +78,7 @@ class PersistentPageMemoryMvPartitionStorageTest extends 
AbstractPageMemoryMvPar
     @AfterEach
     void tearDown() throws Exception {
         IgniteUtils.closeAll(
-                storage,
+                storage::close,
                 table == null ? null : table::stop,
                 engine == null ? null : engine::stop,
                 longJvmPauseDetector == null ? null : 
longJvmPauseDetector::stop
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
index dfdb1c92aa..69f473e4bb 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
@@ -58,7 +58,7 @@ class VolatilePageMemoryMvPartitionStorageTest extends 
AbstractPageMemoryMvParti
     @AfterEach
     void tearDown() throws Exception {
         IgniteUtils.closeAll(
-                storage,
+                storage::close,
                 table == null ? null : table::stop,
                 engine == null ? null : engine::stop
         );
diff --git 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorage.java
 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorage.java
index 238fd98802..d527584354 100644
--- 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorage.java
+++ 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorage.java
@@ -837,8 +837,8 @@ public class RocksDbMvPartitionStorage implements 
MvPartitionStorage {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
-        IgniteUtils.closeAll(persistedTierReadOpts, readOpts, writeOpts, 
scanReadOptions, upperBound);
+    public void close() {
+        RocksUtils.closeAll(persistedTierReadOpts, readOpts, writeOpts, 
scanReadOptions, upperBound);
     }
 
     private static WriteBatchWithIndex requireWriteBatch() {
diff --git 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
index 79ba41a3a7..a02f6f19ff 100644
--- 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
+++ 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/RocksDbTableStorage.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.storage.rocksdb;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
+import static java.util.stream.Collectors.toList;
 import static 
org.apache.ignite.internal.storage.rocksdb.ColumnFamilyUtils.HASH_INDEX_CF_NAME;
 import static 
org.apache.ignite.internal.storage.rocksdb.ColumnFamilyUtils.META_CF_NAME;
 import static 
org.apache.ignite.internal.storage.rocksdb.ColumnFamilyUtils.PARTITION_CF_NAME;
@@ -36,7 +37,6 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReferenceArray;
-import java.util.stream.Collectors;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.rocksdb.ColumnFamily;
@@ -319,7 +319,11 @@ public class RocksDbTableStorage implements MvTableStorage 
{
         resources.add(meta.columnFamily().handle());
         resources.add(partitionCf.handle());
         resources.add(hashIndexCf.handle());
-        resources.addAll(sortedIndices.values());
+        resources.addAll(
+                sortedIndices.values().stream()
+                        .map(index -> (AutoCloseable) index::close)
+                        .collect(toList())
+        );
 
         resources.add(db);
 
@@ -329,7 +333,7 @@ public class RocksDbTableStorage implements MvTableStorage {
             MvPartitionStorage partition = partitions.get(i);
 
             if (partition != null) {
-                resources.add(partition);
+                resources.add(partition::close);
             }
         }
 
@@ -385,7 +389,7 @@ public class RocksDbTableStorage implements MvTableStorage {
 
             try {
                 mvPartition.close();
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 throw new StorageException("Error when closing partition 
storage for the partition: " + partitionId, e);
             }
         }
@@ -498,7 +502,7 @@ public class RocksDbTableStorage implements MvTableStorage {
             List<String> existingNames = RocksDB.listColumnFamilies(opts, 
absolutePathStr)
                     .stream()
                     .map(cfNameBytes -> new String(cfNameBytes, UTF_8))
-                    .collect(Collectors.toList());
+                    .collect(toList());
 
             // even if the database is new (no existing Column Families), we 
return the names of mandatory column families, that
             // will be created automatically.
@@ -518,7 +522,7 @@ public class RocksDbTableStorage implements MvTableStorage {
     private List<ColumnFamilyDescriptor> getExistingCfDescriptors() {
         return getExistingCfNames().stream()
                 .map(this::cfDescriptorFromName)
-                .collect(Collectors.toList());
+                .collect(toList());
     }
 
     /**
diff --git 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/SortedIndex.java
 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/SortedIndex.java
index b2343d05c6..50d4e12103 100644
--- 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/SortedIndex.java
+++ 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/SortedIndex.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.storage.rocksdb;
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.rocksdb.ColumnFamily;
 import org.apache.ignite.internal.storage.StorageException;
 import org.apache.ignite.internal.storage.index.SortedIndexDescriptor;
@@ -29,7 +30,7 @@ import org.rocksdb.RocksDBException;
 /**
  * Class that represents a Sorted Index defined for all partitions of a Table.
  */
-class SortedIndex implements AutoCloseable {
+class SortedIndex implements ManuallyCloseable {
     private final SortedIndexDescriptor descriptor;
 
     private final ColumnFamily indexCf;
@@ -70,7 +71,7 @@ class SortedIndex implements AutoCloseable {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         indexCf.handle().close();
     }
 }
diff --git 
a/modules/storage-rocksdb/src/test/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorageTest.java
 
b/modules/storage-rocksdb/src/test/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorageTest.java
index c7de07825a..b11b42cce8 100644
--- 
a/modules/storage-rocksdb/src/test/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorageTest.java
+++ 
b/modules/storage-rocksdb/src/test/java/org/apache/ignite/internal/storage/rocksdb/RocksDbMvPartitionStorageTest.java
@@ -73,7 +73,7 @@ public class RocksDbMvPartitionStorageTest extends 
AbstractMvPartitionStorageTes
     @AfterEach
     public void tearDown() throws Exception {
         IgniteUtils.closeAll(
-                storage,
+                storage::close,
                 table == null ? null : table::stop,
                 engine == null ? null : engine::stop
         );
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/InternalTable.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/InternalTable.java
index 9cbde36d87..bc01b01c26 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/InternalTable.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/InternalTable.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Flow.Publisher;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.schema.BinaryRowEx;
@@ -42,7 +43,7 @@ import org.jetbrains.annotations.Nullable;
  * Internal table facade provides low-level methods for table operations. The 
facade hides TX/replication protocol over table storage
  * abstractions.
  */
-public interface InternalTable extends AutoCloseable {
+public interface InternalTable extends ManuallyCloseable {
     /**
      * Gets a storage for the table.
      *
@@ -399,4 +400,10 @@ public interface InternalTable extends AutoCloseable {
     TxStateTableStorage txStateStorage();
 
     //TODO: IGNITE-14488. Add invoke() methods.
+
+    /**
+     * Closes the table.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionDataStorage.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionDataStorage.java
index db6f4e7140..e9e2c54a99 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionDataStorage.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionDataStorage.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.table.distributed.raft;
 
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
 import org.apache.ignite.internal.lock.AutoLockup;
 import org.apache.ignite.internal.schema.BinaryRow;
@@ -42,7 +43,7 @@ import org.jetbrains.annotations.TestOnly;
  *
  * @see org.apache.ignite.internal.storage.MvPartitionStorage
  */
-public interface PartitionDataStorage extends AutoCloseable {
+public interface PartitionDataStorage extends ManuallyCloseable {
     /**
      * Executes {@link WriteClosure} atomically, meaning that partial result 
of an incomplete closure will never be written to the
      * physical device, thus guaranteeing data consistency after restart. 
Simply runs the closure in case of a volatile storage.
@@ -141,4 +142,10 @@ public interface PartitionDataStorage extends 
AutoCloseable {
      */
     @TestOnly
     MvPartitionStorage getStorage();
+
+    /**
+     * Closes the storage.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
index c440e24a88..59383c3121 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/PartitionListener.java
@@ -348,7 +348,7 @@ public class PartitionListener implements RaftGroupListener 
{
         // TODO: IGNITE-17958 - probably, we should not close the storage here 
as PartitionListener did not create the storage.
         try {
             storage.close();
-        } catch (Exception e) {
+        } catch (RuntimeException e) {
             throw new IgniteInternalException("Failed to close storage: " + 
e.getMessage(), e);
         }
     }
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorage.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorage.java
index 0759d1658b..62dd5ca4ea 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorage.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorage.java
@@ -122,7 +122,7 @@ public class SnapshotAwarePartitionDataStorage implements 
PartitionDataStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         // TODO: IGNITE-17935 - terminate all snapshots of this partition 
considering correct locking to do it consistently
 
         partitionStorage.close();
diff --git 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
index 27253f6c5b..c6e4acd5f3 100644
--- 
a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
+++ 
b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/storage/InternalTableImpl.java
@@ -1301,7 +1301,7 @@ public class InternalTableImpl implements InternalTable {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
         for (RaftGroupService srv : partitionMap.values()) {
             srv.shutdown();
         }
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
index cf54285285..085549fa5e 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/raft/snapshot/outgoing/SnapshotAwarePartitionDataStorageTest.java
@@ -150,7 +150,7 @@ class SnapshotAwarePartitionDataStorageTest {
     }
 
     @Test
-    void delegatesClose() throws Exception {
+    void delegatesClose() {
         testedStorage.close();
 
         verify(partitionStorage).close();
diff --git 
a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/TestPartitionDataStorage.java
 
b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/TestPartitionDataStorage.java
index aed3f0d5f0..3d0de719bd 100644
--- 
a/modules/table/src/testFixtures/java/org/apache/ignite/distributed/TestPartitionDataStorage.java
+++ 
b/modules/table/src/testFixtures/java/org/apache/ignite/distributed/TestPartitionDataStorage.java
@@ -93,7 +93,7 @@ public class TestPartitionDataStorage implements 
PartitionDataStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         partitionStorage.close();
     }
 }
diff --git 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateStorage.java
 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateStorage.java
index b7ca9b97c9..9463456323 100644
--- 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateStorage.java
+++ 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateStorage.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.tx.storage.state;
 
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.configuration.storage.StorageException;
 import org.apache.ignite.internal.tx.TxMeta;
 import org.apache.ignite.internal.tx.TxState;
@@ -31,7 +32,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Storage for transaction meta, {@link TxMeta}.
  */
-public interface TxStateStorage extends AutoCloseable {
+public interface TxStateStorage extends ManuallyCloseable {
     /**
      * Get tx meta by tx id.
      *
@@ -109,6 +110,12 @@ public interface TxStateStorage extends AutoCloseable {
      */
     long persistedIndex();
 
+    /**
+     * Closes the storage.
+     */
+    @Override
+    void close();
+
     /**
      * Removes all data from the storage.
      *
diff --git 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateTableStorage.java
 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateTableStorage.java
index 0e2bfb208a..e633c51f6b 100644
--- 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateTableStorage.java
+++ 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/TxStateTableStorage.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.tx.storage.state;
 
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.configuration.storage.StorageException;
 import org.apache.ignite.internal.schema.configuration.TableConfiguration;
 import org.jetbrains.annotations.Nullable;
@@ -24,7 +25,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Transaction state storage for a table.
  */
-public interface TxStateTableStorage extends AutoCloseable {
+public interface TxStateTableStorage extends ManuallyCloseable {
     /**
      * Get or create transaction state storage for partition.
      *
@@ -72,6 +73,12 @@ public interface TxStateTableStorage extends AutoCloseable {
      */
     void stop() throws StorageException;
 
+    /**
+     * Closes the storage.
+     */
+    @Override
+    void close();
+
     /**
      * Removes all data from the storage and frees all resources.
      *
diff --git 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
index 39a7214214..0f0d763c1a 100644
--- 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
+++ 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbStorage.java
@@ -36,15 +36,16 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.internal.configuration.storage.StorageException;
 import org.apache.ignite.internal.rocksdb.BusyRocksIteratorAdapter;
+import org.apache.ignite.internal.rocksdb.RocksUtils;
 import org.apache.ignite.internal.tx.TxMeta;
 import org.apache.ignite.internal.tx.TxState;
 import org.apache.ignite.internal.tx.storage.state.TxStateStorage;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteSpinBusyLock;
-import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteInternalException;
 import org.jetbrains.annotations.Nullable;
+import org.rocksdb.AbstractNativeReference;
 import org.rocksdb.ReadOptions;
 import org.rocksdb.RocksDB;
 import org.rocksdb.RocksDBException;
@@ -413,15 +414,15 @@ public class TxStateRocksDbStorage implements 
TxStateStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         if (!closeGuard.compareAndSet(false, true)) {
             return;
         }
 
         busyLock.block();
 
-        List<AutoCloseable> resources = new ArrayList<>(iterators);
+        List<AbstractNativeReference> resources = new ArrayList<>(iterators);
 
-        IgniteUtils.closeAll(resources);
+        RocksUtils.closeAll(resources);
     }
 }
diff --git 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbTableStorage.java
 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbTableStorage.java
index 5cdbbba1e1..ebd985bf07 100644
--- 
a/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbTableStorage.java
+++ 
b/modules/transactions/src/main/java/org/apache/ignite/internal/tx/storage/state/rocksdb/TxStateRocksDbTableStorage.java
@@ -176,9 +176,9 @@ public class TxStateRocksDbTableStorage implements 
TxStateTableStorage {
 
             try {
                 storage.close();
-            } catch (Exception e) {
+            } catch (RuntimeException e) {
                 throw new StorageException("Couldn't close the transaction 
state storage of partition "
-                        + partitionId + ", table " + tableCfg.value().name());
+                        + partitionId + ", table " + tableCfg.value().name(), 
e);
             }
         }
     }
@@ -250,7 +250,7 @@ public class TxStateRocksDbTableStorage implements 
TxStateTableStorage {
                 TxStateStorage storage = storages.get(i);
 
                 if (storage != null) {
-                    resources.add(storage);
+                    resources.add(storage::close);
                 }
             }
 
@@ -296,7 +296,7 @@ public class TxStateRocksDbTableStorage implements 
TxStateTableStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         stop();
     }
 
diff --git 
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
 
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
index 83ecc9fce7..d96f42d77f 100644
--- 
a/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
+++ 
b/modules/transactions/src/test/java/org/apache/ignite/internal/tx/storage/state/TxStateStorageAbstractTest.java
@@ -43,6 +43,8 @@ import org.apache.ignite.internal.tx.TxMeta;
 import org.apache.ignite.internal.tx.TxState;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.lang.IgniteBiTuple;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
@@ -54,44 +56,58 @@ public abstract class TxStateStorageAbstractTest {
     @WorkDirectory
     protected Path workDir;
 
+    private TxStateTableStorage tableStorage;
+
+    @BeforeEach
+    void initStorage() {
+        tableStorage = createStorage();
+    }
+
+    @AfterEach
+    void closeStorage() {
+        if (tableStorage != null) {
+            tableStorage.close();
+        }
+    }
+
     @Test
-    public void testPutGetRemove() throws Exception {
-        try (TxStateTableStorage tableStorage = createStorage()) {
-            TxStateStorage storage = tableStorage.getOrCreateTxStateStorage(0);
+    public void testPutGetRemove() {
+        TxStateStorage storage = tableStorage.getOrCreateTxStateStorage(0);
 
-            List<UUID> txIds = new ArrayList<>();
+        List<UUID> txIds = new ArrayList<>();
 
-            for (int i = 0; i < 100; i++) {
-                UUID txId = UUID.randomUUID();
+        for (int i = 0; i < 100; i++) {
+            UUID txId = UUID.randomUUID();
 
-                txIds.add(txId);
+            txIds.add(txId);
 
-                storage.put(txId, new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(i), generateTimestamp(txId)));
+            storage.put(txId, new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(i), generateTimestamp(txId)));
+        }
+
+        for (int i = 0; i < 100; i++) {
+            TxMeta txMeta = storage.get(txIds.get(i));
+            TxMeta txMetaExpected = new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
+            assertTxMetaEquals(txMetaExpected, txMeta);
+        }
+
+        for (int i = 0; i < 100; i++) {
+            if (i % 2 == 0) {
+                storage.remove(txIds.get(i));
             }
+        }
 
-            for (int i = 0; i < 100; i++) {
+        for (int i = 0; i < 100; i++) {
+            if (i % 2 == 0) {
+                TxMeta txMeta = storage.get(txIds.get(i));
+                assertNull(txMeta);
+            } else {
                 TxMeta txMeta = storage.get(txIds.get(i));
                 TxMeta txMetaExpected = new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
                 assertTxMetaEquals(txMetaExpected, txMeta);
             }
-
-            for (int i = 0; i < 100; i++) {
-                if (i % 2 == 0) {
-                    storage.remove(txIds.get(i));
-                }
-            }
-
-            for (int i = 0; i < 100; i++) {
-                if (i % 2 == 0) {
-                    TxMeta txMeta = storage.get(txIds.get(i));
-                    assertNull(txMeta);
-                } else {
-                    TxMeta txMeta = storage.get(txIds.get(i));
-                    TxMeta txMetaExpected = new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(i), generateTimestamp(txIds.get(i)));
-                    assertTxMetaEquals(txMetaExpected, txMeta);
-                }
-            }
         }
+
+        storage.close();
     }
 
     private List<ReplicationGroupId> generateEnlistedPartitions(int c) {
@@ -110,140 +126,141 @@ public abstract class TxStateStorageAbstractTest {
     }
 
     @Test
-    public void testCas() throws Exception {
-        try (TxStateTableStorage tableStorage = createStorage()) {
-            TxStateStorage storage = tableStorage.getOrCreateTxStateStorage(0);
+    public void testCas() {
+        TxStateStorage storage = tableStorage.getOrCreateTxStateStorage(0);
 
-            UUID txId = UUID.randomUUID();
+        UUID txId = UUID.randomUUID();
 
-            TxMeta txMeta1 = new TxMeta(TxState.COMMITED, new ArrayList<>(), 
generateTimestamp(txId));
-            TxMeta txMeta2 = new TxMeta(TxState.COMMITED, new ArrayList<>(), 
generateTimestamp(UUID.randomUUID()));
+        TxMeta txMeta1 = new TxMeta(TxState.COMMITED, new ArrayList<>(), 
generateTimestamp(txId));
+        TxMeta txMeta2 = new TxMeta(TxState.COMMITED, new ArrayList<>(), 
generateTimestamp(UUID.randomUUID()));
 
-            assertTrue(storage.compareAndSet(txId, null, txMeta1, 1));
-            // Checking idempotency.
-            assertTrue(storage.compareAndSet(txId, null, txMeta1, 1));
-            assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta1, 
1));
+        assertTrue(storage.compareAndSet(txId, null, txMeta1, 1));
+        // Checking idempotency.
+        assertTrue(storage.compareAndSet(txId, null, txMeta1, 1));
+        assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta1, 1));
 
-            TxMeta txMetaWrongTimestamp0 =
-                    new TxMeta(txMeta1.txState(), 
txMeta1.enlistedPartitions(), generateTimestamp(UUID.randomUUID()));
-            assertFalse(storage.compareAndSet(txId, TxState.ABORTED, 
txMetaWrongTimestamp0, 1));
+        TxMeta txMetaWrongTimestamp0 =
+                new TxMeta(txMeta1.txState(), txMeta1.enlistedPartitions(), 
generateTimestamp(UUID.randomUUID()));
+        assertFalse(storage.compareAndSet(txId, TxState.ABORTED, 
txMetaWrongTimestamp0, 1));
 
-            TxMeta txMetaNullTimestamp0 = new TxMeta(txMeta1.txState(), 
txMeta1.enlistedPartitions(), null);
-            assertFalse(storage.compareAndSet(txId, TxState.ABORTED, 
txMetaNullTimestamp0, 3));
+        TxMeta txMetaNullTimestamp0 = new TxMeta(txMeta1.txState(), 
txMeta1.enlistedPartitions(), null);
+        assertFalse(storage.compareAndSet(txId, TxState.ABORTED, 
txMetaNullTimestamp0, 3));
 
-            assertTxMetaEquals(storage.get(txId), txMeta1);
+        assertTxMetaEquals(storage.get(txId), txMeta1);
 
-            assertTrue(storage.compareAndSet(txId, txMeta1.txState(), txMeta2, 
3));
-            // Checking idempotency.
-            assertTrue(storage.compareAndSet(txId, txMeta1.txState(), txMeta2, 
3));
-            assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta2, 
3));
+        assertTrue(storage.compareAndSet(txId, txMeta1.txState(), txMeta2, 3));
+        // Checking idempotency.
+        assertTrue(storage.compareAndSet(txId, txMeta1.txState(), txMeta2, 3));
+        assertTrue(storage.compareAndSet(txId, TxState.ABORTED, txMeta2, 3));
 
-            TxMeta txMetaWrongTimestamp2 =
-                    new TxMeta(txMeta2.txState(), 
txMeta2.enlistedPartitions(), generateTimestamp(UUID.randomUUID()));
+        TxMeta txMetaWrongTimestamp2 =
+                new TxMeta(txMeta2.txState(), txMeta2.enlistedPartitions(), 
generateTimestamp(UUID.randomUUID()));
 
-            TxMeta txMetaNullTimestamp2 = new TxMeta(txMeta2.txState(), 
txMeta2.enlistedPartitions(), null);
-            assertFalse(storage.compareAndSet(txId, TxState.ABORTED, 
txMetaNullTimestamp2, 3));
+        TxMeta txMetaNullTimestamp2 = new TxMeta(txMeta2.txState(), 
txMeta2.enlistedPartitions(), null);
+        assertFalse(storage.compareAndSet(txId, TxState.ABORTED, 
txMetaNullTimestamp2, 3));
 
-            assertTxMetaEquals(storage.get(txId), txMeta2);
-        }
+        assertTxMetaEquals(storage.get(txId), txMeta2);
+
+        storage.close();
     }
 
     @Test
     public void testScan() throws Exception {
-        try (TxStateTableStorage tableStorage = createStorage()) {
-            TxStateStorage storage0 = 
tableStorage.getOrCreateTxStateStorage(0);
-            TxStateStorage storage1 = 
tableStorage.getOrCreateTxStateStorage(1);
-            TxStateStorage storage2 = 
tableStorage.getOrCreateTxStateStorage(2);
+        TxStateStorage storage0 = tableStorage.getOrCreateTxStateStorage(0);
+        TxStateStorage storage1 = tableStorage.getOrCreateTxStateStorage(1);
+        TxStateStorage storage2 = tableStorage.getOrCreateTxStateStorage(2);
 
-            Map<UUID, TxMeta> txs = new HashMap<>();
+        Map<UUID, TxMeta> txs = new HashMap<>();
 
-            putRandomTxMetaWithCommandIndex(storage0, 1, 0);
-            putRandomTxMetaWithCommandIndex(storage2, 1, 0);
+        putRandomTxMetaWithCommandIndex(storage0, 1, 0);
+        putRandomTxMetaWithCommandIndex(storage2, 1, 0);
 
-            for (int i = 0; i < 100; i++) {
-                IgniteBiTuple<UUID, TxMeta> txData = 
putRandomTxMetaWithCommandIndex(storage1, i, i);
-                txs.put(txData.get1(), txData.get2());
-            }
-
-            try (Cursor<IgniteBiTuple<UUID, TxMeta>> scanCursor = 
storage1.scan()) {
-                assertTrue(scanCursor.hasNext());
+        for (int i = 0; i < 100; i++) {
+            IgniteBiTuple<UUID, TxMeta> txData = 
putRandomTxMetaWithCommandIndex(storage1, i, i);
+            txs.put(txData.get1(), txData.get2());
+        }
 
-                while (scanCursor.hasNext()) {
-                    IgniteBiTuple<UUID, TxMeta> txData = scanCursor.next();
-                    TxMeta txMeta = txs.remove(txData.getKey());
+        try (Cursor<IgniteBiTuple<UUID, TxMeta>> scanCursor = storage1.scan()) 
{
+            assertTrue(scanCursor.hasNext());
 
-                    assertNotNull(txMeta);
-                    assertNotNull(txData);
-                    assertNotNull(txData.getValue());
-                    assertTxMetaEquals(txMeta, txData.getValue());
-                }
+            while (scanCursor.hasNext()) {
+                IgniteBiTuple<UUID, TxMeta> txData = scanCursor.next();
+                TxMeta txMeta = txs.remove(txData.getKey());
 
-                assertTrue(txs.isEmpty());
+                assertNotNull(txMeta);
+                assertNotNull(txData);
+                assertNotNull(txData.getValue());
+                assertTxMetaEquals(txMeta, txData.getValue());
             }
+
+            assertTrue(txs.isEmpty());
         }
+
+        List.of(storage0, storage1, storage2).forEach(TxStateStorage::close);
     }
 
     @Test
-    public void testDestroy() throws Exception {
-        try (TxStateTableStorage tableStorage = createStorage()) {
-            TxStateStorage storage0 = 
tableStorage.getOrCreateTxStateStorage(0);
-            TxStateStorage storage1 = 
tableStorage.getOrCreateTxStateStorage(1);
+    public void testDestroy() {
+        TxStateStorage storage0 = tableStorage.getOrCreateTxStateStorage(0);
+        TxStateStorage storage1 = tableStorage.getOrCreateTxStateStorage(1);
 
-            UUID txId0 = UUID.randomUUID();
-            storage0.put(txId0, new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(1), generateTimestamp(txId0)));
+        UUID txId0 = UUID.randomUUID();
+        storage0.put(txId0, new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(1), generateTimestamp(txId0)));
 
-            UUID txId1 = UUID.randomUUID();
-            storage1.put(txId1, new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(1), generateTimestamp(txId1)));
+        UUID txId1 = UUID.randomUUID();
+        storage1.put(txId1, new TxMeta(TxState.COMMITED, 
generateEnlistedPartitions(1), generateTimestamp(txId1)));
 
-            storage0.destroy();
+        storage0.destroy();
 
-            assertNotNull(storage1.get(txId1));
-        }
+        assertNotNull(storage1.get(txId1));
+
+        storage0.close();
+        storage1.close();
     }
 
     @Test
     public void scansInOrderDefinedByTxIds() throws Exception {
-        try (TxStateTableStorage tableStorage = createStorage()) {
-            TxStateStorage partitionStorage = 
tableStorage.getOrCreateTxStateStorage(0);
-
-            for (int i = 0; i < 100; i++) {
-                putRandomTxMetaWithCommandIndex(partitionStorage, i, i);
-            }
+        TxStateStorage partitionStorage = 
tableStorage.getOrCreateTxStateStorage(0);
 
-            try (Cursor<IgniteBiTuple<UUID, TxMeta>> scanCursor = 
partitionStorage.scan()) {
-                List<UUID> txIds = new ArrayList<>();
+        for (int i = 0; i < 100; i++) {
+            putRandomTxMetaWithCommandIndex(partitionStorage, i, i);
+        }
 
-                while (scanCursor.hasNext()) {
-                    IgniteBiTuple<UUID, TxMeta> txData = scanCursor.next();
+        try (Cursor<IgniteBiTuple<UUID, TxMeta>> scanCursor = 
partitionStorage.scan()) {
+            List<UUID> txIds = new ArrayList<>();
 
-                    txIds.add(txData.getKey());
-                }
+            while (scanCursor.hasNext()) {
+                IgniteBiTuple<UUID, TxMeta> txData = scanCursor.next();
 
-                assertThat(txIds, equalTo(txIds.stream().sorted(new 
UnsignedUuidComparator()).collect(toList())));
+                txIds.add(txData.getKey());
             }
+
+            assertThat(txIds, equalTo(txIds.stream().sorted(new 
UnsignedUuidComparator()).collect(toList())));
         }
+
+        partitionStorage.close();
     }
 
     @Test
     public void scanOnlySeesDataExistingAtTheMomentOfCreation() throws 
Exception {
-        try (TxStateTableStorage tableStorage = createStorage()) {
-            TxStateStorage partitionStorage = 
tableStorage.getOrCreateTxStateStorage(0);
-
-            UUID existingBeforeScan = new UUID(2, 0);
-            partitionStorage.put(existingBeforeScan, randomTxMeta(1, 
existingBeforeScan));
-
-            try (Cursor<IgniteBiTuple<UUID, TxMeta>> cursor = 
partitionStorage.scan()) {
-                UUID prependedDuringScan = new UUID(1, 0);
-                partitionStorage.put(prependedDuringScan, randomTxMeta(1, 
prependedDuringScan));
-                UUID appendedDuringScan = new UUID(3, 0);
-                partitionStorage.put(appendedDuringScan, randomTxMeta(1, 
appendedDuringScan));
-
-                List<UUID> txIdsReturnedByScan = cursor.stream()
-                        .map(IgniteBiTuple::getKey)
-                        .collect(toList());
-                assertThat(txIdsReturnedByScan, 
is(List.of(existingBeforeScan)));
-            }
+        TxStateStorage partitionStorage = 
tableStorage.getOrCreateTxStateStorage(0);
+
+        UUID existingBeforeScan = new UUID(2, 0);
+        partitionStorage.put(existingBeforeScan, randomTxMeta(1, 
existingBeforeScan));
+
+        try (Cursor<IgniteBiTuple<UUID, TxMeta>> cursor = 
partitionStorage.scan()) {
+            UUID prependedDuringScan = new UUID(1, 0);
+            partitionStorage.put(prependedDuringScan, randomTxMeta(1, 
prependedDuringScan));
+            UUID appendedDuringScan = new UUID(3, 0);
+            partitionStorage.put(appendedDuringScan, randomTxMeta(1, 
appendedDuringScan));
+
+            List<UUID> txIdsReturnedByScan = cursor.stream()
+                    .map(IgniteBiTuple::getKey)
+                    .collect(toList());
+            assertThat(txIdsReturnedByScan, is(List.of(existingBeforeScan)));
         }
+
+        partitionStorage.close();
     }
 
     private IgniteBiTuple<UUID, TxMeta> 
putRandomTxMetaWithCommandIndex(TxStateStorage storage, int enlistedPartsCount, 
long commandIndex) {
diff --git 
a/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
 
b/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
index 7091adca01..0fa8017dc2 100644
--- 
a/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
+++ 
b/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateStorage.java
@@ -101,7 +101,7 @@ public class TestTxStateStorage implements TxStateStorage {
             close();
 
             storage.clear();
-        } catch (Exception e) {
+        } catch (RuntimeException e) {
             throw new StorageException("Failed to destroy the transaction 
state storage", e);
         }
     }
@@ -127,7 +127,7 @@ public class TestTxStateStorage implements TxStateStorage {
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         // No-op.
     }
 }
diff --git 
a/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateTableStorage.java
 
b/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateTableStorage.java
index dc53f37659..79e868dba7 100644
--- 
a/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateTableStorage.java
+++ 
b/modules/transactions/src/testFixtures/java/org/apache/ignite/internal/tx/storage/state/test/TestTxStateTableStorage.java
@@ -60,17 +60,17 @@ public class TestTxStateTableStorage implements 
TxStateTableStorage {
     }
 
     @Override
-    public void stop() throws StorageException {
+    public void stop() {
         // No-op.
     }
 
     @Override
-    public void destroy() throws StorageException {
+    public void destroy() {
         storages.clear();
     }
 
     @Override
-    public void close() throws Exception {
+    public void close() {
         stop();
     }
 }
diff --git 
a/modules/vault/src/integrationTest/java/org/apache/ignite/internal/vault/persistence/ItPersistencePropertiesVaultServiceTest.java
 
b/modules/vault/src/integrationTest/java/org/apache/ignite/internal/vault/persistence/ItPersistencePropertiesVaultServiceTest.java
index 4e93e4e3e3..d01edbf19c 100644
--- 
a/modules/vault/src/integrationTest/java/org/apache/ignite/internal/vault/persistence/ItPersistencePropertiesVaultServiceTest.java
+++ 
b/modules/vault/src/integrationTest/java/org/apache/ignite/internal/vault/persistence/ItPersistencePropertiesVaultServiceTest.java
@@ -55,25 +55,35 @@ class ItPersistencePropertiesVaultServiceTest {
                 new ByteArray("key" + 3), fromString("value" + 3)
         );
 
-        try (var vaultService = new PersistentVaultService(vaultDir)) {
-            vaultService.start();
+        var service = new PersistentVaultService(vaultDir);
 
-            assertThat(vaultService.putAll(data), 
willBe(nullValue(Void.class)));
+        try {
+            service.start();
+
+            assertThat(service.putAll(data), willBe(nullValue(Void.class)));
+        } finally {
+            service.close();
         }
 
-        try (var vaultService = new PersistentVaultService(vaultDir)) {
-            vaultService.start();
+        service = new PersistentVaultService(vaultDir);
+
+        try {
+            service.start();
 
             assertThat(
-                    vaultService.get(new ByteArray("key" + 1)),
+                    service.get(new ByteArray("key" + 1)),
                     willBe(equalTo(new VaultEntry(new ByteArray("key" + 1), 
fromString("value" + 1))))
             );
+        } finally {
+            service.close();
         }
 
-        try (var vaultService = new PersistentVaultService(vaultDir)) {
-            vaultService.start();
+        service = new PersistentVaultService(vaultDir);
+
+        try {
+            service.start();
 
-            try (var cursor = vaultService.range(new ByteArray("key" + 1), new 
ByteArray("key" + 4))) {
+            try (var cursor = service.range(new ByteArray("key" + 1), new 
ByteArray("key" + 4))) {
                 List<VaultEntry> expectedData = data.entrySet().stream()
                         .map(e -> new VaultEntry(e.getKey(), e.getValue()))
                         .sorted(Comparator.comparing(VaultEntry::key))
@@ -81,6 +91,8 @@ class ItPersistencePropertiesVaultServiceTest {
 
                 assertThat(cursor.stream().collect(toList()), 
is(expectedData));
             }
+        } finally {
+            service.close();
         }
     }
 
diff --git 
a/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultManager.java
 
b/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultManager.java
index a08f0a0eda..6cdcaf097c 100644
--- 
a/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultManager.java
+++ 
b/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultManager.java
@@ -53,7 +53,7 @@ public class VaultManager implements IgniteComponent {
 
     /** {@inheritDoc} */
     @Override
-    public void stop() throws Exception {
+    public void stop() {
         // TODO: IGNITE-15161 Implement component's stop.
         vaultSvc.close();
     }
diff --git 
a/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultService.java
 
b/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultService.java
index 6ec53e68e3..be9be5f1b3 100644
--- 
a/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultService.java
+++ 
b/modules/vault/src/main/java/org/apache/ignite/internal/vault/VaultService.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.vault;
 
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
+import org.apache.ignite.internal.close.ManuallyCloseable;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.lang.ByteArray;
 import org.jetbrains.annotations.Nullable;
@@ -26,7 +27,7 @@ import org.jetbrains.annotations.Nullable;
 /**
  * Defines interface for accessing to the Vault service.
  */
-public interface VaultService extends AutoCloseable {
+public interface VaultService extends ManuallyCloseable {
     /**
      * Starts the service.
      */
@@ -76,4 +77,10 @@ public interface VaultService extends AutoCloseable {
      * @return Future representing pending completion of the operation. Cannot 
be {@code null}.
      */
     CompletableFuture<Void> putAll(Map<ByteArray, byte[]> vals);
+
+    /**
+     * Closes the service.
+     */
+    @Override
+    void close();
 }
diff --git 
a/modules/vault/src/main/java/org/apache/ignite/internal/vault/persistence/PersistentVaultService.java
 
b/modules/vault/src/main/java/org/apache/ignite/internal/vault/persistence/PersistentVaultService.java
index 02aeaf87e9..99a6a9191b 100644
--- 
a/modules/vault/src/main/java/org/apache/ignite/internal/vault/persistence/PersistentVaultService.java
+++ 
b/modules/vault/src/main/java/org/apache/ignite/internal/vault/persistence/PersistentVaultService.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.future.InFlightFutures;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.rocksdb.RocksIteratorAdapter;
+import org.apache.ignite.internal.rocksdb.RocksUtils;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
 import org.apache.ignite.internal.util.Cursor;
 import org.apache.ignite.internal.util.IgniteUtils;
@@ -110,12 +111,12 @@ public class PersistentVaultService implements 
VaultService {
 
     /** {@inheritDoc} */
     @Override
-    public void close() throws Exception {
+    public void close() {
         IgniteUtils.shutdownAndAwaitTermination(threadPool, 10, 
TimeUnit.SECONDS);
 
         futureTracker.cancelInFlightFutures();
 
-        IgniteUtils.closeAll(options, db);
+        RocksUtils.closeAll(options, db);
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/vault/src/test/java/org/apache/ignite/internal/vault/VaultServiceTest.java
 
b/modules/vault/src/test/java/org/apache/ignite/internal/vault/VaultServiceTest.java
index c383512227..b93fc3bf81 100644
--- 
a/modules/vault/src/test/java/org/apache/ignite/internal/vault/VaultServiceTest.java
+++ 
b/modules/vault/src/test/java/org/apache/ignite/internal/vault/VaultServiceTest.java
@@ -60,7 +60,7 @@ public abstract class VaultServiceTest {
      * After each.
      */
     @AfterEach
-    void tearDown() throws Exception {
+    void tearDown() {
         vaultService.close();
     }
 

Reply via email to