aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2023-11-16 21:00:12 +0300
committeralexvru <alexvru@ydb.tech>2023-11-16 21:31:36 +0300
commitaeb7214aa4705327afbd04c9d72c3e37aab0427e (patch)
treecf9ddf49e9d2b20df278a201854670517a33cf35
parent326d86765643437e4986dc3a1318f9d975848415 (diff)
downloadydb-aeb7214aa4705327afbd04c9d72c3e37aab0427e.tar.gz
Fix MustRestoreFirst behaviour in DS proxy monitoring KIKIMR-19748
-rw-r--r--ydb/core/blobstorage/other/mon_blob_range_page.cpp6
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/CMakeLists.darwin-x86_64.txt1
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-aarch64.txt1
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/CMakeLists.linux-x86_64.txt1
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/CMakeLists.windows-x86_64.txt1
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/index_restore_get.cpp110
-rw-r--r--ydb/core/blobstorage/ut_blobstorage/ya.make1
-rw-r--r--ydb/core/blobstorage/vdisk/query/query_extr.cpp3
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