aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Dmitriev <alexd.65536@gmail.com>2022-05-19 00:01:57 +0300
committerAleksandr Dmitriev <alexd.65536@gmail.com>2022-05-19 00:01:57 +0300
commitc8109496007827bef95fcb1a207ccc34db0bb182 (patch)
tree422585dbcae8d0c9063e89e6e53eae2632113cfa
parent65b3811b894e990b918f74256f29acd7dd02d2d6 (diff)
downloadydb-c8109496007827bef95fcb1a207ccc34db0bb182.tar.gz
show donors in viewer for acceptor disks KIKIMR-14511
ref:183652c2096d96654c49395c3194fca5cc81cf93
-rw-r--r--ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp11
-rw-r--r--ydb/core/node_whiteboard/node_whiteboard.h5
-rw-r--r--ydb/core/protos/node_whiteboard.proto1
-rw-r--r--ydb/core/viewer/content/v2/vdisk.js27
4 files changed, 38 insertions, 6 deletions
diff --git a/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp b/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp
index 096ac7ee90..1a75ac8a9e 100644
--- a/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp
+++ b/ydb/core/blobstorage/nodewarden/node_warden_vdisk.cpp
@@ -144,9 +144,16 @@ namespace NKikimr::NStorage {
const ui64 scrubCookie = ++LastScrubCookie;
std::vector<std::pair<TVDiskID, TActorId>> donorDiskIds;
+ std::vector<NKikimrBlobStorage::TVSlotId> donors;
for (const auto& donor : vdisk.Config.GetDonors()) {
- const TVSlotId donorSlot(donor.GetVDiskLocation());
+ const auto& location = donor.GetVDiskLocation();
+ const TVSlotId donorSlot(location);
donorDiskIds.emplace_back(VDiskIDFromVDiskID(donor.GetVDiskId()), donorSlot.GetVDiskServiceId());
+ NKikimrBlobStorage::TVSlotId slotId;
+ slotId.SetNodeId(location.GetNodeID());
+ slotId.SetPDiskId(location.GetPDiskID());
+ slotId.SetVSlotId(location.GetVDiskSlotID());
+ donors.emplace_back(slotId);
}
TVDiskConfig::TBaseInfo baseInfo(vdiskId, pdiskServiceId, pdiskGuid, vslotId.PDiskId, deviceType,
@@ -166,7 +173,7 @@ namespace NKikimr::NStorage {
// issue initial report to whiteboard before creating actor to avoid races
Send(WhiteboardId, new NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateUpdate(vdiskId, groupInfo->GetStoragePoolName(),
- vslotId.PDiskId, vslotId.VDiskSlotId, pdiskGuid, kind, donorMode, whiteboardInstanceGuid));
+ vslotId.PDiskId, vslotId.VDiskSlotId, pdiskGuid, kind, donorMode, whiteboardInstanceGuid, std::move(donors)));
vdisk.WhiteboardVDiskId.emplace(vdiskId);
// create an actor
diff --git a/ydb/core/node_whiteboard/node_whiteboard.h b/ydb/core/node_whiteboard/node_whiteboard.h
index a726c7ad98..9c7a1cabb0 100644
--- a/ydb/core/node_whiteboard/node_whiteboard.h
+++ b/ydb/core/node_whiteboard/node_whiteboard.h
@@ -147,7 +147,7 @@ struct TEvWhiteboard{
// this message is generated by NodeWarden
explicit TEvVDiskStateUpdate(const TVDiskID& vDiskId, const TMaybe<TString>& storagePoolName, ui32 pDiskId,
ui32 vDiskSlotId, ui64 guid, NKikimrBlobStorage::TVDiskKind::EVDiskKind kind, bool donorMode,
- ui64 instanceGuid)
+ ui64 instanceGuid, std::vector<NKikimrBlobStorage::TVSlotId>&& donors)
: Initial(true)
{
VDiskIDFromVDiskID(vDiskId, Record.MutableVDiskId());
@@ -162,6 +162,9 @@ struct TEvWhiteboard{
Record.SetDonorMode(true);
}
Record.SetInstanceGuid(instanceGuid);
+ for (auto&& donor : donors) {
+ *Record.AddDonors() = std::move(donor);
+ }
}
explicit TEvVDiskStateUpdate(NKikimrWhiteboard::TVDiskSatisfactionRank *satisfactionRank) {
diff --git a/ydb/core/protos/node_whiteboard.proto b/ydb/core/protos/node_whiteboard.proto
index b96713ca29..13f5cf0bdf 100644
--- a/ydb/core/protos/node_whiteboard.proto
+++ b/ydb/core/protos/node_whiteboard.proto
@@ -191,6 +191,7 @@ message TVDiskStateInfo {
optional fixed64 IncarnationGuid = 25;
optional bool DonorMode = 26;
optional fixed64 InstanceGuid = 27; // VDisk actor instance guid
+ repeated NKikimrBlobStorage.TVSlotId Donors = 29;
// VDisk (Skeleton) Front Queue Status
optional EFlag FrontQueues = 18;
diff --git a/ydb/core/viewer/content/v2/vdisk.js b/ydb/core/viewer/content/v2/vdisk.js
index 6a3e1af417..636100be11 100644
--- a/ydb/core/viewer/content/v2/vdisk.js
+++ b/ydb/core/viewer/content/v2/vdisk.js
@@ -130,16 +130,34 @@ VDisk.prototype.updateVDiskInfo = function(update) {
state += '<tr><td>FronQueues</td><td>' + this.FrontQueues + '</td></tr>';
severity = Math.max(severity, Math.min(4, this.getColorSeverity(this.FrontQueues)));
}
- dash = false;
+ isDonor = false;
if (this.DonorMode === true) {
state += '<tr><td>Donor</td><td>YES</td></tr>';
- dash = true;
+ isDonor = true;
} else if (!this.Replicated) {
state += '<tr><td>Replicated</td><td>NO</td></tr>';
if (severity === 1) {
severity = 2;
}
}
+ hasDonors = false;
+ if (this.Donors) {
+ hasDonors = true;
+ for (var d = 0; d < this.Donors.length; ++d) {
+ var donor = this.Donors[d];
+ if (d === 0) {
+ state += '<tr><td>Donors</td><td>';
+ } else {
+ state += '<tr><td></td><td>';
+ }
+ state += donor.NodeId;
+ state += '-';
+ state += donor.PDiskId;
+ state += ' vslot ';
+ state += donor.VSlotId;
+ state += '</td></tr>';
+ }
+ }
var color = grey;
switch (severity) {
@@ -176,9 +194,12 @@ VDisk.prototype.updateVDiskInfo = function(update) {
state += '<tr><td>Write</td><td>' + bytesToSpeed(this.WriteThroughput) + '</td></tr>';
}
state += '</table>';
- if (dash) {
+ if (isDonor) {
background = 'linear-gradient(45deg, forestgreen, forestgreen 8px, transparent 8px, transparent 100%)';
vDisk.css('background', background);
+ } else if (hasDonors) {
+ background = 'linear-gradient(45deg, darkmagenta, darkmagenta 8px, transparent 8px, transparent 100%)';
+ vDisk.css('background', background);
}
vDisk.css('background-color', color);
vDisk.attr('data-original-title', state);