Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

merge to stable-23-3 #2149

Merged
merged 4 commits into from
Sep 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions cloud/blockstore/config/disk.proto
Original file line number Diff line number Diff line change
Expand Up @@ -251,6 +251,13 @@ message TDiskAgentConfig

// Max. count of concurrently processing operations (io_setup).
optional uint32 MaxAIOContextEvents = 33;

// Number of paths per each FileIOService.
// 0 means that only one IO service will be created.
// 1 means that one IO service per file path will be created.
// 2 means that one IO service will be created for every two file paths.
// etc.
optional uint32 PathsPerFileIOService = 34;
}

////////////////////////////////////////////////////////////////////////////////
Expand Down
10 changes: 6 additions & 4 deletions cloud/blockstore/libs/daemon/common/bootstrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
#include <cloud/blockstore/libs/service/service_filtered.h>
#include <cloud/blockstore/libs/service/service_null.h>
#include <cloud/blockstore/libs/service/storage_provider.h>
#include <cloud/blockstore/libs/service_local/file_io_service_provider.h>
#include <cloud/blockstore/libs/service_local/service_local.h>
#include <cloud/blockstore/libs/service_local/storage_aio.h>
#include <cloud/blockstore/libs/service_local/storage_null.h>
Expand Down Expand Up @@ -737,7 +738,8 @@ void TBootstrapBase::InitLocalService()
? *Configs->ServerConfig->GetLocalServiceConfig()
: NProto::TLocalServiceConfig();

FileIOService = CreateAIOService();
FileIOServiceProvider =
CreateSingleFileIOServiceProvider(CreateAIOService());

NvmeManager = CreateNvmeManager(
Configs->DiskAgentConfig->GetSecureEraseTimeout());
Expand All @@ -746,7 +748,7 @@ void TBootstrapBase::InitLocalService()
config,
DiscoveryService,
CreateAioStorageProvider(
FileIOService,
FileIOServiceProvider,
NvmeManager,
false, // directIO
EAioSubmitQueueOpt::DontUse
Expand Down Expand Up @@ -866,7 +868,7 @@ void TBootstrapBase::Start()
START_KIKIMR_COMPONENT(StatsUploader);
START_COMMON_COMPONENT(Spdk);
START_KIKIMR_COMPONENT(ActorSystem);
START_COMMON_COMPONENT(FileIOService);
START_COMMON_COMPONENT(FileIOServiceProvider);
START_COMMON_COMPONENT(EndpointProxyClient);
START_COMMON_COMPONENT(EndpointManager);
START_COMMON_COMPONENT(Service);
Expand Down Expand Up @@ -936,7 +938,7 @@ void TBootstrapBase::Stop()
STOP_COMMON_COMPONENT(Service);
STOP_COMMON_COMPONENT(EndpointManager);
STOP_COMMON_COMPONENT(EndpointProxyClient);
STOP_COMMON_COMPONENT(FileIOService);
STOP_COMMON_COMPONENT(FileIOServiceProvider);
STOP_KIKIMR_COMPONENT(ActorSystem);
STOP_COMMON_COMPONENT(Spdk);
STOP_KIKIMR_COMPONENT(StatsUploader);
Expand Down
2 changes: 1 addition & 1 deletion cloud/blockstore/libs/daemon/common/bootstrap.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class TBootstrapBase
NVhost::IServerPtr VhostServer;
NVhost::TVhostCallbacks VhostCallbacks;
NBD::IServerPtr NbdServer;
IFileIOServicePtr FileIOService;
IFileIOServiceProviderPtr FileIOServiceProvider;
IStorageProviderPtr StorageProvider;
IKmsKeyProviderPtr KmsKeyProvider;
IRootKmsKeyProviderPtr RootKmsKeyProvider;
Expand Down
31 changes: 18 additions & 13 deletions cloud/blockstore/libs/daemon/ydb/bootstrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include <cloud/blockstore/libs/service/service_auth.h>
#include <cloud/blockstore/libs/service_kikimr/auth_provider_kikimr.h>
#include <cloud/blockstore/libs/service_kikimr/service_kikimr.h>
#include <cloud/blockstore/libs/service_local/file_io_service_provider.h>
#include <cloud/blockstore/libs/service_local/storage_aio.h>
#include <cloud/blockstore/libs/service_local/storage_null.h>
#include <cloud/blockstore/libs/spdk/iface/env.h>
Expand Down Expand Up @@ -433,23 +434,30 @@ void TBootstrapYdb::InitKikimrService()

InitSpdk();

FileIOService = CreateAIOService();

if (Configs->DiskAgentConfig->GetEnabled() &&
Configs->DiskAgentConfig->GetBackend() == NProto::DISK_AGENT_BACKEND_AIO &&
if (const auto& config = *Configs->DiskAgentConfig;
config.GetEnabled() &&
config.GetBackend() == NProto::DISK_AGENT_BACKEND_AIO &&
!AioStorageProvider)
{
Y_ABORT_UNLESS(FileIOService);

NvmeManager = CreateNvmeManager(
Configs->DiskAgentConfig->GetSecureEraseTimeout());

auto factory = [events = config.GetMaxAIOContextEvents()] {
return CreateAIOService(events);
};

FileIOServiceProvider =
config.GetPathsPerFileIOService()
? CreateFileIOServiceProvider(
config.GetPathsPerFileIOService(),
factory)
: CreateSingleFileIOServiceProvider(factory());

AioStorageProvider = CreateAioStorageProvider(
FileIOService,
FileIOServiceProvider,
NvmeManager,
!Configs->DiskAgentConfig->GetDirectIoFlagDisabled(),
EAioSubmitQueueOpt::DontUse
);
!config.GetDirectIoFlagDisabled(),
EAioSubmitQueueOpt::DontUse);

STORAGE_INFO("AioStorageProvider initialized");
}
Expand All @@ -465,8 +473,6 @@ void TBootstrapYdb::InitKikimrService()
STORAGE_INFO("AioStorageProvider (null) initialized");
}

