-
Notifications
You must be signed in to change notification settings - Fork 16
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Handle new QoS Metadata #2375
Handle new QoS Metadata #2375
Changes from all commits
bfee2c7
091c45a
aa2da1e
c9e7142
10dcf2b
bc67cff
fe237ad
4a27098
d7822db
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
type: improvement | ||
improvement: | ||
description: Handle new QoS Metadata | ||
links: | ||
- https://github.com/palantir/dialogue/pull/2375 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
/* | ||
* (c) Copyright 2024 Palantir Technologies Inc. All rights reserved. | ||
* | ||
* Licensed under the Apache License, Version 2.0 (the "License"); | ||
* you may not use this file except in compliance with the License. | ||
* You may obtain a copy of the License at | ||
* | ||
* http://www.apache.org/licenses/LICENSE-2.0 | ||
* | ||
* Unless required by applicable law or agreed to in writing, software | ||
* distributed under the License is distributed on an "AS IS" BASIS, | ||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
* See the License for the specific language governing permissions and | ||
* limitations under the License. | ||
*/ | ||
|
||
package com.palantir.dialogue.core; | ||
|
||
import com.palantir.conjure.java.api.errors.QosReason; | ||
import com.palantir.conjure.java.api.errors.QosReasons; | ||
import com.palantir.conjure.java.api.errors.QosReasons.QosResponseDecodingAdapter; | ||
import com.palantir.dialogue.Response; | ||
import java.util.Optional; | ||
|
||
enum DialogueQosReasonDecoder implements QosResponseDecodingAdapter<Response> { | ||
INSTANCE; | ||
|
||
@Override | ||
public Optional<String> getFirstHeader(Response response, String headerName) { | ||
return response.getFirstHeader(headerName); | ||
} | ||
|
||
static QosReason parse(Response response) { | ||
return QosReasons.parseFromResponse(response, DialogueQosReasonDecoder.INSTANCE); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -147,7 +147,9 @@ public void onSuccess(Response response) { | |
// workflows where it is important for a large number of requests to all land on the same node, | ||
// even if a couple of them get rate limited in the middle. | ||
if (Responses.isServerErrorRange(response) | ||
|| (Responses.isQosStatus(response) && !Responses.isTooManyRequests(response))) { | ||
|| (Responses.isQosStatus(response) | ||
&& !Responses.isQosDueToCustom(response) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. if i understand this correctly, a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Due-to custom means the client shouldn’t attempt to interpret meaning from the failure, so we don’t route to another node in that case. Changing pinned nodes can have dramatic impacts on perf, some clients use it for cache locality, which we don’t want to give up unless we really need to (instability/etc) |
||
&& !Responses.isTooManyRequests(response))) { | ||
OptionalInt next = incrementHostIfNecessary(pin); | ||
instrumentation.receivedErrorStatus(pin, channel, response, next); | ||
} else { | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
any reason this could not live along side
Response
indialogue-target
and be shared across projects?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It’s an implementation detail, not part of the codegen target api. I don’t mind duplication for such a simple utility, primary goal is to avoid expanding the public api unnecessarily