From 6a03597ddf2cc87857eecd9f1987e2f021744aaa Mon Sep 17 00:00:00 2001 From: Anton Myagkov Date: Sat, 14 Sep 2024 09:09:13 +0000 Subject: [PATCH] fix volume resize in nbsd-lightweight --- .../libs/service_local/service_local.cpp | 76 ++++++++++++++++--- 1 file changed, 64 insertions(+), 12 deletions(-) diff --git a/cloud/blockstore/libs/service_local/service_local.cpp b/cloud/blockstore/libs/service_local/service_local.cpp index 335308f730..58e6d1bf47 100644 --- a/cloud/blockstore/libs/service_local/service_local.cpp +++ b/cloud/blockstore/libs/service_local/service_local.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include @@ -62,17 +63,23 @@ struct TMountSession { const TString SessionId; const TString ClientId; - const IStoragePtr Storage; - const TStorageAdapter StorageAdapter; + const NProto::EVolumeAccessMode AccessMode; + IStoragePtr Storage; + std::unique_ptr StorageAdapter; - TMountSession(TString clientId, IStoragePtr storage, ui32 blockSize) + TMountSession( + TString clientId, + NProto::EVolumeAccessMode accessMode, + IStoragePtr storage, + ui32 blockSize) : SessionId(CreateGuidAsString()) , ClientId(std::move(clientId)) + , AccessMode(accessMode) , Storage(storage) - , StorageAdapter( - std::move(storage), - blockSize, - true) + , StorageAdapter(std::make_unique( + std::move(storage), + blockSize, + true)) {} }; @@ -83,7 +90,7 @@ using TMountSessionMap = THashMap; struct TMountedVolume { - const NProto::TVolume Volume; + NProto::TVolume Volume; TMountSessionMap Sessions; TMutex SessionLock; @@ -92,11 +99,15 @@ struct TMountedVolume : Volume(std::move(volume)) {} - TMountSessionPtr CreateSession(TString clientId, IStoragePtr storage) + TMountSessionPtr CreateSession( + TString clientId, + NProto::EVolumeAccessMode accessMode, + IStoragePtr storage) { with_lock (SessionLock) { auto session = std::make_shared( std::move(clientId), + accessMode, std::move(storage), Volume.GetBlockSize()); @@ -201,6 +212,31 @@ class TVolumeManager TFile fileData(MakeDataPath(diskId), EOpenModeFlag::OpenExisting); fileData.Resize(volume.GetBlockSize() * blocksCount); + + auto mountedVolume = FindMountedVolume(diskId); + if (!mountedVolume) { + return; + } + with_lock (mountedVolume->SessionLock) { + mountedVolume->Volume = volume; + for (auto& session: mountedVolume->Sessions) { + session.second->StorageAdapter.reset(); + session.second->Storage.reset(); + auto dataPath = MakeDataPath(volume.GetDiskId()); + volume.SetDiskId(dataPath); + session.second->Storage = StorageProvider + ->CreateStorage( + volume, + session.second->ClientId, + session.second->AccessMode) + .GetValueSync(); + session.second->StorageAdapter = + std::make_unique( + session.second->Storage, + volume.GetBlockSize(), + true); + } + } } void DestroyVolume(const TString& diskId) @@ -266,6 +302,7 @@ class TVolumeManager auto session = mountedVolume->CreateSession( clientId, + accessMode, std::move(storage)); NProto::TMountVolumeResponse response; @@ -666,7 +703,12 @@ TFuture TLocalService::ReadBlocks( << "Out of bounds read request"; } - return session->StorageAdapter.ReadBlocks( + if (!session->StorageAdapter) { + ythrow TServiceError(E_ARGUMENT) + << "Invalid storage adapter"; + } + + return session->StorageAdapter->ReadBlocks( Now(), std::move(ctx), std::move(request), @@ -725,7 +767,12 @@ TFuture TLocalService::WriteBlocks( << "Out of bounds write request"; } - return session->StorageAdapter.WriteBlocks( + if (!session->StorageAdapter) { + ythrow TServiceError(E_ARGUMENT) + << "Invalid storage adapter"; + } + + return session->StorageAdapter->WriteBlocks( Now(), std::move(ctx), std::move(request), @@ -776,7 +823,12 @@ TFuture TLocalService::ZeroBlocks( << "Out of bounds write request"; } - return session->StorageAdapter.ZeroBlocks( + if (!session->StorageAdapter) { + ythrow TServiceError(E_ARGUMENT) + << "Invalid storage adapter"; + } + + return session->StorageAdapter->ZeroBlocks( Now(), std::move(ctx), std::move(request),