Skip to content

Commit

Permalink
merge to stable-23-3 (#2149)
Browse files Browse the repository at this point in the history
* issue-2086: introduce IFileIOServiceProvider (#2117)

* issue-2086: use multiple aio services (#2126)

* retrying EAGAIN from io_setup in vhost-server (#2143)
  • Loading branch information
sharpeye committed Sep 27, 2024
1 parent 6939558 commit a8fbc7d
Show file tree
Hide file tree
Showing 31 changed files with 577 additions and 74 deletions.
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

0 comments on commit a8fbc7d

Please sign in to comment.