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;