diff options
author | alexvru <alexvru@ydb.tech> | 2022-10-12 14:12:32 +0300 |
---|---|---|
committer | alexvru <alexvru@ydb.tech> | 2022-10-12 14:12:32 +0300 |
commit | 1f3346a0caa25bf81ed237dfa9b74f21a27e53a9 (patch) | |
tree | dd6ef5dceaba30127da4f04067b9e2452164a837 | |
parent | c75a1c7634195bc4a4db9813b9cfdb8e9ec771e2 (diff) | |
download | ydb-1f3346a0caa25bf81ed237dfa9b74f21a27e53a9.tar.gz |
Drop donors from Whiteboard when they are not used anymore
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_impl.cpp | 8 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_impl.h | 7 | ||||
-rw-r--r-- | ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp | 15 | ||||
-rw-r--r-- | ydb/core/node_whiteboard/node_whiteboard.h | 22 | ||||
-rw-r--r-- | ydb/core/tablet/node_whiteboard.cpp | 33 |
5 files changed, 82 insertions, 3 deletions
diff --git a/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp b/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp index 0cabbf3f19a..7e66d81f4c0 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_impl.cpp @@ -405,8 +405,14 @@ void TNodeWarden::Handle(TEvStatusUpdate::TPtr ev) { auto *msg = ev->Get(); const TVSlotId vslotId(msg->NodeId, msg->PDiskId, msg->VSlotId); if (const auto it = LocalVDisks.find(vslotId); it != LocalVDisks.end() && it->second.Status != msg->Status) { - it->second.Status = msg->Status; + auto& vdisk = it->second; + vdisk.Status = msg->Status; SendDiskMetrics(false); + + if (msg->Status == NKikimrBlobStorage::EVDiskStatus::READY && vdisk.WhiteboardVDiskId) { + Send(WhiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvVDiskDropDonors(*vdisk.WhiteboardVDiskId, + vdisk.WhiteboardInstanceGuid, NNodeWhiteboard::TEvWhiteboard::TEvVDiskDropDonors::TDropAllDonors())); + } } } diff --git a/ydb/core/blobstorage/nodewarden/node_warden_impl.h b/ydb/core/blobstorage/nodewarden/node_warden_impl.h index 2f6322a8c23..fed2d406c36 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_impl.h +++ b/ydb/core/blobstorage/nodewarden/node_warden_impl.h @@ -224,6 +224,12 @@ namespace NKikimr::NStorage { return MakeBlobStorageVDiskID(NodeId, PDiskId, VDiskSlotId); } + void Serialize(NKikimrBlobStorage::TVSlotId *proto) const { + proto->SetNodeId(NodeId); + proto->SetPDiskId(PDiskId); + proto->SetVSlotId(VDiskSlotId); + } + auto AsTuple() const { return std::make_tuple(NodeId, PDiskId, VDiskSlotId); } friend bool operator <(const TVSlotId& x, const TVSlotId& y) { return x.AsTuple() < y.AsTuple(); } friend bool operator <=(const TVSlotId& x, const TVSlotId& y) { return x.AsTuple() <= y.AsTuple(); } @@ -253,6 +259,7 @@ namespace NKikimr::NStorage { // Last VDiskId reported to Node Whiteboard. std::optional<TVDiskID> WhiteboardVDiskId; + ui64 WhiteboardInstanceGuid; bool SlayInFlight = false; diff --git a/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp b/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp index 8e6bc269865..22a59222f84 100644 --- a/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp +++ b/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp @@ -175,6 +175,7 @@ namespace NKikimr::NStorage { Send(WhiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateUpdate(vdiskId, groupInfo->GetStoragePoolName(), vslotId.PDiskId, vslotId.VDiskSlotId, pdiskGuid, kind, donorMode, whiteboardInstanceGuid, std::move(donors))); vdisk.WhiteboardVDiskId.emplace(vdiskId); + vdisk.WhiteboardInstanceGuid = whiteboardInstanceGuid; // create an actor auto *as = TActivationContext::ActorSystem(); @@ -281,9 +282,19 @@ namespace NKikimr::NStorage { void TNodeWarden::Handle(TEvBlobStorage::TEvDropDonor::TPtr ev) { auto *msg = ev->Get(); - STLOG(PRI_INFO, BS_NODE, NW34, "TEvDropDonor", (VSlotId, TVSlotId(msg->NodeId, msg->PDiskId, msg->VSlotId)), - (VDiskId, msg->VDiskId)); + const TVSlotId vslotId(msg->NodeId, msg->PDiskId, msg->VSlotId); + STLOG(PRI_INFO, BS_NODE, NW34, "TEvDropDonor", (VSlotId, vslotId), (VDiskId, msg->VDiskId)); SendDropDonorQuery(msg->NodeId, msg->PDiskId, msg->VSlotId, msg->VDiskId); + + if (const auto it = LocalVDisks.find(vslotId); it != LocalVDisks.end()) { + const auto& vdisk = it->second; + if (vdisk.WhiteboardVDiskId) { + NKikimrBlobStorage::TVSlotId id; + vslotId.Serialize(&id); + Send(WhiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvVDiskDropDonors(*vdisk.WhiteboardVDiskId, + vdisk.WhiteboardInstanceGuid, {id})); + } + } } void TNodeWarden::UpdateGroupInfoForDisk(TVDiskRecord& vdisk, const TIntrusivePtr<TBlobStorageGroupInfo>& newInfo) { diff --git a/ydb/core/node_whiteboard/node_whiteboard.h b/ydb/core/node_whiteboard/node_whiteboard.h index 8769068f371..9230290af22 100644 --- a/ydb/core/node_whiteboard/node_whiteboard.h +++ b/ydb/core/node_whiteboard/node_whiteboard.h @@ -57,6 +57,7 @@ struct TEvWhiteboard{ EvSignalBodyResponse, EvPDiskStateDelete, EvVDiskStateGenerationChange, + EvVDiskDropDonors, EvEnd }; @@ -220,6 +221,27 @@ struct TEvWhiteboard{ {} }; + struct TEvVDiskDropDonors : TEventLocal<TEvVDiskDropDonors, EvVDiskDropDonors> { + const TVDiskID VDiskId; + const ui64 InstanceGuid; + const std::vector<NKikimrBlobStorage::TVSlotId> DropDonors; + const bool DropAllDonors = false; + + TEvVDiskDropDonors(TVDiskID vdiskId, ui64 instanceGuid, std::vector<NKikimrBlobStorage::TVSlotId> dropDonors) + : VDiskId(vdiskId) + , InstanceGuid(instanceGuid) + , DropDonors(std::move(dropDonors)) + {} + + struct TDropAllDonors {}; + + TEvVDiskDropDonors(TVDiskID vdiskId, ui64 instanceGuid, TDropAllDonors) + : VDiskId(vdiskId) + , InstanceGuid(instanceGuid) + , DropAllDonors(true) + {} + }; + struct TEvPDiskStateDelete : TEventPB<TEvPDiskStateDelete, NKikimrWhiteboard::TPDiskStateInfo, EvPDiskStateDelete> { TEvPDiskStateDelete() = default; diff --git a/ydb/core/tablet/node_whiteboard.cpp b/ydb/core/tablet/node_whiteboard.cpp index 46be0f95e00..0677480cf3c 100644 --- a/ydb/core/tablet/node_whiteboard.cpp +++ b/ydb/core/tablet/node_whiteboard.cpp @@ -392,6 +392,7 @@ protected: HFunc(TEvWhiteboard::TEvVDiskStateGenerationChange, Handle); HFunc(TEvWhiteboard::TEvVDiskStateDelete, Handle); HFunc(TEvWhiteboard::TEvVDiskStateRequest, Handle); + HFunc(TEvWhiteboard::TEvVDiskDropDonors, Handle); HFunc(TEvWhiteboard::TEvBSGroupStateUpdate, Handle); HFunc(TEvWhiteboard::TEvBSGroupStateDelete, Handle); HFunc(TEvWhiteboard::TEvBSGroupStateRequest, Handle); @@ -455,6 +456,7 @@ protected: } else if (const auto it = VDiskStateInfo.find(key); it != VDiskStateInfo.end() && it->second.GetInstanceGuid() == record.GetInstanceGuid()) { auto& value = it->second; + if (CheckedMerge(value, record) >= 100) { value.SetChangeTime(ctx.Now().MilliSeconds()); UpdateSystemState(ctx); @@ -479,6 +481,37 @@ protected: } } + void Handle(TEvWhiteboard::TEvVDiskDropDonors::TPtr& ev, const TActorContext& ctx) { + auto& msg = *ev->Get(); + if (const auto it = VDiskStateInfo.find(msg.VDiskId); it != VDiskStateInfo.end() && + it->second.GetInstanceGuid() == msg.InstanceGuid) { + auto& value = it->second; + bool change = false; + + if (msg.DropAllDonors) { + change = !value.GetDonors().empty(); + value.ClearDonors(); + } else { + for (const auto& donor : msg.DropDonors) { + auto *donors = value.MutableDonors(); + for (int i = 0; i < donors->size(); ++i) { + auto& x = donors->at(i); + if (x.GetNodeId() == donor.GetNodeId() && x.GetPDiskId() == donor.GetPDiskId() && x.GetVSlotId() == donor.GetVSlotId()) { + donors->DeleteSubrange(i, 1); + change = true; + break; + } + } + } + } + + if (change) { + value.SetChangeTime(ctx.Now().MilliSeconds()); + UpdateSystemState(ctx); + } + } + } + void Handle(TEvWhiteboard::TEvBSGroupStateUpdate::TPtr &ev, const TActorContext &ctx) { auto& bSGroupStateInfo = BSGroupStateInfo[ev->Get()->Record.GetGroupID()]; if (CheckedMerge(bSGroupStateInfo, ev->Get()->Record) >= 100) { |