Skip to content

Commit 10856a5

Browse files
committed
Fixes: compatibility, core, tpcc scenario
tpcc scenario changes: - fixed delivery transaction to handle NULL case properly - modified stock_level transaction to support two type of queries compatibility changes: - modified prepare stage to keep tinyint for MySQL and smallint for other DBs - fixed check stage to support STRAIGHT_JOIN hint for MySQL core script changes: - replaced os.sleep with ffi.C.usleep - replaced pcall() with proper hook for error handling - changed API calls from :query to :query_row - various small cleanups and imporvements
1 parent 2359a12 commit 10856a5

File tree

4 files changed

+394
-369
lines changed

4 files changed

+394
-369
lines changed

tpcc.lua

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@ require("tpcc_run")
2323
require("tpcc_check")
2424

2525
function thread_init()
26+
2627
drv = sysbench.sql.driver()
2728
con = drv:connect()
2829

2930
set_isolation_level(drv,con)
30-
con:query("SET autocommit=0")
31+
32+
if drv:name() == "mysql" then
33+
con:query("SET autocommit=0")
34+
end
3135

3236
end
3337

@@ -46,11 +50,13 @@ function event()
4650
trx="stocklevel"
4751
end
4852

49-
-- Repeat transaction execution until success
50-
while not pcall(function () _G[trx]() end ) do
51-
con:query("ROLLBACK")
52-
end
53+
-- Execute transaction
54+
_G[trx]()
55+
56+
end
5357

58+
function sysbench.hooks.before_restart_event(err)
59+
con:query("ROLLBACK")
5460
end
5561

5662
function sysbench.hooks.report_intermediate(stat)

tpcc_check.lua

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@ require("tpcc_common")
2424

2525
function check_tables(drv, con, warehouse_num)
2626

27+
straight_join_hint=","
28+
29+
if drv:name() == "mysql" then
30+
straight_join_hint = "STRAIGHT_JOIN"
31+
end
32+
33+
2734
local pass1 = 1
2835
for table_num = 1, sysbench.opt.tables do
2936
-- print(string.format("Checking tables: %d for warehouse: %d\n", table_num, warehouse_num))
30-
rs = con:query("SELECT d_w_id,sum(d_ytd)-w_ytd diff FROM district"..table_num..",warehouse"..table_num.." where d_w_id=w_id AND w_id="..warehouse_num.." group by d_w_id")
37+
rs = con:query("SELECT d_w_id,sum(d_ytd)-max(w_ytd) diff FROM district"..table_num..",warehouse"..table_num.." WHERE d_w_id=w_id AND w_id="..warehouse_num.." group by d_w_id")
3138

3239
for i = 1, rs.nrows do
3340
row = rs:fetch_row()
@@ -41,6 +48,8 @@ function check_tables(drv, con, warehouse_num)
4148

4249
if pass1 ~= 1 then
4350
print(string.format("Check 1, warehouse: %d FAILED!!!", warehouse_num))
51+
else
52+
print(string.format("Check 1, warehouse: %d PASSED", warehouse_num))
4453
end
4554

4655
-- CHECK 2
@@ -96,7 +105,13 @@ function check_tables(drv, con, warehouse_num)
96105
local pass4 = 1
97106
for table_num = 1, sysbench.opt.tables do
98107
-- print(string.format("Checking tables: %d for warehouse: %d\n", table_num, warehouse_num))
99-
rs = con:query(string.format("SELECT count(*) FROM (SELECT o_d_id, SUM(o_ol_cnt) sm1, cn FROM orders%d,(SELECT ol_d_id, COUNT(*) cn FROM order_line%d WHERE ol_w_id=%d GROUP BY ol_d_id) ol WHERE O_w_id=%d AND ol_d_id=o_d_id GROUP BY o_d_id) t1 WHERE sm1<>cn",table_num, table_num, warehouse_num, warehouse_num))
108+
rs = con:query(string.format([[SELECT count(*)
109+
FROM (SELECT o_d_id, SUM(o_ol_cnt) sm1, MAX(cn) as cn
110+
FROM orders%d,(SELECT ol_d_id, COUNT(*) cn
111+
FROM order_line%d
112+
WHERE ol_w_id=%d GROUP BY ol_d_id) ol
113+
WHERE o_w_id=%d AND ol_d_id=o_d_id GROUP BY o_d_id) t1
114+
WHERE sm1<>cn]],table_num, table_num, warehouse_num, warehouse_num))
100115

