mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-04-28 18:36:23 +02:00
add migration to clean up Electric SQL artifacts
This commit is contained in:
parent
65539b5381
commit
5bf2734e8c
1 changed files with 104 additions and 0 deletions
|
|
@ -0,0 +1,104 @@
|
||||||
|
"""Clean up Electric SQL artifacts (user, publication, replication slots)
|
||||||
|
|
||||||
|
Revision ID: 108
|
||||||
|
Revises: 107
|
||||||
|
|
||||||
|
Removes leftover Electric SQL infrastructure that is no longer needed after
|
||||||
|
the migration to Rocicorp Zero. Fully idempotent — safe on databases that
|
||||||
|
never had Electric SQL set up (fresh installs).
|
||||||
|
|
||||||
|
Cleaned up:
|
||||||
|
- Replication slots containing 'electric' (prevents unbounded WAL growth)
|
||||||
|
- The 'electric_publication_default' publication
|
||||||
|
- Default privileges, grants, and the 'electric' database user
|
||||||
|
"""
|
||||||
|
|
||||||
|
from collections.abc import Sequence
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
|
||||||
|
revision: str = "108"
|
||||||
|
down_revision: str | None = "107"
|
||||||
|
branch_labels: str | Sequence[str] | None = None
|
||||||
|
depends_on: str | Sequence[str] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
op.execute(
|
||||||
|
"""
|
||||||
|
DO $$
|
||||||
|
DECLARE
|
||||||
|
slot RECORD;
|
||||||
|
BEGIN
|
||||||
|
-- 1. Drop inactive Electric replication slots (prevents WAL growth)
|
||||||
|
FOR slot IN
|
||||||
|
SELECT slot_name FROM pg_replication_slots
|
||||||
|
WHERE slot_name LIKE '%electric%' AND active = false
|
||||||
|
LOOP
|
||||||
|
BEGIN
|
||||||
|
PERFORM pg_drop_replication_slot(slot.slot_name);
|
||||||
|
EXCEPTION WHEN OTHERS THEN
|
||||||
|
RAISE WARNING 'Could not drop replication slot %: %', slot.slot_name, SQLERRM;
|
||||||
|
END;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- Warn about active Electric slots that cannot be safely dropped
|
||||||
|
FOR slot IN
|
||||||
|
SELECT slot_name FROM pg_replication_slots
|
||||||
|
WHERE slot_name LIKE '%electric%' AND active = true
|
||||||
|
LOOP
|
||||||
|
RAISE WARNING 'Active Electric replication slot "%" was not dropped — drop it manually to stop WAL growth', slot.slot_name;
|
||||||
|
END LOOP;
|
||||||
|
|
||||||
|
-- 2. Drop the Electric publication
|
||||||
|
BEGIN
|
||||||
|
IF EXISTS (SELECT 1 FROM pg_publication WHERE pubname = 'electric_publication_default') THEN
|
||||||
|
DROP PUBLICATION electric_publication_default;
|
||||||
|
END IF;
|
||||||
|
EXCEPTION WHEN OTHERS THEN
|
||||||
|
RAISE WARNING 'Could not drop publication electric_publication_default: %', SQLERRM;
|
||||||
|
END;
|
||||||
|
|
||||||
|
-- 3. Revoke privileges and drop the Electric user
|
||||||
|
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'electric') THEN
|
||||||
|
BEGIN
|
||||||
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
||||||
|
REVOKE SELECT ON TABLES FROM electric;
|
||||||
|
ALTER DEFAULT PRIVILEGES IN SCHEMA public
|
||||||
|
REVOKE SELECT ON SEQUENCES FROM electric;
|
||||||
|
EXCEPTION WHEN OTHERS THEN
|
||||||
|
RAISE WARNING 'Could not revoke default privileges from electric: %', SQLERRM;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA public FROM electric;
|
||||||
|
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public FROM electric;
|
||||||
|
REVOKE USAGE ON SCHEMA public FROM electric;
|
||||||
|
EXCEPTION WHEN OTHERS THEN
|
||||||
|
RAISE WARNING 'Could not revoke schema privileges from electric: %', SQLERRM;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
EXECUTE format(
|
||||||
|
'REVOKE CONNECT ON DATABASE %I FROM electric',
|
||||||
|
current_database()
|
||||||
|
);
|
||||||
|
EXCEPTION WHEN OTHERS THEN
|
||||||
|
RAISE WARNING 'Could not revoke CONNECT from electric: %', SQLERRM;
|
||||||
|
END;
|
||||||
|
|
||||||
|
BEGIN
|
||||||
|
REASSIGN OWNED BY electric TO CURRENT_USER;
|
||||||
|
DROP ROLE electric;
|
||||||
|
EXCEPTION WHEN OTHERS THEN
|
||||||
|
RAISE WARNING 'Could not drop role electric: %', SQLERRM;
|
||||||
|
END;
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
$$;
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
pass
|
||||||
Loading…
Add table
Add a link
Reference in a new issue