Repository: ydb-platform/nbs
Pull request #3531: Remove TBlockRange construction function MakeHalfOpenInterval()
Author: login: drbasic
Labels: name: large-tests
description: Launch large tests for PR
name: blockstore
description: Add this label to run only cloud/blockstore build and tests on PR
Created: 2025-05-17T07:18:20Z | Merged: 2025-05-19T15:40:51Z

Достаточно более понятного конструктора TBlockRange::WithLength().


Diff:
diff --git a/cloud/blockstore/apps/client/lib/check_range.cpp b/cloud/blockstore/apps/client/lib/check_range.cpp
index 78e96a0d0c7..b4461eedb3c 100644
--- a/cloud/blockstore/apps/client/lib/check_range.cpp
+++ b/cloud/blockstore/apps/client/lib/check_range.cpp
@@ -51,9 +51,9 @@ struct TRequestBuilder
     TRequestBuilder() = default;
 
     TRequestBuilder(
-        ui32 startIndex,
-        ui32 remainingBlocks,
-        ui32 blocksPerRequest)
+            ui32 startIndex,
+            ui32 remainingBlocks,
+            ui32 blocksPerRequest)
         : StartIndex(startIndex)
         , RemainingBlocks(remainingBlocks)
         , BlocksPerRequest(blocksPerRequest)
@@ -67,9 +67,8 @@ struct TRequestBuilder
 
         ui32 blocksInThisRequest = std::min(RemainingBlocks, BlocksPerRequest);
 
-        TBlockRange64 range = TBlockRange64::MakeHalfOpenInterval(
-            StartIndex,
-            StartIndex + blocksInThisRequest);
+        TBlockRange64 range =
+            TBlockRange64::WithLength(StartIndex, blocksInThisRequest);
 
         RemainingBlocks -= blocksInThisRequest;
         StartIndex += blocksInThisRequest;
diff --git a/cloud/blockstore/libs/common/block_range.h b/cloud/blockstore/libs/common/block_range.h
index 6eac3205793..db04697a2a7 100644
--- a/cloud/blockstore/libs/common/block_range.h
+++ b/cloud/blockstore/libs/common/block_range.h
@@ -73,15 +73,6 @@ struct TBlockRange
             static_cast<TBlockIndex>(end));
     }
 
-    // Create half interval range [start, excludedEnd).
-    static TBlockRange MakeHalfOpenInterval(
-        TBlockIndex start,
-        TBlockIndex excludedEnd)
-    {
-        Y_DEBUG_ABORT_UNLESS(start < excludedEnd);
-        return TBlockRange{start, excludedEnd - 1};
-    }
-
     // Create a range with start and length. It is guaranteed that there will be
     // no overflow for the end of the interval. Therefore, the constructed range
     // may be shorter than the requested one.
diff --git a/cloud/blockstore/libs/storage/partition2/model/blob_index.cpp b/cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
index 0aad739e5d2..79ea201c59a 100644
--- a/cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
+++ b/cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
@@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
+        holeRanges.push_back(TBlockRange32::MakeClosedInterval(
             blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+            blocks[holes.top().FirstBlock + 1].BlockIndex - 1));
         holes.pop();
     }
 
