summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVlad Kuznetsov <[email protected]>2026-07-17 16:16:13 +0200
committerGitHub <[email protected]>2026-07-17 16:16:13 +0200
commit9faeb0fb5545fd90dc096d0f1eb5890469d8c472 (patch)
treec6043a2f7f72a48d78b8ab7fac7f8203c60e0e28
parent462b35b1d3bc7a668b784cf0f313bec2793738e2 (diff)
NBYDB-2344: Implement flag for disable sorting of chunks on HDD (#46786)
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h6
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h12
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp6
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h1
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h5
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp19
-rw-r--r--ydb/core/protos/blobstorage_pdisk_config.proto1
7 files changed, 49 insertions, 1 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h
index 729fd7dbaa6..a86e117e11c 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h
@@ -185,6 +185,8 @@ struct TPDiskConfig : public TThrRefBase {
bool ReadOnly = false;
+ bool SortFreeChunksHDD = true;
+
// used for tests only
std::optional<ui64> NonceRandNum;
@@ -463,6 +465,10 @@ struct TPDiskConfig : public TThrRefBase {
if (cfg->HasSeparateHugePriorities()) {
SeparateHugePriorities = cfg->GetSeparateHugePriorities();
}
+
+ if (cfg->HasSortFreeChunksHDD()) {
+ SortFreeChunksHDD = cfg->GetSortFreeChunksHDD();
+ }
}
ui32 GetOwnerWeight(ui32 groupSizeInUnits) {
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h
index 2f7cb207162..49e7ef33c6a 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_free_chunks.h
@@ -5,6 +5,7 @@
#include <util/generic/algorithm.h>
#include <util/generic/queue.h>
+#include <util/random/shuffle.h>
namespace NKikimr {
namespace NPDisk {
@@ -21,6 +22,7 @@ protected:
::NMonitoring::TDynamicCounters::TCounterPtr MonFreeChunks;
ui64 OutOfOrderCount;
const ui64 SortFreeChunksPerItems;
+ bool SortingEnabled = true;
public:
TFreeChunks(::NMonitoring::TDynamicCounters::TCounterPtr &monFreeChunks, ui64 sortFreeChunksPerItems)
: FreeChunkCount(0)
@@ -42,7 +44,11 @@ public:
return 0;
}
if (OutOfOrderCount > SortFreeChunksPerItems) {
- Sort(FreeChunks.begin(), FreeChunks.end());
+ if (SortingEnabled) {
+ Sort(FreeChunks.begin(), FreeChunks.end());
+ } else {
+ Shuffle(FreeChunks.begin(), FreeChunks.end());
+ }
OutOfOrderCount = 0;
}
TChunkIdx idx = FreeChunks.front();
@@ -77,6 +83,10 @@ public:
MonFreeChunks->Inc();
}
+ void SetSortingEnabled(bool enabled) {
+ SortingEnabled = enabled;
+ }
+
// A thread-safe function that returns the current number of free chunks.
ui32 Size() const { return AtomicGet(FreeChunkCount); }
};
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
index d35266eb480..1d597380fc0 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
@@ -67,6 +67,7 @@ TPDisk::TPDisk(std::shared_ptr<TPDiskCtx> pCtx, const TIntrusivePtr<TPDiskConfig
ForsetiMaxLogBatchNsCached = ForsetiMaxLogBatchNs;
ForsetiOpPieceSize = TControlWrapper(Cfg->IoPieceSizeBytes, 1, Cfg->BufferPoolBufferSizeBytes);
ForsetiOpPieceSizeCached = ForsetiOpPieceSize;
+ EnableFreeChunksSortingHDD = TControlWrapper(Cfg->SortFreeChunksHDD, 0, 1);
UseNoopSchedulerSSD = TControlWrapper(Cfg->UseNoopScheduler, 0, 1);
UseNoopSchedulerHDD = TControlWrapper(Cfg->UseNoopScheduler, 0, 1);
ChunkBaseLimitPerMille = TControlWrapper(0, 0, 130); // 0 means ChunkBaseLimit isn't configured via ICB
@@ -3087,6 +3088,7 @@ bool TPDisk::Initialize() {
REGISTER_LOCAL_CONTROL(ForsetiMilliBatchSize);
REGISTER_LOCAL_CONTROL(ForsetiMaxLogBatchNs);
REGISTER_LOCAL_CONTROL(ForsetiOpPieceSize);
+ REGISTER_LOCAL_CONTROL(EnableFreeChunksSortingHDD);
TControlBoard::RegisterSharedControl(UseNoopSchedulerHDD, icb->PDiskControls.UseNoopSchedulerHDD);
TControlBoard::RegisterSharedControl(UseNoopSchedulerSSD, icb->PDiskControls.UseNoopSchedulerSSD);
REGISTER_LOCAL_CONTROL(ChunkBaseLimitPerMille);
@@ -4228,6 +4230,10 @@ void TPDisk::Update() {
SemiStrictSpaceIsolationCached = currentIsolation;
}
+ if (!PDiskCategory.IsSolidState()) { // HDD
+ Keeper.SetFreeChunksSortingEnabled(EnableFreeChunksSortingHDD);
+ }
+
// Switch the scheduler when possible
ForsetiScheduler.SetIsBinLogEnabled(EnableForsetiBinLog);
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h
index ddb6c3ecb0e..a34a501c523 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.h
@@ -107,6 +107,7 @@ public:
TControlWrapper ForsetiMilliBatchSize;
TControlWrapper ForsetiMaxLogBatchNs;
TControlWrapper ForsetiOpPieceSize;
+ TControlWrapper EnableFreeChunksSortingHDD;
TControlWrapper UseNoopSchedulerSSD;
TControlWrapper UseNoopSchedulerHDD;
TControlWrapper ChunkBaseLimitPerMille;
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h
index 4120c7c9b32..d181672aa76 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h
@@ -54,6 +54,11 @@ public:
TrimmedFreeChunks.Push(chunkIdx);
}
+ void SetFreeChunksSortingEnabled(bool enabled) {
+ UntrimmedFreeChunks.SetSortingEnabled(enabled);
+ TrimmedFreeChunks.SetSortingEnabled(enabled);
+ }
+
//
// Add/remove owner
//
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp
index b19e09e53b2..51c7e4e002a 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_util_ut.cpp
@@ -3,6 +3,7 @@
#include "blobstorage_pdisk_chunk_id_formatter.h"
#include "blobstorage_pdisk_data.h"
#include "blobstorage_pdisk_driveestimator.h"
+#include "blobstorage_pdisk_free_chunks.h"
#include "blobstorage_pdisk_impl.h"
#include "blobstorage_pdisk_mon.h"
#include "blobstorage_pdisk_sectorrestorator.h"
@@ -26,6 +27,24 @@ namespace NKikimr { namespace NPDisk {
Y_UNIT_TEST_SUITE(TPDiskUtil) {
+ Y_UNIT_TEST(FreeChunksSortingCanBeToggled) {
+ TIntrusivePtr<::NMonitoring::TDynamicCounters> counters = new ::NMonitoring::TDynamicCounters;
+ auto counter = counters->GetCounter("FreeChunks");
+ TFreeChunks freeChunks(counter, 3);
+
+ freeChunks.SetSortingEnabled(false);
+ freeChunks.Push(5);
+ freeChunks.Push(1);
+ UNIT_ASSERT_VALUES_EQUAL(freeChunks.Pop(), 5);
+
+ freeChunks.Push(4);
+ freeChunks.Push(2);
+ freeChunks.Push(3);
+ freeChunks.SetSortingEnabled(true);
+ UNIT_ASSERT_VALUES_EQUAL(freeChunks.Pop(), 1);
+ UNIT_ASSERT_VALUES_EQUAL(freeChunks.Pop(), 2);
+ }
+
Y_UNIT_TEST(AtomicBlockCounterFunctional) {
TAtomicBlockCounter counter;
UNIT_ASSERT_EQUAL(counter.Get(), 0);
diff --git a/ydb/core/protos/blobstorage_pdisk_config.proto b/ydb/core/protos/blobstorage_pdisk_config.proto
index 56f251469e8..c0e7c0fd138 100644
--- a/ydb/core/protos/blobstorage_pdisk_config.proto
+++ b/ydb/core/protos/blobstorage_pdisk_config.proto
@@ -99,4 +99,5 @@ message TPDiskConfig {
optional bool SeparateHugePriorities = 2007;
optional bool UseBytesFlightControl = 2008;
optional uint32 IoPieceSizeBytes = 2009;
+ optional bool SortFreeChunksHDD = 2010;
};