You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ge...@apache.org on 2023/07/05 14:58:18 UTC

[solr] branch branch_9x updated: SOLR-16840: Workaround HK2 DI bug (#1726)

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

gerlowskija pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/branch_9x by this push:
     new 4087cab386c SOLR-16840: Workaround HK2 DI bug (#1726)
4087cab386c is described below

commit 4087cab386c30e2cf11a38a6982886660e877dd4
Author: Jason Gerlowski <ge...@apache.org>
AuthorDate: Fri Jun 30 14:58:00 2023 -0400

    SOLR-16840: Workaround HK2 DI bug (#1726)
    
    Prior to this commit many v2 invocations would succeed but log scary
    looking stacktraces to Solr's console log.  This was because of a bug in
    how Jersey creates and cleans up "RequestScoped" objects.  (See
    Jersey#3503 for more details.)
    
    This commit works around the bug by changing how several "factory"
    classes obtain a "ContainerRequestContext": switching away from DI and
    towards looking up the CRC more explicitly using a "ServiceLocator".
---
 .../org/apache/solr/jersey/InjectionFactories.java | 77 ++++++++++------------
 1 file changed, 33 insertions(+), 44 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/jersey/InjectionFactories.java b/solr/core/src/java/org/apache/solr/jersey/InjectionFactories.java
index f84090d4250..8ba5c45b788 100644
--- a/solr/core/src/java/org/apache/solr/jersey/InjectionFactories.java
+++ b/solr/core/src/java/org/apache/solr/jersey/InjectionFactories.java
@@ -20,49 +20,38 @@ package org.apache.solr.jersey;
 import static org.apache.solr.jersey.RequestContextKeys.SOLR_CORE;
 import static org.apache.solr.jersey.RequestContextKeys.SOLR_PARAMS;
 
-import javax.inject.Inject;
 import javax.ws.rs.container.ContainerRequestContext;
+import javax.ws.rs.core.Context;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
 import org.apache.solr.schema.IndexSchema;
 import org.glassfish.hk2.api.Factory;
+import org.glassfish.hk2.api.ServiceLocator;
 
 public class InjectionFactories {
 
-  public static class SolrQueryRequestFactory implements Factory<SolrQueryRequest> {
-
-    private final ContainerRequestContext containerRequestContext;
-
-    @Inject
-    public SolrQueryRequestFactory(ContainerRequestContext containerRequestContext) {
-      this.containerRequestContext = containerRequestContext;
-    }
+  public static class SolrQueryRequestFactory extends RequestContextBasedFactory
+      implements Factory<SolrQueryRequest> {
 
     @Override
     public SolrQueryRequest provide() {
       return (SolrQueryRequest)
-          containerRequestContext.getProperty(RequestContextKeys.SOLR_QUERY_REQUEST);
+          getRequestContext().getProperty(RequestContextKeys.SOLR_QUERY_REQUEST);
     }
 
     @Override
     public void dispose(SolrQueryRequest instance) {}
   }
 
-  public static class SolrQueryResponseFactory implements Factory<SolrQueryResponse> {
-
-    private final ContainerRequestContext containerRequestContext;
-
-    @Inject
-    public SolrQueryResponseFactory(ContainerRequestContext containerRequestContext) {
-      this.containerRequestContext = containerRequestContext;
-    }
+  public static class SolrQueryResponseFactory extends RequestContextBasedFactory
+      implements Factory<SolrQueryResponse> {
 
     @Override
     public SolrQueryResponse provide() {
       return (SolrQueryResponse)
-          containerRequestContext.getProperty(RequestContextKeys.SOLR_QUERY_RESPONSE);
+          getRequestContext().getProperty(RequestContextKeys.SOLR_QUERY_RESPONSE);
     }
 
     @Override
@@ -70,18 +59,12 @@ public class InjectionFactories {
   }
 
   /** Fetch the (existing) SolrCore from the request context */
-  public static class ReuseFromContextSolrCoreFactory implements Factory<SolrCore> {
-
-    private final ContainerRequestContext containerRequestContext;
-
-    @Inject
-    public ReuseFromContextSolrCoreFactory(ContainerRequestContext containerRequestContext) {
-      this.containerRequestContext = containerRequestContext;
-    }
+  public static class ReuseFromContextSolrCoreFactory extends RequestContextBasedFactory
+      implements Factory<SolrCore> {
 
     @Override
     public SolrCore provide() {
-      return (SolrCore) containerRequestContext.getProperty(SOLR_CORE);
+      return (SolrCore) getRequestContext().getProperty(SOLR_CORE);
     }
 
     @Override
@@ -89,16 +72,14 @@ public class InjectionFactories {
   }
 
   public static class ReuseFromContextIndexSchemaFactory implements Factory<IndexSchema> {
-
-    private final SolrCore solrCore;
-
-    @Inject
-    public ReuseFromContextIndexSchemaFactory(SolrCore solrCore) {
-      this.solrCore = solrCore;
-    }
+    @Context ServiceLocator serviceLocator;
 
     @Override
     public IndexSchema provide() {
+      return doProvide(serviceLocator.getService(SolrCore.class));
+    }
+
+    private IndexSchema doProvide(SolrCore solrCore) {
       return solrCore.getLatestSchema();
     }
 
@@ -106,24 +87,32 @@ public class InjectionFactories {
     public void dispose(IndexSchema instance) {}
   }
 
-  public static class ReuseFromContextSolrParamsFactory implements Factory<SolrParams> {
-
-    private final ContainerRequestContext containerRequestContext;
-
-    @Inject
-    public ReuseFromContextSolrParamsFactory(ContainerRequestContext containerRequestContext) {
-      this.containerRequestContext = containerRequestContext;
-    }
+  public static class ReuseFromContextSolrParamsFactory extends RequestContextBasedFactory
+      implements Factory<SolrParams> {
 
     @Override
     public SolrParams provide() {
-      return (SolrParams) containerRequestContext.getProperty(SOLR_PARAMS);
+      return (SolrParams) getRequestContext().getProperty(SOLR_PARAMS);
     }
 
     @Override
     public void dispose(SolrParams instance) {}
   }
 
+  /**
+   * Allows access to a {@link ContainerRequestContext} via a {@link ServiceLocator}
+   *
+   * <p>ServiceLocator must be used util https://github.com/eclipse-ee4j/jersey/issues/3503 is
+   * resolved.
+   */
+  public static class RequestContextBasedFactory {
+    @Context ServiceLocator serviceLocator;
+
+    public ContainerRequestContext getRequestContext() {
+      return serviceLocator.getService(ContainerRequestContext.class);
+    }
+  }
+
   public static class SingletonFactory<T> implements Factory<T> {
 
     private final T singletonVal;