101116
for i = 1, rs.nrows do
102117
row = rs:fetch_row()
@@ -196,7 +211,22 @@ function check_tables(drv, con, warehouse_num)
196211
local pass10 = 1
197212
for table_num = 1, sysbench.opt.tables do
198213
-- print(string.format("Checking tables: %d for warehouse: %d\n", table_num, warehouse_num))
199-
rs = con:query(string.format("SELECT count(*) FROM ( SELECT c.c_id, c.c_d_id, c.c_w_id, c.c_balance c1, (SELECT sum(ol_amount) FROM orders%d STRAIGHT_JOIN order_line%d WHERE OL_W_ID=O_W_ID AND OL_D_ID = O_D_ID AND OL_O_ID = O_ID AND OL_DELIVERY_D IS NOT NULL AND O_W_ID=c.c_w_id AND O_D_ID=c.C_D_ID AND O_C_ID=c.C_ID) sm, (SELECT sum(h_amount) from history%d WHERE H_C_W_ID=c.C_W_ID AND H_C_D_ID=c.C_D_ID AND H_C_ID=c.C_ID) smh FROM customer%d c WHERE c.c_w_id=%d ) t where c1<>sm-smh",table_num, table_num, table_num, table_num, warehouse_num))
214+
rs = con:query(string.format([[SELECT count(*)
215+
FROM ( SELECT c.c_id, c.c_d_id, c.c_w_id, c.c_balance c1,
216+
(SELECT sum(ol_amount) FROM orders%d ]] .. straight_join_hint .. [[ order_line%d
217+
WHERE OL_W_ID=O_W_ID
218+
AND OL_D_ID = O_D_ID
219+
AND OL_O_ID = O_ID
220+
AND OL_DELIVERY_D IS NOT NULL
221+
AND O_W_ID=c.c_w_id
222+
AND O_D_ID=c.C_D_ID
223+
AND O_C_ID=c.C_ID) sm, (SELECT sum(h_amount) from history%d
224+
WHERE H_C_W_ID=c.C_W_ID
225+
AND H_C_D_ID=c.C_D_ID
226+
AND H_C_ID=c.C_ID) smh
227+
FROM customer%d c
228+
WHERE c.c_w_id=%d ) t
229+
WHERE c1<>sm-smh]],table_num, table_num, table_num, table_num, warehouse_num))
200230

201231
for i = 1, rs.nrows do
202232
row = rs:fetch_row()
@@ -216,7 +246,11 @@ function check_tables(drv, con, warehouse_num)
216246
local pass12 = 1
217247
for table_num = 1, sysbench.opt.tables do
218248
-- print(string.format("Checking tables: %d for warehouse: %d\n", table_num, warehouse_num))
219-
rs = con:query(string.format("SELECT count(*) FROM (SELECT c.c_id, c.c_d_id, c.c_balance c1, c_ytd_payment, (SELECT sum(ol_amount) FROM orders%d STRAIGHT_JOIN order_line%d WHERE OL_W_ID=O_W_ID AND OL_D_ID = O_D_ID AND OL_O_ID = O_ID AND OL_DELIVERY_D IS NOT NULL AND O_W_ID=c.c_w_id AND O_D_ID=c.C_D_ID AND O_C_ID=c.C_ID) sm FROM customer%d c WHERE c.c_w_id=%d) t1 WHERE c1+c_ytd_payment <> sm " ,table_num, table_num, table_num, warehouse_num))
249+
rs = con:query(string.format([[SELECT count(*) FROM (SELECT c.c_id, c.c_d_id, c.c_balance c1, c_ytd_payment,
250+
(SELECT sum(ol_amount) FROM orders%d ]] .. straight_join_hint .. [[ order_line%d
251+
WHERE OL_W_ID=O_W_ID AND OL_D_ID = O_D_ID AND OL_O_ID = O_ID AND OL_DELIVERY_D IS NOT NULL AND
252+
O_W_ID=c.c_w_id AND O_D_ID=c.C_D_ID AND O_C_ID=c.C_ID) sm FROM customer%d c WHERE c.c_w_id=%d) t1
253+
WHERE c1+c_ytd_payment <> sm ]] ,table_num, table_num, table_num, warehouse_num))
220254

221255
for i = 1, rs.nrows do
222256
row = rs:fetch_row()

tpcc_common.lua

Lines changed: 66 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ ffi = require("ffi")
2222

2323
ffi.cdef[[
2424
void sb_counter_inc(int, sb_counter_type);
25+
typedef uint32_t useconds_t;
26+
int usleep(useconds_t useconds);
2527
]]
2628

