Skip to content

Commit

Permalink
issue-2404: don't start migration if it is already finished (#2890)
Browse files Browse the repository at this point in the history
* issue-2404: add check is migration finished and tests

* issue-2404: correct issues

* issue-2404: correct issues

* issue-2404: correct issues

* issue-2404: remove lines

* issue-2404: fmt

* issue-2404: correct issue
  • Loading branch information
vladstepanyuk authored Jan 30, 2025
1 parent 86fcf1f commit 4510ec7
Show file tree
Hide file tree
Showing 5 changed files with 579 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -896,7 +896,7 @@ void TDiskRegistryActor::RenderDiskHtmlInfo(
TABLEH() { out << "SeqNo"; }
}

for (const auto& [uuid, seqNo]: info.FinishedMigrations) {
for (const auto& [uuid, seqNo, _]: info.FinishedMigrations) {
TABLER() {
TABLED() { DumpDeviceLink(out, TabletID(), uuid); }
TABLED() { out << seqNo; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ struct TFinishedMigration
{
TString DeviceId;
ui64 SeqNo = 0;
bool IsCanceled = // by default, this value is set to true, because
// we may not start migration if this field is set to
// false
true;
};

////////////////////////////////////////////////////////////////////////////////
Expand Down
45 changes: 31 additions & 14 deletions cloud/blockstore/libs/storage/disk_registry/disk_registry_state.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2975,7 +2975,7 @@ auto TDiskRegistryState::DeallocateSimpleDisk(
}
}

for (const auto& [uuid, seqNo]: disk.FinishedMigrations) {
for (const auto& [uuid, seqNo, _]: disk.FinishedMigrations) {
Y_UNUSED(seqNo);

if (DeviceList.ReleaseDevice(uuid)) {
Expand Down Expand Up @@ -4874,7 +4874,7 @@ NProto::TDiskConfig TDiskRegistryState::BuildDiskConfig(
config.SetStorageMediaKind(diskState.MediaKind);
config.SetMigrationStartTs(diskState.MigrationStartTs.MicroSeconds());

for (const auto& [uuid, seqNo]: diskState.FinishedMigrations) {
for (const auto& [uuid, seqNo, _]: diskState.FinishedMigrations) {
Y_UNUSED(seqNo);
auto& m = *config.AddFinishedMigrations();
m.SetDeviceId(uuid);
Expand Down Expand Up @@ -5023,19 +5023,16 @@ void TDiskRegistryState::ApplyAgentStateChange(
}

if (agent.GetState() == NProto::AGENT_STATE_WARNING) {
if (disk.MigrationSource2Target.contains(deviceId)) {
// migration already started
continue;
}

if (Find(disk.Devices, deviceId) == disk.Devices.end()) {
ReportDiskRegistryWrongMigratedDeviceOwnership(
TStringBuilder() << "ApplyAgentStateChange: device "
<< deviceId << " not found");
continue;
}

AddMigration(disk, diskId, deviceId);
if (MigrationCanBeStarted(disk, deviceId)) {
AddMigration(disk, diskId, deviceId);
}
} else {
if (agent.GetState() == NProto::AGENT_STATE_UNAVAILABLE
&& disk.MasterDiskId)
Expand Down Expand Up @@ -6019,7 +6016,7 @@ void TDiskRegistryState::ApplyDeviceStateChange(
return;
}

if (!disk->MigrationSource2Target.contains(uuid)) {
if (MigrationCanBeStarted(*disk, uuid)) {
AddMigration(*disk, diskId, uuid);
}
}
Expand Down Expand Up @@ -6092,10 +6089,8 @@ void TDiskRegistryState::CancelDeviceMigration(

const ui64 seqNo = AddReallocateRequest(db, diskId);

disk.FinishedMigrations.push_back({
.DeviceId = targetId,
.SeqNo = seqNo
});
disk.FinishedMigrations.push_back(
{.DeviceId = targetId, .SeqNo = seqNo, .IsCanceled = true});

NProto::TDiskHistoryItem historyItem;
historyItem.SetTimestamp(now.MicroSeconds());
Expand Down Expand Up @@ -6164,7 +6159,9 @@ NProto::TError TDiskRegistryState::FinishDeviceMigration(

const ui64 seqNo = AddReallocateRequest(db, diskId);
*devIt = targetId;
disk.FinishedMigrations.push_back({.DeviceId = sourceId, .SeqNo = seqNo});

disk.FinishedMigrations.push_back(
{.DeviceId = sourceId, .SeqNo = seqNo, .IsCanceled = false});

if (disk.MasterDiskId) {
const bool replaced =
Expand Down Expand Up @@ -7561,4 +7558,24 @@ std::optional<ui64> TDiskRegistryState::GetDiskBlockCount(
return diskInfo.GetBlocksCount();
}

// static
bool TDiskRegistryState::MigrationCanBeStarted(
const TDiskState& disk,
const TString& deviceUUID)
{
if (disk.MigrationSource2Target.contains(deviceUUID)) {
// migration already started
return false;
}

for (const auto& m: disk.FinishedMigrations) {
if (m.DeviceId == deviceUUID && !m.IsCanceled) {
// there is a finished migration for the device
return false;
}
}

return true;
}

} // namespace NCloud::NBlockStore::NStorage
Original file line number Diff line number Diff line change
Expand Up @@ -1312,6 +1312,10 @@ class TDiskRegistryState
void CleanupAgentConfig(
TDiskRegistryDatabase& db,
const NProto::TAgentConfig& agent);

static bool MigrationCanBeStarted(
const TDiskState& disk,
const TString& deviceUUID);
};

} // namespace NCloud::NBlockStore::NStorage
Loading

0 comments on commit 4510ec7

Please sign in to comment.