This is an automated email from the ASF dual-hosted git repository.
apkhmv 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 250213253b IGNITE-22342 Improve resource cleaning (#3822)
250213253b is described below
commit 250213253b1817942b3051645d51b761cb1499fa
Author: Vadim Pakhnushev <[email protected]>
AuthorDate: Mon May 27 16:47:04 2024 +0300
IGNITE-22342 Improve resource cleaning (#3822)
---
.../org/apache/ignite/internal/rest/ResourceHolder.java | 3 ++-
.../authentication/ClusterStateHttpServerFilter.java | 10 ++++++++--
.../rest/authentication/IgniteSecurityFilter.java | 10 ++++++++--
.../rest/cluster/ClusterManagementController.java | 13 ++++++++++---
.../ignite/internal/rest/cluster/TopologyController.java | 13 ++++++++++---
.../ignite/internal/rest/compute/ComputeController.java | 10 ++++++++--
.../configuration/AbstractConfigurationController.java | 10 ++++++++--
.../rest/deployment/DeploymentManagementController.java | 10 ++++++++--
.../internal/rest/metrics/NodeMetricController.java | 10 ++++++++--
.../internal/rest/node/NodeManagementController.java | 16 ++++++++++++----
.../rest/recovery/DisasterRecoveryController.java | 10 ++++++++--
11 files changed, 90 insertions(+), 25 deletions(-)
diff --git
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/ResourceHolder.java
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/ResourceHolder.java
index 0730bb439f..772245b2fc 100644
---
a/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/ResourceHolder.java
+++
b/modules/rest-api/src/main/java/org/apache/ignite/internal/rest/ResourceHolder.java
@@ -21,7 +21,8 @@ import io.micronaut.runtime.Micronaut;
/**
* A resource holder. Implement this interface in the bean class if it has a
chain of references to the {@link org.apache.ignite.Ignite}
- * instance.
+ * instance. In general, all REST controllers that use a {@link RestFactory}
to get the internal objects should implement this and clean up
+ * references and objects created by the {@link RestFactory} should also
implement this.
*/
public interface ResourceHolder {
/**
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/ClusterStateHttpServerFilter.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/ClusterStateHttpServerFilter.java
index 1c7c313228..a014e160dc 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/ClusterStateHttpServerFilter.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/ClusterStateHttpServerFilter.java
@@ -23,6 +23,7 @@ import io.micronaut.http.MutableHttpResponse;
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.filter.HttpServerFilter;
import io.micronaut.http.filter.ServerFilterChain;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.RestManager;
import org.apache.ignite.internal.rest.api.Problem;
import org.apache.ignite.internal.rest.constants.HttpCode;
@@ -35,8 +36,8 @@ import reactor.core.publisher.Mono;
* */
@Filter(Filter.MATCH_ALL_PATTERN)
@Requires(property = "ignite.endpoints.filter-non-initialized", value =
"true", defaultValue = "true")
-public class ClusterStateHttpServerFilter implements HttpServerFilter {
- private final RestManager restManager;
+public class ClusterStateHttpServerFilter implements HttpServerFilter,
ResourceHolder {
+ private RestManager restManager;
public ClusterStateHttpServerFilter(RestManager restManager) {
this.restManager = restManager;
@@ -55,5 +56,10 @@ public class ClusterStateHttpServerFilter implements
HttpServerFilter {
return Mono.empty();
}).switchIfEmpty(Mono.from(chain.proceed(request)));
}
+
+ @Override
+ public void cleanResources() {
+ restManager = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/IgniteSecurityFilter.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/IgniteSecurityFilter.java
index 0b687eddc1..06a3c19def 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/IgniteSecurityFilter.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/authentication/IgniteSecurityFilter.java
@@ -28,6 +28,7 @@ import io.micronaut.security.filters.AuthenticationFetcher;
import io.micronaut.security.filters.SecurityFilter;
import io.micronaut.security.rules.SecurityRule;
import java.util.Collection;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.reactivestreams.Publisher;
/**
@@ -35,10 +36,10 @@ import org.reactivestreams.Publisher;
*/
@Replaces(SecurityFilter.class)
@Filter(Filter.MATCH_ALL_PATTERN)
-public class IgniteSecurityFilter implements HttpServerFilter {
+public class IgniteSecurityFilter implements HttpServerFilter, ResourceHolder {
private final SecurityFilter securityFilter;
- private final IgniteAuthenticationProvider igniteAuthenticationProvider;
+ private IgniteAuthenticationProvider igniteAuthenticationProvider;
/**
* Constructor.
@@ -71,4 +72,9 @@ public class IgniteSecurityFilter implements HttpServerFilter
{
public int getOrder() {
return securityFilter.getOrder();
}
+
+ @Override
+ public void cleanResources() {
+ igniteAuthenticationProvider = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/ClusterManagementController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/ClusterManagementController.java
index bb8e204e5a..bf9264ae3d 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/ClusterManagementController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/ClusterManagementController.java
@@ -26,6 +26,7 @@ import
org.apache.ignite.internal.cluster.management.ClusterManagementGroupManag
import org.apache.ignite.internal.lang.IgniteInternalException;
import org.apache.ignite.internal.logger.IgniteLogger;
import org.apache.ignite.internal.logger.Loggers;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.api.cluster.ClusterManagementApi;
import org.apache.ignite.internal.rest.api.cluster.ClusterState;
import org.apache.ignite.internal.rest.api.cluster.ClusterTag;
@@ -38,12 +39,12 @@ import org.apache.ignite.lang.IgniteException;
* Cluster management controller implementation.
*/
@Controller("/management/v1/cluster")
-public class ClusterManagementController implements ClusterManagementApi {
+public class ClusterManagementController implements ClusterManagementApi,
ResourceHolder {
private static final IgniteLogger LOG =
Loggers.forClass(ClusterManagementController.class);
- private final ClusterInitializer clusterInitializer;
+ private ClusterInitializer clusterInitializer;
- private final ClusterManagementGroupManager clusterManagementGroupManager;
+ private ClusterManagementGroupManager clusterManagementGroupManager;
/**
* Cluster management controller constructor.
@@ -104,4 +105,10 @@ public class ClusterManagementController implements
ClusterManagementApi {
return new IgniteException(cause);
}
}
+
+ @Override
+ public void cleanResources() {
+ clusterInitializer = null;
+ clusterManagementGroupManager = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/TopologyController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/TopologyController.java
index 0722949db8..a2347b4323 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/TopologyController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/cluster/TopologyController.java
@@ -26,6 +26,7 @@ import java.util.concurrent.CompletableFuture;
import
org.apache.ignite.internal.cluster.management.ClusterManagementGroupManager;
import org.apache.ignite.internal.cluster.management.topology.api.LogicalNode;
import
org.apache.ignite.internal.cluster.management.topology.api.LogicalTopologySnapshot;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.api.cluster.ClusterNode;
import org.apache.ignite.internal.rest.api.cluster.NetworkAddress;
import org.apache.ignite.internal.rest.api.cluster.NodeMetadata;
@@ -36,10 +37,10 @@ import org.apache.ignite.network.TopologyService;
* Cluster topology endpoint implementation.
*/
@Controller("/management/v1/cluster/topology")
-public class TopologyController implements TopologyApi {
- private final TopologyService topologyService;
+public class TopologyController implements TopologyApi, ResourceHolder {
+ private TopologyService topologyService;
- private final ClusterManagementGroupManager cmgManager;
+ private ClusterManagementGroupManager cmgManager;
public TopologyController(TopologyService topologyService,
ClusterManagementGroupManager cmgManager) {
this.topologyService = topologyService;
@@ -84,4 +85,10 @@ public class TopologyController implements TopologyApi {
}
return new NodeMetadata(metadata.restHost(), metadata.httpPort(),
metadata.httpsPort());
}
+
+ @Override
+ public void cleanResources() {
+ topologyService = null;
+ cmgManager = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/compute/ComputeController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/compute/ComputeController.java
index 6d2602f023..146a135e14 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/compute/ComputeController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/compute/ComputeController.java
@@ -26,6 +26,7 @@ import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import org.apache.ignite.internal.compute.IgniteComputeInternal;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.api.compute.ComputeApi;
import org.apache.ignite.internal.rest.api.compute.JobState;
import org.apache.ignite.internal.rest.api.compute.JobStatus;
@@ -38,8 +39,8 @@ import org.jetbrains.annotations.Nullable;
* REST controller for compute operations.
*/
@Controller
-public class ComputeController implements ComputeApi {
- private final IgniteComputeInternal compute;
+public class ComputeController implements ComputeApi, ResourceHolder {
+ private IgniteComputeInternal compute;
public ComputeController(IgniteComputeInternal compute) {
this.compute = compute;
@@ -98,4 +99,9 @@ public class ComputeController implements ComputeApi {
jobStatus.finishTime()
);
}
+
+ @Override
+ public void cleanResources() {
+ compute = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/configuration/AbstractConfigurationController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/configuration/AbstractConfigurationController.java
index 33ba7b5d0f..9b76585f47 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/configuration/AbstractConfigurationController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/configuration/AbstractConfigurationController.java
@@ -21,15 +21,16 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import
org.apache.ignite.configuration.validation.ConfigurationValidationException;
import
org.apache.ignite.internal.configuration.presentation.ConfigurationPresentation;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.lang.IgniteException;
/**
* Base configuration controller.
*/
-public abstract class AbstractConfigurationController {
+public abstract class AbstractConfigurationController implements
ResourceHolder {
/** Presentation of the configuration. */
- private final ConfigurationPresentation<String> cfgPresentation;
+ private ConfigurationPresentation<String> cfgPresentation;
public AbstractConfigurationController(ConfigurationPresentation<String>
cfgPresentation) {
this.cfgPresentation = cfgPresentation;
@@ -76,4 +77,9 @@ public abstract class AbstractConfigurationController {
throw new IgniteException(ex);
});
}
+
+ @Override
+ public void cleanResources() {
+ cfgPresentation = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/deployment/DeploymentManagementController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/deployment/DeploymentManagementController.java
index 0f0cf3e168..c1f7856e07 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/deployment/DeploymentManagementController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/deployment/DeploymentManagementController.java
@@ -34,6 +34,7 @@ import org.apache.ignite.internal.deployunit.NodesToDeploy;
import org.apache.ignite.internal.deployunit.UnitStatuses;
import org.apache.ignite.internal.logger.IgniteLogger;
import org.apache.ignite.internal.logger.Loggers;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.api.deployment.DeploymentCodeApi;
import org.apache.ignite.internal.rest.api.deployment.DeploymentStatus;
import org.apache.ignite.internal.rest.api.deployment.InitialDeployMode;
@@ -47,10 +48,10 @@ import org.reactivestreams.Publisher;
*/
@SuppressWarnings("OptionalContainsCollection")
@Controller("/management/v1/deployment")
-public class DeploymentManagementController implements DeploymentCodeApi {
+public class DeploymentManagementController implements DeploymentCodeApi,
ResourceHolder {
private static final IgniteLogger LOG =
Loggers.forClass(DeploymentManagementController.class);
- private final IgniteDeployment deployment;
+ private IgniteDeployment deployment;
public DeploymentManagementController(IgniteDeployment deployment) {
this.deployment = deployment;
@@ -209,4 +210,9 @@ public class DeploymentManagementController implements
DeploymentCodeApi {
private static DeploymentStatus
fromDeploymentStatus(org.apache.ignite.internal.deployunit.DeploymentStatus
status) {
return DeploymentStatus.valueOf(status.name());
}
+
+ @Override
+ public void cleanResources() {
+ deployment = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
index 914d670d78..243f38dd8d 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/metrics/NodeMetricController.java
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
import org.apache.ignite.internal.metrics.MetricManager;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.api.metric.Metric;
import org.apache.ignite.internal.rest.api.metric.MetricSet;
import org.apache.ignite.internal.rest.api.metric.MetricSource;
@@ -31,8 +32,8 @@ import
org.apache.ignite.internal.rest.metrics.exception.MetricNotFoundException
/** Node metric controller. */
@Controller("/management/v1/metric/node")
-public class NodeMetricController implements NodeMetricApi {
- private final MetricManager metricManager;
+public class NodeMetricController implements NodeMetricApi, ResourceHolder {
+ private MetricManager metricManager;
public NodeMetricController(MetricManager metricManager) {
this.metricManager = metricManager;
@@ -74,4 +75,9 @@ public class NodeMetricController implements NodeMetricApi {
})
.collect(Collectors.toList());
}
+
+ @Override
+ public void cleanResources() {
+ metricManager = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/node/NodeManagementController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/node/NodeManagementController.java
index fb0b6dfb60..53b7e2c9ba 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/node/NodeManagementController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/node/NodeManagementController.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.rest.node;
import io.micronaut.http.annotation.Controller;
import org.apache.ignite.internal.properties.IgniteProductVersion;
+import org.apache.ignite.internal.rest.RestFactory;
import org.apache.ignite.internal.rest.api.node.NodeInfo;
import org.apache.ignite.internal.rest.api.node.NodeManagementApi;
import org.apache.ignite.internal.rest.api.node.NodeState;
@@ -27,12 +28,12 @@ import org.apache.ignite.internal.rest.api.node.NodeState;
* REST endpoint allows to read node state.
*/
@Controller("/management/v1/node")
-public class NodeManagementController implements NodeManagementApi {
- private final StateProvider stateProvider;
+public class NodeManagementController implements NodeManagementApi,
RestFactory {
+ private StateProvider stateProvider;
- private final NameProvider nameProvider;
+ private NameProvider nameProvider;
- private final JdbcPortProvider jdbcPortProvider;
+ private JdbcPortProvider jdbcPortProvider;
/**
* Constructs node management controller.
@@ -57,4 +58,11 @@ public class NodeManagementController implements
NodeManagementApi {
public String version() {
return IgniteProductVersion.CURRENT_VERSION.toString();
}
+
+ @Override
+ public void cleanResources() {
+ nameProvider = null;
+ stateProvider = null;
+ jdbcPortProvider = null;
+ }
}
diff --git
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/recovery/DisasterRecoveryController.java
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/recovery/DisasterRecoveryController.java
index 65b1f501e6..fd244fb9af 100644
---
a/modules/rest/src/main/java/org/apache/ignite/internal/rest/recovery/DisasterRecoveryController.java
+++
b/modules/rest/src/main/java/org/apache/ignite/internal/rest/recovery/DisasterRecoveryController.java
@@ -30,6 +30,7 @@ import java.util.Optional;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import org.apache.ignite.internal.replicator.TablePartitionId;
+import org.apache.ignite.internal.rest.ResourceHolder;
import org.apache.ignite.internal.rest.api.recovery.DisasterRecoveryApi;
import
org.apache.ignite.internal.rest.api.recovery.GlobalPartitionStateResponse;
import
org.apache.ignite.internal.rest.api.recovery.GlobalPartitionStatesResponse;
@@ -47,8 +48,8 @@ import
org.apache.ignite.internal.table.distributed.disaster.LocalPartitionState
*/
@Controller("/management/v1/recovery/")
@Requires(classes = IgniteInternalExceptionHandler.class)
-public class DisasterRecoveryController implements DisasterRecoveryApi {
- private final DisasterRecoveryManager disasterRecoveryManager;
+public class DisasterRecoveryController implements DisasterRecoveryApi,
ResourceHolder {
+ private DisasterRecoveryManager disasterRecoveryManager;
public DisasterRecoveryController(DisasterRecoveryManager
disasterRecoveryManager) {
this.disasterRecoveryManager = disasterRecoveryManager;
@@ -133,4 +134,9 @@ public class DisasterRecoveryController implements
DisasterRecoveryApi {
return new GlobalPartitionStatesResponse(states);
}
+
+ @Override
+ public void cleanResources() {
+ disasterRecoveryManager = null;
+ }
}