1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-07 00:04:31 +03:00

MDEV-12933 sort out the compression library chaos

bzip2/lz4/lzma/lzo/snappy compression is now provided via *services*

they're almost like normal services, but in include/providers/
and they're supposed to provide exactly the same interface
as original compression libraries (but not everything,
only enough of if for the code to compile).

the services are implemented via dummy functions that return
corresponding error values (LZMA_PROG_ERROR, LZO_E_INTERNAL_ERROR, etc).

the actual compression libraries are linked into corresponding
provider plugins. Providers are daemon plugins that when loaded
replace service pointers to point to actual compression functions.

That is, run-time dependency on compression libraries is now on plugins,
and the server doesn't need any compression libraries to run, but
will automatically support the compression when a plugin is loaded.

InnoDB and Mroonga use compression plugins now. RocksDB doesn't,
because it comes with standalone utility binaries that cannot
load plugins.
This commit is contained in:
Kartik Soneji
2021-08-31 14:09:47 +02:00
committed by Sergei Golubchik
parent c356714d77
commit bf8b699f64
94 changed files with 1958 additions and 455 deletions

View File

@@ -0,0 +1,23 @@
--- suite/plugins/r/compression.result
+++ suite/plugins/r/compression.reject
@@ -1,9 +1,9 @@
#
-# Testing bzip2 compression provider with innodb
+# Testing lz4 compression provider with innodb
#
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
-set global innodb_compression_algorithm = bzip2;
+set global innodb_compression_algorithm = lz4;
call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+) \\(\\d\\), which is not currently loaded. Please load the '\\1' provider plugin to open the table.");
create table t1 (a int, b text ) engine = innodb page_compressed = 1;
@@ -14,7 +14,7 @@
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
-# restart: --disable-provider-bzip2
+# restart: --disable-provider-lz4
select a, left(b, 9), length(b) from t1;
ERROR 42S02: Table 'test.t1' doesn't exist in engine
drop table t1;

View File

@@ -0,0 +1,23 @@
--- suite/plugins/r/compression.result
+++ suite/plugins/r/compression.reject
@@ -1,9 +1,9 @@
#
-# Testing bzip2 compression provider with innodb
+# Testing lzma compression provider with innodb
#
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
-set global innodb_compression_algorithm = bzip2;
+set global innodb_compression_algorithm = lzma;
call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+) \\(\\d\\), which is not currently loaded. Please load the '\\1' provider plugin to open the table.");
create table t1 (a int, b text ) engine = innodb page_compressed = 1;
@@ -14,7 +14,7 @@
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
-# restart: --disable-provider-bzip2
+# restart: --disable-provider-lzma
select a, left(b, 9), length(b) from t1;
ERROR 42S02: Table 'test.t1' doesn't exist in engine
drop table t1;

View File

@@ -0,0 +1,23 @@
--- suite/plugins/r/compression.result
+++ suite/plugins/r/compression.reject
@@ -1,9 +1,9 @@
#
-# Testing bzip2 compression provider with innodb
+# Testing lzo compression provider with innodb
#
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
-set global innodb_compression_algorithm = bzip2;
+set global innodb_compression_algorithm = lzo;
call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+) \\(\\d\\), which is not currently loaded. Please load the '\\1' provider plugin to open the table.");
create table t1 (a int, b text ) engine = innodb page_compressed = 1;
@@ -14,7 +14,7 @@
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
-# restart: --disable-provider-bzip2
+# restart: --disable-provider-lzo
select a, left(b, 9), length(b) from t1;
ERROR 42S02: Table 'test.t1' doesn't exist in engine
drop table t1;

View File

