summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortarum <[email protected]>2023-04-21 13:11:01 +0300
committertarum <[email protected]>2023-04-21 13:11:01 +0300
commit5d90e2a102f93840f3beb44fef64144c89abbc0a (patch)
treeb058c72e2594faf0a4272e8389cdefa29ecfa345
parentb1d5ce58e6a57d9cff019817db28fabfe3996f64 (diff)
Produce archive response in case of nonexisting table, handle avg column as double type
-rw-r--r--ydb/core/load_test/aggregated_result.cpp10
-rw-r--r--ydb/core/load_test/archive.cpp8
-rw-r--r--ydb/core/load_test/service_actor.cpp71
-rw-r--r--ydb/core/load_test/yql_single_query.cpp12
4 files changed, 67 insertions, 34 deletions
diff --git a/ydb/core/load_test/aggregated_result.cpp b/ydb/core/load_test/aggregated_result.cpp
index 92b5064afe4..25108d9a988 100644
--- a/ydb/core/load_test/aggregated_result.cpp
+++ b/ydb/core/load_test/aggregated_result.cpp
@@ -146,8 +146,8 @@ bool GetPercentileLevel(TStringBuf statName, TStringBuf& level) {
return false;
}
-template<typename T>
-void SetInAggregatedField(TStringBuf suffix, T value, TAggregatedField<T>& dst) {
+template<typename T, typename U>
+void SetInAggregatedField(TStringBuf suffix, T value, TAggregatedField<U>& dst) {
if (suffix == "_min") {
dst.MinValue = value;
} else if (suffix == "_avg") {
@@ -179,7 +179,11 @@ TAggregatedResult GetResultFromValueListItem(const NKikimrMiniKQL::TValue& listI
result.Config = ExtractValue<TString>(listItem, pos);
} else if (GetStatName(column, statName, suffix)) {
if (statName == "transactions") {
- SetInAggregatedField(suffix, ExtractValue<ui64>(listItem, pos), result.Stats.Transactions);
+ if (suffix == "_avg") {
+ SetInAggregatedField(suffix, ExtractValue<double>(listItem, pos), result.Stats.Transactions);
+ } else {
+ SetInAggregatedField(suffix, ExtractValue<ui64>(listItem, pos), result.Stats.Transactions);
+ }
} else if (statName == "transactions_per_sec") {
SetInAggregatedField(suffix, ExtractValue<double>(listItem, pos), result.Stats.TransactionsPerSecond);
} else if (statName == "errors_per_sec") {
diff --git a/ydb/core/load_test/archive.cpp b/ydb/core/load_test/archive.cpp
index 62617f8ff25..6fe8b754efb 100644
--- a/ydb/core/load_test/archive.cpp
+++ b/ydb/core/load_test/archive.cpp
@@ -13,6 +13,9 @@
namespace NKikimr {
static constexpr TStringBuf kResultTablePath = ".load_test_archive";
+static constexpr TStringBuf kMinSuffix = "_min";
+static constexpr TStringBuf kAvgSuffix = "_avg";
+static constexpr TStringBuf kMaxSuffix = "_max";
namespace {
@@ -28,8 +31,9 @@ const TColumnDescription BuildTableColumns() {
columns.emplace_back("success_nodes", "Uint32");
auto addStatsColumn = [&columns](const TString& name, const TString& typeName) {
- for (const auto& suffix : {"_min", "_avg", "_max"}) {
- columns.emplace_back(name + suffix, typeName);
+ for (const auto& suffix : {kMinSuffix, kAvgSuffix, kMaxSuffix}) {
+ TString columnTypeName = (suffix == kAvgSuffix) ? "Double" : typeName;
+ columns.emplace_back(name + suffix, std::move(columnTypeName));
}
};
addStatsColumn("transactions", "Uint64");
diff --git a/ydb/core/load_test/service_actor.cpp b/ydb/core/load_test/service_actor.cpp
index 3ad3e899851..df8ebdc2e86 100644
--- a/ydb/core/load_test/service_actor.cpp
+++ b/ydb/core/load_test/service_actor.cpp
@@ -398,6 +398,22 @@ private:
InfoRequests.erase(it);
}
+ void RespondToArchiveRequests() {
+ TVector<ui32> archiveRequestIds;
+ for (const auto& [id, req] : InfoRequests) {
+ if (req.Mode == "archive") {
+ archiveRequestIds.push_back(id);
+ }
+ }
+ for (ui32 id : archiveRequestIds) {
+ if (IsJsonContentType(InfoRequests[id].AcceptFormat)) {
+ GenerateArchiveJsonResponse(id);
+ } else {
+ GenerateHttpInfoRes("archive", id);
+ }
+ }
+ }
+
public:
static constexpr NKikimrServices::TActivity::EType ActorActivityType() {
return NKikimrServices::TActivity::BS_LOAD_ACTOR;
@@ -782,7 +798,11 @@ public:
ui32 limit = GetCgiParamNumber(params, "limit", 1, 100, 10);
info.Offset = offset;
info.Limit = limit;
- StartReadingResultsFromTable(offset, limit);
+ if (AppData()->TenantName.empty()) {
+ RespondToArchiveRequests();
+ } else {
+ StartReadingResultsFromTable(offset, limit);
+ }
} else {
GenerateHttpInfoRes(mode, id);
}
@@ -895,37 +915,33 @@ public:
void Handle(const TEvLoad::TEvYqlSingleQueryResponse::TPtr& ev) {
const auto* response = ev->Get();
- if (response->ErrorMessage.Defined()) {
- LOG_E("Failed to execute YQL query: " << response->ErrorMessage.GetRef());
- return;
- }
if (response->Result == kTableCreatedResult) {
- LOG_N("Created test results table");
- StoreResults();
- } else if (response->Result == kRecordsInsertedResult) {
- LOG_N("Inserted records with test results");
- } else if (response->Result == kRecordsSelectedResult) {
- LOG_N("Selected records from table");
- Y_ENSURE(response->Response.Defined());
- if (!LoadResultFromResponseProto(response->Response.GetRef(), ArchivedResults)) {
- LOG_E("Failed to parse results from table");
- ArchivedResults.clear();
+ if (response->ErrorMessage.Defined()) {
+ LOG_E("Failed to create test results table: " << response->ErrorMessage.GetRef());
} else {
- LOG_N("Got results from table: " << ArchivedResults.size());
+ LOG_N("Created test results table");
+ StoreResults();
}
- TVector<ui32> archiveRequestIds;
- for (const auto& [id, req] : InfoRequests) {
- if (req.Mode == "archive") {
- archiveRequestIds.push_back(id);
- }
+ } else if (response->Result == kRecordsInsertedResult) {
+ if (response->ErrorMessage.Defined()) {
+ LOG_E("Failed to save test results into table: " << response->ErrorMessage.GetRef());
+ } else {
+ LOG_N("Inserted records with test results");
}
- for (ui32 id : archiveRequestIds) {
- if (IsJsonContentType(InfoRequests[id].AcceptFormat)) {
- GenerateArchiveJsonResponse(id);
+ } else if (response->Result == kRecordsSelectedResult) {
+ if (response->ErrorMessage.Defined()) {
+ LOG_E("Failed to select test results from table: " << response->ErrorMessage.GetRef());
+ } else {
+ LOG_N("Selected records from table");
+ Y_ENSURE(response->Response.Defined());
+ if (!LoadResultFromResponseProto(response->Response.GetRef(), ArchivedResults)) {
+ LOG_E("Failed to parse results from table");
+ ArchivedResults.clear();
} else {
- GenerateHttpInfoRes("archive", id);
+ LOG_N("Got results from table: " << ArchivedResults.size());
}
}
+ RespondToArchiveRequests();
} else {
LOG_E("Unsupported result from YQL query: " << response->Result);
}
@@ -1196,6 +1212,11 @@ public:
DIV_CLASS("panel-heading") {
str << "Archived load test results";
}
+ if (AppData()->TenantName.empty()) {
+ DIV_CLASS("panel-body text-warning") {
+ str << "Table is not available because TenantName is not set";
+ }
+ }
TABLE_CLASS("table-bordered table-condensed") {
TABLEHEAD() {
TABLER() {
diff --git a/ydb/core/load_test/yql_single_query.cpp b/ydb/core/load_test/yql_single_query.cpp
index 9a32dcf885a..be06d44935c 100644
--- a/ydb/core/load_test/yql_single_query.cpp
+++ b/ydb/core/load_test/yql_single_query.cpp
@@ -42,13 +42,14 @@ private:
ReportError(ctx, "Query timed out");
}
- void ReportSuccess(const TActorContext& ctx, NKikimrKqp::TQueryResponse response) {
+ void ReportResult(const TActorContext& ctx, NKikimrKqp::TQueryResponse response, TMaybe<TString> errorMessage) {
CloseSession(ctx);
- LOG_DEBUG_S(ctx, NKikimrServices::KQP_LOAD_TEST, "Creating event for successfull query response");
+ LOG_DEBUG_S(ctx, NKikimrServices::KQP_LOAD_TEST,
+ "Creating event for query response " << (errorMessage.Defined() ? "with error" : "with success"));
auto* finishEv = new TEvLoad::TEvYqlSingleQueryResponse(
Result,
- Nothing(),
+ std::move(errorMessage),
std::move(response)
);
ctx.Send(Parent, finishEv);
@@ -125,7 +126,10 @@ private:
if (response.GetYdbStatus() == Ydb::StatusIds_StatusCode_SUCCESS) {
LOG_NOTICE_S(ctx, NKikimrServices::KQP_LOAD_TEST, "Query is executed successfully");
- ReportSuccess(ctx, response.GetResponse());
+ ReportResult(ctx, response.GetResponse(), Nothing());
+ } else if (response.GetYdbStatus() == Ydb::StatusIds_StatusCode_SCHEME_ERROR) {
+ LOG_ERROR_S(ctx, NKikimrServices::KQP_LOAD_TEST, "Abort after query execution failed with scheme error: " + ev->Get()->ToString());
+ ReportResult(ctx, response.GetResponse(), ev->Get()->ToString());
} else {
LOG_ERROR_S(ctx, NKikimrServices::KQP_LOAD_TEST, "Query execution failed: " + ev->Get()->ToString());
ExecuteQuery(ctx);