Skip to content

Commit 9b9ecbf

Browse files
wildtuskerdsmiley
andauthored
SOLR-17810 : Jetty & Jdk SolrClient requests should be recognized by rate limiter (#4282)
Co-authored-by: David Smiley <dsmiley@apache.org>
1 parent dcd1cc9 commit 9b9ecbf

4 files changed

Lines changed: 32 additions & 9 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
title: >
2+
HttpJdkSolrClient & HttpJettySolrClient now send headers that enable Solr's rate limiting to work.
3+
type: changed
4+
authors:
5+
- name: David Smiley
6+
- name: Gaurav Tuli
7+
links:
8+
- name: SOLR-17810
9+
url: https://issues.apache.org/jira/browse/SOLR-17810

solr/solrj-jetty/src/java/org/apache/solr/client/solrj/jetty/HttpJettySolrClient.java

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import org.apache.solr.client.solrj.request.RequestWriter;
5151
import org.apache.solr.client.solrj.response.ResponseParser;
5252
import org.apache.solr.client.solrj.util.ClientUtils;
53+
import org.apache.solr.common.params.CommonParams;
5354
import org.apache.solr.common.params.ModifiableSolrParams;
5455
import org.apache.solr.common.util.ContentStream;
5556
import org.apache.solr.common.util.EnvUtils;
@@ -620,7 +621,19 @@ private void setBasicAuthHeader(SolrRequest<?> solrRequest, Request req) {
620621
}
621622

622623
protected void decorateRequest(Request req, SolrRequest<?> solrRequest, boolean isAsync) {
623-
req.headers(headers -> headers.remove(HttpHeader.ACCEPT_ENCODING));
624+
req.headers(h -> h.remove(HttpHeader.ACCEPT_ENCODING));
625+
Map<String, String> customHeaders = solrRequest.getHeaders();
626+
if (customHeaders != null) {
627+
req.headers(h -> customHeaders.forEach(h::add));
628+
}
629+
// note: if subsequent headers already added, the existing values win (first value considered)
630+
req.headers(
631+
h -> {
632+
h.add(CommonParams.SOLR_REQUEST_TYPE_PARAM, solrRequest.getRequestType().toString());
633+
// TODO: validate request context here: https://issues.apache.org/jira/browse/SOLR-14720
634+
h.add(CommonParams.SOLR_REQUEST_CONTEXT_PARAM, getContext().toString());
635+
});
636+
624637
req.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
625638
req.timeout(requestTimeoutMillis, TimeUnit.MILLISECONDS);
626639

@@ -640,11 +653,6 @@ protected void decorateRequest(Request req, SolrRequest<?> solrRequest, boolean
640653
req.onRequestQueued(asyncTracker.queuedListener);
641654
req.onComplete(asyncTracker.completeListener);
642655
}
643-
644-
Map<String, String> headers = solrRequest.getHeaders();
645-
if (headers != null) {
646-
req.headers(h -> headers.forEach(h::add));
647-
}
648656
}
649657

650658
private static class MakeRequestReturnValue {

solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1199,6 +1199,7 @@ public final NamedList<Object> request(final SolrRequest<?> request)
11991199
* communication between Solr nodes or as an external client). The default value is {@code
12001200
* SolrClientContext#Client}
12011201
*/
1202+
@Deprecated(since = "10.1") // TODO replace or refactor; see SOLR-14720 related
12021203
public SolrRequest.SolrClientContext getContext() {
12031204
return SolrRequest.SolrClientContext.CLIENT;
12041205
}

solr/solrj/src/java/org/apache/solr/client/solrj/impl/HttpJdkSolrClient.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
import org.apache.solr.client.solrj.response.ResponseParser;
5757
import org.apache.solr.client.solrj.util.ClientUtils;
5858
import org.apache.solr.common.SolrException;
59+
import org.apache.solr.common.params.CommonParams;
5960
import org.apache.solr.common.params.ModifiableSolrParams;
6061
import org.apache.solr.common.util.ContentStream;
6162
import org.apache.solr.common.util.ExecutorUtil;
@@ -451,14 +452,18 @@ private synchronized boolean maybeTryHeadRequestSync(URI uriNoQueryParams) {
451452

452453
private void decorateRequest(HttpRequest.Builder reqb, SolrRequest<?> solrRequest) {
453454
reqb.timeout(Duration.of(requestTimeoutMillis, ChronoUnit.MILLIS));
455+
454456
reqb.header("User-Agent", USER_AGENT);
455457
setBasicAuthHeader(solrRequest, reqb);
456-
Map<String, String> headers = solrRequest.getHeaders();
457-
if (headers != null) {
458-
for (Map.Entry<String, String> entry : headers.entrySet()) {
458+
Map<String, String> customHeaders = solrRequest.getHeaders();
459+
if (customHeaders != null) {
460+
for (Map.Entry<String, String> entry : customHeaders.entrySet()) {
459461
reqb.header(entry.getKey(), entry.getValue());
460462
}
461463
}
464+
reqb.header(CommonParams.SOLR_REQUEST_TYPE_PARAM, solrRequest.getRequestType().toString());
465+
// TODO: validate request context here: https://issues.apache.org/jira/browse/SOLR-14720
466+
reqb.header(CommonParams.SOLR_REQUEST_CONTEXT_PARAM, getContext().toString());
462467
}
463468

464469
private void setBasicAuthHeader(SolrRequest<?> solrRequest, HttpRequest.Builder reqb) {

0 commit comments

Comments
 (0)