2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-03 15:35:17 +00:00

[#2438] prevent MySQL lease counters from going negative

This commit is contained in:
Andrei Pavel
2022-06-22 15:53:20 +03:00
parent fe29c8ec7f
commit 774b84db35
3 changed files with 77 additions and 22 deletions

View File

@@ -618,12 +618,59 @@ mysql_upgrade_13_to_14_test() {
assert_str_eq '' "${OUTPUT}" "${query}: expected output %s, returned %s"
done
# Clean up.
query='DELETE FROM lease4; DELETE FROM lease6;'
# Check that leases counters cannot go negative.
for v in 4 6; do
query="SELECT leases FROM lease${v}_stat WHERE subnet_id = 1 AND state = 0 LIMIT 1"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq "" "${OUTPUT}" "${query}: expected output %s, returned %s"
assert_str_eq '2' "${OUTPUT}" "${query}: expected output %s, returned %s"
# Artifically change the subnet counter from 2 down to 1.
query="UPDATE lease${v}_stat SET leases = 1 WHERE subnet_id = 1 AND state = 0"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq '' "${OUTPUT}" "${query}: expected output %s, returned %s"
if test "${json_supported}" = 1; then
query="SELECT leases FROM lease${v}_stat_by_client_class WHERE client_class = 'foo' LIMIT 1"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq '2' "${OUTPUT}" "${query}: expected output %s, returned %s"
# Artifically change the client class counter from 2 down to 1.
query="UPDATE lease${v}_stat SET leases = 1 WHERE client_class = 'foo'"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq '' "${OUTPUT}" "${query}: expected output %s, returned %s"
fi
# Clean up.
query="DELETE FROM lease${v}"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq '' "${OUTPUT}" "${query}: expected output %s, returned %s"
# SELECT should finish succesfully and the subnet counter should be 0.
query="SELECT leases FROM lease${v}_stat WHERE subnet_id = 1 AND state = 0 LIMIT 1"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq '0' "${OUTPUT}" "${query}: expected output %s, returned %s"
if test "${json_supported}" = 1; then
# SELECT should finish succesfully and the client class counter should be 0.
query="SELECT leases FROM lease${v}_stat_by_client_class WHERE client_class = 'foo' LIMIT 1"
run_command \
mysql_execute "${query}"
assert_eq 0 "${EXIT_CODE}" "${query}: expected %d, returned %d"
assert_str_eq '0' "${OUTPUT}" "${query}: expected output %s, returned %s"
fi
done
}
mysql_upgrade_test() {

View File

@@ -4521,7 +4521,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -4578,7 +4579,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(old_client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease4_stat_by_client_class SET leases = leases - 1
UPDATE lease4_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class;
SET i = i + 1;
@@ -4618,7 +4619,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -4635,7 +4637,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease4_stat_by_client_class SET leases = leases - 1
UPDATE lease4_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class;
SET i = i + 1;
@@ -4656,7 +4658,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -4714,7 +4717,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(old_client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease6_stat_by_client_class SET leases = leases - 1
UPDATE lease6_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class AND lease_type = old_lease_type;
SET i = i + 1;
@@ -4755,7 +4758,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -4772,7 +4776,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease6_stat_by_client_class SET leases = leases - 1
UPDATE lease6_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class AND lease_type = old_lease_type;
SET i = i + 1;

View File

@@ -283,7 +283,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -340,7 +341,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(old_client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease4_stat_by_client_class SET leases = leases - 1
UPDATE lease4_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class;
SET i = i + 1;
@@ -380,7 +381,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -397,7 +399,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease4_stat_by_client_class SET leases = leases - 1
UPDATE lease4_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class;
SET i = i + 1;
@@ -418,7 +420,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -476,7 +479,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(old_client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease6_stat_by_client_class SET leases = leases - 1
UPDATE lease6_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class AND lease_type = old_lease_type;
SET i = i + 1;
@@ -517,7 +520,8 @@ BEGIN
DECLARE length INT;
DECLARE i INT;
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 3141 (22032) at line 1: Invalid JSON text in argument 1 to
-- function json_extract: "The document is empty." at position 0.
-- Ignore ERROR 4037 (HY000): Unexpected end of JSON text in argument 1 to function 'json_extract'
-- These situations are handled with a propagating NULL result from JSON_EXTRACT.
DECLARE CONTINUE HANDLER FOR 3141 BEGIN END;
@@ -534,7 +538,7 @@ BEGIN
SET class = JSON_UNQUOTE(JSON_EXTRACT(client_classes, CONCAT('\$[', i, ']')));
-- Decrement the lease count if the record exists.
UPDATE lease6_stat_by_client_class SET leases = leases - 1
UPDATE lease6_stat_by_client_class SET leases = IF(leases > 0, leases - 1, 0)
WHERE client_class = class AND lease_type = old_lease_type;
SET i = i + 1;