mirror of
https://gitlab.isc.org/isc-projects/kea
synced 2025-10-05 13:26:03 +00:00
[5587] PostgreSQL support for shared lease stats implementation
src/share/database/scripts/pgsql/dhcpdb_create.pgsql Adds lease<4/6>_stat tables and triggers src/share/database/scripts/pgsql/dhcpdb_drop.pgsql Added drops for lease<4/6>_stat tables and triggers src/share/database/scripts/pgsql/upgrade_3.3_to_4.0.sh.in Adds lease<4/6>_stat tables and triggers Populates stat tables from existing lease table content src/bin/admin/tests/mysql_tests.sh.in mysql_lease6_stat_per_type() - fixed typo in test src/bin/admin/tests/pgsql_tests.sh.in run_statement() - new convenience fucntion for running statement with option expected outcome pgsql_upgrade_schema_to_version() - new function which converts the existing schema to a target version pgsql_lease4_stat_test() - tests v4 stat table and triggers in an new database pgsql_lease6_stat_test() - tests v6 stat table and triggers in an new database. pgsql_lease6_stat_per_type() - helper function which tests v6 stat table and triggers using a given address and lease type pgsql_lease_stat_upgrade_test() - tests data migration, stat table and trigger operations on an upgraded database src/lib/dhcpsrv/pgsql_lease_mgr.* Added new SQL statements for lease stats queries PgSqlLeaseStatsQuery Constructors - added variants to support where clause params start() - modified to support query variants based on where clause params PgSqlLeaseMgr Added start variants: - startSubnetLeaseStatsQuery4(const SubnetID& subnet_id) - startSubnetRangeLeaseStatsQuery4(const SubnetID& first_subnet_id, const SubnetID& last_subnet_id) src/lib/dhcpsrv/tests/pgsql_lease_mgr_unittest.cc New unit tests: - TEST_F(PgSqlLeaseMgrTest, leaseStatsQuery4) - TEST_F(PgSqlLeaseMgrTest, leaseStatsQuery6)
This commit is contained in:
@@ -570,6 +570,184 @@ CREATE INDEX lease6_by_subnet_id_lease_type ON lease6 (subnet_id, lease_type);
|
||||
DROP INDEX lease6_by_iaid_subnet_id_duid;
|
||||
CREATE INDEX lease6_by_duid_iaid_subnet_id ON lease6 (duid, iaid, subnet_id);
|
||||
|
||||
-- Create v4 lease statistics table
|
||||
CREATE TABLE lease4_stat (
|
||||
subnet_id BIGINT NOT NULL,
|
||||
state INT8 NOT NULL,
|
||||
leases BIGINT,
|
||||
PRIMARY KEY (subnet_id, state)
|
||||
);
|
||||
|
||||
--
|
||||
-- Create v4 insert trigger procedure
|
||||
CREATE FUNCTION proc_stat_lease4_insert () RETURNS trigger AS $stat_lease4_insert$
|
||||
BEGIN
|
||||
IF NEW.state < 2 THEN
|
||||
UPDATE lease4_stat
|
||||
SET leases = leases + 1
|
||||
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||
|
||||
IF NOT FOUND THEN
|
||||
INSERT INTO lease4_stat VALUES (new.subnet_id, new.state, 1);
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- Return is ignored since this is an after insert
|
||||
RETURN NULL;
|
||||
END;
|
||||
$stat_lease4_insert$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create v4 insert trigger procedure
|
||||
CREATE TRIGGER stat_lease4_insert
|
||||
AFTER INSERT ON lease4
|
||||
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_insert();
|
||||
|
||||
--
|
||||
-- Create v4 update trigger procedure
|
||||
CREATE FUNCTION proc_stat_lease4_update () RETURNS trigger AS $stat_lease4_update$
|
||||
BEGIN
|
||||
IF OLD.state != NEW.state THEN
|
||||
IF OLD.state < 2 THEN
|
||||
-- Decrement the old state count if record exists
|
||||
UPDATE lease4_stat SET leases = leases - 1
|
||||
WHERE subnet_id = OLD.subnet_id AND state = OLD.state;
|
||||
END IF;
|
||||
|
||||
IF NEW.state < 2 THEN
|
||||
-- Increment the new state count if record exists
|
||||
UPDATE lease4_stat SET leases = leases + 1
|
||||
WHERE subnet_id = NEW.subnet_id AND state = NEW.state;
|
||||
|
||||
-- Insert new state record if it does not exist
|
||||
IF NOT FOUND THEN
|
||||
INSERT INTO lease4_stat VALUES (NEW.subnet_id, NEW.state, 1);
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- Return is ignored since this is an after insert
|
||||
RETURN NULL;
|
||||
END;
|
||||
$stat_lease4_update$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create v4 update trigger
|
||||
CREATE TRIGGER stat_lease4_update
|
||||
AFTER UPDATE ON lease4
|
||||
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_update();
|
||||
|
||||
|
||||
--
|
||||
-- Create the v4 delete trigger procedure
|
||||
CREATE FUNCTION proc_stat_lease4_delete () RETURNS trigger AS $stat_lease4_delete$
|
||||
BEGIN
|
||||
IF OLD.state < 2 THEN
|
||||
-- Decrement the state count if record exists
|
||||
UPDATE lease4_stat SET leases = leases - 1
|
||||
WHERE subnet_id = OLD.subnet_id AND OLD.state = state;
|
||||
END IF;
|
||||
|
||||
-- Return is ignored since this is an after insert
|
||||
RETURN NULL;
|
||||
END;
|
||||
$stat_lease4_delete$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create the v4 delete trigger
|
||||
CREATE TRIGGER stat_lease4_delete
|
||||
AFTER DELETE ON lease4
|
||||
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease4_delete();
|
||||
|
||||
-- Create v6 lease statistics table
|
||||
CREATE TABLE lease6_stat (
|
||||
subnet_id BIGINT NOT NULL,
|
||||
lease_type SMALLINT NOT NULL,
|
||||
state INT8 NOT NULL,
|
||||
leases BIGINT,
|
||||
PRIMARY KEY (subnet_id, lease_type, state)
|
||||
);
|
||||
|
||||
--
|
||||
-- Create v6 insert trigger procedure
|
||||
CREATE FUNCTION proc_stat_lease6_insert () RETURNS trigger AS $stat_lease6_insert$
|
||||
BEGIN
|
||||
IF NEW.state < 2 THEN
|
||||
UPDATE lease6_stat
|
||||
SET leases = leases + 1
|
||||
WHERE
|
||||
subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||
AND state = NEW.state;
|
||||
|
||||
IF NOT FOUND THEN
|
||||
INSERT INTO lease6_stat
|
||||
VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- Return is ignored since this is an after insert
|
||||
RETURN NULL;
|
||||
END;
|
||||
$stat_lease6_insert$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create v6 insert trigger procedure
|
||||
CREATE TRIGGER stat_lease6_insert
|
||||
AFTER INSERT ON lease6
|
||||
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_insert();
|
||||
|
||||
--
|
||||
-- Create v6 update trigger procedure
|
||||
CREATE FUNCTION proc_stat_lease6_update () RETURNS trigger AS $stat_lease6_update$
|
||||
BEGIN
|
||||
IF OLD.state != NEW.state THEN
|
||||
IF OLD.state < 2 THEN
|
||||
-- Decrement the old state count if record exists
|
||||
UPDATE lease6_stat SET leases = leases - 1
|
||||
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||
AND state = OLD.state;
|
||||
END IF;
|
||||
|
||||
IF NEW.state < 2 THEN
|
||||
-- Increment the new state count if record exists
|
||||
UPDATE lease6_stat SET leases = leases + 1
|
||||
WHERE subnet_id = NEW.subnet_id AND lease_type = NEW.lease_type
|
||||
AND state = NEW.state;
|
||||
|
||||
-- Insert new state record if it does not exist
|
||||
IF NOT FOUND THEN
|
||||
INSERT INTO lease6_stat VALUES (NEW.subnet_id, NEW.lease_type, NEW.state, 1);
|
||||
END IF;
|
||||
END IF;
|
||||
END IF;
|
||||
|
||||
-- Return is ignored since this is an after insert
|
||||
RETURN NULL;
|
||||
END;
|
||||
$stat_lease6_update$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create v6 update trigger
|
||||
CREATE TRIGGER stat_lease6_update
|
||||
AFTER UPDATE ON lease6
|
||||
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_update();
|
||||
|
||||
--
|
||||
-- Create the v6 delete trigger procedure
|
||||
CREATE FUNCTION proc_stat_lease6_delete() RETURNS trigger AS $stat_lease6_delete$
|
||||
BEGIN
|
||||
IF OLD.state < 2 THEN
|
||||
-- Decrement the state count if record exists
|
||||
UPDATE lease6_stat SET leases = leases - 1
|
||||
WHERE subnet_id = OLD.subnet_id AND lease_type = OLD.lease_type
|
||||
AND OLD.state = state;
|
||||
END IF;
|
||||
|
||||
-- Return is ignored since this is an after insert
|
||||
RETURN NULL;
|
||||
END;
|
||||
$stat_lease6_delete$ LANGUAGE plpgsql;
|
||||
|
||||
-- Create the v6 delete trigger
|
||||
CREATE TRIGGER stat_lease6_delete
|
||||
AFTER DELETE ON lease6
|
||||
FOR EACH ROW EXECUTE PROCEDURE proc_stat_lease6_delete();
|
||||
|
||||
-- Set 4.0 schema version.
|
||||
UPDATE schema_version
|
||||
SET version = '4', minor = '0';
|
||||
|
Reference in New Issue
Block a user