2729

@@ -64,8 +66,11 @@ end
6466
function cmd_prepare()
6567
local drv = sysbench.sql.driver()
6668
local con = drv:connect()
69+
local show_query="SHOW TABLES"
6770

68-
con:query("SET FOREIGN_KEY_CHECKS=0")
71+
if drv:name() == "mysql" then
72+
con:query("SET FOREIGN_KEY_CHECKS=0")
73+
end
6974
-- create tables in parallel table per thread
7075
for i = sysbench.tid % sysbench.opt.threads + 1, sysbench.opt.tables,
7176
sysbench.opt.threads do
@@ -74,8 +79,8 @@ function cmd_prepare()
7479

7580
-- make sure all tables are created before we load data
7681
repeat
77-
rs = con:query("SHOW TABLES")
78-
sleep(1)
82+
rs= con:query(show_query)
83+
ffi.C.usleep(1000)
7984
until rs.nrows == sysbench.opt.tables * 9
8085

8186
for i = sysbench.tid % sysbench.opt.threads + 1, sysbench.opt.scale,
@@ -110,18 +115,20 @@ function create_tables(drv, con, table_num)
110115
local engine_def = ""
111116
local extra_table_options = ""
112117
local query
113-
118+
local tinyint_type="smallint"
119+
local datetime_type="timestamp"
120+
114121
if drv:name() == "mysql" or drv:name() == "attachsql" or
115122
drv:name() == "drizzle"
116123
then
117124
engine_def = "/*! ENGINE = " .. sysbench.opt.mysql_storage_engine .. " */"
118125
extra_table_options = sysbench.opt.mysql_table_options or ""
126+
tinyint_type="tinyint"
127+
datetime_type="datetime"
119128
end
120129

121-
122130
print(string.format("Creating tables: %d\n", table_num))
123131

