Skip to content

Commit 9fef326

Browse files
mdcallaginikep
authored andcommitted
Fix issues 1200 and 1295, add rocksdb_compact_lzero_now global variable (percona#1309)
Upstream commit ID: facebook/mysql-5.6@3ba4f39 PS-8951: Merge percona-202305 (https://jira.percona.com/browse/PS-8951) Summary: This fixes issue 1295 and has a workaround for issue 1200. facebook/mysql-5.6#1200 facebook/mysql-5.6#1295 The fix for issue 1295 is to get the value of the base level from RocksDB rather than assuming that L0 compacts into L1 because L1 might not be the base level when dynamic leveled compaction is used -- in that case the base level can be Ln where n > 1 because L1 isn't needed yet. There are two workarounds for issue 1200. The hacky one is to sleep for 1 second between requesting memtable flush and L0 -> base_level compaction. The alternative is to add a new global variable, rocksdb_compact_lzero_now, that when set will request L0 -> base_level compaction. This allows a client to first set rocksdb_force_flush_memtable_now, wait for that to finish, then set rocksdb_compact_lzero_now. Other changes: * rocksdb_force_flush_memtable_now default value changed to OFF to match what is done for rocksdb_force_flush_memtable_and_lzero_now and rocksdb_compact_lzero_now * confirm that the value to which these variables are set can be parsed, that wasn't done for all of them * don't raise an error when these are set to OFF, that will be a no-op Note: these variables are triggers, an action is taken when this is done: set global var = ON | true | 1 But these variables always show the value 0 (OFF, false). Their value doesn't change. Pull Request resolved: facebook/mysql-5.6#1309 Differential Revision: D45789784 fbshipit-source-id: b5ab4d03a984cd0615ad2a828af80b7389b2508f
1 parent c565561 commit 9fef326

8 files changed

+274
-41
lines changed

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,7 @@ rocksdb_column_default_value_as_expression ON
927927
rocksdb_commit_in_the_middle OFF
928928
rocksdb_commit_time_batch_for_recovery OFF
929929
rocksdb_compact_cf
930+
rocksdb_compact_lzero_now OFF
930931
rocksdb_compaction_readahead_size 0
931932
rocksdb_compaction_sequential_deletes 0
932933
rocksdb_compaction_sequential_deletes_count_sd OFF
@@ -975,7 +976,7 @@ rocksdb_flush_log_at_trx_commit 1
975976
rocksdb_force_compute_memtable_stats ON
976977
rocksdb_force_compute_memtable_stats_cachetime 0
977978
rocksdb_force_flush_memtable_and_lzero_now OFF
978-
rocksdb_force_flush_memtable_now ON
979+
rocksdb_force_flush_memtable_now OFF
979980
rocksdb_force_index_records_in_range 0
980981
rocksdb_ignore_unknown_options ON
981982
rocksdb_index_type kBinarySearch
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
2+
INSERT INTO valid_values VALUES(1);
3+
INSERT INTO valid_values VALUES('on');
4+
INSERT INTO valid_values VALUES('true');
5+
INSERT INTO valid_values VALUES(0);
6+
INSERT INTO valid_values VALUES('off');
7+
INSERT INTO valid_values VALUES('false');
8+
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
9+
SET @start_global_value = @@global.ROCKSDB_COMPACT_LZERO_NOW;
10+
SELECT @start_global_value;
11+
@start_global_value
12+
0
13+
'# Setting to valid values in global scope#'
14+
"Trying to set variable @@global.ROCKSDB_COMPACT_LZERO_NOW to 1"
15+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = 1;
16+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
17+
@@global.ROCKSDB_COMPACT_LZERO_NOW
18+
0
19+
"Setting the global scope variable back to default"
20+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = DEFAULT;
21+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
22+
@@global.ROCKSDB_COMPACT_LZERO_NOW
23+
0
24+
"Trying to set variable @@global.ROCKSDB_COMPACT_LZERO_NOW to on"
25+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = on;
26+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
27+
@@global.ROCKSDB_COMPACT_LZERO_NOW
28+
0
29+
"Setting the global scope variable back to default"
30+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = DEFAULT;
31+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
32+
@@global.ROCKSDB_COMPACT_LZERO_NOW
33+
0
34+
"Trying to set variable @@global.ROCKSDB_COMPACT_LZERO_NOW to true"
35+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = true;
36+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
37+
@@global.ROCKSDB_COMPACT_LZERO_NOW
38+
0
39+
"Setting the global scope variable back to default"
40+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = DEFAULT;
41+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
42+
@@global.ROCKSDB_COMPACT_LZERO_NOW
43+
0
44+
"Trying to set variable @@global.ROCKSDB_COMPACT_LZERO_NOW to 0"
45+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = 0;
46+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
47+
@@global.ROCKSDB_COMPACT_LZERO_NOW
48+
0
49+
"Setting the global scope variable back to default"
50+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = DEFAULT;
51+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
52+
@@global.ROCKSDB_COMPACT_LZERO_NOW
53+
0
54+
"Trying to set variable @@global.ROCKSDB_COMPACT_LZERO_NOW to off"
55+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = off;
56+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
57+
@@global.ROCKSDB_COMPACT_LZERO_NOW
58+
0
59+
"Setting the global scope variable back to default"
60+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = DEFAULT;
61+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
62+
@@global.ROCKSDB_COMPACT_LZERO_NOW
63+
0
64+
"Trying to set variable @@global.ROCKSDB_COMPACT_LZERO_NOW to false"
65+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = false;
66+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
67+
@@global.ROCKSDB_COMPACT_LZERO_NOW
68+
0
69+
"Setting the global scope variable back to default"
70+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = DEFAULT;
71+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
72+
@@global.ROCKSDB_COMPACT_LZERO_NOW
73+
0
74+
"Trying to set variable @@session.ROCKSDB_COMPACT_LZERO_NOW to 444. It should fail because it is not session."
75+
SET @@session.ROCKSDB_COMPACT_LZERO_NOW = 444;
76+
ERROR HY000: Variable 'rocksdb_compact_lzero_now' is a GLOBAL variable and should be set with SET GLOBAL
77+
'# Testing with invalid values in global scope #'
78+
SET @@global.ROCKSDB_COMPACT_LZERO_NOW = @start_global_value;
79+
SELECT @@global.ROCKSDB_COMPACT_LZERO_NOW;
80+
@@global.ROCKSDB_COMPACT_LZERO_NOW
81+
0
82+
DROP TABLE valid_values;
83+
DROP TABLE invalid_values;

mysql-test/suite/rocksdb_sys_vars/r/rocksdb_force_flush_memtable_and_lzero_now_basic.result

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
22
INSERT INTO valid_values VALUES(1);
3-
INSERT INTO valid_values VALUES(0);
43
INSERT INTO valid_values VALUES('on');
4+
INSERT INTO valid_values VALUES('true');
5+
INSERT INTO valid_values VALUES(0);
6+
INSERT INTO valid_values VALUES('off');
7+
INSERT INTO valid_values VALUES('false');
58
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
69
SET @start_global_value = @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
710
SELECT @start_global_value;
@@ -18,6 +21,26 @@ SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = DEFAULT;
1821
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
1922
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
2023
0
24+
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW to on"
25+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = on;
26+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
27+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
28+
0
29+
"Setting the global scope variable back to default"
30+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = DEFAULT;
31+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
32+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
33+
0
34+
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW to true"
35+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = true;
36+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
37+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
38+
0
39+
"Setting the global scope variable back to default"
40+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = DEFAULT;
41+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
42+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
43+
0
2144
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW to 0"
2245
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = 0;
2346
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
@@ -28,8 +51,18 @@ SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = DEFAULT;
2851
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
2952
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
3053
0
31-
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW to on"
32-
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = on;
54+
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW to off"
55+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = off;
56+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
57+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
58+
0
59+
"Setting the global scope variable back to default"
60+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = DEFAULT;
61+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
62+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
63+
0
64+
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW to false"
65+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW = false;
3366
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW;
3467
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_AND_LZERO_NOW
3568
0

mysql-test/suite/rocksdb_sys_vars/r/rocksdb_force_flush_memtable_now_basic.result

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,70 +2,82 @@ CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
22
INSERT INTO valid_values VALUES(1);
33
INSERT INTO valid_values VALUES('on');
44
INSERT INTO valid_values VALUES('true');
5+
INSERT INTO valid_values VALUES(0);
6+
INSERT INTO valid_values VALUES('off');
7+
INSERT INTO valid_values VALUES('false');
58
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
6-
INSERT INTO invalid_values VALUES(0);
7-
INSERT INTO invalid_values VALUES('off');
8-
INSERT INTO invalid_values VALUES('false');
99
SET @start_global_value = @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
1010
SELECT @start_global_value;
1111
@start_global_value
12-
1
12+
0
1313
'# Setting to valid values in global scope#'
1414
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to 1"
1515
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = 1;
1616
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
1717
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
18-
1
18+
0
1919
"Setting the global scope variable back to default"
2020
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = DEFAULT;
2121
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
2222
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
23-
1
23+
0
2424
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to on"
2525
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = on;
2626
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
2727
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
28-
1
28+
0
2929
"Setting the global scope variable back to default"
3030
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = DEFAULT;
3131
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
3232
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
33-
1
33+
0
3434
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to true"
3535
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = true;
3636
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
3737
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
38-
1
38+
0
3939
"Setting the global scope variable back to default"
4040
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = DEFAULT;
4141
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
4242
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
43-
1
44-
"Trying to set variable @@session.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to 444. It should fail because it is not session."
45-
SET @@session.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = 444;
46-
ERROR HY000: Variable 'rocksdb_force_flush_memtable_now' is a GLOBAL variable and should be set with SET GLOBAL
47-
'# Testing with invalid values in global scope #'
43+
0
4844
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to 0"
4945
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = 0;
50-
Got one of the listed errors
5146
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
5247
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
53-
1
48+
0
49+
"Setting the global scope variable back to default"
50+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = DEFAULT;
51+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
52+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
53+
0
5454
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to off"
5555
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = off;
56-
Got one of the listed errors
5756
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
5857
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
59-
1
58+
0
59+
"Setting the global scope variable back to default"
60+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = DEFAULT;
61+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
62+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
63+
0
6064
"Trying to set variable @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to false"
6165
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = false;
62-
Got one of the listed errors
6366
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
6467
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
65-
1
68+
0
69+
"Setting the global scope variable back to default"
70+
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = DEFAULT;
71+
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
72+
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
73+
0
74+
"Trying to set variable @@session.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW to 444. It should fail because it is not session."
75+
SET @@session.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = 444;
76+
ERROR HY000: Variable 'rocksdb_force_flush_memtable_now' is a GLOBAL variable and should be set with SET GLOBAL
77+
'# Testing with invalid values in global scope #'
6678
SET @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW = @start_global_value;
6779
SELECT @@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW;
6880
@@global.ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
69-
1
81+
0
7082
DROP TABLE valid_values;
7183
DROP TABLE invalid_values;
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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('on');
6+
INSERT INTO valid_values VALUES('true');
7+
INSERT INTO valid_values VALUES(0);
8+
INSERT INTO valid_values VALUES('off');
9+
INSERT INTO valid_values VALUES('false');
10+
11+
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
12+
13+
--let $sys_var=ROCKSDB_COMPACT_LZERO_NOW
14+
--let $read_only=0
15+
--let $session=0
16+
--let $sticky=1
17+
--source ../include/rocksdb_sys_var.inc
18+
19+
DROP TABLE valid_values;
20+
DROP TABLE invalid_values;

mysql-test/suite/rocksdb_sys_vars/t/rocksdb_force_flush_memtable_and_lzero_now_basic.test

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33

44
CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
55
INSERT INTO valid_values VALUES(1);
6-
INSERT INTO valid_values VALUES(0);
76
INSERT INTO valid_values VALUES('on');
7+
INSERT INTO valid_values VALUES('true');
8+
INSERT INTO valid_values VALUES(0);
9+
INSERT INTO valid_values VALUES('off');
10+
INSERT INTO valid_values VALUES('false');
811

912
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
1013

mysql-test/suite/rocksdb_sys_vars/t/rocksdb_force_flush_memtable_now_basic.test

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ CREATE TABLE valid_values (value varchar(255)) ENGINE=myisam;
55
INSERT INTO valid_values VALUES(1);
66
INSERT INTO valid_values VALUES('on');
77
INSERT INTO valid_values VALUES('true');
8+
INSERT INTO valid_values VALUES(0);
9+
INSERT INTO valid_values VALUES('off');
10+
INSERT INTO valid_values VALUES('false');
811

912
CREATE TABLE invalid_values (value varchar(255)) ENGINE=myisam;
10-
INSERT INTO invalid_values VALUES(0);
11-
INSERT INTO invalid_values VALUES('off');
12-
INSERT INTO invalid_values VALUES('false');
1313

1414
--let $sys_var=ROCKSDB_FORCE_FLUSH_MEMTABLE_NOW
1515
--let $read_only=0

0 commit comments

Comments
 (0)