Skip to content

Commit 385adb4

Browse files
Add callback for outer-task in Prefetch
When task is schedulled and cancelled before execution, no function executed and callback is called. Add callback for covering such cases. Relates-To: OLPEDGE-1005 Signed-off-by: Diachenko Mykahilo <[email protected]>
1 parent 1cef3fb commit 385adb4

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

olp-cpp-sdk-dataservice-read/src/VersionedLayerClientImpl.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -170,8 +170,7 @@ client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
170170
OLP_SDK_LOG_WARNING_F(kLogTag,
171171
"PrefetchTiles : invalid request, layer=%s",
172172
layer_id.c_str());
173-
callback({{ErrorCode::InvalidArgument, "Empty tile key list"}});
174-
return EmptyResponse(PrefetchTileNoError());
173+
return {{ErrorCode::InvalidArgument, "Empty tile key list"}};
175174
}
176175

177176
// Get Catalog version first if none set.
@@ -189,8 +188,7 @@ client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
189188
kLogTag,
190189
"PrefetchTiles: getting catalog version failed, key=%s",
191190
request.CreateKey(layer_id).c_str());
192-
callback(response.GetError());
193-
return EmptyResponse(PrefetchTileNoError());
191+
return response.GetError();
194192
}
195193

196194
request.WithVersion(response.GetResult().GetVersion());
@@ -209,8 +207,7 @@ client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
209207
OLP_SDK_LOG_WARNING_F(kLogTag,
210208
"PrefetchTiles: tile/level mismatch, key=%s",
211209
key.c_str());
212-
callback({{ErrorCode::InvalidArgument, "TileKeys/levels mismatch"}});
213-
return EmptyResponse(PrefetchTileNoError());
210+
return {{ErrorCode::InvalidArgument, "TileKeys/levels mismatch"}};
214211
}
215212

216213
OLP_SDK_LOG_DEBUG_F(kLogTag, "PrefetchTiles, subquads=%zu, key=%s",
@@ -221,16 +218,14 @@ client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
221218
prefetch_repo->GetSubTiles(layer_id, request, sub_quads, context);
222219

223220
if (!sub_tiles.IsSuccessful()) {
224-
callback(sub_tiles.GetError());
225-
return EmptyResponse(PrefetchTileNoError());
221+
return sub_tiles.GetError();
226222
}
227223

228224
const auto& tiles_result = sub_tiles.GetResult();
229225
if (tiles_result.empty()) {
230226
OLP_SDK_LOG_WARNING_F(
231227
kLogTag, "PrefetchTiles: subtiles empty, key=%s", key.c_str());
232-
callback({{ErrorCode::InvalidArgument, "Subquads retrieval failed"}});
233-
return EmptyResponse(PrefetchTileNoError());
228+
return {{ErrorCode::InvalidArgument, "Subquads retrieval failed"}};
234229
}
235230

236231
OLP_SDK_LOG_INFO_F(kLogTag, "Prefetch start, key=%s, tiles=%zu",
@@ -324,7 +319,14 @@ client::CancellationToken VersionedLayerClientImpl::PrefetchTiles(
324319
// Because the handling of prefetch tiles responses is performed by the
325320
// inner-task, no need to set a callback here. Otherwise, the user would
326321
// be notified with empty results.
327-
nullptr);
322+
// It is possible to not invoke inner task, when it was cancelled before
323+
// execution.
324+
[callback](EmptyResponse response) {
325+
// Inner task only generates successfull result
326+
if (!response.IsSuccessful()) {
327+
callback(response.GetError());
328+
}
329+
});
328330

329331
return token;
330332
} // namespace read

tests/integration/olp-cpp-sdk-dataservice-read/VersionedLayerClientTest.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2005,6 +2005,67 @@ TEST_F(DataserviceReadVersionedLayerClientTest,
20052005
data_response.GetError().GetErrorCode());
20062006
}
20072007

2008+
TEST_F(DataserviceReadVersionedLayerClientTest, CancelPendingRequestsPrefetch) {
2009+
olp::client::HRN hrn(GetTestCatalog());
2010+
2011+
auto client =
2012+
std::make_unique<VersionedLayerClient>(hrn, "testlayer", *settings_);
2013+
auto prefetch_request = PrefetchTilesRequest();
2014+
auto data_request =
2015+
DataRequest().WithPartitionId("269").WithFetchOption(OnlineOnly);
2016+
2017+
auto request_started = std::make_shared<std::promise<void>>();
2018+
auto continue_request = std::make_shared<std::promise<void>>();
2019+
2020+
{
2021+
olp::http::RequestId request_id;
2022+
NetworkCallback send_mock;
2023+
CancelCallback cancel_mock;
2024+
2025+
std::tie(request_id, send_mock, cancel_mock) = GenerateNetworkMockActions(
2026+
request_started, continue_request,
2027+
{olp::http::HttpStatusCode::OK, HTTP_RESPONSE_BLOB_DATA_269});
2028+
2029+
EXPECT_CALL(*network_mock_,
2030+
Send(IsGetRequest(URL_BLOB_DATA_269), _, _, _, _))
2031+
.Times(1)
2032+
.WillOnce(testing::Invoke(std::move(send_mock)));
2033+
2034+
EXPECT_CALL(*network_mock_, Cancel(request_id))
2035+
.WillOnce(testing::Invoke(std::move(cancel_mock)));
2036+
}
2037+
2038+
auto data_future = client->GetData(data_request).GetFuture();
2039+
auto prefetch_future = client->PrefetchTiles(prefetch_request).GetFuture();
2040+
2041+
request_started->get_future().get();
2042+
client->CancelPendingRequests();
2043+
continue_request->set_value();
2044+
2045+
ASSERT_EQ(prefetch_future.wait_for(kWaitTimeout), std::future_status::ready);
2046+
auto prefetch_response = prefetch_future.get();
2047+
2048+
ASSERT_FALSE(prefetch_response.IsSuccessful())
2049+
<< ApiErrorToString(prefetch_response.GetError());
2050+
2051+
ASSERT_EQ(static_cast<int>(olp::http::ErrorCode::CANCELLED_ERROR),
2052+
prefetch_response.GetError().GetHttpStatusCode());
2053+
ASSERT_EQ(olp::client::ErrorCode::Cancelled,
2054+
prefetch_response.GetError().GetErrorCode());
2055+
2056+
ASSERT_EQ(data_future.wait_for(kWaitTimeout), std::future_status::ready);
2057+
2058+
auto data_response = data_future.get();
2059+
2060+
ASSERT_FALSE(data_response.IsSuccessful())
2061+
<< ApiErrorToString(data_response.GetError());
2062+
2063+
ASSERT_EQ(static_cast<int>(olp::http::ErrorCode::CANCELLED_ERROR),
2064+
data_response.GetError().GetHttpStatusCode());
2065+
ASSERT_EQ(olp::client::ErrorCode::Cancelled,
2066+
data_response.GetError().GetErrorCode());
2067+
}
2068+
20082069
TEST_F(DataserviceReadVersionedLayerClientTest,
20092070
DISABLED_GetDataWithPartitionIdCancelLookupMetadata) {
20102071
olp::client::HRN hrn(GetTestCatalog());

0 commit comments

Comments
 (0)