Skip to content

Commit 398d39d

Browse files
bladepaninikep
authored andcommitted
ensure bulk load data to LMAX using sstPartitioner
Summary: - register custom SstPartitionerFactory to rocksdb - on bulk load, register index number used to the SstPartitionerFactory - on compaction, SstPartitionerFactory create SstParitioner that will split sst files with keys overlapping with bulk load indexes - on bulk load completion, trigger a compaction when sst file ingestion fails and retry Reviewed By: hermanlee Differential Revision: D41586846 fbshipit-source-id: fc33994a58636a1d3baf00607c3e7d2d517545a9
1 parent e656659 commit 398d39d

15 files changed

+762
-12
lines changed

mysql-test/suite/rocksdb/r/add_index_inplace.result

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,6 +298,7 @@ rocksdb_bulk_load_allow_unsorted OFF
298298
rocksdb_bulk_load_fail_if_not_bottommost_level OFF
299299
rocksdb_bulk_load_partial_index ON
300300
rocksdb_bulk_load_size 1000
301+
rocksdb_bulk_load_use_sst_partitioner OFF
301302
show session variables like 'rocksdb_bulk_load%';
302303
Variable_name Value
303304
rocksdb_bulk_load ON
@@ -306,6 +307,7 @@ rocksdb_bulk_load_allow_unsorted OFF
306307
rocksdb_bulk_load_fail_if_not_bottommost_level OFF
307308
rocksdb_bulk_load_partial_index ON
308309
rocksdb_bulk_load_size 1000
310+
rocksdb_bulk_load_use_sst_partitioner OFF
309311
CREATE TABLE t1 (i INT, j INT, PRIMARY KEY (i)) ENGINE = ROCKSDB;
310312
INSERT INTO t1 VALUES (1,1);
311313
# Disconnecting on con1
@@ -352,6 +354,7 @@ rocksdb_bulk_load_allow_unsorted OFF
352354
rocksdb_bulk_load_fail_if_not_bottommost_level OFF
353355
rocksdb_bulk_load_partial_index ON
354356
rocksdb_bulk_load_size 1000
357+
rocksdb_bulk_load_use_sst_partitioner OFF
355358
CREATE TABLE t1 (a VARCHAR(30)) ENGINE=RocksDB;
356359
INSERT INTO t1 (a) VALUES (REPEAT("a", 30));
357360
INSERT INTO t1 (a) VALUES (REPEAT("a", 30));
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
SET rocksdb_bulk_load_use_sst_partitioner=0;
2+
SET rocksdb_bulk_load_fail_if_not_bottommost_level=1;
3+
SET rocksdb_bulk_load_allow_sk=1;
4+
CREATE TABLE t1(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
5+
CREATE TABLE t2(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
6+
CREATE TABLE t3(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
7+
SET rocksdb_bulk_load=1;
8+
INSERT INTO t1 VALUES (1, 1, 1), (2, 1, 1), (3, 2, 1);
9+
INSERT INTO t3 VALUES (1, 1, 3), (2, 1, 3), (3, 2, 3);
10+
SET rocksdb_bulk_load=0;
11+
set global rocksdb_compact_cf="";
12+
set global rocksdb_compact_cf="rev:cf1";
13+
SET rocksdb_bulk_load=1;
14+
INSERT INTO t2 VALUES(1, 1, 2);
15+
INSERT INTO t2 VALUES(2, 1, 2);
16+
INSERT INTO t2 VALUES(3, 2, 2);
17+
SET rocksdb_bulk_load=0;
18+
ERROR HY000: [(null)] bulk load error: Operation failed. Try again.: Files cannot be ingested to Lmax. Please make sure key range of Lmax and ongoing compaction's output to Lmaxdoes not overlap with files to ingest.
19+
select * from t2;
20+
a b c
21+
SET rocksdb_bulk_load_use_sst_partitioner=1;
22+
CREATE TABLE t4(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
23+
CREATE TABLE t5(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
24+
CREATE TABLE t6(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
25+
SET rocksdb_bulk_load=1;
26+
INSERT INTO t4 VALUES (1, 1, 4), (2, 1, 4), (3, 2, 4);
27+
INSERT INTO t6 VALUES (1, 1, 6), (2, 1, 6), (3, 2, 6);
28+
SET rocksdb_bulk_load=0;
29+
set global rocksdb_compact_cf="";
30+
set global rocksdb_compact_cf="rev:cf1";
31+
SET rocksdb_bulk_load=1;
32+
INSERT INTO t5 VALUES(1, 1, 5);
33+
INSERT INTO t5 VALUES(2, 1, 5);
34+
INSERT INTO t5 VALUES(3, 2, 5);
35+
SET rocksdb_bulk_load=0;
36+
select * from t5;
37+
a b c
38+
1 1 5
39+
2 1 5
40+
3 2 5
41+
drop table t1, t2, t3, t4, t5, t6;

mysql-test/suite/rocksdb/r/rocksdb.result

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,7 @@ rocksdb_bulk_load_allow_unsorted OFF
913913
rocksdb_bulk_load_fail_if_not_bottommost_level OFF
914914
rocksdb_bulk_load_partial_index ON
915915
rocksdb_bulk_load_size 1000
916+
rocksdb_bulk_load_use_sst_partitioner OFF
916917
rocksdb_bytes_per_sync 0
917918
rocksdb_cache_dump ON
918919
rocksdb_cache_high_pri_pool_ratio 0.000000
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# test cases verify the features that ensure the bulk load sst files
2+
# will be placed in rocksdb bottommost level
3+
--source include/have_rocksdb.inc
4+
--source include/count_sessions.inc
5+
6+
--disable_query_log
7+
call mtr.add_suppression("failed to bulk load. status code = 13, status = Operation failed. Try again.");
8+
call mtr.add_suppression("Error 504 finalizing last SST file while setting bulk loading variable");
9+
--enable_query_log
10+
11+
# test case:
12+
# verify bulk load fail when bottommost lvl has sst file with overlap key range
13+
SET rocksdb_bulk_load_use_sst_partitioner=0;
14+
SET rocksdb_bulk_load_fail_if_not_bottommost_level=1;
15+
SET rocksdb_bulk_load_allow_sk=1;
16+
17+
# index numbers in t2 will be greater than index number in t1 and less than
18+
# index numbers in t3
19+
CREATE TABLE t1(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
20+
CREATE TABLE t2(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
21+
CREATE TABLE t3(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
22+
23+
SET rocksdb_bulk_load=1;
24+
INSERT INTO t1 VALUES (1, 1, 1), (2, 1, 1), (3, 2, 1);
25+
INSERT INTO t3 VALUES (1, 1, 3), (2, 1, 3), (3, 2, 3);
26+
SET rocksdb_bulk_load=0;
27+
28+
# compact the LMAX sst files created in the bulk load before
29+
set global rocksdb_compact_cf="";
30+
set global rocksdb_compact_cf="rev:cf1";
31+
32+
SET rocksdb_bulk_load=1;
33+
INSERT INTO t2 VALUES(1, 1, 2);
34+
INSERT INTO t2 VALUES(2, 1, 2);
35+
INSERT INTO t2 VALUES(3, 2, 2);
36+
37+
# verify we get an error
38+
--error ER_UNKNOWN_ERROR
39+
SET rocksdb_bulk_load=0;
40+
41+
# verify data not loaded to db
42+
select * from t2;
43+
44+
# test case:
45+
# same as previous test case, except rocksdb_bulk_load_use_sst_partitioner
46+
# is set
47+
SET rocksdb_bulk_load_use_sst_partitioner=1;
48+
49+
CREATE TABLE t4(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
50+
CREATE TABLE t5(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
51+
CREATE TABLE t6(a INT, b INT, c INT, PRIMARY KEY(a), KEY k1(b, c), KEY k2(c) COMMENT 'cfname=rev:cf1') ENGINE=ROCKSDB;
52+
53+
SET rocksdb_bulk_load=1;
54+
INSERT INTO t4 VALUES (1, 1, 4), (2, 1, 4), (3, 2, 4);
55+
INSERT INTO t6 VALUES (1, 1, 6), (2, 1, 6), (3, 2, 6);
56+
SET rocksdb_bulk_load=0;
57+
58+
# compact the LMAX sst files created in the bulk load before
59+
set global rocksdb_compact_cf="";
60+
set global rocksdb_compact_cf="rev:cf1";
61+
62+
SET rocksdb_bulk_load=1;
63+
INSERT INTO t5 VALUES(1, 1, 5);
64+
INSERT INTO t5 VALUES(2, 1, 5);
65+
INSERT INTO t5 VALUES(3, 2, 5);
66+
67+
# now there is no error
68+
SET rocksdb_bulk_load=0;
69+
70+
# verify data loaded to db
71+
select * from t5;
72+
73+
# clean up
74+
drop table t1, t2, t3, t4, t5, t6;
75+
76+
--let SEARCH_FILE=$MYSQLTEST_VARDIR/log/mysqld.1.err
77+
--let SEARCH_PATTERN=MyRocks: failed to bulk load, retry with compaction.
78+
--source include/search_pattern_in_file.inc
79+
80+
--source include/wait_until_count_sessions.inc
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
2+
INSERT INTO valid_values VALUES(1);
3+
INSERT INTO valid_values VALUES(0);
4+
INSERT INTO valid_values VALUES('on');
5+
INSERT INTO valid_values VALUES('off');
6+
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
7+
INSERT INTO invalid_values VALUES('\'aaa\'');
8+
INSERT INTO invalid_values VALUES('\'bbb\'');
9+
SET @start_global_value = @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
10+
SELECT @start_global_value;
11+
@start_global_value
12+
0
13+
SET @start_session_value = @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
14+
SELECT @start_session_value;
15+
@start_session_value
16+
0
17+
'# Setting to valid values in global scope#'
18+
"Trying to set variable @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to 1"
19+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = 1;
20+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
21+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
22+
1
23+
"Setting the global scope variable back to default"
24+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
25+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
26+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
27+
0
28+
"Trying to set variable @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to 0"
29+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = 0;
30+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
31+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
32+
0
33+
"Setting the global scope variable back to default"
34+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
35+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
36+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
37+
0
38+
"Trying to set variable @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to on"
39+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = on;
40+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
41+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
42+
1
43+
"Setting the global scope variable back to default"
44+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
45+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
46+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
47+
0
48+
"Trying to set variable @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to off"
49+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = off;
50+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
51+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
52+
0
53+
"Setting the global scope variable back to default"
54+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
55+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
56+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
57+
0
58+
'# Setting to valid values in session scope#'
59+
"Trying to set variable @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to 1"
60+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = 1;
61+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
62+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
63+
1
64+
"Setting the session scope variable back to default"
65+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
66+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
67+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
68+
0
69+
"Trying to set variable @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to 0"
70+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = 0;
71+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
72+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
73+
0
74+
"Setting the session scope variable back to default"
75+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
76+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
77+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
78+
0
79+
"Trying to set variable @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to on"
80+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = on;
81+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
82+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
83+
1
84+
"Setting the session scope variable back to default"
85+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
86+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
87+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
88+
0
89+
"Trying to set variable @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to off"
90+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = off;
91+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
92+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
93+
0
94+
"Setting the session scope variable back to default"
95+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = DEFAULT;
96+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
97+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
98+
0
99+
'# Testing with invalid values in global scope #'
100+
"Trying to set variable @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to 'aaa'"
101+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = 'aaa';
102+
Got one of the listed errors
103+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
104+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
105+
0
106+
"Trying to set variable @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER to 'bbb'"
107+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = 'bbb';
108+
Got one of the listed errors
109+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
110+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
111+
0
112+
SET @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = @start_global_value;
113+
SELECT @@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
114+
@@global.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
115+
0
116+
SET @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER = @start_session_value;
117+
SELECT @@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER;
118+
@@session.ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
119+
0
120+
DROP TABLE valid_values;
121+
DROP TABLE invalid_values;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--source include/have_rocksdb.inc
2+
3+
CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
4+
INSERT INTO valid_values VALUES(1);
5+
INSERT INTO valid_values VALUES(0);
6+
INSERT INTO valid_values VALUES('on');
7+
INSERT INTO valid_values VALUES('off');
8+
9+
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
10+
INSERT INTO invalid_values VALUES('\'aaa\'');
11+
INSERT INTO invalid_values VALUES('\'bbb\'');
12+
13+
--let $sys_var=ROCKSDB_BULK_LOAD_USE_SST_PARTITIONER
14+
--let $read_only=0
15+
--let $session=1
16+
--source ../include/rocksdb_sys_var.inc
17+
18+
DROP TABLE valid_values;
19+
DROP TABLE invalid_values;

storage/rocksdb/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,7 @@ SET(ROCKSDB_SOURCES
349349
logger.h
350350
rdb_datadic.cc rdb_datadic.h
351351
rdb_iterator.cc rdb_iterator.h
352+
rdb_sst_partitioner_factory.h
352353
rdb_cf_options.cc rdb_cf_options.h
353354
rdb_cf_manager.cc rdb_cf_manager.h
354355
rdb_converter.cc rdb_converter.h

0 commit comments

Comments
 (0)