aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralexvru <alexvru@ydb.tech>2022-10-12 14:12:32 +0300
committeralexvru <alexvru@ydb.tech>2022-10-12 14:12:32 +0300
commit1f3346a0caa25bf81ed237dfa9b74f21a27e53a9 (patch)
treedd6ef5dceaba30127da4f04067b9e2452164a837
parentc75a1c7634195bc4a4db9813b9cfdb8e9ec771e2 (diff)
downloadydb-1f3346a0caa25bf81ed237dfa9b74f21a27e53a9.tar.gz
Drop donors from Whiteboard when they are not used anymore
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_impl.cpp8
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_impl.h7
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp15
-rw-r--r--ydb/core/node_whiteboard/node_whiteboard.h22
-rw-r--r--ydb/core/tablet/node_whiteboard.cpp33
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) {