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;
+    }
 }

Reply via email to