Skip to content

Commit 95fc620

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

4 files changed

Lines changed: 31 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/src/java/org/apache/solr/client/solrj/SolrClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1213,6 +1213,7 @@ public DocumentObjectBinder getBinder() {
12131213
* communication between Solr nodes or as an external client). The default value is {@code
12141214
* SolrClientContext#Client}
12151215
*/
1216+
@Deprecated(since = "10.1") // TODO replace or refactor; see SOLR-14720 related
12161217
public SolrRequest.SolrClientContext getContext() {
12171218
return SolrRequest.SolrClientContext.CLIENT;
12181219
}

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

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.apache.solr.client.solrj.util.AsyncListener;
5858
import org.apache.solr.client.solrj.util.Cancellable;
5959
import org.apache.solr.client.solrj.util.ClientUtils;
60+
import org.apache.solr.common.params.CommonParams;
6061
import org.apache.solr.common.params.ModifiableSolrParams;
6162
import org.apache.solr.common.params.SolrParams;
6263
import org.apache.solr.common.params.UpdateParams;
@@ -736,7 +737,18 @@ private void setBasicAuthHeader(SolrRequest<?> solrRequest, Request req) {
736737
}
737738

738739
private void decorateRequest(Request req, SolrRequest<?> solrRequest, boolean isAsync) {
739-
req.headers(headers -> headers.remove(HttpHeader.ACCEPT_ENCODING));
740+
req.headers(h -> h.remove(HttpHeader.ACCEPT_ENCODING));
741+
Map<String, String> customHeaders = solrRequest.getHeaders();
742+
if (customHeaders != null) {
743+
req.headers(h -> customHeaders.forEach(h::add));
744+
}
745+
// note: if subsequent headers already added, the existing values win (first value considered)
746+
req.headers(
747+
h -> {
748+
h.add(CommonParams.SOLR_REQUEST_TYPE_PARAM, solrRequest.getRequestType().toString());
749+
// TODO: validate request context here: https://issues.apache.org/jira/browse/SOLR-14720
750+
h.add(CommonParams.SOLR_REQUEST_CONTEXT_PARAM, getContext().toString());
751+
});
740752
req.idleTimeout(idleTimeoutMillis, TimeUnit.MILLISECONDS);
741753
req.timeout(requestTimeoutMillis, TimeUnit.MILLISECONDS);
742754

@@ -756,11 +768,6 @@ private void decorateRequest(Request req, SolrRequest<?> solrRequest, boolean is
756768
req.onRequestQueued(asyncTracker.queuedListener);
757769
req.onComplete(asyncTracker.completeListener);
758770
}
759-
760-
Map<String, String> headers = solrRequest.getHeaders();
761-
if (headers != null) {
762-
req.headers(h -> headers.forEach(h::add));
763-
}
764771
}
765772

766773
private SolrRequest<?> unwrapV2Request(SolrRequest<?> solrRequest) {

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
@@ -57,6 +57,7 @@
5757
import org.apache.solr.client.solrj.util.Cancellable;
5858
import org.apache.solr.client.solrj.util.ClientUtils;
5959
import org.apache.solr.common.SolrException;
60+
import org.apache.solr.common.params.CommonParams;
6061
import org.apache.solr.common.params.ModifiableSolrParams;
6162
import org.apache.solr.common.util.ContentStream;
6263
import org.apache.solr.common.util.ExecutorUtil;
@@ -449,14 +450,18 @@ private synchronized boolean maybeTryHeadRequestSync(String url) {
449450

450451
private void decorateRequest(HttpRequest.Builder reqb, SolrRequest<?> solrRequest) {
451452
reqb.timeout(Duration.of(requestTimeoutMillis, ChronoUnit.MILLIS));
453+
452454
reqb.header("User-Agent", USER_AGENT);
453455
setBasicAuthHeader(solrRequest, reqb);
454-
Map<String, String> headers = solrRequest.getHeaders();
455-
if (headers != null) {
456-
for (Map.Entry<String, String> entry : headers.entrySet()) {
456+
Map<String, String> customHeaders = solrRequest.getHeaders();
457+
if (customHeaders != null) {
458+
for (Map.Entry<String, String> entry : customHeaders.entrySet()) {
457459
reqb.header(entry.getKey(), entry.getValue());
458460
}
459461
}
462+
reqb.header(CommonParams.SOLR_REQUEST_TYPE_PARAM, solrRequest.getRequestType().toString());
463+
// TODO: validate request context here: https://issues.apache.org/jira/browse/SOLR-14720
464+
reqb.header(CommonParams.SOLR_REQUEST_CONTEXT_PARAM, getContext().toString());
460465
}
461466

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

0 commit comments

Comments
 (0)