11#include " kv_workload.h"
2- #include " format "
3- #include " util/random/random.h "
4-
2+ #include " workload_factory.h "
3+ #include < util/generic/serialized_enum.h >
4+ # include < util/random/random.h >
55#include < util/datetime/base.h>
66
77#include < ydb/core/util/lz4_data_generator.h>
1313#include < random>
1414#include < sstream>
1515#include < chrono>
16-
17- template <>
18- void Out<NYdbWorkload::KvWorkloadConstants>(IOutputStream& out, NYdbWorkload::KvWorkloadConstants constant)
19- {
20- out << static_cast <ui64>(constant);
21- }
16+ #include < format>
2217
2318namespace NYdbWorkload {
2419
20+ TWorkloadFactory::TRegistrator<TKvWorkloadParams> KvRegistrar (" kv" );
21+
2522using TRow = TKvWorkloadGenerator::TRow;
2623
2724// Note: there is no mechanism to update row values for now so all keys should be different
@@ -129,7 +126,7 @@ void VerifyRows(const TRow& checkRow, const TVector<TRow>& readRows, TString mes
129126
130127
131128TKvWorkloadGenerator::TKvWorkloadGenerator (const TKvWorkloadParams* params)
132- : Params(* params)
129+ : TBase( params)
133130 , BigString(NKikimr::GenDataForLZ4(Params.StringLen))
134131{
135132 if (Params.MixedChangePartitionsSize ) {
@@ -142,10 +139,6 @@ TKvWorkloadGenerator::TKvWorkloadGenerator(const TKvWorkloadParams* params)
142139 Y_ABORT_UNLESS (Params.KeyColumnsCnt <= Params.ColumnsCnt );
143140}
144141
145- TKvWorkloadParams* TKvWorkloadGenerator::GetParams () {
146- return &Params;
147- }
148-
149142std::string TKvWorkloadGenerator::GetDDLQueries () const {
150143 std::stringstream ss;
151144
@@ -198,6 +191,16 @@ TQueryInfoList TKvWorkloadGenerator::GetWorkload(int type) {
198191}
199192
200193
194+ TVector<IWorkloadQueryGenerator::TWorkloadType> TKvWorkloadGenerator::GetSupportedWorkloadTypes () const {
195+ TVector<TWorkloadType> result;
196+ result.emplace_back (static_cast <int >(EType::UpsertRandom), " upsert" , " Upsert random rows into table" );
197+ result.emplace_back (static_cast <int >(EType::InsertRandom), " insert" , " Insert random rows into table" );
198+ result.emplace_back (static_cast <int >(EType::SelectRandom), " select" , " Select rows matching primary key(s)" );
199+ result.emplace_back (static_cast <int >(EType::ReadRowsRandom), " read-rows" , " ReadRows rows matching primary key(s)" );
200+ result.emplace_back (static_cast <int >(EType::Mixed), " mixed" , " Writes and SELECT/ReadsRows rows randomly, verifies them" );
201+ return result;
202+ }
203+
201204TQueryInfoList TKvWorkloadGenerator::WriteRows (TString operation, TVector<TRow>&& rows) {
202205 std::stringstream ss;
203206
@@ -449,10 +452,8 @@ TQueryInfoList TKvWorkloadGenerator::GetInitialData() {
449452 return res;
450453}
451454
452- std::string TKvWorkloadGenerator::GetCleanDDLQueries () const {
453- std::string query = " DROP TABLE `" + Params.TableName + " `;" ;
454-
455- return query;
455+ TVector<std::string> TKvWorkloadGenerator::GetCleanPaths () const {
456+ return { Params.TableName };
456457}
457458
458459TVector<TRow> TKvWorkloadGenerator::GenerateRandomRows (bool randomValues) {
@@ -486,5 +487,86 @@ TVector<TRow> TKvWorkloadGenerator::GenerateRandomRows(bool randomValues) {
486487 return result;
487488}
488489
490+ void TKvWorkloadParams::ConfigureOpts (NLastGetopt::TOpts& opts, const ECommandType commandType, int workloadType) {
491+ opts.SetFreeArgsNum (0 );
492+ switch (commandType) {
493+ case TWorkloadParams::ECommandType::Init:
494+ opts.AddLongOption (" init-upserts" , " count of upserts need to create while table initialization" )
495+ .DefaultValue ((ui64)KvWorkloadConstants::INIT_ROW_COUNT).StoreResult (&InitRowCount);
496+ opts.AddLongOption (" min-partitions" , " Minimum partitions for tables." )
497+ .DefaultValue ((ui64)KvWorkloadConstants::MIN_PARTITIONS).StoreResult (&MinPartitions);
498+ opts.AddLongOption (" partition-size" , " Maximum partition size in megabytes (AUTO_PARTITIONING_PARTITION_SIZE_MB)." )
499+ .DefaultValue ((ui64)KvWorkloadConstants::PARTITION_SIZE_MB).StoreResult (&PartitionSizeMb);
500+ opts.AddLongOption (" auto-partition" , " Enable auto partitioning by load." )
501+ .DefaultValue ((ui64)KvWorkloadConstants::PARTITIONS_BY_LOAD).StoreResult (&PartitionsByLoad);
502+ opts.AddLongOption (" max-first-key" , " Maximum value of a first primary key" )
503+ .DefaultValue ((ui64)KvWorkloadConstants::MAX_FIRST_KEY).StoreResult (&MaxFirstKey);
504+ opts.AddLongOption (" len" , " String len" )
505+ .DefaultValue ((ui64)KvWorkloadConstants::STRING_LEN).StoreResult (&StringLen);
506+ opts.AddLongOption (" cols" , " Number of columns" )
507+ .DefaultValue ((ui64)KvWorkloadConstants::COLUMNS_CNT).StoreResult (&ColumnsCnt);
508+ opts.AddLongOption (" int-cols" , " Number of int columns" )
509+ .DefaultValue ((ui64)KvWorkloadConstants::INT_COLUMNS_CNT).StoreResult (&IntColumnsCnt);
510+ opts.AddLongOption (" key-cols" , " Number of key columns" )
511+ .DefaultValue ((ui64)KvWorkloadConstants::KEY_COLUMNS_CNT).StoreResult (&KeyColumnsCnt);
512+ opts.AddLongOption (" rows" , " Number of rows" )
513+ .DefaultValue ((ui64)KvWorkloadConstants::ROWS_CNT).StoreResult (&RowsCnt);
514+ break ;
515+ case TWorkloadParams::ECommandType::Run:
516+ opts.AddLongOption (" max-first-key" , " Maximum value of a first primary key" )
517+ .DefaultValue ((ui64)KvWorkloadConstants::MAX_FIRST_KEY).StoreResult (&MaxFirstKey);
518+ opts.AddLongOption (" int-cols" , " Number of int columns" )
519+ .DefaultValue ((ui64)KvWorkloadConstants::INT_COLUMNS_CNT).StoreResult (&IntColumnsCnt);
520+ opts.AddLongOption (" key-cols" , " Number of key columns" )
521+ .DefaultValue ((ui64)KvWorkloadConstants::KEY_COLUMNS_CNT).StoreResult (&KeyColumnsCnt);
522+ switch (static_cast <TKvWorkloadGenerator::EType>(workloadType)) {
523+ case TKvWorkloadGenerator::EType::UpsertRandom:
524+ opts.AddLongOption (" len" , " String len" )
525+ .DefaultValue ((ui64)KvWorkloadConstants::STRING_LEN).StoreResult (&StringLen);
526+ opts.AddLongOption (" cols" , " Number of columns to upsert" )
527+ .DefaultValue ((ui64)KvWorkloadConstants::COLUMNS_CNT).StoreResult (&ColumnsCnt);
528+ opts.AddLongOption (" rows" , " Number of rows to upsert" )
529+ .DefaultValue ((ui64)NYdbWorkload::KvWorkloadConstants::ROWS_CNT).StoreResult (&RowsCnt);
530+ break ;
531+ case TKvWorkloadGenerator::EType::InsertRandom:
532+ opts.AddLongOption (" len" , " String len" )
533+ .DefaultValue ((ui64)KvWorkloadConstants::STRING_LEN).StoreResult (&StringLen);
534+ opts.AddLongOption (" cols" , " Number of columns to insert" )
535+ .DefaultValue ((ui64)KvWorkloadConstants::COLUMNS_CNT).StoreResult (&ColumnsCnt);
536+ opts.AddLongOption (" rows" , " Number of rows to insert" )
537+ .DefaultValue ((ui64)NYdbWorkload::KvWorkloadConstants::ROWS_CNT).StoreResult (&RowsCnt);
538+ break ;
539+ case TKvWorkloadGenerator::EType::SelectRandom:
540+ case TKvWorkloadGenerator::EType::ReadRowsRandom:
541+ opts.AddLongOption (" cols" , " Number of columns to select for a single query" )
542+ .DefaultValue ((ui64)KvWorkloadConstants::COLUMNS_CNT).StoreResult (&ColumnsCnt);
543+ opts.AddLongOption (" rows" , " Number of rows to select for a single query" )
544+ .DefaultValue ((ui64)NYdbWorkload::KvWorkloadConstants::ROWS_CNT).StoreResult (&RowsCnt);
545+ break ;
546+ case TKvWorkloadGenerator::EType::Mixed:
547+ opts.AddLongOption (" len" , " String len" )
548+ .DefaultValue ((ui64)KvWorkloadConstants::STRING_LEN).StoreResult (&StringLen);
549+ opts.AddLongOption (" cols" , " Number of columns" )
550+ .DefaultValue ((ui64)KvWorkloadConstants::COLUMNS_CNT).StoreResult (&ColumnsCnt);
551+ opts.AddLongOption (" change-partitions-size" , " Apply random changes of AUTO_PARTITIONING_PARTITION_SIZE_MB setting" )
552+ .DefaultValue ((ui64)KvWorkloadConstants::MIXED_CHANGE_PARTITIONS_SIZE).StoreResult (&MixedChangePartitionsSize);
553+ opts.AddLongOption (" do-select" , " Do SELECT operations" )
554+ .DefaultValue ((ui64)KvWorkloadConstants::MIXED_DO_SELECT).StoreResult (&MixedDoSelect);
555+ opts.AddLongOption (" do-read-rows" , " Do ReadRows operations" )
556+ .DefaultValue ((ui64)KvWorkloadConstants::MIXED_DO_READ_ROWS).StoreResult (&MixedDoReadRows);
557+ }
558+ break ;
559+ case TWorkloadParams::ECommandType::Clean:
560+ break ;
561+ }
562+ }
489563
490- }
564+ THolder<IWorkloadQueryGenerator> TKvWorkloadParams::CreateGenerator () const {
565+ return MakeHolder<TKvWorkloadGenerator>(this );
566+ }
567+
568+ TString TKvWorkloadParams::GetWorkloadName () const {
569+ return " Key-Value" ;
570+ }
571+
572+ }
0 commit comments