@@ -4,6 +4,7 @@ local fiber = require('fiber')
4
4
local errors = require (' errors' )
5
5
local net_box = require (' net.box' )
6
6
local log = require (' log' )
7
+ local fun = require (' fun' )
7
8
8
9
local t = require (' luatest' )
9
10
local g = t .group (' perf' )
@@ -98,8 +99,32 @@ local function normalize(s, n)
98
99
return (' ' ):rep (n - len ) .. s
99
100
end
100
101
102
+ local function generate_batch_insert_cases (min_value , denominator , count )
103
+ local matrix = {}
104
+ local cols_names = {}
105
+
106
+ local batch_size = min_value
107
+ for _ = 1 , count do
108
+ local col_name = tostring (batch_size )
109
+ table.insert (cols_names , col_name )
110
+ matrix [col_name ] = { column_name = col_name , arg = batch_size }
111
+ batch_size = batch_size * denominator
112
+ end
113
+
114
+ return {
115
+ matrix = matrix ,
116
+ cols_names = cols_names ,
117
+ }
118
+ end
119
+
120
+ local min_batch_size = 1
121
+ local denominator_batch_size = 10
122
+ local count_batch_cases = 5
123
+ local batch_insert_cases = generate_batch_insert_cases (min_batch_size , denominator_batch_size , count_batch_cases )
124
+
101
125
local row_name = {
102
126
insert = ' insert' ,
127
+ insert_many = ' insert_many' ,
103
128
select_pk = ' select by pk' ,
104
129
select_gt_pk = ' select gt by pk (limit 10)' ,
105
130
select_secondary_eq = ' select eq by secondary (limit 10)' ,
@@ -117,6 +142,12 @@ local column_name = {
117
142
metrics_quantile_stats = ' crud (metrics stats, with quantiles)' ,
118
143
}
119
144
145
+ -- insert column names for insert_many/insert comparison cases
146
+ fun .reduce (
147
+ function (list , value ) list [value ] = value return list end ,
148
+ column_name , pairs (batch_insert_cases .cols_names )
149
+ )
150
+
120
151
local function visualize_section (total_report , name , comment , section , params )
121
152
local report_str = (' == %s ==\n (%s)\n\n ' ):format (name , comment or ' ' )
122
153
@@ -242,6 +273,7 @@ g.after_all(function(g)
242
273
row_name .select_secondary_eq ,
243
274
row_name .select_secondary_sharded ,
244
275
row_name .insert ,
276
+ row_name .insert_many ,
245
277
}
246
278
})
247
279
@@ -260,6 +292,15 @@ g.after_all(function(g)
260
292
row_name .insert ,
261
293
}
262
294
})
295
+
296
+ visualize_report (g .total_report , ' BATCH COMPARISON PERFORMANCE REPORT' , {
297
+ columns = batch_insert_cases .cols_names ,
298
+
299
+ rows = {
300
+ row_name .insert ,
301
+ row_name .insert_many ,
302
+ },
303
+ })
263
304
end )
264
305
265
306
local function generate_customer ()
@@ -488,6 +529,18 @@ local insert_params = function()
488
529
return { ' customers' , generate_customer () }
489
530
end
490
531
532
+ local batch_insert_params = function (count )
533
+ local batch = {}
534
+
535
+ count = count or 1
536
+
537
+ for _ = 1 , count do
538
+ table.insert (batch , generate_customer ())
539
+ end
540
+
541
+ return { ' customers' , batch }
542
+ end
543
+
491
544
local select_params_pk_eq = function ()
492
545
return { ' customers' , {{' ==' , ' id' , gen () % 10000 }} }
493
546
end
@@ -606,6 +659,12 @@ local pairs_perf = {
606
659
connection_count = 10 ,
607
660
}
608
661
662
+ local batch_insert_comparison_perf = {
663
+ timeout = 30 ,
664
+ fiber_count = 1 ,
665
+ connection_count = 1 ,
666
+ }
667
+
609
668
local cases = {
610
669
vshard_insert = {
611
670
prepare = vshard_prepare ,
@@ -640,6 +699,29 @@ local cases = {
640
699
row_name = row_name .insert ,
641
700
},
642
701
702
+ crud_insert_many = {
703
+ call = ' crud.insert_many' ,
704
+ params = batch_insert_params ,
705
+ matrix = stats_cases ,
706
+ integration_params = integration_params ,
707
+ perf_params = insert_perf ,
708
+ row_name = row_name .insert_many ,
709
+ },
710
+
711
+ crud_insert_many_without_stats_wrapper = {
712
+ prepare = function (g )
713
+ g .router :eval ([[
714
+ rawset(_G, '_plain_insert_many', require('crud.batch_insert').tuples_batch)
715
+ ]] )
716
+ end ,
717
+ call = ' _plain_insert_many' ,
718
+ params = batch_insert_params ,
719
+ matrix = { [' ' ] = { column_name = column_name .without_stats_wrapper } },
720
+ integration_params = integration_params ,
721
+ perf_params = batch_insert_comparison_perf ,
722
+ row_name = row_name .insert_many ,
723
+ },
724
+
643
725
vshard_select_pk_eq = {
644
726
prepare = function (g )
645
727
select_prepare (g )
@@ -876,14 +958,55 @@ local cases = {
876
958
perf_params = pairs_perf ,
877
959
row_name = row_name .pairs_gt ,
878
960
},
961
+
962
+ crud_insert_loop = {
963
+ prepare = function (g )
964
+ g .router :eval ([[
965
+ _insert_loop = function(space_name, tuples)
966
+ local results
967
+ local errors
968
+
969
+ for _, tuple in ipairs(tuples) do
970
+ local res, err = crud.insert(space_name, tuple)
971
+ if res ~= nil then
972
+ results = results or {}
973
+ table.insert(results, res)
974
+ end
975
+
976
+ if err ~= nil then
977
+ errors = errors or {}
978
+ table.insert(errors, err)
979
+ end
980
+ end
981
+
982
+ return results, errors
983
+ end
984
+ ]] )
985
+ end ,
986
+ call = ' _insert_loop' ,
987
+ params = batch_insert_params ,
988
+ matrix = batch_insert_cases .matrix ,
989
+ integration_params = integration_params ,
990
+ perf_params = batch_insert_comparison_perf ,
991
+ row_name = row_name .insert ,
992
+ },
993
+
994
+ crud_insert_many_different_batch_size = {
995
+ call = ' crud.insert_many' ,
996
+ params = batch_insert_params ,
997
+ matrix = batch_insert_cases .matrix ,
998
+ integration_params = integration_params ,
999
+ perf_params = batch_insert_comparison_perf ,
1000
+ row_name = row_name .insert_many ,
1001
+ },
879
1002
}
880
1003
881
- local function generator_f (conn , call , params , report , timeout )
1004
+ local function generator_f (conn , call , params , report , timeout , arg )
882
1005
local start = clock .monotonic ()
883
1006
884
1007
while (clock .monotonic () - start ) < timeout do
885
1008
local call_start = clock .monotonic ()
886
- local ok , res , err = pcall (conn .call , conn , call , params ())
1009
+ local ok , res , err = pcall (conn .call , conn , call , params (arg ))
887
1010
local call_time = clock .monotonic () - call_start
888
1011
889
1012
if not ok then
@@ -947,7 +1070,7 @@ for name, case in pairs(cases) do
947
1070
for id = 1 , params .fiber_count do
948
1071
local conn_id = id % params .connection_count + 1
949
1072
local conn = connections [conn_id ]
950
- local f = fiber .new (generator_f , conn , case .call , case .params , report , params .timeout )
1073
+ local f = fiber .new (generator_f , conn , case .call , case .params , report , params .timeout , subcase . arg )
951
1074
f :set_joinable (true )
952
1075
table.insert (fibers , f )
953
1076
end
0 commit comments