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); | 
