38c60ff90b
NOTE: RVS Build is disabled by default due to CI build issues.
Change-Id: I1593f0fe22075a9f86f54afa3ac151e109f1f7bd
Signed-off-by: Galantsev, Dmitrii <dmitrii.galantsev@amd.com>
[ROCm/rdc commit: eaa1862a80]
648 baris
23 KiB
C++
648 baris
23 KiB
C++
/*
|
|
Copyright (c) 2020 - present Advanced Micro Devices, Inc. All rights reserved.
|
|
|
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
of this software and associated documentation files (the "Software"), to deal
|
|
in the Software without restriction, including without limitation the rights
|
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
copies of the Software, and to permit persons to whom the Software is
|
|
furnished to do so, subject to the following conditions:
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
THE SOFTWARE.
|
|
*/
|
|
#include "rdc/rdc_api_service.h"
|
|
|
|
#include <assert.h>
|
|
#include <grpcpp/grpcpp.h>
|
|
|
|
#include <csignal>
|
|
#include <iostream>
|
|
#include <memory>
|
|
#include <string>
|
|
|
|
#include "rdc.grpc.pb.h" // NOLINT
|
|
#include "rdc/rdc.h"
|
|
#include "rdc_lib/RdcLogger.h"
|
|
#include "rdc_lib/rdc_common.h"
|
|
|
|
namespace amd {
|
|
namespace rdc {
|
|
|
|
RdcAPIServiceImpl::RdcAPIServiceImpl() : rdc_handle_(nullptr) {}
|
|
|
|
rdc_status_t RdcAPIServiceImpl::Initialize(uint64_t rdcd_init_flags) {
|
|
rdc_status_t result = rdc_init(rdcd_init_flags);
|
|
if (result != RDC_ST_OK) {
|
|
std::cout << "RDC API initialize fail\n";
|
|
return result;
|
|
}
|
|
|
|
result = rdc_start_embedded(RDC_OPERATION_MODE_AUTO, &rdc_handle_);
|
|
if (result != RDC_ST_OK) {
|
|
std::cout << "RDC API start embedded fail\n";
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
RdcAPIServiceImpl::~RdcAPIServiceImpl() {
|
|
if (rdc_handle_) {
|
|
rdc_stop_embedded(rdc_handle_);
|
|
rdc_handle_ = nullptr;
|
|
}
|
|
rdc_shutdown();
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetAllDevices(::grpc::ServerContext* context,
|
|
const ::rdc::Empty* request,
|
|
::rdc::GetAllDevicesResponse* reply) {
|
|
(void)(context);
|
|
(void)(request);
|
|
if (!reply) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty reply");
|
|
}
|
|
uint32_t gpu_index_list[RDC_MAX_NUM_DEVICES];
|
|
uint32_t count = 0;
|
|
rdc_status_t result = rdc_device_get_all(rdc_handle_, gpu_index_list, &count);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
for (uint32_t i = 0; i < count; i++) {
|
|
reply->add_gpus(gpu_index_list[i]);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetDeviceAttributes(
|
|
::grpc::ServerContext* context, const ::rdc::GetDeviceAttributesRequest* request,
|
|
::rdc::GetDeviceAttributesResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
uint32_t gpu_index = request->gpu_index();
|
|
rdc_device_attributes_t attribute;
|
|
rdc_status_t result = rdc_device_get_attributes(rdc_handle_, gpu_index, &attribute);
|
|
|
|
::rdc::DeviceAttributes* attr = reply->mutable_attributes();
|
|
attr->set_device_name(attribute.device_name);
|
|
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::CreateGpuGroup(::grpc::ServerContext* context,
|
|
const ::rdc::CreateGpuGroupRequest* request,
|
|
::rdc::CreateGpuGroupResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_gpu_group_t group_id = 0;
|
|
rdc_status_t result =
|
|
rdc_group_gpu_create(rdc_handle_, static_cast<rdc_group_type_t>(request->type()),
|
|
request->group_name().c_str(), &group_id);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_group_id(group_id);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::AddToGpuGroup(::grpc::ServerContext* context,
|
|
const ::rdc::AddToGpuGroupRequest* request,
|
|
::rdc::AddToGpuGroupResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result = rdc_group_gpu_add(rdc_handle_, request->group_id(), request->gpu_index());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetGpuGroupInfo(::grpc::ServerContext* context,
|
|
const ::rdc::GetGpuGroupInfoRequest* request,
|
|
::rdc::GetGpuGroupInfoResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_group_info_t group_info;
|
|
rdc_status_t result = rdc_group_gpu_get_info(rdc_handle_, request->group_id(), &group_info);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_group_name(group_info.group_name);
|
|
for (uint32_t i = 0; i < group_info.count; i++) {
|
|
reply->add_entity_ids(group_info.entity_ids[i]);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetGroupAllIds(::grpc::ServerContext* context,
|
|
const ::rdc::Empty* request,
|
|
::rdc::GetGroupAllIdsResponse* reply) {
|
|
if (!reply || !request || !context) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_gpu_group_t group_id_list[RDC_MAX_NUM_GROUPS];
|
|
uint32_t count = 0;
|
|
rdc_status_t result = rdc_group_get_all_ids(rdc_handle_, group_id_list, &count);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
for (uint32_t i = 0; i < count; i++) {
|
|
reply->add_group_ids(group_id_list[i]);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetFieldGroupAllIds(::grpc::ServerContext* context,
|
|
const ::rdc::Empty* request,
|
|
::rdc::GetFieldGroupAllIdsResponse* reply) {
|
|
if (!reply || !request || !context) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_field_grp_t field_group_id_list[RDC_MAX_NUM_FIELD_GROUPS];
|
|
uint32_t count = 0;
|
|
rdc_status_t result = rdc_group_field_get_all_ids(rdc_handle_, field_group_id_list, &count);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
for (uint32_t i = 0; i < count; i++) {
|
|
reply->add_field_group_ids(field_group_id_list[i]);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::DestroyGpuGroup(::grpc::ServerContext* context,
|
|
const ::rdc::DestroyGpuGroupRequest* request,
|
|
::rdc::DestroyGpuGroupResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result = rdc_group_gpu_destroy(rdc_handle_, request->group_id());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::CreateFieldGroup(::grpc::ServerContext* context,
|
|
const ::rdc::CreateFieldGroupRequest* request,
|
|
::rdc::CreateFieldGroupResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_field_grp_t field_group_id;
|
|
rdc_field_t field_ids[RDC_MAX_FIELD_IDS_PER_FIELD_GROUP];
|
|
for (int i = 0; i < request->field_ids_size(); i++) {
|
|
field_ids[i] = static_cast<rdc_field_t>(request->field_ids(i));
|
|
}
|
|
rdc_status_t result =
|
|
rdc_group_field_create(rdc_handle_, request->field_ids_size(), &field_ids[0],
|
|
request->field_group_name().c_str(), &field_group_id);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_field_group_id(field_group_id);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetFieldGroupInfo(::grpc::ServerContext* context,
|
|
const ::rdc::GetFieldGroupInfoRequest* request,
|
|
::rdc::GetFieldGroupInfoResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_field_group_info_t field_info;
|
|
rdc_status_t result =
|
|
rdc_group_field_get_info(rdc_handle_, request->field_group_id(), &field_info);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_filed_group_name(field_info.group_name);
|
|
for (uint32_t i = 0; i < field_info.count; i++) {
|
|
reply->add_field_ids(field_info.field_ids[i]);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::DestroyFieldGroup(::grpc::ServerContext* context,
|
|
const ::rdc::DestroyFieldGroupRequest* request,
|
|
::rdc::DestroyFieldGroupResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result = rdc_group_field_destroy(rdc_handle_, request->field_group_id());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::WatchFields(::grpc::ServerContext* context,
|
|
const ::rdc::WatchFieldsRequest* request,
|
|
::rdc::WatchFieldsResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result =
|
|
rdc_field_watch(rdc_handle_, request->group_id(), request->field_group_id(),
|
|
request->update_freq(), request->max_keep_age(), request->max_keep_samples());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetLatestFieldValue(
|
|
::grpc::ServerContext* context, const ::rdc::GetLatestFieldValueRequest* request,
|
|
::rdc::GetLatestFieldValueResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_field_value value;
|
|
rdc_status_t result = rdc_field_get_latest_value(
|
|
rdc_handle_, request->gpu_index(), static_cast<rdc_field_t>(request->field_id()), &value);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_field_id(value.field_id);
|
|
reply->set_rdc_status(value.status);
|
|
reply->set_ts(value.ts);
|
|
reply->set_type(static_cast<::rdc::GetLatestFieldValueResponse_FieldType>(value.type));
|
|
if (value.type == INTEGER) {
|
|
reply->set_l_int(value.value.l_int);
|
|
} else if (value.type == DOUBLE) {
|
|
reply->set_dbl(value.value.dbl);
|
|
} else if (value.type == STRING || value.type == BLOB) {
|
|
reply->set_str(value.value.str);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetFieldSince(::grpc::ServerContext* context,
|
|
const ::rdc::GetFieldSinceRequest* request,
|
|
::rdc::GetFieldSinceResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_field_value value;
|
|
uint64_t next_timestamp;
|
|
rdc_status_t result = rdc_field_get_value_since(
|
|
rdc_handle_, request->gpu_index(), static_cast<rdc_field_t>(request->field_id()),
|
|
request->since_time_stamp(), &next_timestamp, &value);
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_next_since_time_stamp(next_timestamp);
|
|
reply->set_field_id(value.field_id);
|
|
reply->set_rdc_status(value.status);
|
|
reply->set_ts(value.ts);
|
|
reply->set_type(static_cast<::rdc::GetFieldSinceResponse_FieldType>(value.type));
|
|
if (value.type == INTEGER) {
|
|
reply->set_l_int(value.value.l_int);
|
|
} else if (value.type == DOUBLE) {
|
|
reply->set_dbl(value.value.dbl);
|
|
} else if (value.type == STRING || value.type == BLOB) {
|
|
std::string val_str(value.value.str);
|
|
size_t endpos = val_str.find_last_not_of(" ");
|
|
val_str[endpos + 1] = '\0';
|
|
reply->set_str(val_str);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::UnWatchFields(::grpc::ServerContext* context,
|
|
const ::rdc::UnWatchFieldsRequest* request,
|
|
::rdc::UnWatchFieldsResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result =
|
|
rdc_field_unwatch(rdc_handle_, request->group_id(), request->field_group_id());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::UpdateAllFields(::grpc::ServerContext* context,
|
|
const ::rdc::UpdateAllFieldsRequest* request,
|
|
::rdc::UpdateAllFieldsResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result = rdc_field_update_all(rdc_handle_, request->wait_for_update());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::StartJobStats(::grpc::ServerContext* context,
|
|
const ::rdc::StartJobStatsRequest* request,
|
|
::rdc::StartJobStatsResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
rdc_status_t result =
|
|
rdc_job_start_stats(rdc_handle_, request->group_id(),
|
|
const_cast<char*>(request->job_id().c_str()), request->update_freq());
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::GetJobStats(::grpc::ServerContext* context,
|
|
const ::rdc::GetJobStatsRequest* request,
|
|
::rdc::GetJobStatsResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_job_info_t job_info;
|
|
rdc_status_t result =
|
|
rdc_job_get_stats(rdc_handle_, const_cast<char*>(request->job_id().c_str()), &job_info);
|
|
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
reply->set_num_gpus(job_info.num_gpus);
|
|
::rdc::GpuUsageInfo* sinfo = reply->mutable_summary();
|
|
copy_gpu_usage_info(job_info.summary, sinfo);
|
|
|
|
for (uint32_t i = 0; i < job_info.num_gpus; i++) {
|
|
::rdc::GpuUsageInfo* ginfo = reply->add_gpus();
|
|
copy_gpu_usage_info(job_info.gpus[i], ginfo);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
bool RdcAPIServiceImpl::copy_gpu_usage_info(const rdc_gpu_usage_info_t& src,
|
|
::rdc::GpuUsageInfo* target) {
|
|
if (target == nullptr) {
|
|
return false;
|
|
}
|
|
|
|
target->set_gpu_id(src.gpu_id);
|
|
target->set_start_time(src.start_time);
|
|
target->set_end_time(src.end_time);
|
|
target->set_energy_consumed(src.energy_consumed);
|
|
target->set_max_gpu_memory_used(src.max_gpu_memory_used);
|
|
target->set_ecc_correct(src.ecc_correct);
|
|
target->set_ecc_uncorrect(src.ecc_uncorrect);
|
|
|
|
::rdc::JobStatsSummary* stats = target->mutable_power_usage();
|
|
stats->set_max_value(src.power_usage.max_value);
|
|
stats->set_min_value(src.power_usage.min_value);
|
|
stats->set_average(src.power_usage.average);
|
|
stats->set_standard_deviation(src.power_usage.standard_deviation);
|
|
|
|
stats = target->mutable_gpu_clock();
|
|
stats->set_max_value(src.gpu_clock.max_value);
|
|
stats->set_min_value(src.gpu_clock.min_value);
|
|
stats->set_average(src.gpu_clock.average);
|
|
stats->set_standard_deviation(src.gpu_clock.standard_deviation);
|
|
|
|
stats = target->mutable_gpu_utilization();
|
|
stats->set_max_value(src.gpu_utilization.max_value);
|
|
stats->set_min_value(src.gpu_utilization.min_value);
|
|
stats->set_average(src.gpu_utilization.average);
|
|
stats->set_standard_deviation(src.gpu_utilization.standard_deviation);
|
|
|
|
stats = target->mutable_memory_utilization();
|
|
stats->set_max_value(src.memory_utilization.max_value);
|
|
stats->set_min_value(src.memory_utilization.min_value);
|
|
stats->set_average(src.memory_utilization.average);
|
|
stats->set_standard_deviation(src.memory_utilization.standard_deviation);
|
|
|
|
stats = target->mutable_pcie_tx();
|
|
stats->set_max_value(src.pcie_tx.max_value);
|
|
stats->set_min_value(src.pcie_tx.min_value);
|
|
stats->set_average(src.pcie_tx.average);
|
|
stats->set_standard_deviation(src.pcie_tx.standard_deviation);
|
|
|
|
stats = target->mutable_pcie_rx();
|
|
stats->set_max_value(src.pcie_rx.max_value);
|
|
stats->set_min_value(src.pcie_rx.min_value);
|
|
stats->set_average(src.pcie_rx.average);
|
|
stats->set_standard_deviation(src.pcie_rx.standard_deviation);
|
|
|
|
stats = target->mutable_memory_clock();
|
|
stats->set_max_value(src.memory_clock.max_value);
|
|
stats->set_min_value(src.memory_clock.min_value);
|
|
stats->set_average(src.memory_clock.average);
|
|
stats->set_standard_deviation(src.memory_clock.standard_deviation);
|
|
|
|
stats = target->mutable_gpu_temperature();
|
|
stats->set_max_value(src.gpu_temperature.max_value);
|
|
stats->set_min_value(src.gpu_temperature.min_value);
|
|
stats->set_average(src.gpu_temperature.average);
|
|
stats->set_standard_deviation(src.gpu_temperature.standard_deviation);
|
|
|
|
return true;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::StopJobStats(::grpc::ServerContext* context,
|
|
const ::rdc::StopJobStatsRequest* request,
|
|
::rdc::StopJobStatsResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_status_t result =
|
|
rdc_job_stop_stats(rdc_handle_, const_cast<char*>(request->job_id().c_str()));
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::RemoveJob(::grpc::ServerContext* context,
|
|
const ::rdc::RemoveJobRequest* request,
|
|
::rdc::RemoveJobResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
rdc_status_t result = rdc_job_remove(rdc_handle_, const_cast<char*>(request->job_id().c_str()));
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::RemoveAllJob(::grpc::ServerContext* context,
|
|
const ::rdc::Empty* request,
|
|
::rdc::RemoveAllJobResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
rdc_status_t result = rdc_job_remove_all(rdc_handle_);
|
|
reply->set_status(result);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::DiagnosticRun(::grpc::ServerContext* context,
|
|
const ::rdc::DiagnosticRunRequest* request,
|
|
::rdc::DiagnosticRunResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_diag_response_t diag_response;
|
|
rdc_status_t result = rdc_diagnostic_run(
|
|
rdc_handle_, request->group_id(), static_cast<rdc_diag_level_t>(request->level()),
|
|
const_cast<char*>(request->config().c_str()), static_cast<size_t>(request->config().length()),
|
|
&diag_response);
|
|
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::rdc::DiagnosticResponse* to_response = reply->mutable_response();
|
|
to_response->set_results_count(diag_response.results_count);
|
|
|
|
for (uint32_t i = 0; i < diag_response.results_count; i++) {
|
|
const rdc_diag_test_result_t& test_result = diag_response.diag_info[i];
|
|
::rdc::DiagnosticTestResult* to_diag_info = to_response->add_diag_info();
|
|
|
|
to_diag_info->set_status(test_result.status);
|
|
|
|
// details
|
|
auto to_details = to_diag_info->mutable_details();
|
|
to_details->set_code(test_result.details.code);
|
|
to_details->set_msg(test_result.details.msg);
|
|
|
|
to_diag_info->set_test_case(
|
|
static_cast<::rdc::DiagnosticTestResult_DiagnosticTestCase>(test_result.test_case));
|
|
to_diag_info->set_per_gpu_result_count(test_result.per_gpu_result_count);
|
|
|
|
// gpu_results
|
|
for (uint32_t j = 0; j < test_result.per_gpu_result_count; j++) {
|
|
auto to_result = to_diag_info->add_gpu_results();
|
|
const rdc_diag_per_gpu_result_t& cur_result = test_result.gpu_results[j];
|
|
to_result->set_gpu_index(cur_result.gpu_index);
|
|
auto to_per_detail = to_result->mutable_gpu_result();
|
|
to_per_detail->set_code(cur_result.gpu_result.code);
|
|
to_per_detail->set_msg(cur_result.gpu_result.msg);
|
|
}
|
|
to_diag_info->set_info(test_result.info);
|
|
}
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
::grpc::Status RdcAPIServiceImpl::DiagnosticTestCaseRun(
|
|
::grpc::ServerContext* context, const ::rdc::DiagnosticTestCaseRunRequest* request,
|
|
::rdc::DiagnosticTestCaseRunResponse* reply) {
|
|
(void)(context);
|
|
if (!reply || !request) {
|
|
return ::grpc::Status(::grpc::StatusCode::INTERNAL, "Empty contents");
|
|
}
|
|
|
|
rdc_diag_test_result_t test_result;
|
|
rdc_status_t result = rdc_test_case_run(
|
|
rdc_handle_, request->group_id(), static_cast<rdc_diag_test_cases_t>(request->test_case()),
|
|
const_cast<char*>(request->config().c_str()), static_cast<size_t>(request->config().length()),
|
|
&test_result);
|
|
|
|
reply->set_status(result);
|
|
if (result != RDC_ST_OK) {
|
|
return ::grpc::Status::OK;
|
|
}
|
|
::rdc::DiagnosticTestResult* to_diag_info = reply->mutable_result();
|
|
to_diag_info->set_status(test_result.status);
|
|
|
|
// details
|
|
auto to_details = to_diag_info->mutable_details();
|
|
to_details->set_code(test_result.details.code);
|
|
to_details->set_msg(test_result.details.msg);
|
|
|
|
to_diag_info->set_test_case(
|
|
static_cast<::rdc::DiagnosticTestResult_DiagnosticTestCase>(test_result.test_case));
|
|
to_diag_info->set_per_gpu_result_count(test_result.per_gpu_result_count);
|
|
|
|
// gpu_results
|
|
for (uint32_t j = 0; j < test_result.per_gpu_result_count; j++) {
|
|
auto to_result = to_diag_info->add_gpu_results();
|
|
const rdc_diag_per_gpu_result_t& cur_result = test_result.gpu_results[j];
|
|
to_result->set_gpu_index(cur_result.gpu_index);
|
|
auto to_per_detail = to_result->mutable_gpu_result();
|
|
to_per_detail->set_code(cur_result.gpu_result.code);
|
|
to_per_detail->set_msg(cur_result.gpu_result.msg);
|
|
}
|
|
to_diag_info->set_info(test_result.info);
|
|
|
|
return ::grpc::Status::OK;
|
|
}
|
|
|
|
} // namespace rdc
|
|
} // namespace amd
|