summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2022-11-29 18:15:29 +0100
committerGitHub <noreply@github.com>2022-11-29 18:15:29 +0100
commit0bc82ef441d34bce1ae79b797973393c0675184c (patch)
tree6e86d3440cc3bda8afb9f50a5062d2a1ec3cb5aa
parent26eaef25144e64c3b6613816dfc9aeddf42cc50a (diff)
parente807b7cab069732251d797a25f2bb6c8fd70c095 (diff)
Merge pull request #25045 from vespa-engine/balder/reduce-jdisc-http-httprequest-infestation
Balder/reduce jdisc http httprequest infestation
-rw-r--r--container-core/abi-spec.json4
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/HttpRequest.java31
-rw-r--r--container-core/src/main/java/com/yahoo/container/jdisc/ThreadedHttpRequestHandler.java5
-rw-r--r--container-search/abi-spec.json1
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java2
-rw-r--r--container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java3
-rw-r--r--container-search/src/main/java/com/yahoo/search/Query.java7
-rw-r--r--container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java2
-rw-r--r--container-search/src/main/java/com/yahoo/search/logging/LoggerEntry.java10
-rw-r--r--container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java8
-rw-r--r--container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java2
-rw-r--r--vespaclient-core/src/main/java/com/yahoo/feedhandler/InputStreamRequest.java4
12 files changed, 58 insertions, 21 deletions
diff --git a/container-core/abi-spec.json b/container-core/abi-spec.json
index 9c2638a0a64..5f86db1d385 100644
--- a/container-core/abi-spec.json
+++ b/container-core/abi-spec.json
@@ -627,6 +627,10 @@
"public com.yahoo.jdisc.http.HttpRequest$Method getMethod()",
"public java.net.URI getUri()",
"public com.yahoo.jdisc.http.HttpRequest getJDiscRequest()",
+ "public java.util.Map context()",
+ "public long creationTime(java.util.concurrent.TimeUnit)",
+ "public long getConnectedAt(java.util.concurrent.TimeUnit)",
+ "public long relativeCreatedAtNanoTime()",
"public java.lang.String getProperty(java.lang.String)",
"public java.util.Map propertyMap()",
"public boolean getBooleanProperty(java.lang.String)",
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/HttpRequest.java b/container-core/src/main/java/com/yahoo/container/jdisc/HttpRequest.java
index d5ac3a9a124..100fb053ecf 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/HttpRequest.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/HttpRequest.java
@@ -23,6 +23,7 @@ import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
+import java.util.concurrent.TimeUnit;
import static com.yahoo.jdisc.http.HttpRequest.Method;
@@ -455,6 +456,36 @@ public class HttpRequest {
}
/**
+ * <p>Returns the named application context objects. This data is not intended for network transport, rather they
+ * are intended for passing shared data between components of an Application.</p>
+ *
+ * @return The context map.
+ */
+ public Map<String, Object> context() {
+ return parentRequest.context();
+ }
+
+ /** Returns the time at which this Request was created. */
+ public long creationTime(TimeUnit unit) {
+ return parentRequest.creationTime(unit);
+ }
+
+ /**
+ * <p>For server requests, this returns the timestamp of when the underlying HTTP channel was connected.
+ *
+ * @param unit the unit to return the time in
+ * @return the timestamp of when the underlying HTTP channel was connected, or request creation time
+ */
+ public long getConnectedAt(TimeUnit unit) {
+ return parentRequest.getConnectedAt(TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * @return the relative created timestamp (using {@link System#nanoTime()}
+ */
+ public long relativeCreatedAtNanoTime() { return parentRequest.relativeCreatedAtNanoTime(); }
+
+ /**
* Returns the value of a request property/parameter.
* Multi-value properties are not supported.
*
diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedHttpRequestHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedHttpRequestHandler.java
index fb7ba1ab39e..06d372c967c 100644
--- a/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedHttpRequestHandler.java
+++ b/container-core/src/main/java/com/yahoo/container/jdisc/ThreadedHttpRequestHandler.java
@@ -79,14 +79,13 @@ public abstract class ThreadedHttpRequestHandler extends ThreadedRequestHandler
@Override
public final void handleRequest(Request request, BufferedContentChannel requestContent, ResponseHandler responseHandler) {
log.log(Level.FINE, () -> "In " + this.getClass() + ".handleRequest()");
- com.yahoo.jdisc.http.HttpRequest jdiscRequest = asHttpRequest(request);
- HttpRequest httpRequest = new HttpRequest(jdiscRequest, new UnsafeContentInputStream(requestContent.toReadable()));
+ HttpRequest httpRequest = new HttpRequest(asHttpRequest(request), new UnsafeContentInputStream(requestContent.toReadable()));
LazyContentChannel channel = null;
try {
channel = new LazyContentChannel(httpRequest, responseHandler, metric, log);
HttpResponse httpResponse = handle(httpRequest, channel);
channel.setHttpResponse(httpResponse); // may or may not have already been done
- render(httpRequest, httpResponse, channel, jdiscRequest.creationTime(TimeUnit.MILLISECONDS));
+ render(httpRequest, httpResponse, channel, httpRequest.creationTime(TimeUnit.MILLISECONDS));
} catch (Exception e) {
metric.add(UNHANDLED_EXCEPTIONS_METRIC, 1L, contextFor(request, Map.of("exception", e.getClass().getSimpleName())));
metric.add(RENDERING_ERRORS, 1, null);
diff --git a/container-search/abi-spec.json b/container-search/abi-spec.json
index ab8718508b7..22be0d32f69 100644
--- a/container-search/abi-spec.json
+++ b/container-search/abi-spec.json
@@ -1985,6 +1985,7 @@
"public com.yahoo.search.query.Model getModel()",
"public com.yahoo.search.query.Trace getTrace()",
"public com.yahoo.container.jdisc.HttpRequest getHttpRequest()",
+ "public java.net.URI getUri()",
"public com.yahoo.search.query.SessionId getSessionId()",
"public com.yahoo.search.query.SessionId getSessionId(java.lang.String)",
"public void prepare()",
diff --git a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java
index f948ddfb8e9..494b16304ea 100644
--- a/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/fastsearch/VespaBackEndSearcher.java
@@ -162,7 +162,7 @@ public abstract class VespaBackEndSearcher extends PingableSearcher {
// query root should not be null here
Item root = query.getModel().getQueryTree().getRoot();
if (root == null || root instanceof NullItem) {
- return new Result(query, ErrorMessage.createNullQuery(query.getHttpRequest().getUri().toString()));
+ return new Result(query, ErrorMessage.createNullQuery(query.getUri().toString()));
}
if ( ! getDocumentDatabase(query).schema().rankProfiles().containsKey(query.getRanking().getProfile()))
diff --git a/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java b/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java
index 6401945799b..09f15b4c5c2 100644
--- a/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java
+++ b/container-search/src/main/java/com/yahoo/prelude/statistics/StatisticsSearcher.java
@@ -3,8 +3,8 @@ package com.yahoo.prelude.statistics;
import com.yahoo.component.chain.dependencies.Before;
import com.yahoo.concurrent.CopyOnWriteHashMap;
+import com.yahoo.container.jdisc.HttpRequest;
import com.yahoo.jdisc.Metric;
-import com.yahoo.jdisc.http.HttpRequest;
import com.yahoo.metrics.simple.MetricReceiver;
import com.yahoo.metrics.simple.MetricSettings;
import com.yahoo.processing.request.CompoundName;
@@ -410,7 +410,6 @@ public class StatisticsSearcher extends Searcher {
*/
private static long getStartNanoTime(Query query) {
return Optional.ofNullable(query.getHttpRequest())
- .flatMap(httpRequest -> Optional.ofNullable(httpRequest.getJDiscRequest()))
.map(HttpRequest::relativeCreatedAtNanoTime)
.orElseGet(System::nanoTime);
}
diff --git a/container-search/src/main/java/com/yahoo/search/Query.java b/container-search/src/main/java/com/yahoo/search/Query.java
index dc9609f2d0d..be964081326 100644
--- a/container-search/src/main/java/com/yahoo/search/Query.java
+++ b/container-search/src/main/java/com/yahoo/search/Query.java
@@ -46,6 +46,7 @@ import com.yahoo.search.yql.VespaSerializer;
import com.yahoo.search.yql.YqlParser;
import com.yahoo.yolean.Exceptions;
+import java.net.URI;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collections;
@@ -362,7 +363,7 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
Map<String, Embedder> embedders,
ZoneInfo zoneInfo,
SchemaInfo schemaInfo) {
- startTime = httpRequest.getJDiscRequest().creationTime(TimeUnit.MILLISECONDS);
+ startTime = httpRequest.creationTime(TimeUnit.MILLISECONDS);
if (queryProfile != null) {
// Move all request parameters to the query profile
Properties queryProfileProperties = new QueryProfileProperties(queryProfile, embedders, zoneInfo);
@@ -912,7 +913,9 @@ public class Query extends com.yahoo.processing.Request implements Cloneable {
* Return the HTTP request which caused this query. This will never be null
* when running with queries from the network.
*/
- public HttpRequest getHttpRequest() { return httpRequest; }
+ public HttpRequest getHttpRequest() { return httpRequest; }
+
+ public URI getUri() { return httpRequest != null ? httpRequest.getUri() : null; }
/** Returns the session id of this query, or null if none is assigned */
public SessionId getSessionId() {
diff --git a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
index 3da3f57cb21..39721ffab29 100644
--- a/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
+++ b/container-search/src/main/java/com/yahoo/search/handler/SearchHandler.java
@@ -337,7 +337,7 @@ public class SearchHandler extends LoggingRequestHandler {
private void traceRequestAttributes(Query query) {
int miminumTraceLevel = 7;
if (query.getTraceLevel() >= 7) {
- query.trace("Request attributes: " + query.getHttpRequest().getJDiscRequest().context(), miminumTraceLevel);
+ query.trace("Request attributes: " + query.getHttpRequest().context(), miminumTraceLevel);
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/logging/LoggerEntry.java b/container-search/src/main/java/com/yahoo/search/logging/LoggerEntry.java
index 8d8afce4f77..ffac8b89860 100644
--- a/container-search/src/main/java/com/yahoo/search/logging/LoggerEntry.java
+++ b/container-search/src/main/java/com/yahoo/search/logging/LoggerEntry.java
@@ -9,6 +9,7 @@ import com.yahoo.slime.SlimeUtils;
import com.yahoo.text.Utf8;
import java.io.IOException;
import java.io.UncheckedIOException;
+import java.net.URI;
import java.nio.ByteBuffer;
import java.util.Base64;
@@ -37,10 +38,11 @@ public class LoggerEntry {
public String queryString() {
String queryString = null;
if (query != null) {
- if (query.getHttpRequest() != null && query.getHttpRequest().getUri() != null) {
- queryString = query.getHttpRequest().getUri().getPath();
- if (query.getHttpRequest().getUri().getQuery() != null) {
- queryString += "?" + query.getHttpRequest().getUri().getRawQuery();
+ URI uri = query.getUri();
+ if (uri != null) {
+ queryString = uri.getPath();
+ if (uri.getQuery() != null) {
+ queryString += "?" + uri.getRawQuery();
}
}
}
diff --git a/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java b/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java
index 15c683ccb10..90cb05be1f8 100644
--- a/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java
+++ b/container-search/src/main/java/com/yahoo/search/searchers/ConnectionControlSearcher.java
@@ -1,7 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.search.searchers;
-import com.yahoo.container.jdisc.HttpRequest;
+import com.yahoo.component.annotation.Inject;
import com.yahoo.processing.request.CompoundName;
import com.yahoo.search.Query;
import com.yahoo.search.Result;
@@ -53,6 +53,7 @@ public class ConnectionControlSearcher extends Searcher {
private static final String HTTP_CONNECTION_HEADER_NAME = "Connection";
private static final String HTTP_CONNECTION_CLOSE_ARGUMENT = "Close";
+ @Inject
public ConnectionControlSearcher() {
this(() -> System.currentTimeMillis());
}
@@ -100,14 +101,13 @@ public class ConnectionControlSearcher extends Searcher {
}
private void setCloseIfLifetimeExceeded(Query query, Result result, int maxLifetimeSeconds) {
- final HttpRequest httpRequest = query.getHttpRequest();
- if (httpRequest == null) {
+ if (query.getHttpRequest() == null) {
query.trace(false, 5, simpleName, " got max lifetime = ", maxLifetimeSeconds,
", but got no JDisc request. Setting no header.");
return;
}
- final long connectedAtMillis = httpRequest.getJDiscRequest().getConnectedAt(TimeUnit.MILLISECONDS);
+ final long connectedAtMillis = query.getHttpRequest().getConnectedAt(TimeUnit.MILLISECONDS);
final long maxLifeTimeMillis = maxLifetimeSeconds * 1000L;
if (connectedAtMillis + maxLifeTimeMillis < clock.getAsLong()) {
result.getHeaders(true).put(HTTP_CONNECTION_HEADER_NAME, HTTP_CONNECTION_CLOSE_ARGUMENT);
diff --git a/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java b/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java
index 06b6eca5f84..d70b42aa36b 100644
--- a/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java
+++ b/container-search/src/test/java/com/yahoo/prelude/test/QueryTestCase.java
@@ -71,7 +71,7 @@ public class QueryTestCase {
+ "yahoo+com!253+interest:www+yahoo!138+"
+ "interest:www+yahoo+com!136"
+ "&hits=20&offset=0&vectorranking=queryrank");
- assertEquals("/p13n", q.getHttpRequest().getUri().getPath());
+ assertEquals("/p13n", q.getUri().getPath());
assertEquals(0, q.getOffset());
assertEquals(20, q.getHits());
assertEquals("queryrank", q.properties().get("vectorranking"));
diff --git a/vespaclient-core/src/main/java/com/yahoo/feedhandler/InputStreamRequest.java b/vespaclient-core/src/main/java/com/yahoo/feedhandler/InputStreamRequest.java
index a62ecbd55ec..c29d6582ea7 100644
--- a/vespaclient-core/src/main/java/com/yahoo/feedhandler/InputStreamRequest.java
+++ b/vespaclient-core/src/main/java/com/yahoo/feedhandler/InputStreamRequest.java
@@ -6,9 +6,7 @@ import java.util.HashMap;
import java.util.Map;
/**
- * This is needed because whoever wrote this library moronically decided to pass in-process communication through
- * the HTTP layer. As the feeded is being phased out in favor of the standalone HTTP client we don't bother to clean
- * it up properly.
+ * Simple wrapper of a stream and some properties.
*
* @author bratseth
*/