Y_ABORT_UNLESS(FileIOService);

Allocator = CreateCachingAllocator(
Spdk ? Spdk->GetAllocator() : TDefaultAllocator::Instance(),
Configs->DiskAgentConfig->GetPageSize(),
Expand Down Expand Up @@ -534,7 +540,6 @@ void TBootstrapYdb::InitKikimrService()
args.DiscoveryService = DiscoveryService;
args.Spdk = Spdk;
args.Allocator = Allocator;
args.FileIOService = FileIOService;
args.AioStorageProvider = AioStorageProvider;
args.ProfileLog = ProfileLog;
args.BlockDigestGenerator = BlockDigestGenerator;
Expand Down
26 changes: 18 additions & 8 deletions cloud/blockstore/libs/disk_agent/bootstrap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include <cloud/blockstore/libs/rdma/iface/probes.h>
#include <cloud/blockstore/libs/rdma/iface/server.h>
#include <cloud/blockstore/libs/server/config.h>
#include <cloud/blockstore/libs/service_local/file_io_service_provider.h>
#include <cloud/blockstore/libs/service_local/storage_aio.h>
#include <cloud/blockstore/libs/service_local/storage_null.h>
#include <cloud/blockstore/libs/spdk/iface/config.h>
Expand Down Expand Up @@ -428,20 +429,30 @@ bool TBootstrap::InitKikimrService()
break;
}

case NProto::DISK_AGENT_BACKEND_AIO:
FileIOService =
CreateAIOService(config.GetMaxAIOContextEvents());
case NProto::DISK_AGENT_BACKEND_AIO: {
NvmeManager = CreateNvmeManager(config.GetSecureEraseTimeout());

auto factory = [events = config.GetMaxAIOContextEvents()] {
return CreateAIOService(events);
};

FileIOServiceProvider =
config.GetPathsPerFileIOService()
? CreateFileIOServiceProvider(
config.GetPathsPerFileIOService(),
factory)
: CreateSingleFileIOServiceProvider(factory());

AioStorageProvider = CreateAioStorageProvider(
FileIOService,
FileIOServiceProvider,
NvmeManager,
!config.GetDirectIoFlagDisabled(),
EAioSubmitQueueOpt::Use
);

STORAGE_INFO("Aio backend initialized");
break;
}
case NProto::DISK_AGENT_BACKEND_NULL:
NvmeManager = CreateNvmeManager(config.GetSecureEraseTimeout());
AioStorageProvider = CreateNullStorageProvider();
Expand Down Expand Up @@ -487,7 +498,6 @@ bool TBootstrap::InitKikimrService()
args.AsyncLogger = AsyncLogger;
args.Spdk = Spdk;
args.Allocator = Allocator;
args.FileIOService = FileIOService;
args.AioStorageProvider = AioStorageProvider;
args.ProfileLog = ProfileLog;
args.BlockDigestGenerator = BlockDigestGenerator;
Expand Down Expand Up @@ -604,7 +614,7 @@ void TBootstrap::Start()
START_COMPONENT(TraceProcessor);
START_COMPONENT(Spdk);
START_COMPONENT(RdmaServer);
START_COMPONENT(FileIOService);
START_COMPONENT(FileIOServiceProvider);
START_COMPONENT(ActorSystem);

// we need to start scheduler after all other components for 2 reasons:
Expand Down Expand Up @@ -642,9 +652,9 @@ void TBootstrap::Stop()
STOP_COMPONENT(Scheduler);

STOP_COMPONENT(ActorSystem);
// stop FileIOService after ActorSystem to ensure that there are no
// stop FileIOServiceProvider after ActorSystem to ensure that there are no
// in-flight I/O requests from TDiskAgentActor
STOP_COMPONENT(FileIOService);
STOP_COMPONENT(FileIOServiceProvider);

