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();
}