mariadb: 10.5.26, 10.6.19, 10.11.9, 11.4.3 (#334878)
* mariadb: 10.5.26, 10.6.19, 10.11.9, 11.4.3 * nixos/tests/automysqlbackup: nixfmt * nixos/automysqlbackup: fix tests * nixos/tests/mariadb-galera: nixfmt * nixos/tests/mariadb-galera: fix test failing with new default IPv6 configuration
This commit is contained in:
parent
848b7926cd
commit
32cc042368
@ -118,15 +118,6 @@ in
|
|||||||
name = user;
|
name = user;
|
||||||
ensurePermissions = {
|
ensurePermissions = {
|
||||||
"*.*" = "SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT";
|
"*.*" = "SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, EVENT";
|
||||||
|
|
||||||
# https://forums.mysql.com/read.php?10,668311,668315#msg-668315
|
|
||||||
"function sys.extract_table_from_file_name" = "execute";
|
|
||||||
"function sys.format_path" = "execute";
|
|
||||||
"function sys.format_statement" = "execute";
|
|
||||||
"function sys.extract_schema_from_file_name" = "execute";
|
|
||||||
"function sys.ps_thread_account" = "execute";
|
|
||||||
"function sys.format_time" = "execute";
|
|
||||||
"function sys.format_bytes" = "execute";
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
system ? builtins.currentSystem,
|
system ? builtins.currentSystem,
|
||||||
config ? {},
|
config ? { },
|
||||||
pkgs ? import ../../.. { inherit system config; },
|
pkgs ? import ../../.. { inherit system config; },
|
||||||
lib ? pkgs.lib
|
lib ? pkgs.lib,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
@ -11,240 +11,263 @@ let
|
|||||||
makeTest = import ./../make-test-python.nix;
|
makeTest = import ./../make-test-python.nix;
|
||||||
|
|
||||||
# Common user configuration
|
# Common user configuration
|
||||||
makeGaleraTest = {
|
makeGaleraTest =
|
||||||
mariadbPackage,
|
{
|
||||||
name ? mkTestName mariadbPackage,
|
mariadbPackage,
|
||||||
galeraPackage ? pkgs.mariadb-galera
|
name ? mkTestName mariadbPackage,
|
||||||
}: makeTest {
|
galeraPackage ? pkgs.mariadb-galera,
|
||||||
name = "${name}-galera-mariabackup";
|
}:
|
||||||
meta = {
|
makeTest {
|
||||||
maintainers = with lib.maintainers; [ izorkin ] ++ lib.teams.helsinki-systems.members;
|
name = "${name}-galera-mariabackup";
|
||||||
|
meta = {
|
||||||
|
maintainers = with lib.maintainers; [ izorkin ] ++ lib.teams.helsinki-systems.members;
|
||||||
|
};
|
||||||
|
|
||||||
|
# The test creates a Galera cluster with 3 nodes and is checking if mariabackup-based SST works. The cluster is tested by creating a DB and an empty table on one node,
|
||||||
|
# and checking the table's presence on the other node.
|
||||||
|
nodes =
|
||||||
|
let
|
||||||
|
mkGaleraNode =
|
||||||
|
{
|
||||||
|
id,
|
||||||
|
method,
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
address = "192.168.1.${toString id}";
|
||||||
|
isFirstClusterNode = id == 1 || id == 4;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
users = {
|
||||||
|
users.testuser = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = "testusers";
|
||||||
|
};
|
||||||
|
groups.testusers = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
interfaces.eth1 = {
|
||||||
|
ipv4.addresses = [
|
||||||
|
{
|
||||||
|
inherit address;
|
||||||
|
prefixLength = 24;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
ipv6.addresses = lib.mkForce [ ];
|
||||||
|
};
|
||||||
|
extraHosts = lib.concatMapStringsSep "\n" (i: "192.168.1.${toString i} galera_0${toString i}") (
|
||||||
|
lib.range 1 6
|
||||||
|
);
|
||||||
|
firewall.allowedTCPPorts = [
|
||||||
|
3306
|
||||||
|
4444
|
||||||
|
4567
|
||||||
|
4568
|
||||||
|
];
|
||||||
|
firewall.allowedUDPPorts = [ 4567 ];
|
||||||
|
};
|
||||||
|
systemd.services.mysql = with pkgs; {
|
||||||
|
path = with pkgs; [
|
||||||
|
bash
|
||||||
|
gawk
|
||||||
|
gnutar
|
||||||
|
gzip
|
||||||
|
inetutils
|
||||||
|
iproute2
|
||||||
|
netcat
|
||||||
|
procps
|
||||||
|
pv
|
||||||
|
rsync
|
||||||
|
socat
|
||||||
|
stunnel
|
||||||
|
which
|
||||||
|
];
|
||||||
|
};
|
||||||
|
services.mysql = {
|
||||||
|
enable = true;
|
||||||
|
package = mariadbPackage;
|
||||||
|
ensureDatabases = lib.mkIf isFirstClusterNode [ "testdb" ];
|
||||||
|
ensureUsers = lib.mkIf isFirstClusterNode [
|
||||||
|
{
|
||||||
|
name = "testuser";
|
||||||
|
ensurePermissions = {
|
||||||
|
"testdb.*" = "ALL PRIVILEGES";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
initialScript = lib.mkIf isFirstClusterNode (
|
||||||
|
pkgs.writeText "mariadb-init.sql" ''
|
||||||
|
GRANT ALL PRIVILEGES ON *.* TO 'check_repl'@'localhost' IDENTIFIED BY 'check_pass' WITH GRANT OPTION;
|
||||||
|
FLUSH PRIVILEGES;
|
||||||
|
''
|
||||||
|
);
|
||||||
|
settings = {
|
||||||
|
mysqld = {
|
||||||
|
bind_address = "0.0.0.0";
|
||||||
|
};
|
||||||
|
galera = {
|
||||||
|
wsrep_on = "ON";
|
||||||
|
wsrep_debug = "NONE";
|
||||||
|
wsrep_retry_autocommit = "3";
|
||||||
|
wsrep_provider = "${galeraPackage}/lib/galera/libgalera_smm.so";
|
||||||
|
wsrep_cluster_address =
|
||||||
|
"gcomm://"
|
||||||
|
+ lib.optionalString (id == 2 || id == 3) "galera_01,galera_02,galera_03"
|
||||||
|
+ lib.optionalString (id == 5 || id == 6) "galera_04,galera_05,galera_06";
|
||||||
|
wsrep_cluster_name = "galera";
|
||||||
|
wsrep_node_address = address;
|
||||||
|
wsrep_node_name = "galera_0${toString id}";
|
||||||
|
wsrep_sst_method = method;
|
||||||
|
wsrep_sst_auth = "check_repl:check_pass";
|
||||||
|
binlog_format = "ROW";
|
||||||
|
enforce_storage_engine = "InnoDB";
|
||||||
|
innodb_autoinc_lock_mode = "2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
galera_01 = mkGaleraNode {
|
||||||
|
id = 1;
|
||||||
|
method = "mariabackup";
|
||||||
|
};
|
||||||
|
|
||||||
|
galera_02 = mkGaleraNode {
|
||||||
|
id = 2;
|
||||||
|
method = "mariabackup";
|
||||||
|
};
|
||||||
|
|
||||||
|
galera_03 = mkGaleraNode {
|
||||||
|
id = 3;
|
||||||
|
method = "mariabackup";
|
||||||
|
};
|
||||||
|
|
||||||
|
galera_04 = mkGaleraNode {
|
||||||
|
id = 4;
|
||||||
|
method = "rsync";
|
||||||
|
};
|
||||||
|
|
||||||
|
galera_05 = mkGaleraNode {
|
||||||
|
id = 5;
|
||||||
|
method = "rsync";
|
||||||
|
};
|
||||||
|
|
||||||
|
galera_06 = mkGaleraNode {
|
||||||
|
id = 6;
|
||||||
|
method = "rsync";
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = ''
|
||||||
|
galera_01.start()
|
||||||
|
galera_01.wait_for_unit("mysql")
|
||||||
|
galera_01.wait_for_open_port(3306)
|
||||||
|
galera_01.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
||||||
|
)
|
||||||
|
galera_01.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (37);'"
|
||||||
|
)
|
||||||
|
galera_02.start()
|
||||||
|
galera_02.wait_for_unit("mysql")
|
||||||
|
galera_02.wait_for_open_port(3306)
|
||||||
|
galera_03.start()
|
||||||
|
galera_03.wait_for_unit("mysql")
|
||||||
|
galera_03.wait_for_open_port(3306)
|
||||||
|
galera_02.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
|
||||||
|
)
|
||||||
|
galera_02.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
||||||
|
)
|
||||||
|
galera_02.succeed("systemctl stop mysql")
|
||||||
|
galera_01.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (38);'"
|
||||||
|
)
|
||||||
|
galera_03.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
||||||
|
)
|
||||||
|
galera_01.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (39);'"
|
||||||
|
)
|
||||||
|
galera_02.succeed("systemctl start mysql")
|
||||||
|
galera_02.wait_for_open_port(3306)
|
||||||
|
galera_02.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
|
||||||
|
)
|
||||||
|
galera_03.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
|
||||||
|
)
|
||||||
|
galera_01.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 39"
|
||||||
|
)
|
||||||
|
galera_02.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 38"
|
||||||
|
)
|
||||||
|
galera_03.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
|
||||||
|
)
|
||||||
|
galera_01.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
|
||||||
|
galera_02.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
|
||||||
|
galera_03.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
|
||||||
|
galera_01.crash()
|
||||||
|
galera_02.crash()
|
||||||
|
galera_03.crash()
|
||||||
|
|
||||||
|
galera_04.start()
|
||||||
|
galera_04.wait_for_unit("mysql")
|
||||||
|
galera_04.wait_for_open_port(3306)
|
||||||
|
galera_04.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
||||||
|
)
|
||||||
|
galera_04.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (41);'"
|
||||||
|
)
|
||||||
|
galera_05.start()
|
||||||
|
galera_05.wait_for_unit("mysql")
|
||||||
|
galera_05.wait_for_open_port(3306)
|
||||||
|
galera_06.start()
|
||||||
|
galera_06.wait_for_unit("mysql")
|
||||||
|
galera_06.wait_for_open_port(3306)
|
||||||
|
galera_05.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
|
||||||
|
)
|
||||||
|
galera_05.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
||||||
|
)
|
||||||
|
galera_05.succeed("systemctl stop mysql")
|
||||||
|
galera_04.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (42);'"
|
||||||
|
)
|
||||||
|
galera_06.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
||||||
|
)
|
||||||
|
galera_04.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (43);'"
|
||||||
|
)
|
||||||
|
galera_05.succeed("systemctl start mysql")
|
||||||
|
galera_05.wait_for_open_port(3306)
|
||||||
|
galera_05.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
|
||||||
|
)
|
||||||
|
galera_06.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
|
||||||
|
)
|
||||||
|
galera_04.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 43"
|
||||||
|
)
|
||||||
|
galera_05.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 42"
|
||||||
|
)
|
||||||
|
galera_06.succeed(
|
||||||
|
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
|
||||||
|
)
|
||||||
|
galera_04.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
|
||||||
|
galera_05.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
|
||||||
|
galera_06.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
|
||||||
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
# The test creates a Galera cluster with 3 nodes and is checking if mariabackup-based SST works. The cluster is tested by creating a DB and an empty table on one node,
|
|
||||||
# and checking the table's presence on the other node.
|
|
||||||
nodes = let
|
|
||||||
mkGaleraNode = {
|
|
||||||
id,
|
|
||||||
method
|
|
||||||
}: let
|
|
||||||
address = "192.168.1.${toString id}";
|
|
||||||
isFirstClusterNode = id == 1 || id == 4;
|
|
||||||
in {
|
|
||||||
users = {
|
|
||||||
users.testuser = {
|
|
||||||
isSystemUser = true;
|
|
||||||
group = "testusers";
|
|
||||||
};
|
|
||||||
groups.testusers = { };
|
|
||||||
};
|
|
||||||
|
|
||||||
networking = {
|
|
||||||
interfaces.eth1 = {
|
|
||||||
ipv4.addresses = [
|
|
||||||
{ inherit address; prefixLength = 24; }
|
|
||||||
];
|
|
||||||
};
|
|
||||||
extraHosts = lib.concatMapStringsSep "\n" (i: "192.168.1.${toString i} galera_0${toString i}") (lib.range 1 6);
|
|
||||||
firewall.allowedTCPPorts = [ 3306 4444 4567 4568 ];
|
|
||||||
firewall.allowedUDPPorts = [ 4567 ];
|
|
||||||
};
|
|
||||||
systemd.services.mysql = with pkgs; {
|
|
||||||
path = with pkgs; [
|
|
||||||
bash
|
|
||||||
gawk
|
|
||||||
gnutar
|
|
||||||
gzip
|
|
||||||
inetutils
|
|
||||||
iproute2
|
|
||||||
netcat
|
|
||||||
procps
|
|
||||||
pv
|
|
||||||
rsync
|
|
||||||
socat
|
|
||||||
stunnel
|
|
||||||
which
|
|
||||||
];
|
|
||||||
};
|
|
||||||
services.mysql = {
|
|
||||||
enable = true;
|
|
||||||
package = mariadbPackage;
|
|
||||||
ensureDatabases = lib.mkIf isFirstClusterNode [ "testdb" ];
|
|
||||||
ensureUsers = lib.mkIf isFirstClusterNode [{
|
|
||||||
name = "testuser";
|
|
||||||
ensurePermissions = {
|
|
||||||
"testdb.*" = "ALL PRIVILEGES";
|
|
||||||
};
|
|
||||||
}];
|
|
||||||
initialScript = lib.mkIf isFirstClusterNode (pkgs.writeText "mariadb-init.sql" ''
|
|
||||||
GRANT ALL PRIVILEGES ON *.* TO 'check_repl'@'localhost' IDENTIFIED BY 'check_pass' WITH GRANT OPTION;
|
|
||||||
FLUSH PRIVILEGES;
|
|
||||||
'');
|
|
||||||
settings = {
|
|
||||||
mysqld = {
|
|
||||||
bind_address = "0.0.0.0";
|
|
||||||
};
|
|
||||||
galera = {
|
|
||||||
wsrep_on = "ON";
|
|
||||||
wsrep_debug = "NONE";
|
|
||||||
wsrep_retry_autocommit = "3";
|
|
||||||
wsrep_provider = "${galeraPackage}/lib/galera/libgalera_smm.so";
|
|
||||||
wsrep_cluster_address = "gcomm://"
|
|
||||||
+ lib.optionalString (id == 2 || id == 3) "galera_01,galera_02,galera_03"
|
|
||||||
+ lib.optionalString (id == 5 || id == 6) "galera_04,galera_05,galera_06";
|
|
||||||
wsrep_cluster_name = "galera";
|
|
||||||
wsrep_node_address = address;
|
|
||||||
wsrep_node_name = "galera_0${toString id}";
|
|
||||||
wsrep_sst_method = method;
|
|
||||||
wsrep_sst_auth = "check_repl:check_pass";
|
|
||||||
binlog_format = "ROW";
|
|
||||||
enforce_storage_engine = "InnoDB";
|
|
||||||
innodb_autoinc_lock_mode = "2";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
galera_01 = mkGaleraNode {
|
|
||||||
id = 1;
|
|
||||||
method = "mariabackup";
|
|
||||||
};
|
|
||||||
|
|
||||||
galera_02 = mkGaleraNode {
|
|
||||||
id = 2;
|
|
||||||
method = "mariabackup";
|
|
||||||
};
|
|
||||||
|
|
||||||
galera_03 = mkGaleraNode {
|
|
||||||
id = 3;
|
|
||||||
method = "mariabackup";
|
|
||||||
};
|
|
||||||
|
|
||||||
galera_04 = mkGaleraNode {
|
|
||||||
id = 4;
|
|
||||||
method = "rsync";
|
|
||||||
};
|
|
||||||
|
|
||||||
galera_05 = mkGaleraNode {
|
|
||||||
id = 5;
|
|
||||||
method = "rsync";
|
|
||||||
};
|
|
||||||
|
|
||||||
galera_06 = mkGaleraNode {
|
|
||||||
id = 6;
|
|
||||||
method = "rsync";
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
testScript = ''
|
|
||||||
galera_01.start()
|
|
||||||
galera_01.wait_for_unit("mysql")
|
|
||||||
galera_01.wait_for_open_port(3306)
|
|
||||||
galera_01.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
|
||||||
)
|
|
||||||
galera_01.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (37);'"
|
|
||||||
)
|
|
||||||
galera_02.start()
|
|
||||||
galera_02.wait_for_unit("mysql")
|
|
||||||
galera_02.wait_for_open_port(3306)
|
|
||||||
galera_03.start()
|
|
||||||
galera_03.wait_for_unit("mysql")
|
|
||||||
galera_03.wait_for_open_port(3306)
|
|
||||||
galera_02.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
|
|
||||||
)
|
|
||||||
galera_02.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
|
||||||
)
|
|
||||||
galera_02.succeed("systemctl stop mysql")
|
|
||||||
galera_01.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (38);'"
|
|
||||||
)
|
|
||||||
galera_03.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
|
||||||
)
|
|
||||||
galera_01.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (39);'"
|
|
||||||
)
|
|
||||||
galera_02.succeed("systemctl start mysql")
|
|
||||||
galera_02.wait_for_open_port(3306)
|
|
||||||
galera_02.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
|
|
||||||
)
|
|
||||||
galera_03.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
|
|
||||||
)
|
|
||||||
galera_01.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 39"
|
|
||||||
)
|
|
||||||
galera_02.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 38"
|
|
||||||
)
|
|
||||||
galera_03.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 37"
|
|
||||||
)
|
|
||||||
galera_01.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
|
|
||||||
galera_02.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
|
|
||||||
galera_03.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
|
|
||||||
galera_01.crash()
|
|
||||||
galera_02.crash()
|
|
||||||
galera_03.crash()
|
|
||||||
|
|
||||||
galera_04.start()
|
|
||||||
galera_04.wait_for_unit("mysql")
|
|
||||||
galera_04.wait_for_open_port(3306)
|
|
||||||
galera_04.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db1 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
|
||||||
)
|
|
||||||
galera_04.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db1 values (41);'"
|
|
||||||
)
|
|
||||||
galera_05.start()
|
|
||||||
galera_05.wait_for_unit("mysql")
|
|
||||||
galera_05.wait_for_open_port(3306)
|
|
||||||
galera_06.start()
|
|
||||||
galera_06.wait_for_unit("mysql")
|
|
||||||
galera_06.wait_for_open_port(3306)
|
|
||||||
galera_05.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
|
|
||||||
)
|
|
||||||
galera_05.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db2 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
|
||||||
)
|
|
||||||
galera_05.succeed("systemctl stop mysql")
|
|
||||||
galera_04.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db2 values (42);'"
|
|
||||||
)
|
|
||||||
galera_06.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; create table db3 (test_id INT, PRIMARY KEY (test_id)) ENGINE = InnoDB;'"
|
|
||||||
)
|
|
||||||
galera_04.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; insert into db3 values (43);'"
|
|
||||||
)
|
|
||||||
galera_05.succeed("systemctl start mysql")
|
|
||||||
galera_05.wait_for_open_port(3306)
|
|
||||||
galera_05.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_cluster_size.*3'"
|
|
||||||
)
|
|
||||||
galera_06.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'show status' -N | grep 'wsrep_local_state_comment.*Synced'"
|
|
||||||
)
|
|
||||||
galera_04.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db3;' -N | grep 43"
|
|
||||||
)
|
|
||||||
galera_05.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db2;' -N | grep 42"
|
|
||||||
)
|
|
||||||
galera_06.succeed(
|
|
||||||
"sudo -u testuser mysql -u testuser -e 'use testdb; select test_id from db1;' -N | grep 41"
|
|
||||||
)
|
|
||||||
galera_04.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db3;'")
|
|
||||||
galera_05.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db2;'")
|
|
||||||
galera_06.succeed("sudo -u testuser mysql -u testuser -e 'use testdb; drop table db1;'")
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
in
|
in
|
||||||
lib.mapAttrs (_: mariadbPackage: makeGaleraTest { inherit mariadbPackage; }) mariadbPackages
|
lib.mapAttrs (_: mariadbPackage: makeGaleraTest { inherit mariadbPackage; }) mariadbPackages
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
system ? builtins.currentSystem,
|
system ? builtins.currentSystem,
|
||||||
config ? {},
|
config ? { },
|
||||||
pkgs ? import ../../.. { inherit system config; },
|
pkgs ? import ../../.. { inherit system config; },
|
||||||
lib ? pkgs.lib
|
lib ? pkgs.lib,
|
||||||
}:
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
@ -10,44 +10,52 @@ let
|
|||||||
|
|
||||||
makeTest = import ./../make-test-python.nix;
|
makeTest = import ./../make-test-python.nix;
|
||||||
|
|
||||||
makeAutobackupTest = {
|
makeAutobackupTest =
|
||||||
package,
|
{
|
||||||
name ? mkTestName package,
|
package,
|
||||||
}: makeTest {
|
name ? mkTestName package,
|
||||||
name = "${name}-automysqlbackup";
|
}:
|
||||||
meta.maintainers = [ lib.maintainers.aanderse ];
|
makeTest {
|
||||||
|
name = "${name}-automysqlbackup";
|
||||||
|
meta.maintainers = [ lib.maintainers.aanderse ];
|
||||||
|
|
||||||
nodes.machine = {
|
nodes.machine = {
|
||||||
services.mysql = {
|
services.mysql = {
|
||||||
inherit package;
|
inherit package;
|
||||||
enable = true;
|
enable = true;
|
||||||
initialDatabases = [ { name = "testdb"; schema = ./testdb.sql; } ];
|
initialDatabases = [
|
||||||
|
{
|
||||||
|
name = "testdb";
|
||||||
|
schema = ./testdb.sql;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.automysqlbackup.enable = true;
|
||||||
|
automysqlbackup.settings.mysql_dump_port = "";
|
||||||
};
|
};
|
||||||
|
|
||||||
services.automysqlbackup.enable = true;
|
testScript = ''
|
||||||
};
|
start_all()
|
||||||
|
|
||||||
testScript = ''
|
# Need to have mysql started so that it can be populated with data.
|
||||||
start_all()
|
machine.wait_for_unit("mysql.service")
|
||||||
|
|
||||||
# Need to have mysql started so that it can be populated with data.
|
with subtest("Wait for testdb to be fully populated (5 rows)."):
|
||||||
machine.wait_for_unit("mysql.service")
|
machine.wait_until_succeeds(
|
||||||
|
"mysql -u root -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"
|
||||||
|
)
|
||||||
|
|
||||||
with subtest("Wait for testdb to be fully populated (5 rows)."):
|
with subtest("Do a backup and wait for it to start"):
|
||||||
machine.wait_until_succeeds(
|
machine.start_job("automysqlbackup.service")
|
||||||
"mysql -u root -D testdb -N -B -e 'select count(id) from tests' | grep -q 5"
|
machine.wait_for_job("automysqlbackup.service")
|
||||||
)
|
|
||||||
|
|
||||||
with subtest("Do a backup and wait for it to start"):
|
with subtest("wait for backup file and check that data appears in backup"):
|
||||||
machine.start_job("automysqlbackup.service")
|
machine.wait_for_file("/var/backup/mysql/daily/testdb")
|
||||||
machine.wait_for_job("automysqlbackup.service")
|
machine.succeed(
|
||||||
|
"${pkgs.gzip}/bin/zcat /var/backup/mysql/daily/testdb/daily_testdb_*.sql.gz | grep hello"
|
||||||
with subtest("wait for backup file and check that data appears in backup"):
|
)
|
||||||
machine.wait_for_file("/var/backup/mysql/daily/testdb")
|
|
||||||
machine.succeed(
|
|
||||||
"${pkgs.gzip}/bin/zcat /var/backup/mysql/daily/testdb/daily_testdb_*.sql.gz | grep hello"
|
|
||||||
)
|
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
in
|
in
|
||||||
lib.mapAttrs (_: package: makeAutobackupTest { inherit package; }) mariadbPackages
|
lib.mapAttrs (_: package: makeAutobackupTest { inherit package; }) mariadbPackages
|
||||||
|
@ -244,28 +244,26 @@ in
|
|||||||
# see https://mariadb.org/about/#maintenance-policy for EOLs
|
# see https://mariadb.org/about/#maintenance-policy for EOLs
|
||||||
mariadb_105 = self.callPackage generic {
|
mariadb_105 = self.callPackage generic {
|
||||||
# Supported until 2025-06-24
|
# Supported until 2025-06-24
|
||||||
# TODO should be removed
|
version = "10.5.26";
|
||||||
version = "10.5.25";
|
hash = "sha256-3V+ZodMK5HNl/Bix3u/23AqzishOfZ/ZyMBP9rAZYfE=";
|
||||||
hash = "sha256-lhnQ9R6GQ1dGayxjMBo0pT99/ZnxjE/UUvqyK/Obpk4=";
|
|
||||||
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
||||||
};
|
};
|
||||||
mariadb_106 = self.callPackage generic {
|
mariadb_106 = self.callPackage generic {
|
||||||
# Supported until 2026-07-06
|
# Supported until 2026-07-06
|
||||||
version = "10.6.18";
|
version = "10.6.19";
|
||||||
hash = "sha256-aJihER9HEwcJ4ouix70aV+S7VxAfbhCeWX1R5tOFzxg=";
|
hash = "sha256-vOyw/3t5pBNEc2+plHEHh8FVFtUet3FfJ4w/D8t+hwM=";
|
||||||
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
||||||
};
|
};
|
||||||
mariadb_1011 = self.callPackage generic {
|
mariadb_1011 = self.callPackage generic {
|
||||||
# Supported until 2028-02-16
|
# Supported until 2028-02-16
|
||||||
version = "10.11.8";
|
version = "10.11.9";
|
||||||
hash = "sha256-XwTz4z2fHL7/BeecVNQdMCYwUAyZWu5ysGOOL5383w8=";
|
hash = "sha256-CgAYCGTNAWGHyYb6q4AQ3iOhF7mnX5HWRWQh+JTkjSA=";
|
||||||
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
||||||
};
|
};
|
||||||
mariadb_110 = self.callPackage generic {
|
mariadb_114 = self.callPackage generic {
|
||||||
# Supported until 2024-06-07
|
# Supported until 2029-05-29
|
||||||
# TODO should be removed
|
version = "11.4.3";
|
||||||
version = "11.0.6";
|
hash = "sha256-bwAXuZAbsYl94O7SHK75/6nWbvVZNFoNim8BEwhBPs4=";
|
||||||
hash = "sha256-AYnWKUbDfG20a/GkaLqVgLy6joDwWVjsSDwzh+zPmgA=";
|
|
||||||
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
inherit (self.darwin.apple_sdk.frameworks) CoreServices;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,167 +0,0 @@
|
|||||||
From 1f1ee5d3776af7ef56ffa3f4dcd22532c2c86c74 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jan Tojnar <jtojnar@gmail.com>
|
|
||||||
Date: Sun, 7 Jan 2024 10:19:54 +0100
|
|
||||||
Subject: [PATCH] Fix build with libxml2 2.12
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
libxml2 2.12.0 made `xmlGetLastError()` return `const` pointer:
|
|
||||||
|
|
||||||
https://gitlab.gnome.org/GNOME/libxml2/-/commit/61034116d0a3c8b295c6137956adc3ae55720711
|
|
||||||
|
|
||||||
Clang 16 does not like this:
|
|
||||||
|
|
||||||
error: assigning to 'xmlErrorPtr' (aka '_xmlError *') from 'const xmlError *' (aka 'const _xmlError *') discards qualifiers
|
|
||||||
error: cannot initialize a variable of type 'xmlErrorPtr' (aka '_xmlError *') with an rvalue of type 'const xmlError *' (aka 'const _xmlError *')
|
|
||||||
|
|
||||||
Let’s update the variables to `const`.
|
|
||||||
For older versions, it will be automatically converted.
|
|
||||||
|
|
||||||
But then `xmlResetError(xmlError*)` will not like the `const` pointer:
|
|
||||||
|
|
||||||
error: no matching function for call to 'xmlResetError'
|
|
||||||
note: candidate function not viable: 1st argument ('const xmlError *' (aka 'const _xmlError *')) would lose const qualifier
|
|
||||||
|
|
||||||
Let’s replace it with `xmlResetLastError()`.
|
|
||||||
|
|
||||||
ALso remove `LIBXMLDOC::Xerr` protected member property.
|
|
||||||
It was introduced in 65b0e5455b547a3d574fa77b34cce23ae3bea0a0
|
|
||||||
along with the `xmlResetError` calls.
|
|
||||||
It does not appear to be used for anything.
|
|
||||||
---
|
|
||||||
storage/connect/libdoc.cpp | 39 +++++++++++++++++++-------------------
|
|
||||||
1 file changed, 19 insertions(+), 20 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/storage/connect/libdoc.cpp b/storage/connect/libdoc.cpp
|
|
||||||
index e414aa88355..10edcbc3ffa 100644
|
|
||||||
--- a/storage/connect/libdoc.cpp
|
|
||||||
+++ b/storage/connect/libdoc.cpp
|
|
||||||
@@ -93,7 +93,6 @@ class LIBXMLDOC : public XMLDOCUMENT {
|
|
||||||
xmlXPathContextPtr Ctxp;
|
|
||||||
xmlXPathObjectPtr Xop;
|
|
||||||
xmlXPathObjectPtr NlXop;
|
|
||||||
- xmlErrorPtr Xerr;
|
|
||||||
char *Buf; // Temporary
|
|
||||||
bool Nofreelist;
|
|
||||||
}; // end of class LIBXMLDOC
|
|
||||||
@@ -327,7 +326,6 @@ LIBXMLDOC::LIBXMLDOC(char *nsl, char *nsdf, char *enc, PFBLOCK fp)
|
|
||||||
Ctxp = NULL;
|
|
||||||
Xop = NULL;
|
|
||||||
NlXop = NULL;
|
|
||||||
- Xerr = NULL;
|
|
||||||
Buf = NULL;
|
|
||||||
Nofreelist = false;
|
|
||||||
} // end of LIBXMLDOC constructor
|
|
||||||
@@ -365,8 +363,8 @@ bool LIBXMLDOC::ParseFile(PGLOBAL g, char *fn)
|
|
||||||
Encoding = (char*)Docp->encoding;
|
|
||||||
|
|
||||||
return false;
|
|
||||||
- } else if ((Xerr = xmlGetLastError()))
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ } else if (xmlGetLastError())
|
|
||||||
+ xmlResetLastError();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} // end of ParseFile
|
|
||||||
@@ -505,9 +503,9 @@ int LIBXMLDOC::DumpDoc(PGLOBAL g, char *ofn)
|
|
||||||
#if 1
|
|
||||||
// This function does not crash (
|
|
||||||
if (xmlSaveFormatFileEnc((const char *)ofn, Docp, Encoding, 0) < 0) {
|
|
||||||
- xmlErrorPtr err = xmlGetLastError();
|
|
||||||
+ const xmlError *err = xmlGetLastError();
|
|
||||||
strcpy(g->Message, (err) ? err->message : "Error saving XML doc");
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ xmlResetLastError();
|
|
||||||
rc = -1;
|
|
||||||
} // endif Save
|
|
||||||
// rc = xmlDocDump(of, Docp);
|
|
||||||
@@ -546,8 +544,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp)
|
|
||||||
if (Nlist) {
|
|
||||||
xmlXPathFreeNodeSet(Nlist);
|
|
||||||
|
|
||||||
- if ((Xerr = xmlGetLastError()))
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ if (xmlGetLastError())
|
|
||||||
+ xmlResetLastError();
|
|
||||||
|
|
||||||
Nlist = NULL;
|
|
||||||
} // endif Nlist
|
|
||||||
@@ -555,8 +553,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp)
|
|
||||||
if (Xop) {
|
|
||||||
xmlXPathFreeObject(Xop);
|
|
||||||
|
|
||||||
- if ((Xerr = xmlGetLastError()))
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ if (xmlGetLastError())
|
|
||||||
+ xmlResetLastError();
|
|
||||||
|
|
||||||
Xop = NULL;
|
|
||||||
} // endif Xop
|
|
||||||
@@ -564,8 +562,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp)
|
|
||||||
if (NlXop) {
|
|
||||||
xmlXPathFreeObject(NlXop);
|
|
||||||
|
|
||||||
- if ((Xerr = xmlGetLastError()))
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ if (xmlGetLastError())
|
|
||||||
+ xmlResetLastError();
|
|
||||||
|
|
||||||
NlXop = NULL;
|
|
||||||
} // endif NlXop
|
|
||||||
@@ -573,8 +571,8 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp)
|
|
||||||
if (Ctxp) {
|
|
||||||
xmlXPathFreeContext(Ctxp);
|
|
||||||
|
|
||||||
- if ((Xerr = xmlGetLastError()))
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ if (xmlGetLastError())
|
|
||||||
+ xmlResetLastError();
|
|
||||||
|
|
||||||
Ctxp = NULL;
|
|
||||||
} // endif Ctxp
|
|
||||||
@@ -590,6 +588,7 @@ void LIBXMLDOC::CloseDoc(PGLOBAL g, PFBLOCK xp)
|
|
||||||
/******************************************************************/
|
|
||||||
xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp)
|
|
||||||
{
|
|
||||||
+ const xmlError *xerr;
|
|
||||||
xmlNodeSetPtr nl;
|
|
||||||
|
|
||||||
if (trace(1))
|
|
||||||
@@ -649,11 +648,11 @@ xmlNodeSetPtr LIBXMLDOC::GetNodeList(PGLOBAL g, xmlNodePtr np, char *xp)
|
|
||||||
} else
|
|
||||||
xmlXPathFreeObject(Xop); // Caused node not found
|
|
||||||
|
|
||||||
- if ((Xerr = xmlGetLastError())) {
|
|
||||||
- strcpy(g->Message, Xerr->message);
|
|
||||||
- xmlResetError(Xerr);
|
|
||||||
+ if ((xerr = xmlGetLastError())) {
|
|
||||||
+ strcpy(g->Message, xerr->message);
|
|
||||||
+ xmlResetLastError();
|
|
||||||
return NULL;
|
|
||||||
- } // endif Xerr
|
|
||||||
+ } // endif xerr
|
|
||||||
|
|
||||||
} // endif Xop
|
|
||||||
|
|
||||||
@@ -1079,7 +1078,7 @@ void XML2NODE::AddText(PGLOBAL g, PCSZ txtp)
|
|
||||||
/******************************************************************/
|
|
||||||
void XML2NODE::DeleteChild(PGLOBAL g, PXNODE dnp)
|
|
||||||
{
|
|
||||||
- xmlErrorPtr xerr;
|
|
||||||
+ const xmlError *xerr;
|
|
||||||
|
|
||||||
if (trace(1))
|
|
||||||
htrc("DeleteChild: node=%p\n", dnp);
|
|
||||||
@@ -1122,7 +1121,7 @@ void XML2NODE::DeleteChild(PGLOBAL g, PXNODE dnp)
|
|
||||||
if (trace(1))
|
|
||||||
htrc("DeleteChild: errmsg=%-.256s\n", xerr->message);
|
|
||||||
|
|
||||||
- xmlResetError(xerr);
|
|
||||||
+ xmlResetLastError();
|
|
||||||
} // end of DeleteChild
|
|
||||||
|
|
||||||
/* -------------------- class XML2NODELIST ---------------------- */
|
|
||||||
--
|
|
||||||
2.42.0
|
|
||||||
|
|
@ -969,6 +969,7 @@ mapAliases {
|
|||||||
mailman-rss = throw "The mailman-rss package was dropped since it was unmaintained."; # Added 2024-06-21
|
mailman-rss = throw "The mailman-rss package was dropped since it was unmaintained."; # Added 2024-06-21
|
||||||
mariadb_104 = throw "mariadb_104 has been removed from nixpkgs, please switch to another version like mariadb_106"; # Added 2023-09-11
|
mariadb_104 = throw "mariadb_104 has been removed from nixpkgs, please switch to another version like mariadb_106"; # Added 2023-09-11
|
||||||
mariadb_1010 = throw "mariadb_1010 has been removed from nixpkgs, please switch to another version like mariadb_1011"; # Added 2023-11-14
|
mariadb_1010 = throw "mariadb_1010 has been removed from nixpkgs, please switch to another version like mariadb_1011"; # Added 2023-11-14
|
||||||
|
mariadb_110 = throw "mariadb_110 has been removed from nixpkgs, please switch to another version like mariadb_114"; # Added 2024-08-15
|
||||||
mariadb-client = hiPrio mariadb.client; #added 2019.07.28
|
mariadb-client = hiPrio mariadb.client; #added 2019.07.28
|
||||||
markdown-pp = throw "markdown-pp was removed from nixpkgs, because the upstream archived it on 2021-09-02"; # Added 2023-07-22
|
markdown-pp = throw "markdown-pp was removed from nixpkgs, because the upstream archived it on 2021-09-02"; # Added 2023-07-22
|
||||||
markmind = throw "markmind has been removed from nixpkgs, because it depended on an old version of electron"; # Added 2023-09-12
|
markmind = throw "markmind has been removed from nixpkgs, because it depended on an old version of electron"; # Added 2023-09-12
|
||||||
|
@ -25026,7 +25026,7 @@ with pkgs;
|
|||||||
mariadb_105
|
mariadb_105
|
||||||
mariadb_106
|
mariadb_106
|
||||||
mariadb_1011
|
mariadb_1011
|
||||||
mariadb_110
|
mariadb_114
|
||||||
;
|
;
|
||||||
mariadb = mariadb_1011;
|
mariadb = mariadb_1011;
|
||||||
mariadb-embedded = mariadb.override { withEmbedded = true; };
|
mariadb-embedded = mariadb.override { withEmbedded = true; };
|
||||||
|
Loading…
Reference in New Issue
Block a user