@@ -0,0 +1,23 @@
--- suite/plugins/r/compression.result
+++ suite/plugins/r/compression.reject
@@ -1,9 +1,9 @@
#
-# Testing bzip2 compression provider with innodb
+# Testing snappy compression provider with innodb
#
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
-set global innodb_compression_algorithm = bzip2;
+set global innodb_compression_algorithm = snappy;
call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+) \\(\\d\\), which is not currently loaded. Please load the '\\1' provider plugin to open the table.");
create table t1 (a int, b text ) engine = innodb page_compressed = 1;
@@ -14,7 +14,7 @@
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
-# restart: --disable-provider-bzip2
+# restart: --disable-provider-snappy
select a, left(b, 9), length(b) from t1;
ERROR 42S02: Table 'test.t1' doesn't exist in engine
drop table t1;

View File

@@ -0,0 +1,40 @@
--- suite/plugins/r/compression.result
+++ suite/plugins/r/compression.reject
@@ -1,12 +1,8 @@
#
-# Testing bzip2 compression provider with innodb
+# Testing lz4 compression provider with mroonga
#
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
-set global innodb_compression_algorithm = bzip2;
-call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
-call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
-call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
-create table t1 (a int, b text ) engine = innodb page_compressed = 1;
+create table t1 (a int, b text COMMENT 'FLAGS "COLUMN_SCALAR|COMPRESS_LZ4"') engine = mroonga charset = utf8;
insert t1 (a, b) values (0, repeat("abc", 100));
insert t1 (a, b) values (1, repeat("def", 1000));
insert t1 (a, b) values (2, repeat("ghi", 10000));
@@ -14,8 +11,20 @@
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
-# restart: --disable-provider-bzip2
+# restart: --disable-provider-lz4
select a, left(b, 9), length(b) from t1;
-ERROR 42S02: Table 'test.t1' doesn't exist in engine
+a left(b, 9) length(b)
+0 0
+1 0
+2 0
+Warnings:
+Warning 4185 MariaDB tried to use the LZ4 compression, but its provider plugin is not loaded
+select a, left(b, 9), length(b) from t1;
+a left(b, 9) length(b)
+0 0
+1 0
+2 0
+Warnings:
+Warning 4185 MariaDB tried to use the LZ4 compression, but its provider plugin is not loaded
drop table t1;
# restart

View File

@@ -0,0 +1,22 @@
#
# Testing bzip2 compression provider with innodb
#
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
set global innodb_compression_algorithm = bzip2;
call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
create table t1 (a int, b text ) engine = innodb page_compressed = 1;
insert t1 (a, b) values (0, repeat("abc", 100));
insert t1 (a, b) values (1, repeat("def", 1000));
insert t1 (a, b) values (2, repeat("ghi", 10000));
select a, left(b, 9), length(b) from t1;
a left(b, 9) length(b)
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
# restart: --disable-provider-bzip2
select a, left(b, 9), length(b) from t1;
ERROR 42S02: Table 'test.t1' doesn't exist in engine
drop table t1;
# restart

View File

@@ -0,0 +1,31 @@
select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
plugin_name plugin_status
set global innodb_compression_algorithm = lz4;
ERROR 42000: Variable 'innodb_compression_algorithm' can't be set to the value of 'lz4'
install plugin provider_lz4 soname 'provider_lz4';
select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
plugin_name plugin_status
provider_lz4 ACTIVE
set global innodb_compression_algorithm = lz4;
create table t1 (a int, b text) engine=innodb page_compressed=1;
insert t1 (a, b) values (0, repeat("abc", 100));
insert t1 (a, b) values (1, repeat("def", 1000));
insert t1 (a, b) values (2, repeat("ghi", 10000));
select a, left(b, 9), length(b) from t1;
a left(b, 9) length(b)
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
uninstall plugin provider_lz4;
select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
plugin_name plugin_status
provider_lz4 INACTIVE
set global innodb_compression_algorithm = default;
set global innodb_compression_algorithm = lz4;
set global innodb_compression_algorithm = default;
select a, left(b, 9), length(b) from t1;
a left(b, 9) length(b)
0 abcabcabc 300
1 defdefdef 3000
2 ghighighi 30000
drop table t1;

View File

