aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorserg-belyakov <serg-belyakov@yandex-team.com>2023-10-27 16:03:41 +0300
committerserg-belyakov <serg-belyakov@yandex-team.com>2023-10-27 17:32:14 +0300
commit63d30647b25867ab5e75bbc45816c7883732c37c (patch)
tree7a9245d636c382e6ec0f40d4072610e6c4c478ca
parent68b659ef9f20a660cfed1ba94fb218904742bd70 (diff)
downloadydb-63d30647b25867ab5e75bbc45816c7883732c37c.tar.gz
Handle empty PDisk's mainKey correctly, KIKIMR-19578
Handle empty main key properly
-rw-r--r--ydb/core/blobstorage/backpressure/queue_backpressure_client_ut.cpp4
-rw-r--r--ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp2
-rw-r--r--ydb/core/blobstorage/incrhuge/ut/incrhuge_basic_ut.cpp4
-rw-r--r--ydb/core/blobstorage/nodewarden/distconf_persistent_storage.cpp8
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden.h19
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_impl.cpp32
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_pdisk.cpp15
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp24
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h19
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp2
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp32
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h2
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_run.cpp2
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_yard.cpp8
-rw-r--r--ydb/core/blobstorage/ut_group/main.cpp2
-rw-r--r--ydb/core/blobstorage/ut_pdiskfit/lib/basic_test.h3
-rw-r--r--ydb/core/blobstorage/ut_vdisk/lib/prepare.cpp2
-rw-r--r--ydb/core/blobstorage/vdisk/skeleton/blobstorage_monactors.h1
-rw-r--r--ydb/core/driver_lib/base_utils/format_info.cpp2
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_disk.cpp6
21 files changed, 120 insertions, 73 deletions
diff --git a/ydb/core/blobstorage/backpressure/queue_backpressure_client_ut.cpp b/ydb/core/blobstorage/backpressure/queue_backpressure_client_ut.cpp
index 164d2bf172..f207e730a0 100644
--- a/ydb/core/blobstorage/backpressure/queue_backpressure_client_ut.cpp
+++ b/ydb/core/blobstorage/backpressure/queue_backpressure_client_ut.cpp
@@ -161,8 +161,8 @@ public:
DiskSize = SectorMap->DeviceSize;
PDiskGuid = 1;
PDiskKey = 1;
- MainKey = {1};
- FormatPDisk(Path, DiskSize, 4096, ChunkSize, PDiskGuid, PDiskKey, PDiskKey, PDiskKey, MainKey.back(), "queue_test",
+ MainKey = NPDisk::TMainKey{ .Keys = { 1 } };
+ FormatPDisk(Path, DiskSize, 4096, ChunkSize, PDiskGuid, PDiskKey, PDiskKey, PDiskKey, MainKey.Keys.back(), "queue_test",
false, false, SectorMap, false);
PDiskId = MakeBlobStoragePDiskID(1, 1);
diff --git a/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp b/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp
index 04fea4b01c..a374e6df87 100644
--- a/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp
+++ b/ydb/core/blobstorage/dsproxy/ut_fat/dsproxy_ut.cpp
@@ -4227,7 +4227,7 @@ public:
pDiskConfig->SectorMap = SectorMapByPath[filePath];
pDiskConfig->EnableSectorEncryption = !pDiskConfig->SectorMap;
- NPDisk::TMainKey mainKeys = { mainKey };
+ NPDisk::TMainKey mainKeys = NPDisk::TMainKey{ .Keys = { mainKey }, .IsInitialized = true };
TActorSetupCmd pDiskSetup(
CreatePDisk(pDiskConfig.Get(), mainKeys, counters),
TMailboxType::Revolving, 0);
diff --git a/ydb/core/blobstorage/incrhuge/ut/incrhuge_basic_ut.cpp b/ydb/core/blobstorage/incrhuge/ut/incrhuge_basic_ut.cpp
index f76bfdb157..083d15f89e 100644
--- a/ydb/core/blobstorage/incrhuge/ut/incrhuge_basic_ut.cpp
+++ b/ydb/core/blobstorage/incrhuge/ut/incrhuge_basic_ut.cpp
@@ -58,8 +58,8 @@ public:
DiskSize = (ui64)ChunkSize * numChunks;
PDiskGuid = Now().GetValue();
PDiskKey = 1;
- MainKey = {1};
- FormatPDisk(Path, DiskSize, 4096, ChunkSize, PDiskGuid, PDiskKey, PDiskKey, PDiskKey, MainKey.back(), "incrhuge",
+ MainKey = NPDisk::TMainKey{ .Keys = { 1 }, .IsInitialized = true };
+ FormatPDisk(Path, DiskSize, 4096, ChunkSize, PDiskGuid, PDiskKey, PDiskKey, PDiskKey, MainKey.Keys.back(), "incrhuge",
false, false, nullptr, false);
}
diff --git a/ydb/core/blobstorage/nodewarden/distconf_persistent_storage.cpp b/ydb/core/blobstorage/nodewarden/distconf_persistent_storage.cpp
index ed7ff96152..35699774c0 100644
--- a/ydb/core/blobstorage/nodewarden/distconf_persistent_storage.cpp
+++ b/ydb/core/blobstorage/nodewarden/distconf_persistent_storage.cpp
@@ -7,7 +7,7 @@ namespace NKikimr::NStorage {
auto ev = std::make_unique<TEvPrivate::TEvStorageConfigLoaded>();
for (const TString& path : drives) {
TRcBuf metadata;
- switch (ReadPDiskMetadata(path, cfg->CreatePDiskKey(), metadata)) {
+ switch (ReadPDiskMetadata(path, cfg->PDiskKey, metadata)) {
case NPDisk::EPDiskMetadataOutcome::OK:
if (NKikimrBlobStorage::TPDiskMetadataRecord m; m.ParseFromString(metadata.ExtractUnderlyingContainerOrCopy<TString>())) {
auto& [p, config] = ev->MetadataPerPath.emplace_back();
@@ -32,7 +32,7 @@ namespace NKikimr::NStorage {
TString data;
const bool success = record.SerializeToString(&data);
Y_ABORT_UNLESS(success);
- switch (WritePDiskMetadata(path, cfg->CreatePDiskKey(), TRcBuf(std::move(data)))) {
+ switch (WritePDiskMetadata(path, cfg->PDiskKey, TRcBuf(std::move(data)))) {
case NPDisk::EPDiskMetadataOutcome::OK:
ev->StatusPerPath.emplace_back(path, true);
break;
@@ -272,7 +272,7 @@ namespace NKikimr {
}
if (it && it->GetPDiskGuid() == info.DiskGuid && it->GetTimestamp() == info.Timestamp.GetValue() &&
- std::find(key.begin(), key.end(), it->GetKey()) != key.end()) {
+ std::find(key.Keys.begin(), key.Keys.end(), it->GetKey()) != key.Keys.end()) {
TString s;
const bool success = it->GetMeta().SerializeToString(&s);
Y_ABORT_UNLESS(success);
@@ -317,7 +317,7 @@ namespace NKikimr {
it->SetPDiskGuid(info.DiskGuid);
it->SetTimestamp(info.Timestamp.GetValue());
- it->SetKey(key.back());
+ it->SetKey(key.Keys.back());
bool success = it->MutableMeta()->ParseFromString(metadata.ExtractUnderlyingContainerOrCopy<TString>());
Y_ABORT_UNLESS(success);
diff --git a/ydb/core/blobstorage/nodewarden/node_warden.h b/ydb/core/blobstorage/nodewarden/node_warden.h
index 72b4d8c79c..e0e15a0263 100644
--- a/ydb/core/blobstorage/nodewarden/node_warden.h
+++ b/ydb/core/blobstorage/nodewarden/node_warden.h
@@ -29,7 +29,7 @@ namespace NKikimr {
std::unique_ptr<ICacheAccessor> CacheAccessor;
TEncryptionKey TenantKey;
TEncryptionKey StaticKey;
- TVector<TEncryptionKey> PDiskKey;
+ NPDisk::TMainKey PDiskKey;
bool CachePDisks = false;
bool CacheVDisks = false;
bool EnableVDiskCooldownTimeout = false;
@@ -43,21 +43,6 @@ namespace NKikimr {
, AllDriveModels(new NPDisk::TDriveModelDb)
{}
- NPDisk::TMainKey CreatePDiskKey() const {
- if (PDiskKey.size() > 0) {
- NPDisk::TMainKey mainKey;
- for (ui32 i = 0; i < PDiskKey.size(); ++i) {
- const ui8 *key;
- ui32 keySize;
- PDiskKey[i].Key.GetKeyBytes(&key, &keySize);
- mainKey.push_back(*(ui64*)key);
- }
- return mainKey;
- } else {
- return { NPDisk::YdbDefaultPDiskSequence };
- }
- }
-
bool IsCacheEnabled() const {
return static_cast<bool>(CacheAccessor);
}
@@ -67,7 +52,7 @@ namespace NKikimr {
bool ObtainTenantKey(TEncryptionKey *key, const NKikimrProto::TKeyConfig& keyConfig);
bool ObtainStaticKey(TEncryptionKey *key);
- bool ObtainPDiskKey(TVector<TEncryptionKey> *key, const NKikimrProto::TKeyConfig& keyConfig);
+ bool ObtainPDiskKey(NPDisk::TMainKey *key, const NKikimrProto::TKeyConfig& keyConfig);
std::unique_ptr<ICacheAccessor> CreateFileCacheAccessor(const TString& templ, const std::unordered_map<char, TString>& vars);
diff --git a/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp b/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp
index 12bf4781fb..285cee2ad6 100644
--- a/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp
+++ b/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp
@@ -619,37 +619,55 @@ bool NKikimr::ObtainTenantKey(TEncryptionKey *key, const NKikimrProto::TKeyConfi
}
}
-bool NKikimr::ObtainPDiskKey(TVector<TEncryptionKey> *keys, const NKikimrProto::TKeyConfig& keyConfig) {
+bool NKikimr::ObtainPDiskKey(NPDisk::TMainKey *mainKey, const NKikimrProto::TKeyConfig& keyConfig) {
+ Y_ABORT_UNLESS(mainKey);
+ *mainKey = NPDisk::TMainKey{};
+
ui32 keysSize = keyConfig.KeysSize();
if (!keysSize) {
Cerr << "No Keys in PDiskKeyConfig! Encrypted pdisks will not start" << Endl;
+ mainKey->ErrorReason = "Empty PDiskKeyConfig";
+ mainKey->Keys = { NPDisk::YdbDefaultPDiskSequence };
+ mainKey->IsInitialized = true;
return false;
}
- keys->resize(keysSize);
+ TVector<TEncryptionKey> keys(keysSize);
for (ui32 i = 0; i < keysSize; ++i) {
auto &record = keyConfig.GetKeys(i);
if (record.GetId() == "0" && record.GetContainerPath() == "") {
// use default pdisk key
- (*keys)[i].Id = "0";
- (*keys)[i].Version = record.GetVersion();
+ keys[i].Id = "0";
+ keys[i].Version = record.GetVersion();
ui8 *keyBytes = 0;
ui32 keySize = 0;
- (*keys)[i].Key.MutableKeyBytes(&keyBytes, &keySize);
+ keys[i].Key.MutableKeyBytes(&keyBytes, &keySize);
ui64* p = (ui64*)keyBytes;
p[0] = NPDisk::YdbDefaultPDiskSequence;
} else {
- if (!ObtainKey(&(*keys)[i], record)) {
+ if (!ObtainKey(&keys[i], record)) {
+ mainKey->Keys = {};
+ mainKey->ErrorReason = "Cannot obtain key, ContainerPath# " + record.GetContainerPath();
+ mainKey->IsInitialized = true;
return false;
}
}
}
- std::sort(keys->begin(), keys->end(), [&](const TEncryptionKey& l, const TEncryptionKey& r) {
+ std::sort(keys.begin(), keys.end(), [&](const TEncryptionKey& l, const TEncryptionKey& r) {
return l.Version < r.Version;
});
+
+ for (ui32 i = 0; i < keys.size(); ++i) {
+ const ui8 *key;
+ ui32 keySize;
+ keys[i].Key.GetKeyBytes(&key, &keySize);
+ Y_DEBUG_ABORT_UNLESS(keySize == sizeof(ui64));
+ mainKey->Keys.push_back(*(ui64*)key);
+ }
+ mainKey->IsInitialized = true;
return true;
}
diff --git a/ydb/core/blobstorage/nodewarden/node_warden_pdisk.cpp b/ydb/core/blobstorage/nodewarden/node_warden_pdisk.cpp
index 1de430a4fc..067305154d 100644
--- a/ydb/core/blobstorage/nodewarden/node_warden_pdisk.cpp
+++ b/ydb/core/blobstorage/nodewarden/node_warden_pdisk.cpp
@@ -111,13 +111,13 @@ namespace NKikimr::NStorage {
pdiskConfig->EnableSectorEncryption = !pdiskConfig->SectorMap;
}
- NPDisk::TMainKey pdiskKey = Cfg->CreatePDiskKey();
+ const NPDisk::TMainKey& pdiskKey = Cfg->PDiskKey;
TString keyPrintSalt = "@N2#_lW19)2-31!iifI@n1178349617";
- pdiskConfig->HashedMainKey.resize(pdiskKey.size());
- for (ui32 i = 0; i < pdiskKey.size(); ++i) {
+ pdiskConfig->HashedMainKey.resize(pdiskKey.Keys.size());
+ for (ui32 i = 0; i < pdiskKey.Keys.size(); ++i) {
THashCalculator hasher;
hasher.Hash(keyPrintSalt.Detach(), keyPrintSalt.Size());
- hasher.Hash(&pdiskKey[i], sizeof(pdiskKey[i]));
+ hasher.Hash(&pdiskKey.Keys[i], sizeof(pdiskKey.Keys[i]));
pdiskConfig->HashedMainKey[i] = TStringBuilder() << Hex(hasher.GetHashResult(), HF_ADDX);
}
@@ -170,8 +170,8 @@ namespace NKikimr::NStorage {
const TString& path = pdisk.GetPath();
const ui64 pdiskGuid = pdisk.GetPDiskGuid();
const ui64 pdiskCategory = pdisk.GetPDiskCategory();
- Cfg->PDiskServiceFactory->Create(ActorContext(), pdiskID, pdiskConfig,
- Cfg->CreatePDiskKey(), AppData()->SystemPoolId, LocalNodeId);
+ Cfg->PDiskKey.Initialize();
+ Cfg->PDiskServiceFactory->Create(ActorContext(), pdiskID, pdiskConfig, Cfg->PDiskKey, AppData()->SystemPoolId, LocalNodeId);
Send(WhiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateUpdate(pdiskID, path, pdiskGuid, pdiskCategory));
Send(WhiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvSystemStateAddRole("Storage"));
}
@@ -208,7 +208,8 @@ namespace NKikimr::NStorage {
}
const TActorId actorId = MakeBlobStoragePDiskID(LocalNodeId, pdiskId);
- Send(actorId, new TEvBlobStorage::TEvRestartPDisk(pdiskId, Cfg->CreatePDiskKey(), pdiskConfig));
+ Cfg->PDiskKey.Initialize();
+ Send(actorId, new TEvBlobStorage::TEvRestartPDisk(pdiskId, Cfg->PDiskKey, pdiskConfig));
STLOG(PRI_NOTICE, BS_NODE, NW69, "RestartLocalPDisk is started", (PDiskId, pdiskId));
}
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp
index 2fef1b449c..852e46ff55 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp
@@ -203,11 +203,11 @@ public:
->GetSubgroup("pdisk", Sprintf("%09" PRIu32, (ui32)cfg->PDiskId))
->GetSubgroup("media", to_lower(cfg->PDiskCategory.TypeStrShort())))
{
- Y_ABORT_UNLESS(!MainKey.empty());
+ Y_ABORT_UNLESS(MainKey.IsInitialized);
}
~TPDiskActor() {
- SecureWipeBuffer((ui8*)MainKey.data(), sizeof(NPDisk::TKey) * MainKey.size());
+ SecureWipeBuffer((ui8*)MainKey.Keys.data(), sizeof(NPDisk::TKey) * MainKey.Keys.size());
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -244,7 +244,13 @@ public:
bool isOk = PDisk->Initialize(TlsActivationContext->ActorSystem(), SelfId());
- if (!isOk) {
+ if (!MainKey) {
+ TStringStream str;
+ str << "PDiskId# " << (ui32)PDisk->PDiskId
+ << " MainKey is invalid, ErrorReason# " << MainKey.ErrorReason;
+ InitError(str.Str());
+ LOG_CRIT_S(*TlsActivationContext, NKikimrServices::BS_PDISK, str.Str());
+ } else if (!isOk) {
TStringStream str;
str << "PDiskId# " << (ui32)PDisk->PDiskId
<< " bootstrapped to the StateError, reason# " << PDisk->ErrorStr
@@ -364,12 +370,12 @@ public:
try {
try {
FormatPDisk(cfg->GetDevicePath(), 0, cfg->SectorSize, cfg->ChunkSize,
- cfg->PDiskGuid, chunkKey, logKey, sysLogKey, actor->MainKey.back(), TString(), false,
+ cfg->PDiskGuid, chunkKey, logKey, sysLogKey, actor->MainKey.Keys.back(), TString(), false,
cfg->FeatureFlags.GetTrimEntireDeviceOnStartup(), cfg->SectorMap,
cfg->FeatureFlags.GetEnableSmallDiskOptimization());
} catch (NPDisk::TPDiskFormatBigChunkException) {
FormatPDisk(cfg->GetDevicePath(), 0, cfg->SectorSize, NPDisk::SmallDiskMaximumChunkSize,
- cfg->PDiskGuid, chunkKey, logKey, sysLogKey, actor->MainKey.back(), TString(), false,
+ cfg->PDiskGuid, chunkKey, logKey, sysLogKey, actor->MainKey.Keys.back(), TString(), false,
cfg->FeatureFlags.GetTrimEntireDeviceOnStartup(), cfg->SectorMap,
cfg->FeatureFlags.GetEnableSmallDiskOptimization());
}
@@ -384,7 +390,7 @@ public:
FormattingThread->Start();
} else {
- SecureWipeBuffer((ui8*)MainKey.data(), sizeof(NPDisk::TKey) * MainKey.size());
+ SecureWipeBuffer((ui8*)MainKey.Keys.data(), sizeof(NPDisk::TKey) * MainKey.Keys.size());
*PDisk->Mon.PDiskState = NKikimrBlobStorage::TPDiskState::InitialFormatReadError;
*PDisk->Mon.PDiskBriefState = TPDiskMon::TPDisk::Error;
*PDisk->Mon.PDiskDetailedState = TPDiskMon::TPDisk::ErrorPDiskCannotBeInitialised;
@@ -486,12 +492,12 @@ public:
} else {
if (res.IsReencryptionRequired) {
// Format reencryption required
- ReencryptDiskFormat(PDisk->Format, MainKey.back());
+ ReencryptDiskFormat(PDisk->Format, MainKey.Keys.back());
// We still need main key after restart
// SecureWipeBuffer((ui8*)MainKey.data(), sizeof(NPDisk::TKey) * MainKey.size());
} else {
// Format is read OK
- SecureWipeBuffer((ui8*)MainKey.data(), sizeof(NPDisk::TKey) * MainKey.size());
+ SecureWipeBuffer((ui8*)MainKey.Keys.data(), sizeof(NPDisk::TKey) * MainKey.Keys.size());
LOG_NOTICE_S(*TlsActivationContext, NKikimrServices::BS_PDISK, "PDiskId# " << PDisk->PDiskId
<< " Successfully read format record# " << PDisk->Format.ToString());
TString info;
@@ -969,7 +975,7 @@ public:
}
MainKey = ev->Get()->MainKey;
- SecureWipeBuffer((ui8*)ev->Get()->MainKey.data(), sizeof(NPDisk::TKey) * ev->Get()->MainKey.size());
+ SecureWipeBuffer((ui8*)ev->Get()->MainKey.Keys.data(), sizeof(NPDisk::TKey) * ev->Get()->MainKey.Keys.size());
LOG_NOTICE_S(*TlsActivationContext, NKikimrServices::BS_PDISK, "PDiskId# " << PDisk->PDiskId
<< " Going to restart PDisk since recieved TEvRestartPDisk");
PDisk->Stop();
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
index 929e61c840..7ab878a946 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
@@ -1,6 +1,7 @@
#pragma once
#include "defs.h"
#include <ydb/core/base/blobstorage.h>
+#include <ydb/core/blobstorage/crypto/default.h>
#include <ydb/core/protos/blobstorage.pb.h>
#include "blobstorage_pdisk_signature.h"
@@ -46,7 +47,23 @@ namespace NKikimr {
typedef ui32 TStatusFlags;
typedef ui64 TKey;
typedef ui64 THash;
- typedef TStackVec<TKey, 2> TMainKey;
+
+ struct TMainKey {
+ TStackVec<TKey, 2> Keys;
+ TString ErrorReason = "";
+ bool IsInitialized = false;
+
+ operator bool() const {
+ return !Keys.empty();
+ }
+
+ void Initialize() {
+ if (!IsInitialized && Keys.empty()) {
+ Keys = { NPDisk::YdbDefaultPDiskSequence };
+ }
+ IsInitialized = true;
+ }
+ };
struct TOwnerToken {
TOwner Owner = 0;
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
index c824428185..3e6b402880 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
@@ -120,11 +120,11 @@ TCheckDiskFormatResult TPDisk::ReadChunk0Format(ui8* formatSectors, const NPDisk
TGuard<TMutex> guard(StateMutex);
Format.SectorSize = FormatSectorSize;
- ui32 mainKeySize = mainKey.size();
+ ui32 mainKeySize = mainKey.Keys.size();
for (ui32 k = 0; k < mainKeySize; ++k) {
TPDiskStreamCypher cypher(true); // Format record is always encrypted
- cypher.SetKey(mainKey[k]);
+ cypher.SetKey(mainKey.Keys[k]);
ui32 lastGoodIdx = (ui32)-1;
bool isBad[ReplicationFactor];
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp
index 7a41067785..f4eb255fb8 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp
@@ -154,7 +154,7 @@ bool ReadPDiskFormatInfo(const TString &path, const NPDisk::TMainKey &mainKey, T
blockDevice->PreadSync(formatRaw->Data(), formatSectorsSize, 0,
NPDisk::TReqId(NPDisk::TReqId::ReadFormatInfo, 0), {});
- for (auto& key : mainKey) {
+ for (auto& key : mainKey.Keys) {
NPDisk::TPDiskStreamCypher cypher(true); // Format record is always encrypted
cypher.SetKey(key);
bool isOk = false;
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
index 3730dc8cd4..b8e13e261b 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
@@ -737,7 +737,7 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
NKikimrProto::OK);
round = evInitRes->PDiskParams->OwnerRound + 1;
- testCtx.MainKey[0] += 123;
+ testCtx.MainKey.Keys[0] += 123;
testCtx.UpdateConfigRecreatePDisk(testCtx.GetPDiskConfig());
evInitRes = testCtx.TestResponse<NPDisk::TEvYardInitResult>(
@@ -775,27 +775,27 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
readChunk();
- testCtx.MainKey.push_back(0xFull);
+ testCtx.MainKey.Keys.push_back(0xFull);
testCtx.RestartPDiskSync();
mock.InitFull();
readChunk();
- testCtx.MainKey = { 0xFull };
+ testCtx.MainKey.Keys = { 0xFull };
testCtx.RestartPDiskSync();
mock.InitFull();
readChunk();
- testCtx.MainKey = { 0xFull, 0xA };
+ testCtx.MainKey.Keys = { 0xFull, 0xA };
testCtx.RestartPDiskSync();
mock.InitFull();
readChunk();
- testCtx.MainKey = { 0xFull, 0xA, 0xB, 0xC };
+ testCtx.MainKey.Keys = { 0xFull, 0xA, 0xB, 0xC };
testCtx.RestartPDiskSync();
mock.InitFull();
readChunk();
- testCtx.MainKey = { 0xC };
+ testCtx.MainKey.Keys = { 0xC };
testCtx.RestartPDiskSync();
mock.InitFull();
readChunk();
@@ -826,7 +826,7 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
chunk, 0, data.size(), 0, nullptr),
NKikimrProto::OK);
- testCtx.MainKey = { 0xABCDEF };
+ testCtx.MainKey.Keys = { 0xABCDEF };
testCtx.TestResponse<NPDisk::TEvYardControlResult>(
new NPDisk::TEvYardControl(NPDisk::TEvYardControl::PDiskStop, nullptr),
NKikimrProto::OK);
@@ -836,6 +836,24 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
NKikimrProto::CORRUPTED);
}
+ Y_UNIT_TEST(RecreateWithInvalidPDiskKey) {
+ TActorTestContext testCtx({ false });
+ int round = 2;
+ const TVDiskID vDiskID(0, 1, 0, 0, 0);
+
+ auto evInitRes = testCtx.TestResponse<NPDisk::TEvYardInitResult>(
+ new NPDisk::TEvYardInit(round, vDiskID, testCtx.TestCtx.PDiskGuid),
+ NKikimrProto::OK);
+ round = evInitRes->PDiskParams->OwnerRound + 1;
+
+ testCtx.MainKey.Keys = {};
+ testCtx.UpdateConfigRecreatePDisk(testCtx.GetPDiskConfig());
+
+ evInitRes = testCtx.TestResponse<NPDisk::TEvYardInitResult>(
+ new NPDisk::TEvYardInit(round, vDiskID, testCtx.TestCtx.PDiskGuid),
+ NKikimrProto::CORRUPTED);
+ }
+
void SmallDisk(ui64 diskSizeGb) {
ui64 diskSize = diskSizeGb << 30;
TActorTestContext testCtx({
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h
index e8ac720ed3..f1b5d2b0c0 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h
@@ -36,7 +36,7 @@ private:
public:
TActorId Sender;
- NPDisk::TMainKey MainKey = { NPDisk::YdbDefaultPDiskSequence };
+ NPDisk::TMainKey MainKey{ .Keys = { NPDisk::YdbDefaultPDiskSequence }, .IsInitialized = true };
TTestContext TestCtx;
TSettings Settings;
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_run.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_run.cpp
index 8eb13d2549..20ed9d50be 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_run.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_run.cpp
@@ -88,7 +88,7 @@ void Run(TVector<IActor*> tests, TTestRunConfig runCfg) {
pDiskConfig->UseT1ha0HashInFooter = runCfg.UseT1ha0Hasher;
pDiskConfig->FeatureFlags.SetEnableSmallDiskOptimization(false);
- NPDisk::TMainKey mainKey = {NPDisk::YdbDefaultPDiskSequence};
+ NPDisk::TMainKey mainKey{ .Keys = {NPDisk::YdbDefaultPDiskSequence}, .IsInitialized = true };
TActorSetupCmd pDiskSetup(CreatePDisk(pDiskConfig.Get(),
mainKey, mainCounters), TMailboxType::Revolving, 0);
setup1->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(pDiskId, std::move(pDiskSetup)));
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_yard.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_yard.cpp
index 1f98f7a952..a408a9540c 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_yard.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_yard.cpp
@@ -534,7 +534,7 @@ YARD_UNIT_TEST(TestDamagedFirstRecordToKeep) {
MakeDirIfNotExist(databaseDirectory.c_str());
}
TPDiskInfo info;
- const NPDisk::TMainKey mainKey = {NPDisk::YdbDefaultPDiskSequence};
+ const NPDisk::TMainKey mainKey{ .Keys = { NPDisk::YdbDefaultPDiskSequence } };
bool isOk = ReadPDiskFormatInfo(dataPath, mainKey, info, false, tc.SectorMap);
UNIT_ASSERT_VALUES_EQUAL(isOk, true);
@@ -881,7 +881,7 @@ YARD_UNIT_TEST(TestFormatInfo) {
FormatPDiskForTest(dataPath, tc.PDiskGuid, chunkSize, 1 << 30, false, tc.SectorMap);
TPDiskInfo info;
- const NPDisk::TMainKey mainKey = {NPDisk::YdbDefaultPDiskSequence};
+ const NPDisk::TMainKey mainKey{.Keys = { NPDisk::YdbDefaultPDiskSequence } };
bool isOk = ReadPDiskFormatInfo(dataPath, mainKey, info, false, tc.SectorMap);
UNIT_ASSERT_VALUES_EQUAL(isOk, true);
UNIT_ASSERT_VALUES_EQUAL(info.TextMessage, "Info");
@@ -916,7 +916,7 @@ YARD_UNIT_TEST(TestRestartAtNonceJump) {
MakeDirIfNotExist(databaseDirectory.c_str());
}
TPDiskInfo info;
- const NPDisk::TMainKey mainKey = {NPDisk::YdbDefaultPDiskSequence};
+ const NPDisk::TMainKey mainKey{ .Keys = { NPDisk::YdbDefaultPDiskSequence } };
bool isOk = ReadPDiskFormatInfo(dataPath, mainKey, info, false, tc.SectorMap);
UNIT_ASSERT_VALUES_EQUAL(isOk, true);
// Destroy data in chunks starting at# SystemChunkCount + 1
@@ -946,7 +946,7 @@ YARD_UNIT_TEST(TestRestartAtChunkEnd) {
MakeDirIfNotExist(databaseDirectory.c_str());
}
TPDiskInfo info;
- const NPDisk::TMainKey mainKey = {NPDisk::YdbDefaultPDiskSequence};
+ const NPDisk::TMainKey mainKey{ .Keys = { NPDisk::YdbDefaultPDiskSequence } };
bool isOk = ReadPDiskFormatInfo(dataPath, mainKey, info, false, tc.SectorMap);
UNIT_ASSERT_VALUES_EQUAL(isOk, true);
// Destroy data in chunks starting at# SystemChunkCount + 1
diff --git a/ydb/core/blobstorage/ut_group/main.cpp b/ydb/core/blobstorage/ut_group/main.cpp
index 18cdc075bb..45b82919b8 100644
--- a/ydb/core/blobstorage/ut_group/main.cpp
+++ b/ydb/core/blobstorage/ut_group/main.cpp
@@ -161,7 +161,7 @@ public:
};
TIntrusivePtr<::NMonitoring::TDynamicCounters> Counters;
- const NPDisk::TMainKey MainKey = { NPDisk::YdbDefaultPDiskSequence };
+ const NPDisk::TMainKey MainKey{ .Keys = { NPDisk::YdbDefaultPDiskSequence } };
const ui32 NodeCount;
const ui32 GroupId = 0;
std::vector<TDiskRecord> Disks;
diff --git a/ydb/core/blobstorage/ut_pdiskfit/lib/basic_test.h b/ydb/core/blobstorage/ut_pdiskfit/lib/basic_test.h
index bc8a19775d..b4ea635aa8 100644
--- a/ydb/core/blobstorage/ut_pdiskfit/lib/basic_test.h
+++ b/ydb/core/blobstorage/ut_pdiskfit/lib/basic_test.h
@@ -85,7 +85,8 @@ public:
Y_ABORT_UNLESS(ctx.ExecutorThread.ActorSystem);
Y_ABORT_UNLESS(PDiskConfig);
Y_ABORT_UNLESS(AppData(ctx));
- std::unique_ptr<IActor> pdiskActor(CreatePDisk(PDiskConfig, {1}, Counters->GetSubgroup("subsystem", "pdisk")));
+ std::unique_ptr<IActor> pdiskActor(CreatePDisk(PDiskConfig, NPDisk::TMainKey{ .Keys = { 1 }, .IsInitialized = true },
+ Counters->GetSubgroup("subsystem", "pdisk")));
const TActorId actorId = ctx.ExecutorThread.ActorSystem->Register(pdiskActor.release(), TMailboxType::Simple,
AppData(ctx)->SystemPoolId);
PDiskServiceId = MakeBlobStoragePDiskID(ctx.ExecutorThread.ActorSystem->NodeId, PDiskConfig->PDiskId);
diff --git a/ydb/core/blobstorage/ut_vdisk/lib/prepare.cpp b/ydb/core/blobstorage/ut_vdisk/lib/prepare.cpp
index 2daaa9303d..ba36004d2e 100644
--- a/ydb/core/blobstorage/ut_vdisk/lib/prepare.cpp
+++ b/ydb/core/blobstorage/ut_vdisk/lib/prepare.cpp
@@ -161,7 +161,7 @@ void TAllPDisks::ActorSetupCmd(NActors::TActorSystemSetup *setup, ui32 node,
TPDiskCategory(deviceType, 0).GetRaw()));
pDiskConfig->GetDriveDataSwitch = NKikimrBlobStorage::TPDiskConfig::DoNotTouch;
pDiskConfig->WriteCacheSwitch = NKikimrBlobStorage::TPDiskConfig::DoNotTouch;
- const NPDisk::TMainKey mainKey = {NPDisk::YdbDefaultPDiskSequence};
+ const NPDisk::TMainKey mainKey{ .Keys = { NPDisk::YdbDefaultPDiskSequence }, .IsInitialized = true };
TActorSetupCmd pDiskSetup(CreatePDisk(pDiskConfig.Get(),
mainKey, counters), TMailboxType::Revolving, 0);
setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>(inst.PDiskActorID, std::move(pDiskSetup)));
diff --git a/ydb/core/blobstorage/vdisk/skeleton/blobstorage_monactors.h b/ydb/core/blobstorage/vdisk/skeleton/blobstorage_monactors.h
index b646db66bd..1ed0d4a36f 100644
--- a/ydb/core/blobstorage/vdisk/skeleton/blobstorage_monactors.h
+++ b/ydb/core/blobstorage/vdisk/skeleton/blobstorage_monactors.h
@@ -1,6 +1,7 @@
#pragma once
#include "defs.h"
+#include <ydb/core/blobstorage/vdisk/common/vdisk_mongroups.h>
#include <ydb/core/blobstorage/vdisk/common/vdisk_events.h>
#include <ydb/core/blobstorage/groupinfo/blobstorage_groupinfo.h>
#include <ydb/core/protos/node_whiteboard.pb.h>
diff --git a/ydb/core/driver_lib/base_utils/format_info.cpp b/ydb/core/driver_lib/base_utils/format_info.cpp
index 03498da375..84daa51d6a 100644
--- a/ydb/core/driver_lib/base_utils/format_info.cpp
+++ b/ydb/core/driver_lib/base_utils/format_info.cpp
@@ -88,7 +88,7 @@ void TCmdFormatInfoConfig::Parse(int argc, char **argv) {
MainKey = {};
for (auto& key : MainKeyTmp) {
- MainKey.push_back(key);
+ MainKey.Keys.push_back(key);
}
}
diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_disk.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_disk.cpp
index d7028ee5f4..eac2cd9893 100644
--- a/ydb/core/driver_lib/cli_utils/cli_cmds_disk.cpp
+++ b/ydb/core/driver_lib/cli_utils/cli_cmds_disk.cpp
@@ -47,7 +47,7 @@ public:
MainKey = {};
for (auto& key : MainKeyTmp) {
- MainKey.push_back(key);
+ MainKey.Keys.push_back(key);
}
}
@@ -174,12 +174,12 @@ public:
ythrow yexception() << "missing main-key param";
for (auto& key : MainKeyTmp) {
- MainKey.push_back(key);
+ MainKey.Keys.push_back(key);
}
}
virtual int Run(TConfig&) override {
- FormatPDisk(Path, DiskSize, SectorSize, ChunkSize, Guid, ChunkKey, LogKey, SysLogKey, MainKey.back(), TextMessage,
+ FormatPDisk(Path, DiskSize, SectorSize, ChunkSize, Guid, ChunkKey, LogKey, SysLogKey, MainKey.Keys.back(), TextMessage,
IsErasureEncode, false, nullptr, true);
return 0;
}