Skip to content

Commit

Permalink
NBS-4859 Any errors in the mirrored disk replica should be retriable (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
drbasic committed Jan 25, 2024
1 parent 177639d commit 77a89c8
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@ namespace NCloud::NBlockStore::NStorage {

void ProcessMirrorActorError(NProto::TError& error)
{
if (error.GetCode() == E_IO || error.GetCode() == E_IO_SILENT) {
if (HasError(error) && error.GetCode() != E_REJECTED) {
// We believe that all errors of the mirrored disk can be fixed by
// repeating the request.
error = MakeError(E_REJECTED, FormatError(error));
}
}
Expand Down
81 changes: 79 additions & 2 deletions cloud/blockstore/libs/storage/partition_nonrepl/part_mirror_ut.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -911,7 +911,8 @@ Y_UNIT_TEST_SUITE(TMirrorPartitionTest)
// TODO trigger and test migration for petya and petya#1
}

Y_UNIT_TEST(ShouldTransformIOErrorToRetriable)

void DoShouldTransformAnyErrorToRetriable(NProto::TError error)
{
TTestBasicRuntime runtime;

Expand All @@ -929,7 +930,7 @@ Y_UNIT_TEST_SUITE(TMirrorPartitionTest)
const auto blockRange = TBlockRange64::WithLength(1024, 3072);
client.WriteBlocksLocal(blockRange, TString(DefaultBlockSize, 'A'));

env.DiskAgentState->Error = MakeError(E_IO, "io error");
env.DiskAgentState->Error = std::move(error);

{
TVector<TString> blocks;
Expand Down Expand Up @@ -980,6 +981,82 @@ Y_UNIT_TEST_SUITE(TMirrorPartitionTest)
}
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_FAIL)
{
DoShouldTransformAnyErrorToRetriable(MakeError(E_FAIL, "E_FAIL error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_ARGUMENT)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_ARGUMENT, "E_ARGUMENT error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_INVALID_STATE)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_INVALID_STATE, "E_INVALID_STATE error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_NOT_FOUND)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_TIMEOUT, "E_TIMEOUT error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_TIMEOUT)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_TIMEOUT, "E_TIMEOUT error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_UNAUTHORIZED)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_UNAUTHORIZED, "E_UNAUTHORIZED error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_ABORTED)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_ABORTED, "E_ABORTED error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_TRY_AGAIN)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_TRY_AGAIN, "E_TRY_AGAIN error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_IO)
{
DoShouldTransformAnyErrorToRetriable(MakeError(E_IO, "E_IO error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_CANCELLED)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_CANCELLED, "E_CANCELLED error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_IO_SILENT)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_IO_SILENT, "E_IO_SILENT error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_RETRY_TIMEOUT)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_RETRY_TIMEOUT, "E_RETRY_TIMEOUT error"));
}

Y_UNIT_TEST(ShouldTransformAnyErrorToRetriable_E_PRECONDITION_FAILED)
{
DoShouldTransformAnyErrorToRetriable(
MakeError(E_PRECONDITION_FAILED, "E_PRECONDITION_FAILED error"));
}

Y_UNIT_TEST(ShouldReportSimpleCounters)
{
TTestBasicRuntime runtime;
Expand Down

0 comments on commit 77a89c8

Please sign in to comment.