@@ -0,0 +1,29 @@
[innodb-bzip2]
innodb
plugin-load-add=$PROVIDER_BZIP2_SO
loose-provider-bzip2
[innodb-lz4]
innodb
plugin-load-add=$PROVIDER_LZ4_SO
loose-provider-lz4
[innodb-lzma]
innodb
plugin-load-add=$PROVIDER_LZMA_SO
loose-provider-lzma
[innodb-lzo]
innodb
plugin-load-add=$PROVIDER_LZO_SO
loose-provider-lzo
[innodb-snappy]
innodb
plugin-load-add=$PROVIDER_SNAPPY_SO
loose-provider-snappy
[mroonga-lz4]
plugin-load-add=$HA_MROONGA_SO
plugin-load-add=$PROVIDER_LZ4_SO
loose-provider-lz4

View File

@@ -0,0 +1,52 @@
let $engine=`select regexp_replace('$MTR_COMBINATIONS', '-.*', '')`;
let $alg=`select regexp_replace('$MTR_COMBINATIONS', '.*-', '')`;
if (`select count(*) = 0 from information_schema.plugins where plugin_name = '$engine' and plugin_status='active'`)
{
skip Needs $engine engine;
}
if (`select count(*) = 0 from information_schema.plugins where plugin_name = 'provider_$alg' and plugin_status='active'`)
{
skip Needs provider_$alg plugin;
}
--echo #
--echo # Testing $alg compression provider with $engine
--echo #
call mtr.add_suppression("MariaDB tried to use the .+ compression, but its provider plugin is not loaded");
if ($engine == "innodb") {
eval set global innodb_compression_algorithm = $alg;
let $table_params = page_compressed = 1;
call mtr.add_suppression("InnoDB: Background Page read failed to read or decrypt \\[page id: space=\\d+, page number=\\d+\\]");
call mtr.add_suppression("InnoDB: Failed to read page \\d+ from file './test/t1.ibd': Table is encrypted but decrypt failed");
call mtr.add_suppression("InnoDB: Table `test`.`t1` is compressed with (\\w+), which is not currently loaded. Please load the \\1 provider plugin to open the table");
}
if ($engine == "mroonga") {
let $column_params = `select upper('COMMENT \'flags "COLUMN_SCALAR|COMPRESS_$alg"\'')`;
let $table_params = charset = utf8;
}
eval create table t1 (a int, b text $column_params) engine = $engine $table_params;
insert t1 (a, b) values (0, repeat("abc", 100));
insert t1 (a, b) values (1, repeat("def", 1000));
insert t1 (a, b) values (2, repeat("ghi", 10000));
select a, left(b, 9), length(b) from t1;
let $restart_parameters = --disable-provider-$alg;
source include/restart_mysqld.inc;
if ($engine == "innodb") {
error ER_NO_SUCH_TABLE_IN_ENGINE;
select a, left(b, 9), length(b) from t1;
}
if ($engine == "mroonga"){
select a, left(b, 9), length(b) from t1;
select a, left(b, 9), length(b) from t1; # a warning once per statement
}
drop table t1;
let $restart_parameters =;
source include/restart_mysqld.inc;

View File

@@ -0,0 +1,24 @@
source include/have_innodb.inc;
if (!$PROVIDER_LZ4_SO) {
skip Requires provider_lz4 plugin;
}
select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
--error ER_WRONG_VALUE_FOR_VAR
set global innodb_compression_algorithm = lz4;
install plugin provider_lz4 soname 'provider_lz4';
select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
set global innodb_compression_algorithm = lz4;
create table t1 (a int, b text) engine=innodb page_compressed=1;
insert t1 (a, b) values (0, repeat("abc", 100));
insert t1 (a, b) values (1, repeat("def", 1000));
insert t1 (a, b) values (2, repeat("ghi", 10000));
select a, left(b, 9), length(b) from t1;
uninstall plugin provider_lz4;
select plugin_name, plugin_status from information_schema.plugins where plugin_name='provider_lz4';
set global innodb_compression_algorithm = default;
set global innodb_compression_algorithm = lz4;
set global innodb_compression_algorithm = default;
select a, left(b, 9), length(b) from t1;
drop table t1;