Skip to content

Commit e525a99

Browse files
author
oigolovanova
committed
feat core: add abs tp propagation on the client side
commit_hash:c153a37eff8ee76354dec27423827c26597d0413
1 parent 3d58540 commit e525a99

File tree

4 files changed

+44
-1
lines changed

4 files changed

+44
-1
lines changed

core/functional_tests/basic_chaos/tests-deadline/test_client.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,21 @@
11
import asyncio
2+
import datetime
23

34
import pytest
45

56
DP_TIMEOUT_MS = 'X-YaTaxi-Client-TimeoutMs'
67
DP_DEADLINE_EXPIRED = 'X-YaTaxi-Deadline-Expired'
8+
DP_ABSOLUTE_DEADLINE = 'X-Request-Deadline'
79
VERSION = {'version': '2'}
810

911

12+
def _make_iso_deadline(offset_seconds: float) -> str:
13+
tp = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
14+
seconds=offset_seconds,
15+
)
16+
return tp.strftime('%Y-%m-%dT%H:%M:%S.') + f'{tp.microsecond:06d}Z'
17+
18+
1019
@pytest.fixture(name='call')
1120
def _call(service_client, mockserver_info):
1221
async def _call(htype='common', headers=None, **args):
@@ -385,3 +394,22 @@ async def test_dp_timeout_not_retried(
385394
assert response.text == ''
386395

387396
assert fake_deadline_expired_mock.times_called == retries_performed
397+
398+
399+
async def test_absolute_deadline_propagated_as_is(call, mockserver):
400+
iso_deadline = _make_iso_deadline(10.0)
401+
captured = {}
402+
403+
@mockserver.handler('/test')
404+
async def mock(request):
405+
captured['headers'] = dict(request.headers)
406+
return mockserver.make_response('OK!')
407+
408+
response = await call(
409+
headers={
410+
DP_TIMEOUT_MS: '500',
411+
DP_ABSOLUTE_DEADLINE: iso_deadline,
412+
},
413+
)
414+
assert response.status == 200
415+
assert captured['headers'].get(DP_ABSOLUTE_DEADLINE) == iso_deadline

core/functional_tests/basic_chaos/tests-deadline/test_server.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ async def test_absolute_deadline_disabled_dynamically(call):
139139
headers={
140140
**HEADERS,
141141
DP_TIMEOUT_MS: '5000',
142-
DP_ABSOLUTE_DEADLINE: _make_iso_deadline(-120.0),
142+
DP_ABSOLUTE_DEADLINE: _make_iso_deadline(-1.0),
143143
},
144144
)
145145
assert response.status == 200

core/src/clients/http/request_state.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include <userver/utils/algo.hpp>
2525
#include <userver/utils/assert.hpp>
2626
#include <userver/utils/async.hpp>
27+
#include <userver/utils/datetime_light.hpp>
2728
#include <userver/utils/encoding/hex.hpp>
2829
#include <userver/utils/from_string.hpp>
2930
#include <userver/utils/overloaded.hpp>
@@ -970,6 +971,16 @@ void RequestState::UpdateTimeoutHeader() {
970971
fmt::to_string(remote_timeout_.count()),
971972
curl::easy::DuplicateHeaderAction::kReplace
972973
);
974+
975+
if (inherited_original_deadline_.has_value()) {
976+
const auto
977+
iso_str = utils::datetime::UtcTimestring(*inherited_original_deadline_, utils::datetime::kTaximeterFormat);
978+
easy().add_header(
979+
USERVER_NAMESPACE::http::headers::kXRequestDeadline,
980+
iso_str,
981+
curl::easy::DuplicateHeaderAction::kReplace
982+
);
983+
}
973984
}
974985

975986
void RequestState::HandleDeadlineAlreadyPassed() {
@@ -1096,6 +1107,7 @@ void RequestState::ResetDataForNewRequest() {
10961107
retry_.current = 1;
10971108
remote_timeout_ = original_timeout_;
10981109
deadline_ = server::request::GetTaskInheritedDeadline();
1110+
inherited_original_deadline_ = server::request::GetTaskInheritedOriginalDeadline();
10991111
deadline_expired_ = false;
11001112
timeout_updated_by_deadline_ = false;
11011113

core/src/clients/http/request_state.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <userver/engine/single_consumer_event.hpp>
2323
#include <userver/http/common_headers.hpp>
2424
#include <userver/http/url.hpp>
25+
#include <userver/server/request/task_inherited_data.hpp>
2526
#include <userver/tracing/in_place_span.hpp>
2627
#include <userver/tracing/manager.hpp>
2728
#include <userver/tracing/span.hpp>
@@ -236,6 +237,8 @@ class RequestState : public std::enable_shared_from_this<RequestState> {
236237
std::chrono::milliseconds remote_timeout_;
237238

238239
DeadlinePropagationConfig deadline_propagation_config_;
240+
/// original absolute deadline from task inherited data
241+
std::optional<server::request::TaskInheritedOriginalDeadline> inherited_original_deadline_;
239242
/// deadline from current task
240243
engine::Deadline deadline_;
241244
bool timeout_updated_by_deadline_{false};

0 commit comments

Comments
 (0)