STOP_COMPONENT(Spdk);
STOP_COMPONENT(RdmaServer);
Expand Down
2 changes: 1 addition & 1 deletion cloud/blockstore/libs/disk_agent/bootstrap.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class TBootstrap
ITraceProcessorPtr TraceProcessor;
IProfileLogPtr ProfileLog;
IBlockDigestGeneratorPtr BlockDigestGenerator;
IFileIOServicePtr FileIOService;
IFileIOServiceProviderPtr FileIOServiceProvider;
NSpdk::ISpdkEnvPtr Spdk;
std::function<void(TLog& log)> SpdkLogInitializer;
ICachingAllocatorPtr Allocator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ target_link_libraries(blockstore-libs-service_local PUBLIC
target_sources(blockstore-libs-service_local PRIVATE
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/broken_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/compound_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/file_io_service_provider.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/rdma_protocol.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/service_local.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/storage_aio.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ target_link_libraries(blockstore-libs-service_local PUBLIC
target_sources(blockstore-libs-service_local PRIVATE
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/broken_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/compound_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/file_io_service_provider.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/rdma_protocol.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/service_local.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/storage_aio.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ target_link_libraries(blockstore-libs-service_local PUBLIC
target_sources(blockstore-libs-service_local PRIVATE
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/broken_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/compound_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/file_io_service_provider.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/rdma_protocol.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/service_local.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/storage_aio.cpp
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ target_link_libraries(blockstore-libs-service_local PUBLIC
target_sources(blockstore-libs-service_local PRIVATE
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/broken_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/compound_storage.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/file_io_service_provider.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/rdma_protocol.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/service_local.cpp
${CMAKE_SOURCE_DIR}/cloud/blockstore/libs/service_local/storage_aio.cpp
Expand Down
114 changes: 114 additions & 0 deletions cloud/blockstore/libs/service_local/file_io_service_provider.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
#include "file_io_service_provider.h"

#include <cloud/storage/core/libs/common/file_io_service.h>

#include <util/generic/algorithm.h>
#include <util/generic/string.h>
#include <util/generic/vector.h>

namespace NCloud::NBlockStore::NServer {

namespace {

////////////////////////////////////////////////////////////////////////////////

class TFileIOServiceProvider final
: public IFileIOServiceProvider
{
private:
const ui32 PathsPerServices;
std::function<IFileIOServicePtr()> Factory;

TVector<std::pair<TString, size_t>> PathToFileIOIndex;
TVector<IFileIOServicePtr> FileIOs;

public:
explicit TFileIOServiceProvider(
ui32 pathsPerServices,
std::function<IFileIOServicePtr()> factory)
: PathsPerServices{Max(pathsPerServices, 1U)}
, Factory(std::move(factory))
{}

void Start() override
{}

void Stop() override
{
for (auto& fileIO: FileIOs) {
fileIO->Stop();
}
}

IFileIOServicePtr CreateFileIOService(TStringBuf filePath) override
{
if (auto* p = FindIfPtr(
PathToFileIOIndex,
[=](const auto& p) { return p.first == filePath; }))
{
return FileIOs[p->second];
}

if (PathToFileIOIndex.size() + 1 > PathsPerServices * FileIOs.size()) {
auto service = Factory();
Y_DEBUG_ABORT_UNLESS(service);
service->Start();
FileIOs.push_back(service);
}

PathToFileIOIndex.emplace_back(filePath, FileIOs.size() - 1);

return FileIOs.back();
}
};

////////////////////////////////////////////////////////////////////////////////

struct TSingleFileIOServiceProvider final
: IFileIOServiceProvider
{
IFileIOServicePtr FileIO;

explicit TSingleFileIOServiceProvider(
IFileIOServicePtr fileIO)
: FileIO{std::move(fileIO)}
{}

void Start() override
{
FileIO->Start();
}

void Stop() override
{
FileIO->Stop();
}

IFileIOServicePtr CreateFileIOService(TStringBuf filePath) override
{
Y_UNUSED(filePath);

return FileIO;
}
};

} // namespace

////////////////////////////////////////////////////////////////////////////////

IFileIOServiceProviderPtr CreateSingleFileIOServiceProvider(
IFileIOServicePtr fileIO)
{
return std::make_shared<TSingleFileIOServiceProvider>(std::move(fileIO));
}

IFileIOServiceProviderPtr CreateFileIOServiceProvider(
ui32 filePathsPerServices,
std::function<IFileIOServicePtr()> factory)
{
return std::make_shared<TFileIOServiceProvider>(
filePathsPerServices,
std::move(factory));
}

} // namespace NCloud::NBlockStore::NServer
31 changes: 31 additions & 0 deletions cloud/blockstore/libs/service_local/file_io_service_provider.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#pragma once

#include "public.h"

#include <cloud/storage/core/libs/common/public.h>
#include <cloud/storage/core/libs/common/startable.h>

#include <util/generic/strbuf.h>

#include <functional>

namespace NCloud::NBlockStore::NServer {

////////////////////////////////////////////////////////////////////////////////

struct IFileIOServiceProvider
: IStartable
{
virtual IFileIOServicePtr CreateFileIOService(TStringBuf filePath) = 0;
};

////////////////////////////////////////////////////////////////////////////////

IFileIOServiceProviderPtr CreateSingleFileIOServiceProvider(
IFileIOServicePtr fileIO);

IFileIOServiceProviderPtr CreateFileIOServiceProvider(
ui32 filePathsPerServices,
std::function<IFileIOServicePtr()> factory);

} // namespace NCloud::NBlockStore::NServer
Loading
Loading