124-
125132
query = string.format([[
126133
CREATE TABLE IF NOT EXISTS warehouse%d (
127134
w_id smallint not null,
@@ -141,7 +148,7 @@ function create_tables(drv, con, table_num)
141148

142149
query = string.format([[
143150
create table IF NOT EXISTS district%d (
144-
d_id tinyint not null,
151+
d_id ]] .. tinyint_type .. [[ not null,
145152
d_w_id smallint not null,
146153
d_name varchar(10),
147154
d_street_1 varchar(20),
@@ -163,7 +170,7 @@ function create_tables(drv, con, table_num)
163170
query = string.format([[
164171
create table IF NOT EXISTS customer%d (
165172
c_id int not null,
166-
c_d_id tinyint not null,
173+
c_d_id ]] .. tinyint_type .. [[ not null,
167174
c_w_id smallint not null,
168175
c_first varchar(16),
169176
c_middle char(2),
@@ -174,7 +181,7 @@ function create_tables(drv, con, table_num)
174181
c_state char(2),
175182
c_zip char(9),
176183
c_phone char(16),
177-
c_since datetime,
184+
c_since ]] .. datetime_type .. [[,
178185
c_credit char(2),
179186
c_credit_lim bigint,
180187
c_discount decimal(4,2),
@@ -194,11 +201,11 @@ function create_tables(drv, con, table_num)
194201
query = string.format([[
195202
create table IF NOT EXISTS history%d (
196203
h_c_id int,
197-
h_c_d_id tinyint,
204+
h_c_d_id ]] .. tinyint_type .. [[,
198205
h_c_w_id smallint,
199-
h_d_id tinyint,
206+
h_d_id ]] .. tinyint_type .. [[,
200207
h_w_id smallint,
201-
h_date datetime,
208+
h_date ]] .. datetime_type .. [[,
202209
h_amount decimal(6,2),
203210
h_data varchar(24)
204211
) %s %s]],
@@ -209,13 +216,13 @@ function create_tables(drv, con, table_num)
209216
query = string.format([[
210217
create table IF NOT EXISTS orders%d (
211218
o_id int not null,
212-
o_d_id tinyint not null,
219+
o_d_id ]] .. tinyint_type .. [[ not null,
213220
o_w_id smallint not null,
214221
o_c_id int,
215-
o_entry_d datetime,
216-
o_carrier_id tinyint,
217-
o_ol_cnt tinyint,
218-
o_all_local tinyint,
222+
o_entry_d ]] .. datetime_type .. [[,
223+
o_carrier_id ]] .. tinyint_type .. [[,
224+
o_ol_cnt ]] .. tinyint_type .. [[,
225+
o_all_local ]] .. tinyint_type .. [[,
219226
PRIMARY KEY(o_w_id, o_d_id, o_id)
220227
) %s %s]],
221228
table_num, engine_def, extra_table_options)
@@ -227,7 +234,7 @@ function create_tables(drv, con, table_num)
227234
query = string.format([[
228235
create table IF NOT EXISTS new_orders%d (
229236
no_o_id int not null,
230-
no_d_id tinyint not null,
237+
no_d_id ]] .. tinyint_type .. [[ not null,
231238
no_w_id smallint not null,
232239
PRIMARY KEY(no_w_id, no_d_id, no_o_id)
233240
) %s %s]],
@@ -238,13 +245,13 @@ function create_tables(drv, con, table_num)
238245
query = string.format([[
239246
create table IF NOT EXISTS order_line%d (
240247
ol_o_id int not null,
241-
ol_d_id tinyint not null,
248+
ol_d_id ]] .. tinyint_type .. [[ not null,
242249
ol_w_id smallint not null,
243-
ol_number tinyint not null,
250+
ol_number ]] .. tinyint_type .. [[ not null,
244251
ol_i_id int,
245252
ol_supply_w_id smallint,
246-
ol_delivery_d datetime,
247-
ol_quantity tinyint,
253+
ol_delivery_d ]] .. datetime_type .. [[,
254+
ol_quantity ]] .. tinyint_type .. [[,
248255
ol_amount decimal(6,2),
249256
ol_dist_info char(24),
250257
PRIMARY KEY(ol_w_id, ol_d_id, ol_o_id, ol_number)
@@ -311,12 +318,12 @@ function create_tables(drv, con, table_num)
311318
con:bulk_insert_done()
312319

313320
print(string.format("Adding indexes %d ... \n", i))
314-
con:query("CREATE INDEX idx_customer ON customer"..i.." (c_w_id,c_d_id,c_last,c_first)")
315-
con:query("CREATE INDEX idx_orders ON orders"..i.." (o_w_id,o_d_id,o_c_id,o_id)")
316-
con:query("CREATE INDEX fkey_stock_2 ON stock"..i.." (s_i_id)")
317-
con:query("CREATE INDEX fkey_order_line_2 ON order_line"..i.." (ol_supply_w_id,ol_i_id)")
318-
con:query("CREATE INDEX fkey_history_1 ON history"..i.." (h_c_w_id,h_c_d_id,h_c_id)")
319-
con:query("CREATE INDEX fkey_history_2 ON history"..i.." (h_w_id,h_d_id )")
321+
con:query("CREATE INDEX idx_customer"..i.." ON customer"..i.." (c_w_id,c_d_id,c_last,c_first)")
322+
con:query("CREATE INDEX idx_orders"..i.." ON orders"..i.." (o_w_id,o_d_id,o_c_id,o_id)")
323+
con:query("CREATE INDEX fkey_stock_2"..i.." ON stock"..i.." (s_i_id)")
324+
con:query("CREATE INDEX fkey_order_line_2"..i.." ON order_line"..i.." (ol_supply_w_id,ol_i_id)")
325+
con:query("CREATE INDEX fkey_history_1"..i.." ON history"..i.." (h_c_w_id,h_c_d_id,h_c_id)")
326+
con:query("CREATE INDEX fkey_history_2"..i.." ON history"..i.." (h_w_id,h_d_id )")
320327
if sysbench.opt.use_fk == 1 then
321328
print(string.format("Adding FK %d ... \n", i))
322329
con:query("ALTER TABLE new_orders"..i.." ADD CONSTRAINT fkey_new_orders_1_"..table_num.." FOREIGN KEY(no_w_id,no_d_id,no_o_id) REFERENCES orders"..i.."(o_w_id,o_d_id,o_id)")
@@ -330,7 +337,6 @@ function create_tables(drv, con, table_num)
330337
con:query("ALTER TABLE stock"..i.." ADD CONSTRAINT fkey_stock_1_"..table_num.." FOREIGN KEY(s_w_id) REFERENCES warehouse"..i.."(w_id)")
331338
con:query("ALTER TABLE stock"..i.." ADD CONSTRAINT fkey_stock_2_"..table_num.." FOREIGN KEY(s_i_id) REFERENCES item"..i.."(i_id)")
332339
end
333-
334340
end
335341

336342

@@ -345,9 +351,7 @@ function set_isolation_level(drv,con)
345351
isolation_level="SERIALIZABLE"
346352
end
347353

348-
rs=con:query("SHOW VARIABLES LIKE 't%_isolation'")
349-
row = rs:fetch_row()
350-
isolation_variable = row[1]
354+
isolation_variable=con:query_row("SHOW VARIABLES LIKE 't%_isolation'")
351355

352356
con:query("SET SESSION " .. isolation_variable .. "='".. isolation_level .."'")
353357
end
@@ -465,7 +469,6 @@ function load_tables(drv, con, warehouse_num)
465469
con:bulk_insert_init("INSERT INTO orders" .. table_num .. [[
466470
(o_id, o_d_id, o_w_id, o_c_id, o_entry_d, o_carrier_id, o_ol_cnt, o_all_local) values]])
467471

468-
469472
a_counts[warehouse_num] = {}
470473

471474
for d_id = 1 , DIST_PER_WARE do
@@ -486,32 +489,6 @@ function load_tables(drv, con, warehouse_num)
486489

487490
con:bulk_insert_done()
488491

489-
con:query(string.format("INSERT INTO new_orders%d (no_o_id, no_d_id, no_w_id) SELECT o_id, o_d_id, o_w_id FROM orders%d WHERE o_id>2100 and o_w_id=%d", table_num, table_num, warehouse_num))
490-
491-
con:bulk_insert_init("INSERT INTO order_line" .. table_num .. [[
492-
(ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_delivery_d,
493-
ol_quantity, ol_amount, ol_dist_info ) values]])
494-
495-
496-
for d_id = 1 , DIST_PER_WARE do
497-
for o_id = 1 , 3000 do
498-
for ol_id = 1, a_counts[warehouse_num][d_id][o_id] do
499-
500-
query = string.format([[(%d, %d, %d, %d, %d, %d, %s, 5, %f, '%s' )]],
501-
o_id, d_id, warehouse_num, ol_id, sysbench.rand.uniform(1, MAXITEMS), warehouse_num,
502-
o_id < 2101 and "NOW()" or "NULL",
503-
o_id < 2101 and 0 or sysbench.rand.uniform_double()*9999.99,
504-
string.rep(sysbench.rand.string("@"),24)
505-
)
506-
con:bulk_insert_next(query)
507-
508-
end
509-
end
510-
end
511-
512-
con:bulk_insert_done()
513-
514-
515492
-- STOCK table
516493

517494
con:bulk_insert_init("INSERT INTO stock" .. table_num ..
@@ -536,8 +513,33 @@ function load_tables(drv, con, warehouse_num)
536513
con:bulk_insert_next(query)
537514

538515
end
539-
con:bulk_insert_done()
540-
end
516+
con:bulk_insert_done()
517+
518+
con:query(string.format("INSERT INTO new_orders%d (no_o_id, no_d_id, no_w_id) SELECT o_id, o_d_id, o_w_id FROM orders%d WHERE o_id>2100 and o_w_id=%d", table_num, table_num, warehouse_num))
519+
520+
con:bulk_insert_init("INSERT INTO order_line" .. table_num .. [[
521+
(ol_o_id, ol_d_id, ol_w_id, ol_number, ol_i_id, ol_supply_w_id, ol_delivery_d,
522+
ol_quantity, ol_amount, ol_dist_info ) values]])
523+
524+
for d_id = 1 , DIST_PER_WARE do
525+
for o_id = 1 , 3000 do
526+
for ol_id = 1, a_counts[warehouse_num][d_id][o_id] do
527+
528+
query = string.format([[(%d, %d, %d, %d, %d, %d, %s, 5, %f, '%s' )]],
529+
o_id, d_id, warehouse_num, ol_id, sysbench.rand.uniform(1, MAXITEMS), warehouse_num,
530+
o_id < 2101 and "NOW()" or "NULL",
531+
o_id < 2101 and 0 or sysbench.rand.uniform_double()*9999.99,
532+
string.rep(sysbench.rand.string("@"),24)
533+
)
534+
res=con:bulk_insert_next(query)
535+
536+
end
537+
end
538+
end
539+
540+
con:bulk_insert_done()
541+
542+
end
541543

542544
end
543545

@@ -556,7 +558,9 @@ function cleanup()
556558
local drv = sysbench.sql.driver()
557559
local con = drv:connect()
558560

559-
con:query("SET FOREIGN_KEY_CHECKS=0")
561+
if drv:name() == "mysql" then
562+
con:query("SET FOREIGN_KEY_CHECKS=0")
563+
end
560564

561565
for i = 1, sysbench.opt.tables do
562566
print(string.format("Dropping tables '%d'...", i))

0 commit comments

Comments
 (0)