Summary of Changes Create a plugin mechanism in the accounts update path so that accounts data can be streamed out to external data stores (be it Kafka or Postgres). The plugin mechanism allows Data stores of connection strings/credentials to be configured, Accounts with patterns to be streamed PostgreSQL implementation of the streaming for different destination stores to be plugged in. The code comprises 4 major parts: accountsdb-plugin-intf: defines the plugin interface which concrete plugin should implement. accountsdb-plugin-manager: manages the load/unload of plugins and provide interfaces which the validator can notify of accounts update to plugins. accountsdb-plugin-postgres: the concrete plugin implementation for PostgreSQL The validator integrations: updated streamed right after snapshot restore and after account update from transaction processing or other real updates. The plugin is optionally loaded on demand by new validator CLI argument -- there is no impact if the plugin is not loaded.
53 lines
1.4 KiB
PL/PgSQL
53 lines
1.4 KiB
PL/PgSQL
/**
|
|
* This plugin implementation for PostgreSQL requires the following tables
|
|
*/
|
|
-- The table storing accounts
|
|
|
|
|
|
CREATE TABLE account (
|
|
pubkey BYTEA PRIMARY KEY,
|
|
owner BYTEA,
|
|
lamports BIGINT NOT NULL,
|
|
slot BIGINT NOT NULL,
|
|
executable BOOL NOT NULL,
|
|
rent_epoch BIGINT NOT NULL,
|
|
data BYTEA,
|
|
updated_on TIMESTAMP NOT NULL
|
|
);
|
|
|
|
-- The table storing slot information
|
|
CREATE TABLE slot (
|
|
slot BIGINT PRIMARY KEY,
|
|
parent BIGINT,
|
|
status varchar(16) NOT NULL,
|
|
updated_on TIMESTAMP NOT NULL
|
|
);
|
|
|
|
/**
|
|
* The following is for keeping historical data for accounts and is not required for plugin to work.
|
|
*/
|
|
-- The table storing historical data for accounts
|
|
CREATE TABLE account_audit (
|
|
pubkey BYTEA,
|
|
owner BYTEA,
|
|
lamports BIGINT NOT NULL,
|
|
slot BIGINT NOT NULL,
|
|
executable BOOL NOT NULL,
|
|
rent_epoch BIGINT NOT NULL,
|
|
data BYTEA,
|
|
updated_on TIMESTAMP NOT NULL
|
|
);
|
|
|
|
CREATE FUNCTION audit_account_update() RETURNS trigger AS $audit_account_update$
|
|
BEGIN
|
|
INSERT INTO account_audit (pubkey, owner, lamports, slot, executable, rent_epoch, data, updated_on)
|
|
VALUES (OLD.pubkey, OLD.owner, OLD.lamports, OLD.slot,
|
|
OLD.executable, OLD.rent_epoch, OLD.data, OLD.updated_on);
|
|
RETURN NEW;
|
|
END;
|
|
|
|
$audit_account_update$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER account_update_trigger AFTER UPDATE OR DELETE ON account
|
|
FOR EACH ROW EXECUTE PROCEDURE audit_account_update();
|