diff options
| author | tarum <[email protected]> | 2023-04-21 13:11:01 +0300 |
|---|---|---|
| committer | tarum <[email protected]> | 2023-04-21 13:11:01 +0300 |
| commit | 5d90e2a102f93840f3beb44fef64144c89abbc0a (patch) | |
| tree | b058c72e2594faf0a4272e8389cdefa29ecfa345 | |
| parent | b1d5ce58e6a57d9cff019817db28fabfe3996f64 (diff) | |
Produce archive response in case of nonexisting table, handle avg column as double type
| -rw-r--r-- | ydb/core/load_test/aggregated_result.cpp | 10 | ||||
| -rw-r--r-- | ydb/core/load_test/archive.cpp | 8 | ||||
| -rw-r--r-- | ydb/core/load_test/service_actor.cpp | 71 | ||||
| -rw-r--r-- | ydb/core/load_test/yql_single_query.cpp | 12 |
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); |
