2
0
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:
Thomas Markwalder
2018-05-09 14:36:37 -04:00
parent 593ddeae13
commit b0bea19c48
8 changed files with 928 additions and 29 deletions

View File

@@ -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';