@@ -2129,7 +2129,7 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
     ui32 blockIndex = blocks.front().BlockIndex;
     for (const auto& holeRange: holeRanges) {
         blockRanges.push_back(
-            TBlockRange32::MakeHalfOpenInterval(blockIndex, holeRange.Start));
+            TBlockRange32::MakeClosedInterval(blockIndex, holeRange.Start - 1));
         blockIndex = holeRange.End + 1;
     }
     blockRanges.push_back(TBlockRange32::MakeClosedInterval(
diff --git a/cloud/blockstore/libs/storage/partition_common/actor_checkrange.cpp b/cloud/blockstore/libs/storage/partition_common/actor_checkrange.cpp
index 676f7b657a0..0d9c293f195 100644
--- a/cloud/blockstore/libs/storage/partition_common/actor_checkrange.cpp
+++ b/cloud/blockstore/libs/storage/partition_common/actor_checkrange.cpp
@@ -33,9 +33,9 @@ void TCheckRangeActor::Bootstrap(const TActorContext& ctx)
 
 void TCheckRangeActor::SendReadBlocksRequest(const TActorContext& ctx)
 {
-    TBlockRange64 range = TBlockRange64::MakeHalfOpenInterval(
+    TBlockRange64 range = TBlockRange64::WithLength(
         Request.GetStartIndex(),
-        Request.GetStartIndex() + Request.GetBlocksCount());
+        Request.GetBlocksCount());
 
     Buffer = TGuardedBuffer(TString::Uninitialized(range.Size() * BlockSize));
 
diff --git a/cloud/blockstore/libs/storage/partition_nonrepl/model/processing_blocks_ut.cpp b/cloud/blockstore/libs/storage/partition_nonrepl/model/processing_blocks_ut.cpp
index 8d6363be0ec..bed9621dab9 100644
--- a/cloud/blockstore/libs/storage/partition_nonrepl/model/processing_blocks_ut.cpp
+++ b/cloud/blockstore/libs/storage/partition_nonrepl/model/processing_blocks_ut.cpp
@@ -84,7 +84,7 @@ Y_UNIT_TEST_SUITE(TProcessingBlocksTest)
         blocks.MarkProcessed(TBlockRange64::WithLength(1000, 500));
         blocks.MarkProcessed(TBlockRange64::WithLength(3000, 30000));
         blocks.MarkProcessed(
-            TBlockRange64::MakeHalfOpenInterval(35048, 1024 * 1024));
+            TBlockRange64::MakeClosedInterval(35048, 1024 * 1024 - 1));
         blocks.SkipProcessedRanges();
 
         UNIT_ASSERT(blocks.IsProcessing());
diff --git a/cloud/blockstore/libs/storage/partition_nonrepl/part_mirror_actor_checkrange.cpp b/cloud/blockstore/libs/storage/partition_nonrepl/part_mirror_actor_checkrange.cpp
index e2e40371374..5a82256b848 100644
--- a/cloud/blockstore/libs/storage/partition_nonrepl/part_mirror_actor_checkrange.cpp
+++ b/cloud/blockstore/libs/storage/partition_nonrepl/part_mirror_actor_checkrange.cpp
@@ -37,9 +37,9 @@ class TMirrorCheckRangeActor final: public TCheckRangeActor
 void TMirrorCheckRangeActor::SendReadBlocksRequest(const TActorContext& ctx)
 {
     const TString clientId{CheckRangeClientId};
-    TBlockRange64 range = TBlockRange64::MakeHalfOpenInterval(
+    TBlockRange64 range = TBlockRange64::WithLength(
         Request.GetStartIndex(),
-        Request.GetStartIndex() + Request.GetBlocksCount());
+        Request.GetBlocksCount());
 
     Buffer = TGuardedBuffer(TString::Uninitialized(range.Size() * BlockSize));
 
diff --git a/cloud/blockstore/libs/storage/partition_nonrepl/part_nonrepl_actor_checkrange.cpp b/cloud/blockstore/libs/storage/partition_nonrepl/part_nonrepl_actor_checkrange.cpp
index 48e6d707148..552b34b6e14 100644
--- a/cloud/blockstore/libs/storage/partition_nonrepl/part_nonrepl_actor_checkrange.cpp
+++ b/cloud/blockstore/libs/storage/partition_nonrepl/part_nonrepl_actor_checkrange.cpp
@@ -40,9 +40,9 @@ void TNonreplCheckRangeActor::SendReadBlocksRequest(const TActorContext& ctx)
 {
     const TString clientId{CheckRangeClientId};
 
-    TBlockRange64 range = TBlockRange64::MakeHalfOpenInterval(
+    TBlockRange64 range = TBlockRange64::WithLength(
         Request.GetStartIndex(),
-        Request.GetStartIndex() + Request.GetBlocksCount());
+        Request.GetBlocksCount());
 
     Buffer = TGuardedBuffer(TString::Uninitialized(range.Size() * BlockSize));
 
diff --git a/cloud/blockstore/libs/storage/volume/model/checkpoint_light_ut.cpp b/cloud/blockstore/libs/storage/volume/model/checkpoint_light_ut.cpp
index c928468109e..1b6fd0d0dd9 100644
--- a/cloud/blockstore/libs/storage/volume/model/checkpoint_light_ut.cpp
+++ b/cloud/blockstore/libs/storage/volume/model/checkpoint_light_ut.cpp
@@ -38,7 +38,7 @@ Y_UNIT_TEST_SUITE(TCheckpointLightTests)
     Y_UNIT_TEST(ShouldDiffCheckpoint)
     {
         const int blocksCount = 10;
-        const auto& fillRange = TBlockRange64::MakeHalfOpenInterval(1, 4);
+        const auto& fillRange = TBlockRange64::WithLength(1, 3);
 
         TCheckpointLight checkpoint(blocksCount);
         checkpoint.CreateCheckpoint("Checkpoint_1");
@@ -71,23 +71,23 @@ Y_UNIT_TEST_SUITE(TCheckpointLightTests)
         UNIT_ASSERT(!SUCCEEDED(checkpoint.FindDirtyBlocksBetweenCheckpoints(
             "Checkpoint_1",
             "Checkpoint_2",
-            TBlockRange64::MakeHalfOpenInterval(0, 11),
+            TBlockRange64::WithLength(0, 11),
             &mask).GetCode()));
         UNIT_ASSERT(!SUCCEEDED(checkpoint.FindDirtyBlocksBetweenCheckpoints(
             "Checkpoint_1",
             "Checkpoint_2",
-            TBlockRange64::MakeHalfOpenInterval(5, 12),
+            TBlockRange64::WithLength(5, 7),
             &mask).GetCode()));
 
         UNIT_ASSERT_VALUES_EQUAL(S_OK, checkpoint.FindDirtyBlocksBetweenCheckpoints(
             "Checkpoint_1",
             "Checkpoint_2",
-            TBlockRange64::MakeHalfOpenInterval(0, 10),
+            TBlockRange64::WithLength(0, 10),
             &mask).GetCode());
         UNIT_ASSERT_VALUES_EQUAL(S_OK, checkpoint.FindDirtyBlocksBetweenCheckpoints(
             "Checkpoint_1",
             "Checkpoint_2",
-            TBlockRange64::MakeHalfOpenInterval(3, 5),
+            TBlockRange64::WithLength(3, 2),
             &mask).GetCode());
     }
 
@@ -96,11 +96,11 @@ Y_UNIT_TEST_SUITE(TCheckpointLightTests)
         const int blocksCount = 10;
         TCheckpointLight checkpoint(blocksCount);
 
-        const auto& blockRangeFull = TBlockRange64::MakeHalfOpenInterval(0, 10);
+        const auto& blockRangeFull = TBlockRange64::WithLength(0, 10);
 
         checkpoint.CreateCheckpoint("Checkpoint_1");
-        checkpoint.Set(TBlockRange64::MakeHalfOpenInterval(2, 4));
-        checkpoint.Set(TBlockRange64::MakeHalfOpenInterval(6, 9));
+        checkpoint.Set(TBlockRange64::WithLength(2, 2));
+        checkpoint.Set(TBlockRange64::WithLength(6, 3));
         checkpoint.CreateCheckpoint("Checkpoint_2");
 
         {
@@ -119,7 +119,7 @@ Y_UNIT_TEST_SUITE(TCheckpointLightTests)
             auto error = checkpoint.FindDirtyBlocksBetweenCheckpoints(
                 "Checkpoint_1",
                 "Checkpoint_2",
-                TBlockRange64::MakeHalfOpenInterval(3, 9),
+                TBlockRange64::WithLength(3, 6),
                 &mask);
             UNIT_ASSERT_VALUES_EQUAL(S_OK, error.GetCode());
             UNIT_ASSERT_VALUES_EQUAL(0b00111001, ui8(mask[0]));
@@ -129,7 +129,7 @@ Y_UNIT_TEST_SUITE(TCheckpointLightTests)
             auto error = checkpoint.FindDirtyBlocksBetweenCheckpoints(
                 "Checkpoint_1",
                 "Checkpoint_2",
-                TBlockRange64::MakeHalfOpenInterval(0, 8),
+                TBlockRange64::WithLength(0, 8),
                 &mask);
             UNIT_ASSERT_VALUES_EQUAL(S_OK, error.GetCode());
             UNIT_ASSERT_VALUES_EQUAL(0b11001100, ui8(mask[0]));
@@ -139,7 +139,7 @@ Y_UNIT_TEST_SUITE(TCheckpointLightTests)
             auto error = checkpoint.FindDirtyBlocksBetweenCheckpoints(
                 "Checkpoint_1",
                 "Checkpoint_2",
-                TBlockRange64::MakeHalfOpenInterval(8, 10),
+                TBlockRange64::WithLength(8, 2),
                 &mask);
             UNIT_ASSERT_VALUES_EQUAL(S_OK, error.GetCode());
             UNIT_ASSERT_VALUES_EQUAL(0b00000001, ui8(mask[0]));


Reviews:
user: login: komarevtsev-d
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-19T05:54:53Z
user: login: agalibin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T07:26:49Z
user: login: drbasic
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T07:28:46Z
user: login: agalibin
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T07:36:59Z
user: login: agalibin
state: DISMISSED
author_association: COLLABORATOR
submitted_at: 2025-05-19T07:39:14Z
user: login: drbasic
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T12:44:47Z
user: login: komarevtsev-d
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-19T13:16:53Z
user: login: SvartMetal
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T15:34:07Z
user: login: SvartMetal
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T15:34:30Z
user: login: drbasic
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T15:38:02Z
user: login: drbasic
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-19T15:38:07Z
user: login: SvartMetal
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-19T15:40:21Z

Review comments:
diff_hunk: @@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
-            blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+        auto start = blocks[holes.top().FirstBlock].BlockIndex + 1;
+        auto end = blocks[holes.top().FirstBlock + 1].BlockIndex;
+        holeRanges.push_back(TBlockRange32::WithLength(start, end - start));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: agalibin
body: есть гарантии, что end больше start?
created_at: 2025-05-19T07:26:48Z
author_association: COLLABORATOR
diff_hunk: @@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
-            blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+        auto start = blocks[holes.top().FirstBlock].BlockIndex + 1;
+        auto end = blocks[holes.top().FirstBlock + 1].BlockIndex;
+        holeRanges.push_back(TBlockRange32::WithLength(start, end - start));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: drbasic
body: Видимо. Код сам по себе не менялся, заменил один конструктор на другой. 
created_at: 2025-05-19T07:28:46Z
author_association: COLLABORATOR
diff_hunk: @@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
-            blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+        auto start = blocks[holes.top().FirstBlock].BlockIndex + 1;
+        auto end = blocks[holes.top().FirstBlock + 1].BlockIndex;
+        holeRanges.push_back(TBlockRange32::WithLength(start, end - start));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: agalibin
body: можно тогда добавить такую же дебажную проверялку, как было и раньше, для успокоения (правда тогда надо ее добавлять во все изменения). Вобщем выглядит немного настораживающе )
created_at: 2025-05-19T07:36:59Z
author_association: COLLABORATOR
diff_hunk: @@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
-            blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+        auto start = blocks[holes.top().FirstBlock].BlockIndex + 1;
+        auto end = blocks[holes.top().FirstBlock + 1].BlockIndex;
+        holeRanges.push_back(TBlockRange32::WithLength(start, end - start));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: drbasic
body: сделал через MakeClosedInterval
created_at: 2025-05-19T12:44:47Z
author_association: COLLABORATOR
diff_hunk: @@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
+        holeRanges.push_back(TBlockRange32::MakeClosedInterval(
             blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+            blocks[holes.top().FirstBlock + 1].BlockIndex - 1));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: SvartMetal
body: Y_DEBUG_ABORT_UNLESS

подобный тому что был в `MakeHalfOpenInterval`
created_at: 2025-05-19T15:34:07Z
author_association: COLLABORATOR
diff_hunk: @@ -2129,7 +2129,7 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
     ui32 blockIndex = blocks.front().BlockIndex;
     for (const auto& holeRange: holeRanges) {
         blockRanges.push_back(
-            TBlockRange32::MakeHalfOpenInterval(blockIndex, holeRange.Start));
+            TBlockRange32::MakeClosedInterval(blockIndex, holeRange.Start - 1));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: SvartMetal
body: и тут Y_DEBUG_ABORT_UNLESS
created_at: 2025-05-19T15:34:30Z
author_association: COLLABORATOR
diff_hunk: @@ -2115,9 +2115,9 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
 
     TBlockRanges holeRanges;
     while (!holes.empty()) {
-        holeRanges.push_back(TBlockRange32::MakeHalfOpenInterval(
+        holeRanges.push_back(TBlockRange32::MakeClosedInterval(
             blocks[holes.top().FirstBlock].BlockIndex + 1,
-            blocks[holes.top().FirstBlock + 1].BlockIndex));
+            blocks[holes.top().FirstBlock + 1].BlockIndex - 1));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: drbasic
body: https://github.com/ydb-platform/nbs/blob/main/cloud/blockstore/libs/common/block_range.h#L54
created_at: 2025-05-19T15:38:02Z
author_association: COLLABORATOR
diff_hunk: @@ -2129,7 +2129,7 @@ TBlockRanges BuildRanges(const TVector<TBlock>& blocks, ui32 maxRanges)
     ui32 blockIndex = blocks.front().BlockIndex;
     for (const auto& holeRange: holeRanges) {
         blockRanges.push_back(
-            TBlockRange32::MakeHalfOpenInterval(blockIndex, holeRange.Start));
+            TBlockRange32::MakeClosedInterval(blockIndex, holeRange.Start - 1));
path: cloud/blockstore/libs/storage/partition2/model/blob_index.cpp
user: login: drbasic
body: https://github.com/ydb-platform/nbs/blob/main/cloud/blockstore/libs/common/block_range.h#L54
created_at: 2025-05-19T15:38:07Z
author_association: COLLABORATOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-05-17T09:55:24Z
body: <!-- status pr=3531, run=11641, build_preset=linux-x86_64-relwithdebinfo, dry_run=False -->
> [!NOTE]
> This is an automated comment that will be appended during run.

:green_circle: **linux-x86_64-relwithdebinfo**: all tests PASSED for commit 61561e823f6e7f9821f8e70b849a29702ebe9337.
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/nbs/tree/main/.github/config "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [5354](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15083027926/1/nebius-x86-64/summary/1/ya-test.html) | [5354](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15083027926/1/nebius-x86-64/summary/1/ya-test.html#PASS) | 0 | 0 | 0 | 0 |
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-05-19T14:53:25Z
body: <!-- status pr=3531, run=11681, build_preset=linux-x86_64-relwithdebinfo, dry_run=False -->
> [!NOTE]
> This is an automated comment that will be appended during run.

:red_circle: **linux-x86_64-relwithdebinfo**: some tests FAILED for commit ec8a6f7c74e212832f68b657d29457bc5dbaf094.
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/nbs/tree/main/.github/config "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [5354](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15113310305/1/nebius-x86-64/summary/1/ya-test.html) | [5353](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15113310305/1/nebius-x86-64/summary/1/ya-test.html#PASS) | 0 | [1](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15113310305/1/nebius-x86-64/summary/1/ya-test.html#FAIL) | 0 | 0 |


:green_circle: **linux-x86_64-relwithdebinfo**: all tests PASSED for commit ec8a6f7c74e212832f68b657d29457bc5dbaf094.
| TESTS | PASSED | ERRORS | FAILED | SKIPPED | MUTED<sup>[?](https://github.com/ydb-platform/nbs/tree/main/.github/config "All mute rules are defined here")</sup> |
| ---: | ---: | ---: | ---: | ---: | ---: |
| [2](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15113310305/1/nebius-x86-64/summary/2/ya-test.html) | [2](https://github-actions-s3.storage.eu-north1.nebius.cloud/ydb-platform/nbs/PR-check/15113310305/1/nebius-x86-64/summary/2/ya-test.html#PASS) | 0 | 0 | 0 | 0 |
author_association: CONTRIBUTOR