You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@activemq.apache.org by "Grzegorz Grzybek (Jira)" <ji...@apache.org> on 2025/10/10 05:35:00 UTC

[jira] [Created] (ARTEMIS-5700) KubernetesLoginModule doesn't control HttpClient instances

Grzegorz Grzybek created ARTEMIS-5700:
-----------------------------------------

             Summary: KubernetesLoginModule doesn't control HttpClient instances
                 Key: ARTEMIS-5700
                 URL: https://issues.apache.org/jira/browse/ARTEMIS-5700
             Project: ActiveMQ Artemis
          Issue Type: Bug
            Reporter: Grzegorz Grzybek


After some heap dump analysis, I realized that a scenario where {{org.apache.activemq.artemis.spi.core.security.jaas.KubernetesLoginModule}} is used as JAAS login module is inefficient.

JAAS' LoginContext _instantiates_ the login modules on each {{lc.login()}} and we have:
{code:java}
public KubernetesLoginModule(KubernetesClient client) {
   this.client = client;
}
public KubernetesLoginModule() {
   this(new KubernetesClientImpl());
}
{code}

{{org.apache.activemq.artemis.spi.core.security.jaas.kubernetes.client.KubernetesClientImpl}} calls this in {{getTokenReview()}}:
{code:java}
HttpClient client = HttpClient.newBuilder().sslContext(ctx).build();
HttpRequest request = HttpRequest.newBuilder(apiUri)
      .header("Authorization", "Bearer " + authToken)
      .header("Accept", "application/json; charset=utf-8")
      .POST(HttpRequest.BodyPublishers.ofString(jsonRequest)).build();
logger.debug("Submit TokenReview request to Kubernetes API");
try {
   HttpResponse<String> response = client.send(request, BodyHandlers.ofString());
   if (response.statusCode() == HTTP_CREATED) {
      logger.debug("Received valid TokenReview response");
      return TokenReview.fromJsonString(response.body());
   }
   logger.error("Unable to retrieve a valid TokenReview. Received StatusCode: {}. Body: {}",
         response.statusCode(), response.body());
} catch (IOException | InterruptedException e) {
   logger.error("Unable to request ReviewToken", e);
}
return tokenReview;
{code}

The point is that {{jdk.internal.net.http.HttpClientImpl}} is not closeable and is supposed to be reused.
{{jdk.internal.net.http.AuthenticationFilter#caches}} holds the weak map of clients, but without GC the number of instances will grow unnecessarily.

Also creation of HttpClient is not negligible when doing token reviews so often.

----

I'm just finishing big Jolokia changes related to JAAS and authentication and may at some point review JAAS usage in AMQ.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@activemq.apache.org
For additional commands, e-mail: issues-help@activemq.apache.org
For further information, visit: https://activemq.apache.org/contact