Skip to content

Commit

Permalink
extend pdisk information (#5952)
Browse files Browse the repository at this point in the history
  • Loading branch information
adameat authored Jun 26, 2024
1 parent 2e60443 commit 0a857b8
Show file tree
Hide file tree
Showing 3 changed files with 192 additions and 41 deletions.
26 changes: 20 additions & 6 deletions ydb/core/viewer/json_pipe_req.h
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,12 @@ class TViewerPipeClient : public TActorBootstrapped<TDerived> {
}
}

void SendRequest(const TActorId& recipient, IEventBase* ev, ui32 flags = 0, ui64 cookie = 0) {
SendEvent(std::make_unique<IEventHandle>(recipient, TBase::SelfId(), ev, flags, cookie));
void SendRequest(const TActorId& recipient, IEventBase* ev, ui32 flags = 0, ui64 cookie = 0, NWilson::TTraceId traceId = {}) {
SendEvent(std::make_unique<IEventHandle>(recipient, TBase::SelfId(), ev, flags, cookie, nullptr/*forwardOnNondelivery*/, std::move(traceId)));
}

void SendRequestToPipe(const TActorId& pipe, IEventBase* ev, ui64 cookie = 0) {
std::unique_ptr<IEventHandle> event = std::make_unique<IEventHandle>(pipe, TBase::SelfId(), ev, 0/*flags*/, cookie);
void SendRequestToPipe(const TActorId& pipe, IEventBase* ev, ui64 cookie = 0, NWilson::TTraceId traceId = {}) {
std::unique_ptr<IEventHandle> event = std::make_unique<IEventHandle>(pipe, TBase::SelfId(), ev, 0/*flags*/, cookie, nullptr/*forwardOnNondelivery*/, std::move(traceId));
event->Rewrite(TEvTabletPipe::EvSend, pipe);
SendEvent(std::move(event));
}
Expand Down Expand Up @@ -210,7 +210,7 @@ class TViewerPipeClient : public TActorBootstrapped<TDerived> {
SendRequestToPipe(pipeClient, request.Release());
}

void RequestBSControllerPDiskInfo(ui32 nodeId, ui32 pdiskId) {
void RequestBSControllerPDiskInfo(ui32 nodeId, ui32 pdiskId, NWilson::TTraceId traceId = {}) {
TActorId pipeClient = ConnectTabletPipe(GetBSControllerId());
auto request = std::make_unique<NSysView::TEvSysView::TEvGetPDisksRequest>();
request->Record.SetInclusiveFrom(true);
Expand All @@ -219,7 +219,21 @@ class TViewerPipeClient : public TActorBootstrapped<TDerived> {
request->Record.MutableFrom()->SetPDiskId(pdiskId);
request->Record.MutableTo()->SetNodeId(nodeId);
request->Record.MutableTo()->SetPDiskId(pdiskId);
SendRequestToPipe(pipeClient, request.release());
SendRequestToPipe(pipeClient, request.release(), 0/*cookie*/, std::move(traceId));
}

void RequestBSControllerVDiskInfo(ui32 nodeId, ui32 pdiskId, NWilson::TTraceId traceId = {}) {
TActorId pipeClient = ConnectTabletPipe(GetBSControllerId());
auto request = std::make_unique<NSysView::TEvSysView::TEvGetVSlotsRequest>();
request->Record.SetInclusiveFrom(true);
request->Record.SetInclusiveTo(true);
request->Record.MutableFrom()->SetNodeId(nodeId);
request->Record.MutableFrom()->SetPDiskId(pdiskId);
request->Record.MutableFrom()->SetVSlotId(0);
request->Record.MutableTo()->SetNodeId(nodeId);
request->Record.MutableTo()->SetPDiskId(pdiskId);
request->Record.MutableTo()->SetVSlotId(std::numeric_limits<ui32>::max());
SendRequestToPipe(pipeClient, request.release(), 0/*cookie*/, std::move(traceId));
}

void RequestBSControllerPDiskUpdateStatus(const NKikimrBlobStorage::TUpdateDriveStatus& driveStatus, bool force = false) {
Expand Down
193 changes: 160 additions & 33 deletions ydb/core/viewer/pdisk_info.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,14 @@ class TPDiskInfo : public TViewerPipeClient<TPDiskInfo> {
ui32 Retries = 0;
TDuration RetryPeriod = TDuration::MilliSeconds(500);

std::unique_ptr<NSysView::TEvSysView::TEvGetPDisksResponse> BSCResponse;
std::unique_ptr<NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateResponse> WhiteboardResponse;
std::unique_ptr<NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateResponse> PDiskStateResponse;
NWilson::TSpan PDiskStateSpan;
std::unique_ptr<NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse> VDiskStateResponse;
NWilson::TSpan VDiskStateSpan;
std::unique_ptr<NSysView::TEvSysView::TEvGetPDisksResponse> PDiskResponse;
NWilson::TSpan PDiskSpan;
std::unique_ptr<NSysView::TEvSysView::TEvGetVSlotsResponse> VDiskResponse;
NWilson::TSpan VDiskSpan;

ui32 NodeId = 0;
ui32 PDiskId = 0;
Expand All @@ -50,7 +56,8 @@ class TPDiskInfo : public TViewerPipeClient<TPDiskInfo> {
}

TPDiskInfo(IViewer* viewer, NMon::TEvHttpInfo::TPtr& ev)
: Viewer(viewer)
: TBase(ev)
, Viewer(viewer)
, Event(ev)
{}

Expand All @@ -60,16 +67,10 @@ class TPDiskInfo : public TViewerPipeClient<TPDiskInfo> {
PDiskId = FromStringWithDefault<ui32>(params.Get("pdisk_id"), Max<ui32>());

if (PDiskId == Max<ui32>()) {
TBase::Send(Event->Sender, new NMon::TEvHttpInfoRes(
Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "field 'pdisk_id' is required"),
0, NMon::IEvHttpInfoRes::EContentType::Custom));
return PassAway();
return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "field 'pdisk_id' is required"), "BadRequest");
}
if (Event->Get()->Request.GetMethod() != HTTP_METHOD_GET) {
TBase::Send(Event->Sender, new NMon::TEvHttpInfoRes(
Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "Only GET method is allowed"),
0, NMon::IEvHttpInfoRes::EContentType::Custom));
return PassAway();
return ReplyAndPassAway(Viewer->GetHTTPBADREQUEST(Event->Get(), "text/plain", "Only GET method is allowed"), "BadRequest");
}

if (!NodeId) {
Expand All @@ -90,22 +91,45 @@ class TPDiskInfo : public TViewerPipeClient<TPDiskInfo> {
STATEFN(StateWork) {
switch (ev->GetTypeRewrite()) {
hFunc(NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateResponse, Handle);
hFunc(NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse, Handle);
hFunc(NSysView::TEvSysView::TEvGetPDisksResponse, Handle);
hFunc(NSysView::TEvSysView::TEvGetVSlotsResponse, Handle);
cFunc(TEvRetryNodeRequest::EventType, HandleRetry);
cFunc(TEvents::TEvUndelivered::EventType, Undelivered);
hFunc(TEvInterconnect::TEvNodeDisconnected, Disconnected);
hFunc(TEvTabletPipe::TEvClientConnected, Handle);
hFunc(TEvTabletPipe::TEvClientDestroyed, Handle);
cFunc(TEvents::TSystem::Wakeup, HandleTimeout);
}
}

void SendWhiteboardRequest() {
TActorId whiteboardServiceId = NNodeWhiteboard::MakeNodeWhiteboardServiceId(NodeId);
auto request = std::make_unique<NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateRequest>();
TBase::SendRequest(whiteboardServiceId, request.release(), IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, NodeId);
{
auto request = std::make_unique<NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateRequest>();
if (Span) {
PDiskStateSpan = Span.CreateChild(TComponentTracingLevels::THttp::Detailed, "TEvPDiskStateRequest");
}
TBase::SendRequest(whiteboardServiceId, request.release(), IEventHandle::FlagTrackDelivery | IEventHandle::FlagSubscribeOnSession, NodeId, PDiskStateSpan.GetTraceId());
}
{
auto request = std::make_unique<NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateRequest>();
if (Span) {
VDiskStateSpan = Span.CreateChild(TComponentTracingLevels::THttp::Detailed, "TEvVDiskStateRequest");
}
TBase::SendRequest(whiteboardServiceId, request.release(), 0, NodeId, VDiskStateSpan.GetTraceId());
}
}

void SendBSCRequest() {
RequestBSControllerPDiskInfo(NodeId, PDiskId);
if (Span) {
PDiskSpan = Span.CreateChild(TComponentTracingLevels::THttp::Detailed, "TEvGetPDisksRequest");
}
RequestBSControllerPDiskInfo(NodeId, PDiskId, PDiskSpan.GetTraceId());
if (Span) {
VDiskSpan = Span.CreateChild(TComponentTracingLevels::THttp::Detailed, "TEvGetVSlotsRequest");
}
RequestBSControllerVDiskInfo(NodeId, PDiskId, VDiskSpan.GetTraceId());
}

bool RetryRequest() {
Expand All @@ -119,24 +143,80 @@ class TPDiskInfo : public TViewerPipeClient<TPDiskInfo> {
}

void Undelivered() {
if (PDiskStateSpan) {
PDiskStateSpan.EndError("Undelivered");
}
if (VDiskStateSpan) {
VDiskStateSpan.EndError("Undelivered");
}
if (!RetryRequest()) {
TBase::RequestDone();
TBase::RequestDone(2);
}
}

void Disconnected(TEvInterconnect::TEvNodeDisconnected::TPtr&) {
if (PDiskStateSpan) {
PDiskStateSpan.EndError("NodeDisconnected");
}
if (VDiskStateSpan) {
VDiskStateSpan.EndError("NodeDisconnected");
}
if (!RetryRequest()) {
TBase::RequestDone();
TBase::RequestDone(2);
}
}

void Handle(TEvTabletPipe::TEvClientConnected::TPtr& ev) {
if (ev->Get()->Status != NKikimrProto::OK) {
if (PDiskSpan) {
PDiskSpan.EndError("ClientNotConnected");
}
if (VDiskSpan) {
VDiskSpan.EndError("ClientNotConnected");
}
TBase::RequestDone(2);
}
}

void Handle(TEvTabletPipe::TEvClientDestroyed::TPtr&) {
if (PDiskSpan) {
PDiskSpan.EndError("ClientDestroyed");
}
if (VDiskSpan) {
VDiskSpan.EndError("ClientDestroyed");
}
TBase::RequestDone(2);
}

void Handle(NSysView::TEvSysView::TEvGetPDisksResponse::TPtr& ev) {
BSCResponse.reset(ev->Release().Release());
PDiskResponse.reset(ev->Release().Release());
if (PDiskSpan) {
PDiskSpan.EndOk();
}
TBase::RequestDone();
}

void Handle(NSysView::TEvSysView::TEvGetVSlotsResponse::TPtr& ev) {
VDiskResponse.reset(ev->Release().Release());
if (VDiskSpan) {
VDiskSpan.EndOk();
}
TBase::RequestDone();
}

void Handle(NNodeWhiteboard::TEvWhiteboard::TEvPDiskStateResponse::TPtr& ev) {
WhiteboardResponse.reset(ev->Release().Release());
PDiskStateResponse.reset(ev->Release().Release());
if (PDiskStateSpan) {
PDiskStateSpan.EndOk();
}
TBase::RequestDone();
}

void Handle(NNodeWhiteboard::TEvWhiteboard::TEvVDiskStateResponse::TPtr& ev) {
VDiskStateResponse.reset(ev->Release().Release());
if (VDiskStateSpan) {
VDiskStateSpan.EndOk();
}
TBase::RequestDone();
}

Expand All @@ -145,36 +225,82 @@ class TPDiskInfo : public TViewerPipeClient<TPDiskInfo> {
}

void HandleTimeout() {
Send(Event->Sender, new NMon::TEvHttpInfoRes(
Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get(), "text/plain", "Timeout receiving response"),
0, NMon::IEvHttpInfoRes::EContentType::Custom));
PassAway();
ReplyAndPassAway(Viewer->GetHTTPGATEWAYTIMEOUT(Event->Get(), "text/plain", "Timeout receiving response"), "Timeout");
}

void PassAway() override {
TBase::Send(TActivationContext::InterconnectProxy(NodeId), new TEvents::TEvUnsubscribe());
TBase::PassAway();
}

void ReplyAndPassAway(TString data, const TString& error = {}) {
Send(Event->Sender, new NMon::TEvHttpInfoRes(data, 0, NMon::IEvHttpInfoRes::EContentType::Custom));
if (Span) {
if (error) {
Span.EndError(error);
} else {
Span.EndOk();
}
}
PassAway();
}

void ReplyAndPassAway() {
NKikimrViewer::TPDiskInfo proto;
TStringStream json;
if (WhiteboardResponse != nullptr && WhiteboardResponse->Record.PDiskStateInfoSize() > 0) {
for (const auto& pdisk : WhiteboardResponse->Record.GetPDiskStateInfo()) {
bool hasPDisk = false;
bool hasVDisk = false;
if (PDiskStateResponse != nullptr && PDiskStateResponse->Record.PDiskStateInfoSize() > 0) {
for (const auto& pdisk : PDiskStateResponse->Record.GetPDiskStateInfo()) {
if (pdisk.GetPDiskId() == PDiskId) {
proto.MutableWhiteboard()->CopyFrom(pdisk);
proto.MutableWhiteboard()->MutablePDisk()->CopyFrom(pdisk);
hasPDisk = true;
break;
}
}
}
if (BSCResponse != nullptr && BSCResponse->Record.EntriesSize() > 0) {
proto.MutableBSC()->CopyFrom(BSCResponse->Record.GetEntries(0).GetInfo());
if (VDiskStateResponse != nullptr && VDiskStateResponse->Record.VDiskStateInfoSize() > 0) {
for (const auto& vdisk : VDiskStateResponse->Record.GetVDiskStateInfo()) {
if (vdisk.GetPDiskId() == PDiskId) {
proto.MutableWhiteboard()->AddVDisks()->CopyFrom(vdisk);
hasVDisk = true;
}
}
}
if (PDiskResponse != nullptr && PDiskResponse->Record.EntriesSize() > 0) {
const auto& bscInfo(PDiskResponse->Record.GetEntries(0).GetInfo());
proto.MutableBSC()->MutablePDisk()->CopyFrom(bscInfo);
if (!hasPDisk) {
auto& pdiskInfo(*proto.MutableWhiteboard()->MutablePDisk());
pdiskInfo.SetPDiskId(PDiskId);
pdiskInfo.SetPath(bscInfo.GetPath());
pdiskInfo.SetGuid(bscInfo.GetGuid());
pdiskInfo.SetCategory(bscInfo.GetCategory());
pdiskInfo.SetAvailableSize(bscInfo.GetAvailableSize());
pdiskInfo.SetTotalSize(bscInfo.GetTotalSize());
}
}
if (VDiskResponse != nullptr && VDiskResponse->Record.EntriesSize() > 0) {
for (const auto& vdisk : VDiskResponse->Record.GetEntries()) {
proto.MutableBSC()->AddVDisks()->CopyFrom(vdisk);
if (!hasVDisk) {
const auto& bscInfo(vdisk.GetInfo());
auto& vdiskInfo(*proto.MutableWhiteboard()->AddVDisks());
vdiskInfo.SetPDiskId(PDiskId);
vdiskInfo.MutableVDiskId()->SetGroupID(bscInfo.GetGroupId());
vdiskInfo.MutableVDiskId()->SetGroupGeneration(bscInfo.GetGroupGeneration());
vdiskInfo.MutableVDiskId()->SetRing(bscInfo.GetFailRealm());
vdiskInfo.MutableVDiskId()->SetDomain(bscInfo.GetFailDomain());
vdiskInfo.MutableVDiskId()->SetVDisk(bscInfo.GetVDisk());
vdiskInfo.SetAllocatedSize(bscInfo.GetAllocatedSize());
vdiskInfo.SetAvailableSize(bscInfo.GetAvailableSize());
}
}
}
TStringStream json;
TProtoToJson::ProtoToJson(json, proto, {
.EnumAsNumbers = false,
});
TBase::Send(Event->Sender, new NMon::TEvHttpInfoRes(Viewer->GetHTTPOKJSON(Event->Get(), json.Str()), 0, NMon::IEvHttpInfoRes::EContentType::Custom));
PassAway();
ReplyAndPassAway(Viewer->GetHTTPOKJSON(Event->Get(), json.Str()));
}
};

Expand Down Expand Up @@ -217,9 +343,10 @@ YAML::Node TJsonRequestSwagger<TPDiskInfo>::GetSwagger() {

node["get"]["responses"]["200"]["content"]["application/json"]["schema"] = TProtoToYaml::ProtoToYamlSchema<NKikimrViewer::TPDiskInfo>();
YAML::Node properties(node["get"]["responses"]["200"]["content"]["application/json"]["schema"]["properties"]["BSC"]["properties"]);
TProtoToYaml::FillEnum(properties["StatusV2"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EDriveStatus>());
TProtoToYaml::FillEnum(properties["DecommitStatus"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EDecommitStatus>());
TProtoToYaml::FillEnum(properties["Type"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EPDiskType>());
TProtoToYaml::FillEnum(properties["PDisk"]["properties"]["StatusV2"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EDriveStatus>());
TProtoToYaml::FillEnum(properties["PDisk"]["properties"]["DecommitStatus"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EDecommitStatus>());
TProtoToYaml::FillEnum(properties["PDisk"]["properties"]["Type"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EPDiskType>());
TProtoToYaml::FillEnum(properties["VDisks"]["items"]["properties"]["StatusV2"], NProtoBuf::GetEnumDescriptor<NKikimrBlobStorage::EVDiskStatus>());
return node;
}

Expand Down
14 changes: 12 additions & 2 deletions ydb/core/viewer/protos/viewer.proto
Original file line number Diff line number Diff line change
Expand Up @@ -634,7 +634,17 @@ message TQueryAutocomplete {
repeated string Error = 3;
}

message TPDiskInfoWhiteboard {
NKikimrWhiteboard.TPDiskStateInfo PDisk = 1;
repeated NKikimrWhiteboard.TVDiskStateInfo VDisks = 2;
}

message TPDiskInfoBSC {
NKikimrSysView.TPDiskInfo PDisk = 1;
repeated NKikimrSysView.TVSlotEntry VDisks = 2;
}

message TPDiskInfo {
NKikimrWhiteboard.TPDiskStateInfo Whiteboard = 1;
NKikimrSysView.TPDiskInfo BSC = 2;
TPDiskInfoWhiteboard Whiteboard = 1;
TPDiskInfoBSC BSC = 2;
}

0 comments on commit 0a857b8

Please sign in to comment.