mirror of
https://github.com/block/buzz.git
synced 2026-10-27 12:40:30 +00:00
## What
Name the relay's four Postgres pool roles—writer, reader, audit, and
search—and export one fixed-cardinality utilization metric contract for
all of them. Existing writer and reader gauges remain unchanged.
## Why
Audit and search already use separate pools, but they are missing from
pool pressure telemetry. Operators cannot see all process-level
connection demand before setting a deployment-wide connection budget.
## How
A closed `DbPoolRole` vocabulary now labels
`buzz_db_pool_connections{pool_role,state}` and
`buzz_db_pool_configured{pool_role}`. The relay retains cheap pool
clones for statistics only; ownership, capacities, timeouts, query
routing, and failure behavior do not change. The docs also replace the
stale async search-index description with the generated-column behavior
used today.
This simplifies four ad hoc observability states into one bounded model
without adding a pool manager or changing service boundaries.
## Risk
Low to moderate. This changes relay metrics and pool construction
plumbing, but not SQL execution or routing. Legacy metric names remain
available for current dashboards.
## Testing
- Push gate at `3f5468a0463bdfc5879bcdd3878fa06b42ca84c2`: all 14 Rust
test lanes passed; desktop Tauri checks passed.
- Blox: `cargo test --workspace --all-targets` with repository-declared
Postgres services.
- Blox: `cargo clippy --workspace --all-targets -- -D warnings`.
- Blox: `cargo fmt --all -- --check`.
## Bigger picture
Aggregate deployment budget enforcement remains deferred. This PR
exposes the per-role facts that a later deployment-policy change can
consume.
Generated with Claude Code
---------
Signed-off-by: tornquist <tornquist@squareup.com>
Co-authored-by: Codex <noreply@openai.com>
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
70 lines
2.7 KiB
Rust
70 lines
2.7 KiB
Rust
#![deny(unsafe_code)]
|
||
#![warn(missing_docs)]
|
||
//! buzz-db — Postgres event store for Buzz.
|
||
//!
|
||
//! ## Design invariants
|
||
//! - AUTH events (kind 22242) are never stored — they carry bearer tokens.
|
||
//! - Ephemeral events (20000–29999) are never stored — Redis pub/sub only.
|
||
//! - Events table is partitioned by month on `created_at`.
|
||
//! - No FK references to partitioned tables.
|
||
//! - Uses `sqlx::query()` (runtime) not `sqlx::query!()` (compile-time).
|
||
//!
|
||
//! ## Runtime and store ownership
|
||
//! Database runtime infrastructure and domain persistence are physically
|
||
//! separated behind this crate-root compatibility facade:
|
||
//!
|
||
//! - Runtime concerns own pool construction, writer/replica routing,
|
||
//! transactions, sessions, metrics, health support, and migrations.
|
||
//! - Store concerns own domain-specific SQL, row mapping, locking, mutation
|
||
//! rules, indexes, and focused persistence tests.
|
||
//!
|
||
//! Existing crate-root modules, records, and [`Db`] methods remain the public
|
||
//! API. The internal `runtime` and `store` namespaces are not public APIs.
|
||
|
||
mod runtime;
|
||
mod store;
|
||
|
||
/// Database error types.
|
||
pub mod error;
|
||
|
||
#[cfg(test)]
|
||
mod test_support;
|
||
|
||
pub use runtime::{
|
||
insert_mentions, migration, replica_fence, Db, DbConfig, DbPoolRole, DbPoolStats,
|
||
DbReadinessOutcome, ReadSession,
|
||
};
|
||
|
||
/// Valid low-cardinality `(pool_role, operation)` pairs for pool-acquisition telemetry.
|
||
pub const DB_POOL_ACQUIRE_VALID_PAIRS: [(&str, &str); 11] =
|
||
runtime::observability::POOL_ACQUIRE_VALID_PAIRS;
|
||
|
||
/// Raw Prometheus series ceiling per relay pod for the operation-aware contract.
|
||
pub const DB_POOL_ACQUIRE_RAW_SERIES_PER_POD: usize =
|
||
runtime::observability::POOL_ACQUIRE_RAW_SERIES_PER_POD;
|
||
pub(crate) use runtime::{
|
||
insert_mentions_in_transaction, observability, route_proof, ReadSessionInner, RouteDecision,
|
||
RoutePredicate,
|
||
};
|
||
pub use store::{
|
||
admin_moderation, allowlist, api_token, archived_identities, channel, channel_members,
|
||
community, deletion, dm, event, feed, git_repo, moderation, partition, product_feedback, push,
|
||
reaction, relay_admin_actions, relay_invite, relay_members, relay_operators, reminder,
|
||
replaceable, thread, usage, user, workflow,
|
||
};
|
||
|
||
pub use allowlist::AllowlistEntry;
|
||
pub use api_token::{ApiTokenRecord, TokenSummary};
|
||
pub use community::{
|
||
ArchivedCommunityRecord, CommunityRecord, CreateCommunityWithOwnerResult,
|
||
CreatedCommunityRecord, EnsuredCommunityRecord, OwnedCommunityRecord,
|
||
UnarchivedCommunityRecord,
|
||
};
|
||
pub use error::{DbError, Result};
|
||
pub use event::{EventQuery, DEFAULT_MAX_PAGE_LIMIT};
|
||
pub use reaction::ReactionEventInsertOutcome;
|
||
pub use reminder::DueReminder;
|
||
pub use usage::UsageMetricsLeader;
|
||
|
||
use buzz_core::CommunityId;
|