Skip to content

Commit 0efca16

Browse files
authored
Merge branch 'stable-25-3' into backport-27430-to-stable-25-3
2 parents 61903d4 + f893f1d commit 0efca16

File tree

233 files changed

+10529
-2270
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

233 files changed

+10529
-2270
lines changed

.github/config/muted_ya.txt

Lines changed: 39 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,84 +1,96 @@
1+
ydb/core/blobstorage/dsproxy/ut TDSProxyPutTest.TestBlock42PutStatusErrorWith_1_2_VdiskErrors
2+
ydb/core/blobstorage/dsproxy/ut TDSProxyPutTest.TestBlock42PutStatusOkWith_1_1_VdiskErrors
3+
ydb/core/blobstorage/dsproxy/ut TDSProxyPutTest.TestBlock42PutStatusOkWith_2_0_VdiskErrors
14
ydb/core/blobstorage/ut_blobstorage BlobPatching.PatchBlock42
2-
ydb/core/blobstorage/ut_blobstorage Decommit3dc.Test
5+
ydb/core/blobstorage/ut_blobstorage Defragmentation.DefragCompactionRace
6+
ydb/core/blobstorage/ut_blobstorage GroupLayoutSanitizer.StressMirror3of4
37
ydb/core/blobstorage/ut_blobstorage GroupReconfiguration.BsControllerDoesNotDisableGroup
48
ydb/core/blobstorage/ut_blobstorage GroupReconfiguration.BsControllerDoesNotDisableGroupNoRequestsToNodesWVDisks
5-
ydb/core/blobstorage/ut_blobstorage NodeDisconnected.BsQueueRetries
69
ydb/core/blobstorage/ut_blobstorage unittest.[*/*] chunk
710
ydb/core/blobstorage/ut_blobstorage/ut_huge HugeBlobOnlineSizeChange.Compaction
811
ydb/core/blobstorage/ut_blobstorage/ut_huge unittest.[*/*] chunk
912
ydb/core/blobstorage/ut_blobstorage/ut_statestorage TStateStorageRingGroupState.TestProxyConfigMismatch
10-
ydb/core/blobstorage/ut_vdisk unittest.[*/*] chunk
1113
ydb/core/cms/ut_sentinel_unstable TSentinelUnstableTests.BSControllerCantChangeStatus
14+
ydb/core/fq/libs/checkpoint_storage/ut NFq.(anonymous namespace).TStorageServiceTest<false>.ShouldGetState
1215
ydb/core/keyvalue/ut_trace TKeyValueTracingTest.ReadHuge
1316
ydb/core/keyvalue/ut_trace TKeyValueTracingTest.ReadSmall
1417
ydb/core/keyvalue/ut_trace TKeyValueTracingTest.WriteHuge
1518
ydb/core/keyvalue/ut_trace TKeyValueTracingTest.WriteSmall
19+
ydb/core/kqp/ut/arrow KqpResultSetFormats.ArrowFormat_Stress
20+
ydb/core/kqp/ut/federated_query/datastreams KqpStreamingQueriesSysView.ReadSysViewWithMetadataSizeBackPressure
1621
ydb/core/kqp/ut/indexes KqpMultishardIndex.WriteIntoRenamingAsyncIndex
17-
ydb/core/kqp/ut/olap KqpOlapJson.BloomNGrammIndexesVariants[true,false,0,0,0,0]
18-
ydb/core/kqp/ut/olap KqpOlapJson.DoubleFilterReduceScopeVariants[2,false,0,10,0,0]
19-
ydb/core/kqp/ut/olap KqpOlapJson.RestoreJsonArrayVariants[10,true,1024,1000,1000000,0]
22+
ydb/core/kqp/ut/olap KqpOlapJson.BloomMixIndexesVariants[false,false,0,0,1000,0.5,BLOOM_FILTER]
23+
ydb/core/kqp/ut/olap KqpOlapJson.BloomNGrammIndexesVariants[false,true,1024,10,0,0.5]
24+
ydb/core/kqp/ut/olap KqpOlapJson.BrokenJsonWriting[10,false,0,10,1000000,0]
25+
ydb/core/kqp/ut/olap KqpOlapJson.BrokenJsonWriting[10,false,1024,10,0,0]
26+
ydb/core/kqp/ut/olap KqpOlapJson.BrokenJsonWriting[2,false,0,10,0,0.5]
27+
ydb/core/kqp/ut/olap KqpOlapJson.FilterVariants[2,true,1024,0,0,0.5]
28+
ydb/core/kqp/ut/olap KqpOlapJson.QuotedFilterVariants[10,true,0,10,0,0]
29+
ydb/core/kqp/ut/olap KqpOlapJson.QuotedFilterVariants[2,true,1024,1000,1000000,0]
30+
ydb/core/kqp/ut/olap KqpOlapJson.RestoreFirstLevelVariants[10,true,1,10,100,0.5]
2031
ydb/core/kqp/ut/olap KqpOlapSysView.StatsSysViewColumns
2132
ydb/core/kqp/ut/olap KqpOlapSysView.StatsSysViewTable
22-
ydb/core/kqp/ut/opt KqpExtractPredicateLookup.SqlInJoin
23-
ydb/core/kqp/ut/opt KqpKv.ReadRows_TimeoutCancelsReads
2433
ydb/core/kqp/ut/query KqpAnalyze.AnalyzeTable+ColumnStore
25-
ydb/core/kqp/ut/query KqpStats.DeferredEffects+UseSink
26-
ydb/core/kqp/ut/scheme KqpAcl.AclRevoke+UseSink+IsOlap
34+
ydb/core/kqp/ut/query KqpLimits.StreamWrite+Allowed
2735
ydb/core/kqp/ut/scheme KqpOlapScheme.AddPgColumnWithStore
28-
ydb/core/kqp/ut/service KqpQueryService.LargeUpsert-UseSink
2936
ydb/core/persqueue/ut/ut_with_sdk TopicTimestamp.TimestampRead_40MB_Topic_offset+middle_WithRestart
37+
ydb/core/persqueue/ut/ut_with_sdk TopicTimestamp.TimestampRead_6MB_Topic_offset+middle
3038
ydb/core/statistics/aggregator/ut AnalyzeColumnshard.AnalyzeRebootColumnShard
31-
ydb/core/tx/schemeshard/ut_export_reboots_s3 unittest.[*/*] chunk
32-
ydb/core/tx/schemeshard/ut_restore TImportWithRebootsTests.ShouldSucceedOnIndexedTable
33-
ydb/core/tx/schemeshard/ut_restore TImportWithRebootsTests.ShouldSucceedOnSingleTableWithUniqueIndex
34-
ydb/core/tx/schemeshard/ut_restore unittest.[*/*] chunk
39+
ydb/core/tx/schemeshard/ut_export_reboots_s3 TExportToS3WithRebootsTests.ShouldSucceedOnMultiShardTable
40+
ydb/core/tx/schemeshard/ut_export_reboots_s3 TExportToS3WithRebootsTests.ShouldSucceedOnSingleShardTableWithChangefeed
41+
ydb/core/tx/schemeshard/ut_index TAsyncIndexTests.CdcAndMergeWithReboots[TabletReboots]
42+
ydb/core/tx/schemeshard/ut_index_build_reboots IndexBuildTestReboots.IndexPartitioningUniq
3543
ydb/core/tx/schemeshard/ut_vector_index_build_reboots VectorIndexBuildTestReboots.BaseCase+Prefixed[TabletReboots]
3644
ydb/core/tx/schemeshard/ut_vector_index_build_reboots unittest.[*/*] chunk
37-
ydb/core/tx/tx_proxy/ut_ext_tenant TExtSubDomainTest.CreateTableInsideAndAlterDomainAndTable-AlterDatabaseCreateHiveFirst-false
38-
ydb/core/tx/tx_proxy/ut_ext_tenant TExtSubDomainTest.CreateTableInsideAndAlterDomainAndTable-AlterDatabaseCreateHiveFirst-true
3945
ydb/core/viewer/tests test.py.test_topic_data
4046
ydb/core/viewer/tests test.py.test_topic_data_cdc
41-
ydb/core/viewer/ut Viewer.TabletMergingPacked
4247
ydb/library/yql/dq/actors/compute/ut TAsyncComputeActorTest.InputTransformMultichannel
48+
ydb/public/sdk/cpp/src/client/topic/ut TxUsage.Sinks_Oltp_WriteToTopics_4_Query
49+
ydb/public/sdk/cpp/src/client/topic/ut unittest.[*/*] chunk
50+
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut BasicUsage.ReadWithRestarts
51+
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut TxUsage.Write_50k_100times_50tx
52+
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut TxUsage.Write_And_Read_Big_Messages_1
53+
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut TxUsage.Write_And_Read_Big_Messages_2
54+
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut TxUsage.Write_And_Read_Gigant_Messages_2
55+
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut TxUsage.Write_And_Read_Small_Messages_2
4356
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut TxUsage.Write_Only_Big_Messages_In_Wide_Transactions_Query
4457
ydb/public/sdk/cpp/src/client/topic/ut/with_direct_read_ut unittest.[*/*] chunk
4558
ydb/public/sdk/cpp/tests/integration/sessions_pool YdbSdkSessionsPool.StressTestSync/0
4659
ydb/public/sdk/cpp/tests/integration/sessions_pool YdbSdkSessionsPool.StressTestSync/1
4760
ydb/services/persqueue_v1/ut TPersQueueTest.Cache
48-
ydb/services/ydb/ut TGRpcAuthentication.NoDescribeRights
4961
ydb/services/ydb/ut YdbLogStore.AlterLogTable
5062
ydb/tests/fq/mem_alloc test_scheduling.py.TestSchedule.test_skip_busy[kikimr0]
63+
ydb/tests/fq/multi_plane py3test.[test_retry.py] chunk
64+
ydb/tests/fq/multi_plane test_retry.py.TestRetry.test_low_rate[kikimr0]
5165
ydb/tests/fq/s3 test_bindings_0.py.TestBindings.test_modify_connection_with_a_lot_of_bindings[v2-kikimr_settings0-client0]
5266
ydb/tests/fq/yds test_2_selects_limit.py.TestSelectLimit.test_select_same[v1]
5367
ydb/tests/fq/yds test_2_selects_limit.py.TestSelectLimit.test_select_sequence[v1]
54-
ydb/tests/fq/yds test_delete_read_rules_after_abort_by_system.py.TestDeleteReadRulesAfterAbortBySystem.test_delete_read_rules_after_abort_by_system
5568
ydb/tests/fq/yds test_mem_alloc.py.TestMemAlloc.test_hop_alloc[v1]
5669
ydb/tests/fq/yds test_mem_alloc.py.TestMemAlloc.test_join_alloc[v1]
5770
ydb/tests/fq/yds test_recovery.py.TestRecovery.test_ic_disconnection
5871
ydb/tests/fq/yds test_select_limit_db_id.py.TestSelectLimitWithDbId.test_select_same_with_id[v1-mvp_external_ydb_endpoint0]
5972
ydb/tests/fq/yds test_yds_bindings.py.TestBindings.test_yds_insert[v1]
60-
ydb/tests/fq/yds test_yq_streaming.py.TestYqStreaming.test_early_finish_case1[v1]
61-
ydb/tests/functional/api test_discovery.py.TestDiscoveryExtEndpoint.test_scenario
62-
ydb/tests/functional/api test_read_table.py.TestReadTableTruncatedResults.test_truncated_results[async_read_table]
63-
ydb/tests/functional/cms test_cms_restart.py.TestCmsStateStorageRestartsMirrorKeep.test_restart_as_much_as_can
6473
ydb/tests/functional/hive test_drain.py.TestHive.test_drain_on_stop
65-
ydb/tests/functional/restarts test_restarts.py.TestRestartClusterBlock42.test_when_create_many_tablets_and_restart_cluster_then_every_thing_is_ok
74+
ydb/tests/functional/serializable test.py.test_local
6675
ydb/tests/functional/serverless test_serverless.py.test_database_with_disk_quotas[enable_alter_database_create_hive_first--false]
6776
ydb/tests/functional/serverless test_serverless.py.test_database_with_disk_quotas[enable_alter_database_create_hive_first--true]
77+
ydb/tests/functional/sqs/cloud test_yandex_cloud_mode.py.TestSqsYandexCloudMode.test_dlq_mechanics_in_cloud[tables_format_v0-tables_format_v1-std]
6878
ydb/tests/functional/tenants test_dynamic_tenants.py.test_create_and_drop_tenants[enable_alter_database_create_hive_first--false]
6979
ydb/tests/functional/tenants test_dynamic_tenants.py.test_create_and_drop_tenants[enable_alter_database_create_hive_first--true]
7080
ydb/tests/functional/tenants test_tenants.py.TestTenants.test_create_drop_create_table3[enable_alter_database_create_hive_first--false]
7181
ydb/tests/functional/tenants test_tenants.py.TestTenants.test_create_drop_create_table3[enable_alter_database_create_hive_first--true]
7282
ydb/tests/functional/tenants test_tenants.py.TestTenants.test_stop_start[enable_alter_database_create_hive_first--false]
7383
ydb/tests/functional/tenants test_tenants.py.TestTenants.test_stop_start[enable_alter_database_create_hive_first--true]
74-
ydb/tests/functional/ydb_cli test_ydb_backup.py.TestDatabaseBackup.test_database_backup
7584
ydb/tests/functional/ydb_cli test_ydb_backup.py.TestDatabaseBackupRestore.test_database_backup_restore
85+
ydb/tests/functional/ydb_cli test_ydb_scripting.py.TestExecuteScriptWithParamsFromStdin.test_batching_full_json[scripting]
86+
ydb/tests/functional/ydb_cli test_ydb_scripting.py.TestExecuteScriptWithParamsFromStdin.test_batching_full_json[stream]
87+
ydb/tests/functional/ydb_cli test_ydb_scripting.py.TestExecuteScriptWithParamsFromStdin.test_batching_full_raw[scripting]
7688
ydb/tests/olap py3test.[*/*] chunk
89+
ydb/tests/olap tablets_movement.py.TestTabletsMovement.test[COLUMN]
7790
ydb/tests/olap test_cs_many_updates.py.TestCSManyUpdates.test_many_updates[bulk_upsert]
7891
ydb/tests/olap upgrade_to_internal_path_id.py.TestUpgradeToInternalPathId.test
7992
ydb/tests/olap zip_bomb.py.TestZipBomb.test
8093
ydb/tests/olap/scenario test_alter_tiering.py.TestAlterTiering.test[many_tables]
81-
ydb/tests/olap/scenario test_insert.py.TestInsert.test_multi[read_data_during_bulk_upsert]
8294
ydb/tests/stress/olap_workload/tests py3test.sole chunk
8395
ydb/tests/stress/olap_workload/tests test_workload.py.TestYdbWorkload.test
8496
ydb/tests/stress/reconfig_state_storage_workload/tests test_board_workload.py.TestReconfigStateStorageBoardWorkload.test_state_storage_board

ydb/core/blobstorage/dsproxy/dsproxy_get_block.cpp

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ class TBlobStorageGroupGetBlockRequest : public TBlobStorageGroupRequestActor {
1414
ui64 Generation = 0;
1515
const TInstant Deadline;
1616
ui64 Requests = 0;
17-
ui64 Responses = 0;
1817
TGroupQuorumTracker QuorumTracker;
1918

2019
void Handle(TEvBlobStorage::TEvVGetBlockResult::TPtr &ev) {
@@ -36,13 +35,10 @@ class TBlobStorageGroupGetBlockRequest : public TBlobStorageGroupRequestActor {
3635
if (status == NKikimrProto::NODATA) {
3736
status = NKikimrProto::OK; // assume OK for quorum tracker
3837
}
39-
++Responses;
4038

4139
switch (const NKikimrProto::EReplyStatus overallStatus = QuorumTracker.ProcessReply(vdisk, status)) {
4240
case NKikimrProto::OK:
43-
if (Responses == Requests) {
44-
ReplyAndDie(NKikimrProto::OK);
45-
}
41+
ReplyAndDie(NKikimrProto::OK);
4642
break;
4743

4844
case NKikimrProto::ERROR:
Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
#include "defs.h"
2+
#include "dsproxy_env_mock_ut.h"
3+
#include "dsproxy_test_state_ut.h"
4+
5+
#include <ydb/core/blobstorage/dsproxy/dsproxy_quorum_tracker.h>
6+
#include <ydb/core/blobstorage/vdisk/common/vdisk_events.h>
7+
8+
#include <ydb/core/testlib/basics/runtime.h>
9+
#include <ydb/core/testlib/actor_helpers.h>
10+
11+
#include <library/cpp/testing/unittest/registar.h>
12+
13+
using namespace NKikimr;
14+
15+
namespace {
16+
17+
void TestQuorumResponse(TBlobStorageGroupType::EErasureSpecies erasure) {
18+
TTestBasicRuntime runtime(1, false);
19+
runtime.SetDispatchTimeout(TDuration::Seconds(1));
20+
SetupRuntime(runtime);
21+
22+
TDSProxyEnv env;
23+
env.Configure(runtime, TBlobStorageGroupType(erasure), 0, 0);
24+
TTestState testState(runtime, env.Info);
25+
26+
const ui64 tabletId = 123456;
27+
28+
auto ev = std::make_unique<TEvBlobStorage::TEvGetBlock>(tabletId, TInstant::Max());
29+
runtime.Send(new IEventHandle(env.RealProxyActorId, testState.EdgeActor, ev.release()), 0);
30+
31+
TVector<TEvBlobStorage::TEvVGetBlock::TPtr> requests;
32+
for (ui32 i = 0; i < env.Info->GetTotalVDisksNum(); ++i) {
33+
TEvBlobStorage::TEvVGetBlock::TPtr vgetBlock = testState.GrabEventPtr<TEvBlobStorage::TEvVGetBlock>();
34+
UNIT_ASSERT(vgetBlock);
35+
requests.push_back(vgetBlock);
36+
}
37+
38+
TGroupQuorumTracker tracker(env.Info.Get());
39+
ui32 responsesNeeded = 0;
40+
41+
for (auto& req : requests) {
42+
++responsesNeeded;
43+
const TVDiskID vdisk = VDiskIDFromVDiskID(req->Get()->Record.GetVDiskID());
44+
45+
auto response = testState.CreateEventResultPtr(req, NKikimrProto::OK, tabletId);
46+
runtime.Send(response.Release(), 0);
47+
48+
NKikimrProto::EReplyStatus status = tracker.ProcessReply(vdisk, NKikimrProto::OK);
49+
50+
if (status == NKikimrProto::OK) {
51+
TAutoPtr<IEventHandle> resultHandle;
52+
auto result = runtime.GrabEdgeEventRethrow<TEvBlobStorage::TEvGetBlockResult>(resultHandle);
53+
UNIT_ASSERT(result);
54+
UNIT_ASSERT_VALUES_EQUAL(result->Status, NKikimrProto::OK);
55+
UNIT_ASSERT_VALUES_EQUAL(result->TabletId, tabletId);
56+
57+
UNIT_ASSERT_C(responsesNeeded < requests.size(),
58+
"Expected to respond after " << responsesNeeded << " responses, but got " << requests.size() << " disks");
59+
return;
60+
}
61+
}
62+
63+
UNIT_FAIL("Failed to reach quorum");
64+
}
65+
66+
void TestFailModelViolation(TBlobStorageGroupType::EErasureSpecies erasure) {
67+
TTestBasicRuntime runtime(1, false);
68+
runtime.SetDispatchTimeout(TDuration::Seconds(1));
69+
SetupRuntime(runtime);
70+
71+
TDSProxyEnv env;
72+
env.Configure(runtime, TBlobStorageGroupType(erasure), 0, 0);
73+
TTestState testState(runtime, env.Info);
74+
75+
const ui64 tabletId = 123456;
76+
77+
auto ev = std::make_unique<TEvBlobStorage::TEvGetBlock>(tabletId, TInstant::Max());
78+
runtime.Send(new IEventHandle(env.RealProxyActorId, testState.EdgeActor, ev.release()), 0);
79+
80+
TVector<TEvBlobStorage::TEvVGetBlock::TPtr> requests;
81+
for (ui32 i = 0; i < env.Info->GetTotalVDisksNum(); ++i) {
82+
TEvBlobStorage::TEvVGetBlock::TPtr vgetBlock = testState.GrabEventPtr<TEvBlobStorage::TEvVGetBlock>();
83+
UNIT_ASSERT(vgetBlock);
84+
requests.push_back(vgetBlock);
85+
}
86+
87+
TGroupQuorumTracker tracker(env.Info.Get());
88+
bool gotError = false;
89+
90+
bool isMirror3dc = (erasure == TBlobStorageGroupType::ErasureMirror3dc);
91+
92+
for (ui32 i = 0; i < requests.size(); ++i) {
93+
const TVDiskID vdisk = VDiskIDFromVDiskID(requests[i]->Get()->Record.GetVDiskID());
94+
95+
NKikimrProto::EReplyStatus diskStatus;
96+
if (isMirror3dc) {
97+
diskStatus = (vdisk.FailDomain == 1) ? NKikimrProto::ERROR : NKikimrProto::OK;
98+
} else {
99+
ui32 maxFailures = env.Info->Type.TotalPartCount() - env.Info->Type.MinimalRestorablePartCount();
100+
diskStatus = (i < maxFailures + 1) ? NKikimrProto::ERROR : NKikimrProto::OK;
101+
}
102+
103+
auto response = testState.CreateEventResultPtr(requests[i], diskStatus, tabletId);
104+
runtime.Send(response.Release(), 0);
105+
106+
NKikimrProto::EReplyStatus status = tracker.ProcessReply(vdisk, diskStatus);
107+
108+
if (status == NKikimrProto::ERROR) {
109+
TAutoPtr<IEventHandle> resultHandle;
110+
auto result = runtime.GrabEdgeEventRethrow<TEvBlobStorage::TEvGetBlockResult>(resultHandle);
111+
UNIT_ASSERT(result);
112+
UNIT_ASSERT_VALUES_EQUAL(result->Status, NKikimrProto::ERROR);
113+
gotError = true;
114+
break;
115+
}
116+
}
117+
118+
UNIT_ASSERT_C(gotError, "Expected ERROR when fail model is violated");
119+
}
120+
121+
void TestMaxAllowedFailures(TBlobStorageGroupType::EErasureSpecies erasure) {
122+
TTestBasicRuntime runtime(1, false);
123+
runtime.SetDispatchTimeout(TDuration::Seconds(1));
124+
SetupRuntime(runtime);
125+
126+
TDSProxyEnv env;
127+
env.Configure(runtime, TBlobStorageGroupType(erasure), 0, 0);
128+
TTestState testState(runtime, env.Info);
129+
130+
const ui64 tabletId = 123456;
131+
132+
auto ev = std::make_unique<TEvBlobStorage::TEvGetBlock>(tabletId, TInstant::Max());
133+
runtime.Send(new IEventHandle(env.RealProxyActorId, testState.EdgeActor, ev.release()), 0);
134+
135+
TVector<TEvBlobStorage::TEvVGetBlock::TPtr> requests;
136+
for (ui32 i = 0; i < env.Info->GetTotalVDisksNum(); ++i) {
137+
TEvBlobStorage::TEvVGetBlock::TPtr vgetBlock = testState.GrabEventPtr<TEvBlobStorage::TEvVGetBlock>();
138+
UNIT_ASSERT(vgetBlock);
139+
requests.push_back(vgetBlock);
140+
}
141+
142+
ui32 maxFailures = env.Info->Type.TotalPartCount() - env.Info->Type.MinimalRestorablePartCount();
143+
TGroupQuorumTracker tracker(env.Info.Get());
144+
145+
bool isMirror3dc = (erasure == TBlobStorageGroupType::ErasureMirror3dc);
146+
147+
for (ui32 i = 0; i < requests.size(); ++i) {
148+
const TVDiskID vdisk = VDiskIDFromVDiskID(requests[i]->Get()->Record.GetVDiskID());
149+
150+
NKikimrProto::EReplyStatus diskStatus;
151+
if (isMirror3dc) {
152+
diskStatus = ((vdisk.FailRealm == 0 && vdisk.FailDomain >= 1) ||
153+
(vdisk.FailRealm == 1 && vdisk.FailDomain == 1))
154+
? NKikimrProto::ERROR : NKikimrProto::OK;
155+
} else {
156+
diskStatus = (i < maxFailures) ? NKikimrProto::ERROR : NKikimrProto::OK;
157+
}
158+
159+
auto response = testState.CreateEventResultPtr(requests[i], diskStatus, tabletId);
160+
runtime.Send(response.Release(), 0);
161+
162+
NKikimrProto::EReplyStatus status = tracker.ProcessReply(vdisk, diskStatus);
163+
164+
if (status == NKikimrProto::OK) {
165+
TAutoPtr<IEventHandle> resultHandle;
166+
auto result = runtime.GrabEdgeEventRethrow<TEvBlobStorage::TEvGetBlockResult>(resultHandle);
167+
UNIT_ASSERT(result);
168+
UNIT_ASSERT_VALUES_EQUAL(result->Status, NKikimrProto::OK);
169+
return;
170+
}
171+
}
172+
173+
UNIT_FAIL("Failed to get OK response with max allowed failures");
174+
}
175+
176+
} // namespace
177+
178+
Y_UNIT_TEST_SUITE(TDSProxyGetBlockQuorumTest) {
179+
180+
#define UNIT_TEST_QUORUM_RESPONSE(ERASURE) \
181+
Y_UNIT_TEST(QuorumResponse##ERASURE) { \
182+
TestQuorumResponse(TBlobStorageGroupType::ERASURE); \
183+
}
184+
185+
UNIT_TEST_QUORUM_RESPONSE(Erasure3Plus1Block)
186+
UNIT_TEST_QUORUM_RESPONSE(Erasure4Plus2Block)
187+
UNIT_TEST_QUORUM_RESPONSE(Erasure3Plus2Block)
188+
UNIT_TEST_QUORUM_RESPONSE(ErasureMirror3dc)
189+
190+
#undef UNIT_TEST_QUORUM_RESPONSE
191+
192+
#define UNIT_TEST_FAIL_MODEL(ERASURE) \
193+
Y_UNIT_TEST(FailModelViolation##ERASURE) { \
194+
TestFailModelViolation(TBlobStorageGroupType::ERASURE); \
195+
}
196+
197+
UNIT_TEST_FAIL_MODEL(Erasure3Plus1Block)
198+
UNIT_TEST_FAIL_MODEL(Erasure4Plus2Block)
199+
UNIT_TEST_FAIL_MODEL(Erasure3Plus2Block)
200+
UNIT_TEST_FAIL_MODEL(ErasureMirror3dc)
201+
202+
#undef UNIT_TEST_FAIL_MODEL
203+
204+
#define UNIT_TEST_MAX_FAILURES(ERASURE) \
205+
Y_UNIT_TEST(MaxAllowedFailures##ERASURE) { \
206+
TestMaxAllowedFailures(TBlobStorageGroupType::ERASURE); \
207+
}
208+
209+
UNIT_TEST_MAX_FAILURES(Erasure3Plus1Block)
210+
UNIT_TEST_MAX_FAILURES(Erasure4Plus2Block)
211+
UNIT_TEST_MAX_FAILURES(Erasure3Plus2Block)
212+
UNIT_TEST_MAX_FAILURES(ErasureMirror3dc)
213+
214+
#undef UNIT_TEST_MAX_FAILURES
215+
216+
}

0 commit comments

Comments
 (0)