Skip to content

Commit

Permalink
issue-2086: introduce IFileIOServiceProvider
Browse files Browse the repository at this point in the history
  • Loading branch information
sharpeye committed Sep 24, 2024
1 parent 7e4d737 commit bb3e226
Show file tree
Hide file tree
Showing 6 changed files with 430 additions and 4 deletions.
115 changes: 115 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,115 @@
#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 TFileIOServiceProviderStub final
: IFileIOServiceProvider
{
IFileIOServicePtr FileIO;

explicit TFileIOServiceProviderStub(
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 CreateFileIOServiceProviderStub(
IFileIOServicePtr fileIO)
{
return std::make_shared<TFileIOServiceProviderStub>(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 CreateFileIOServiceProviderStub(
IFileIOServicePtr fileIO);

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

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

0 comments on commit bb3e226

Please sign in to comment.