Skip to content

[DO NOT MERGE] Implement RLS and use SPI for PG backend interaction with duroxide - #40

Closed
Pino de Candia (pinodeca) wants to merge 1 commit into
mainfrom
pinodeca/backend-spi
Closed

Pino de Candia (pinodeca) wants to merge 1 commit into
mainfrom
pinodeca/backend-spi

Conversation

@pinodeca

Copy link
Copy Markdown
Contributor

Replace async sqlx/tokio calls with direct SPI in PostgreSQL backend
processes (user sessions). This eliminates TCP connection pools and
async runtime overhead for client, monitoring, and explain operations.
The background worker continues to use sqlx via duroxide-pg-opt since
the Provider trait requires Send + Sync + async.

This work builds on the POC in docs/design-native-provider.md, which
explored three phases: SPI for client ops, SPI for monitoring, and UDS
for BGW connections. This branch isolates the first two phases (SPI).

Changes

  • Rewrite src/client.rs to enqueue work items via SPI instead of async Client/Provider
  • Rewrite src/monitoring.rs to query duroxide stored procedures via SPI
  • Rewrite src/explain.rs get_duroxide_instance_info() to use SPI
  • Add GRANTs on df and duroxide schema objects so non-superusers can call functions through SPI (which runs as the calling user)
  • Enable Row-Level Security on df.instances, df.nodes, duroxide.instances, duroxide.executions, duroxide.history, and duroxide.orchestrator_queue so users only see/modify their own data
  • Fix 21_signals test: split signal+wait into separate transactions for SPI transaction visibility
  • Add docs/design-backend-spi.md design document

Replace async sqlx/tokio calls with direct SPI in PostgreSQL backend
processes (user sessions). This eliminates TCP connection pools and
async runtime overhead for client, monitoring, and explain operations.
The background worker continues to use sqlx via duroxide-pg-opt since
the Provider trait requires Send + Sync + async.

This work builds on the POC in docs/design-native-provider.md, which
explored three phases: SPI for client ops, SPI for monitoring, and UDS
for BGW connections. This branch isolates the first two phases (SPI).

Changes:
- Rewrite src/client.rs to enqueue work items via SPI instead of
  async Client/Provider
- Rewrite src/monitoring.rs to query duroxide stored procedures via SPI
- Rewrite src/explain.rs get_duroxide_instance_info() to use SPI
- Add GRANTs on df and duroxide schema objects so non-superusers can
  call functions through SPI (which runs as the calling user)
- Enable Row-Level Security on df.instances, df.nodes,
  duroxide.instances, duroxide.executions, duroxide.history, and
  duroxide.orchestrator_queue so users only see/modify their own data
- Fix 21_signals test: split signal+wait into separate transactions
  for SPI transaction visibility
- Add docs/design-backend-spi.md design document
@pinodeca Pino de Candia (pinodeca) changed the title Implement RLS and use SPI for PG backend interaction with duroxide [DO NOT MERGE] Implement RLS and use SPI for PG backend interaction with duroxide Mar 5, 2026
@pinodeca

Copy link
Copy Markdown
Contributor Author

#47 implements RLS

SPI for duroxide-pg-opt has been de-prioritized. Abandoning this PR.

@pinodeca
Pino de Candia (pinodeca) deleted the pinodeca/backend-spi branch April 28, 2026 17:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant