diff options
author | alexvru <alexvru@ydb.tech> | 2023-11-16 21:00:12 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2023-11-16 21:31:36 +0300 |
commit | aeb7214aa4705327afbd04c9d72c3e37aab0427e (patch) | |
tree | cf9ddf49e9d2b20df278a201854670517a33cf35 | |
parent | 326d86765643437e4986dc3a1318f9d975848415 (diff) | |
download | ydb-aeb7214aa4705327afbd04c9d72c3e37aab0427e.tar.gz |
Fix MustRestoreFirst behaviour in DS proxy monitoring KIKIMR-19748
8 files changed, 122 insertions, 2 deletions
diff --git a/ydb/core/blobstorage/other/mon_blob_range_page.cpp b/ydb/core/blobstorage/other/mon_blob_range_page.cpp index 7beaf32395..74bd420ee4 100644 --- a/ydb/core/blobstorage/other/mon_blob_range_page.cpp +++ b/ydb/core/blobstorage/other/mon_blob_range_page.cpp @@ -52,6 +52,7 @@ namespace { } ui32 json = 0; + ui32 mustRestoreFirst = 0; TLogoBlobID from, to; TString errorExplanation; if (!params.Has("from")) { @@ -73,9 +74,12 @@ namespace { return generateError("Failed to parse json parameter -- must be an integer"); } } + if (params.Has("mustRestoreFirst") && !TryFromString(params.Get("mustRestoreFirst"), mustRestoreFirst)) { + return generateError("Failed to parse mustRestoreFirst parameter -- must be an integer"); + } const ui64 cookie = ++LastCookie; - auto query = std::make_unique<TEvBlobStorage::TEvRange>(tabletId, from, to, false, TInstant::Max(), true); + auto query = std::make_unique<TEvBlobStorage::TEvRange>(tabletId, from, to, mustRestoreFirst, TInstant::Max(), true); SendToBSProxy(SelfId(), groupId, query.release(), cookie); RequestsInFlight[cookie] = {ev->Sender, ev->Cookie, ev->Get()->SubRequestId, json}; } diff --git a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.darwin-x86_64.txt b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.darwin-x86_64.txt index f9b38bd4a3..2428e80682 100644 --- a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.darwin-x86_64.txt +++ b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.darwin-x86_64.txt @@ -48,6 +48,7 @@ target_sources(ydb-core-blobstorage-ut_blobstorage PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/gc_quorum_3dc.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/group_reconfiguration.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/main.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/mirror3of4.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp diff --git a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-aarch64.txt b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-aarch64.txt index dfb076e3fb..994ec6ce40 100644 --- a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-aarch64.txt +++ b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-aarch64.txt @@ -51,6 +51,7 @@ target_sources(ydb-core-blobstorage-ut_blobstorage PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/gc_quorum_3dc.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/group_reconfiguration.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/main.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/mirror3of4.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp diff --git a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-x86_64.txt b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-x86_64.txt index 831e212021..8fdd87322a 100644 --- a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-x86_64.txt +++ b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-x86_64.txt @@ -52,6 +52,7 @@ target_sources(ydb-core-blobstorage-ut_blobstorage PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/gc_quorum_3dc.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/group_reconfiguration.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/main.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/mirror3of4.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp diff --git a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.windows-x86_64.txt b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.windows-x86_64.txt index 6850778337..711abadf8a 100644 --- a/ydb/core/blobstorage/ut_blobstorage/CMakeLists.windows-x86_64.txt +++ b/ydb/core/blobstorage/ut_blobstorage/CMakeLists.windows-x86_64.txt @@ -41,6 +41,7 @@ target_sources(ydb-core-blobstorage-ut_blobstorage PRIVATE ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/gc_quorum_3dc.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/group_reconfiguration.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/incorrect_queries.cpp + ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/main.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/mirror3of4.cpp ${CMAKE_SOURCE_DIR}/ydb/core/blobstorage/ut_blobstorage/monitoring.cpp diff --git a/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp b/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp new file mode 100644 index 0000000000..7145c08df3 --- /dev/null +++ b/ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp @@ -0,0 +1,110 @@ +#include <ydb/core/blobstorage/ut_blobstorage/lib/env.h> +#include <ydb/core/blobstorage/vdisk/common/vdisk_private_events.h> + +Y_UNIT_TEST_SUITE(IndexRestoreGet) { + Y_UNIT_TEST(BlobRecovery) { + TEnvironmentSetup env(TEnvironmentSetup::TSettings{ + .NodeCount = 8, + .Erasure = TBlobStorageGroupType::Erasure4Plus2Block, + }); + + env.CreateBoxAndPool(1, 1); + env.Sim(TDuration::Minutes(1)); + auto groups = env.GetGroups(); + UNIT_ASSERT_VALUES_EQUAL(groups.size(), 1); + const TIntrusivePtr<TBlobStorageGroupInfo> info = env.GetGroupInfo(groups.front()); + + TLogoBlobID id; + TString error; + const bool success = TLogoBlobID::Parse(id, "[72075186270680851:57:3905:6:786432:4194304:0]", error); + UNIT_ASSERT(success); + + TString data = TString(id.BlobSize(), 'X'); + + TDataPartSet parts; + info->Type.SplitData((TErasureType::ECrcMode)id.CrcMode(), data, parts); + + TBlobStorageGroupInfo::TOrderNums nums{5, 6, 7, 0, 1, 2, 3, 4}; + + for (ui32 i = 0; i < 6; ++i) { + const ui32 partId = i + 1; + const ui32 orderNumber = nums[i]; + if (i != 4) { + env.PutBlob(info->GetVDiskId(orderNumber), TLogoBlobID(id, partId), parts.Parts[i].OwnedString.ConvertToString()); + } + } + + { + const auto edge = env.Runtime->AllocateEdgeActor(1, __FILE__, __LINE__); + env.Runtime->WrapInActorContext(edge, [&] { + SendToBSProxy(edge, info->GroupID, new TEvBlobStorage::TEvCollectGarbage(id.TabletID(), id.Generation(), + 1, id.Channel(), true, id.Generation(), id.Step(), new TVector<TLogoBlobID>{id}, nullptr, + TInstant::Max(), true, false)); + }); + auto res = env.WaitForEdgeActorEvent<TEvBlobStorage::TEvCollectGarbageResult>(edge); + UNIT_ASSERT_VALUES_EQUAL(res->Get()->Status, NKikimrProto::OK); + } + + env.Sim(TDuration::Minutes(1)); + + for (ui32 idx = 0; idx < 8; ++idx) { + const ui32 orderNumber = nums[idx]; + Cerr << idx << ' ' << orderNumber << Endl; + + std::vector<ui32> v; + if (idx < 6) { + v.push_back(idx + 1); + } else { + v.push_back(1); + v.push_back(2); + v.push_back(3); + v.push_back(4); + v.push_back(5); + v.push_back(6); + } + + for (ui32 partId : v) { + env.CheckBlob(info->GetActorId(orderNumber), info->GetVDiskId(orderNumber), TLogoBlobID(id, partId), + parts.Parts[partId - 1].OwnedString.ConvertToString(), + idx == 4 || idx == 6 || idx == 7 ? NKikimrProto::NODATA : NKikimrProto::OK); + } + } + + const auto edge = env.Runtime->AllocateEdgeActor(1, __FILE__, __LINE__); + env.Runtime->WrapInActorContext(edge, [&] { +// SendToBSProxy(edge, info->GroupID, new TEvBlobStorage::TEvGet(id, 0, 0, TInstant::Max(), +// NKikimrBlobStorage::EGetHandleClass::FastRead, true, true)); + SendToBSProxy(edge, info->GroupID, new TEvBlobStorage::TEvRange(id.TabletID(), id, id, true, TInstant::Max(), true)); + }); + auto res = env.WaitForEdgeActorEvent<TEvBlobStorage::TEvRangeResult>(edge); + UNIT_ASSERT_VALUES_EQUAL(res->Get()->Status, NKikimrProto::OK); + UNIT_ASSERT_VALUES_EQUAL(res->Get()->Responses.size(), 1); +// auto res = env.WaitForEdgeActorEvent<TEvBlobStorage::TEvGetResult>(edge); +// UNIT_ASSERT_VALUES_EQUAL(res->Get()->Status, NKikimrProto::OK); +// UNIT_ASSERT_VALUES_EQUAL(res->Get()->ResponseSz, 1); +// UNIT_ASSERT_VALUES_EQUAL(res->Get()->Responses[0].Status, NKikimrProto::OK); + + for (ui32 idx = 0; idx < 8; ++idx) { + const ui32 orderNumber = nums[idx]; + Cerr << idx << ' ' << orderNumber << Endl; + + std::vector<ui32> v; + if (idx < 6) { + v.push_back(idx + 1); + } else { + v.push_back(1); + v.push_back(2); + v.push_back(3); + v.push_back(4); + v.push_back(5); + v.push_back(6); + } + + for (ui32 partId : v) { + env.CheckBlob(info->GetActorId(orderNumber), info->GetVDiskId(orderNumber), TLogoBlobID(id, partId), + parts.Parts[partId - 1].OwnedString.ConvertToString(), + idx == 6 || idx == 7 ? NKikimrProto::NODATA : NKikimrProto::OK); + } + } + } +} diff --git a/ydb/core/blobstorage/ut_blobstorage/ya.make b/ydb/core/blobstorage/ut_blobstorage/ya.make index c2acdec391..179e060cd7 100644 --- a/ydb/core/blobstorage/ut_blobstorage/ya.make +++ b/ydb/core/blobstorage/ut_blobstorage/ya.make @@ -22,6 +22,7 @@ SRCS( gc_quorum_3dc.cpp group_reconfiguration.cpp incorrect_queries.cpp + index_restore_get.cpp main.cpp mirror3of4.cpp monitoring.cpp diff --git a/ydb/core/blobstorage/vdisk/query/query_extr.cpp b/ydb/core/blobstorage/vdisk/query/query_extr.cpp index 36bfd3aa75..64515de52c 100644 --- a/ydb/core/blobstorage/vdisk/query/query_extr.cpp +++ b/ydb/core/blobstorage/vdisk/query/query_extr.cpp @@ -125,7 +125,8 @@ namespace NKikimr { NMatrix::TVectorType missingParts = mustHave - actuallyHave; // If we don't have something locally we return NOT_YET unless that blob is going to be collected - auto status = IsBlobDeleted(query->LogoBlobID, Merger) ? NKikimrProto::NODATA : + auto status = mustHave.Empty() ? NKikimrProto::NODATA : // we do not have any parts of this blob + IsBlobDeleted(query->LogoBlobID, Merger) ? NKikimrProto::NODATA : missingParts.Empty() ? NKikimrProto::OK : NKikimrProto::NOT_YET; // Add result |