Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ This file lists the dependency checks the `extenddb-setup` skill runs before pro

| Dependency | Check command | Minimum version | Rationale |
|---|---|---|---|
| Rust toolchain | `cargo --version` and `rustc --version` | 1.88 | extenddb is a Rust workspace; older toolchains fail `cargo build --release`. |
| Rust toolchain | `cargo --version` and `rustc --version` | 1.91.1 | extenddb is a Rust workspace; older toolchains fail `cargo build --release`. |
| PostgreSQL client | `psql --version` | 14 | extenddb speaks the Postgres protocol at init and runtime; older clients may lack required features. |
| PostgreSQL server readiness | `pg_isready` | n/a (server-side check) | Confirms the server is reachable before `extenddb init`. |
| Python 3 | `python3 --version` | 3.10 | Required by the sample apps and the docs build pipeline. |
Expand All @@ -29,7 +29,7 @@ If `which cargo` exits nonzero, Rust is not installed. Install:
- Linux (Fedora/RHEL): `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`
- macOS: `brew install rustup-init && rustup-init`

If Rust is installed but `rustc --version` reports older than 1.88:
If Rust is installed but `rustc --version` reports older than 1.91.1:

```bash
rustup update
Expand Down Expand Up @@ -84,7 +84,7 @@ If `python3 --version` reports older than 3.10, upgrade via the same package man

## Version parsing

`rustc --version` prints `rustc 1.88.0 (abcdef0 2025-01-01)`. Extract the version field with `awk`:
`rustc --version` prints `rustc 1.91.1 (abcdef0 2025-01-01)`. Extract the version field with `awk`:

```bash
rustc --version | awk '{print $2}'
Expand All @@ -96,11 +96,11 @@ rustc --version | awk '{print $2}'
psql --version | awk '{print $3}'
```

Compare the extracted version against the minimum (1.88 for Rust, 14 for Postgres) by splitting on `.` and comparing numerically. For skill-level checks, a string prefix comparison (`[[ "$PG_VER" < "14" ]]`) is adequate because major versions are single or double digits.
Compare the extracted version against the minimum (1.91.1 for Rust, 14 for Postgres) by splitting on `.` and comparing numerically. For skill-level checks, a string prefix comparison (`[[ "$PG_VER" < "14" ]]`) is adequate because major versions are single or double digits.

## Rust version upgrade path

If Rust is installed via rustup and `rustc --version` reports older than 1.88, the fix is:
If Rust is installed via rustup and `rustc --version` reports older than 1.91.1, the fix is:

```bash
rustup update
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,4 @@ This should print the extenddb version string. If it does not, the build failed
cargo build --release --verbose
```

Common causes of silent build failure are a missing system library (for example, `libpq-dev` or `openssl-dev` on Linux), a Rust toolchain older than 1.88, or a disk full condition under `target/`. The verbose output names the failing crate and the missing dependency.
Common causes of silent build failure are a missing system library (for example, `libpq-dev` or `openssl-dev` on Linux), a Rust toolchain older than 1.91.1, or a disk full condition under `target/`. The verbose output names the failing crate and the missing dependency.
4 changes: 2 additions & 2 deletions .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

[resolver]
# Prefer dependency versions whose declared rust-version fits the workspace
# rust-version (1.88, tested in CI), so `cargo update` on a newer toolchain
# does not pull in crates that no longer build on 1.88. Only applies when a
# rust-version (1.91.1, tested in CI), so `cargo update` on a newer toolchain
# does not pull in crates that no longer build on 1.91.1. Only applies when a
# newer version would be incompatible; everything else updates as usual.
incompatible-rust-versions = "fallback"
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ jobs:
timeout-minutes: 15
strategy:
matrix:
toolchain: [stable, "1.88.0"]
toolchain: [stable, "1.91.1"]
steps:
- uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
- uses: dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8 # master
Expand Down
6 changes: 3 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ License. ExtendDB is a clean-room implementation of the DynamoDB wire protocol,
by AWS engineers. It is not a fork of DynamoDB and contains no DynamoDB source code. ExtendDB speaks the DynamoDB wire
protocol: any AWS SDK, CLI, or tool that works with DynamoDB works with ExtendDB, unchanged.

- **Language:** Rust (edition 2024, MSRV 1.88+)
- **Language:** Rust (edition 2024, MSRV 1.91.1+)
- **Storage backends:** PostgreSQL 14+ (default), SQLite (bundled, no server or client install required; feature flag `sqlite`, also `sqlite-memory` for dev and CI), MongoDB 7.0+ (feature flag `mongodb`), Cassandra 4.1+ (experimental; feature flag `cassandra`). One backend per binary, selected by mutually exclusive Cargo features.
- **Architecture:** Async (tokio), trait-based storage abstraction
- **Authentication:** Mandatory SigV4 with built-in IAM (users, groups, roles, policies)
Expand Down Expand Up @@ -97,7 +97,7 @@ extenddb (bin)

### Prerequisites

- Rust 1.88+ (`rustup update`)
- Rust 1.91.1+ (`rustup update`)
- Storage backend (one of):
- PostgreSQL 14+ running locally (see `docs/local-postgres-setup.md`)
- SQLite (embedded; nothing to install)
Expand Down Expand Up @@ -415,7 +415,7 @@ python3 docs/build-docs.py
## Code Style and Conventions

- **Rust edition:** 2024
- **MSRV:** 1.88
- **MSRV:** 1.91.1
- **Async:** tokio, no `#[async_trait]` (use RPITIT)
- **Error handling:** `thiserror` for library errors, `anyhow` for application errors
- **Serialization:** `serde` + `serde_json`
Expand Down
2 changes: 1 addition & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Thank you for your interest in contributing to ExtendDB!

### Prerequisites

- Rust 1.88+ (stable)
- Rust 1.91.1+ (stable)
- PostgreSQL 14+
- Python 3.10+ (for integration tests)

Expand Down
41 changes: 33 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 7 additions & 8 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ members = [
[workspace.package]
version = "0.1.14"
edition = "2024"
rust-version = "1.88"
rust-version = "1.91.1"
license = "Apache-2.0"

[workspace.dependencies]
Expand Down Expand Up @@ -89,14 +89,13 @@ bson = "2.13"
dashmap = "6"

# Backup store
# Exact pins: the aws-sdk crates release in lockstep, and these are the newest
# versions whose declared minimum supported rustc fits the workspace
# rust-version (1.88); later releases require a newer compiler. Their
# transitive aws-* and aws-smithy-* crates are held in Cargo.lock at the
# newest versions that build on 1.88 (set with
# `cargo +1.88.0 update <crate>@<version> --precise <older>`). The resolver
# Exact pins: the aws-sdk crates release in lockstep, and each of these
# versions declares a minimum supported rustc at or below the workspace
# rust-version (1.91.1). Their transitive aws-* and aws-smithy-* crates are
# held in Cargo.lock at versions that build on 1.91.1 (set with
# `cargo +1.91.1 update <crate>@<version> --precise <older>`). The resolver
# fallback in .cargo/config.toml keeps a plain `cargo update` from moving
# them past that, and the 1.88 leg of .github/workflows/test.yml fails if
# them past that, and the 1.91.1 leg of .github/workflows/test.yml fails if
# they drift. The feature set is that of tests/rust/Cargo.toml plus `sso` on
# aws-config, so a server whose credentials come from an SSO profile
# (`sso_session` in the shared config) can reach the backup bucket.
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# The runtime base is explicitly approved for this public OSS distribution.
# Keep both references digest-pinned and update them only through reviewed CRs.
FROM public.ecr.aws/docker/library/rust:1.88-bookworm@sha256:af306cfa71d987911a781c37b59d7d67d934f49684058f96cf72079c3626bfe0 AS build
FROM public.ecr.aws/docker/library/rust:1.91.1-bookworm@sha256:c1e5f19e773b7878c3f7a805dd00a495e747acbdc76fb2337a4ebf0418896b33 AS build
ARG VCS_REF
ARG BUILD_DATE
WORKDIR /src
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.cassandra
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# external service: use an Apache Cassandra 4.1+ cluster you operate, or the
# optional docker-compose.cassandra.yml reference stack for local development.

FROM public.ecr.aws/docker/library/rust:1.88-bookworm@sha256:af306cfa71d987911a781c37b59d7d67d934f49684058f96cf72079c3626bfe0 AS build
FROM public.ecr.aws/docker/library/rust:1.91.1-bookworm@sha256:c1e5f19e773b7878c3f7a805dd00a495e747acbdc76fb2337a4ebf0418896b33 AS build
ARG VCS_REF
ARG BUILD_DATE
WORKDIR /src
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
# production binaries keep readable panic backtraces.
# * distroless runtime: no shell, no package manager, no setuid binaries.

FROM public.ecr.aws/docker/library/rust:1.88-bookworm@sha256:af306cfa71d987911a781c37b59d7d67d934f49684058f96cf72079c3626bfe0 AS build
FROM public.ecr.aws/docker/library/rust:1.91.1-bookworm@sha256:c1e5f19e773b7878c3f7a805dd00a495e747acbdc76fb2337a4ebf0418896b33 AS build
ARG VCS_REF
ARG BUILD_DATE
WORKDIR /src
Expand Down
2 changes: 1 addition & 1 deletion Dockerfile.mongodb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
# external service: use MongoDB Atlas, a managed replica set, or the optional
# docker-compose.mongodb.yml reference stack.

FROM public.ecr.aws/docker/library/rust:1.88-bookworm@sha256:af306cfa71d987911a781c37b59d7d67d934f49684058f96cf72079c3626bfe0 AS build
FROM public.ecr.aws/docker/library/rust:1.91.1-bookworm@sha256:c1e5f19e773b7878c3f7a805dd00a495e747acbdc76fb2337a4ebf0418896b33 AS build
ARG VCS_REF
ARG BUILD_DATE
WORKDIR /src
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ scripts/install-macos.sh # macOS

## Prerequisites

- Rust 1.88+ (`rustup update`)
- Rust 1.91.1+ (`rustup update`)
- Python 3.10+ (for test suites and documentation)
- A storage backend:
- PostgreSQL 14+ (see `docs/local-postgres-setup.md`)
Expand Down
2 changes: 1 addition & 1 deletion crates/cache/src/swr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ pub struct SwrCacheConfig {
impl Default for SwrCacheConfig {
fn default() -> Self {
Self {
ttl: Duration::from_secs(60),
ttl: Duration::from_mins(1),
soft_ttl: Duration::from_secs(30),
negative_ttl: Duration::from_secs(5),
max_entries: 10_000,
Expand Down
4 changes: 2 additions & 2 deletions crates/cache/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ async fn refresh_failure_does_not_evict_stale_entry() {
async fn lru_eviction_caps_size_at_max_entries() {
let (loader, _) = CountingLoader::new();
let config = SwrCacheConfig {
ttl: Duration::from_secs(60),
ttl: Duration::from_mins(1),
soft_ttl: Duration::from_secs(30),
negative_ttl: Duration::from_secs(5),
max_entries: 4,
Expand Down Expand Up @@ -402,7 +402,7 @@ async fn invalidate_all_clears_every_entry() {
#[tokio::test(flavor = "multi_thread", worker_threads = 4)]
async fn config_default_has_expected_values() {
let cfg = SwrCacheConfig::default();
assert_eq!(cfg.ttl, Duration::from_secs(60));
assert_eq!(cfg.ttl, Duration::from_mins(1));
assert_eq!(cfg.soft_ttl, Duration::from_secs(30));
assert_eq!(cfg.negative_ttl, Duration::from_secs(5));
assert_eq!(cfg.max_entries, 10_000);
Expand Down
2 changes: 1 addition & 1 deletion crates/storage-cassandra/src/migrations/backend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ pub(crate) fn stopped(left: Option<&std::sync::atomic::AtomicUsize>) -> bool {
return false;
};
// A compare-exchange loop: `fetch_update` is deprecated on current
// stable and its replacement does not exist on 1.88.
// stable and its replacement does not exist on 1.91.1.
let mut n = left.load(Ordering::SeqCst);
loop {
let Some(next) = n.checked_sub(1) else {
Expand Down
2 changes: 1 addition & 1 deletion crates/storage-mongodb/src/migrations/guarded.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ pub(crate) struct LeasedManagementStore {
pub(crate) fn stopped(left: Option<&std::sync::atomic::AtomicUsize>) -> bool {
use std::sync::atomic::Ordering;
// A compare-exchange loop: `fetch_update` is deprecated on current
// stable and its replacement does not exist on 1.88.
// stable and its replacement does not exist on 1.91.1.
let Some(left) = left else {
return false;
};
Expand Down
2 changes: 1 addition & 1 deletion docs/design/15-backup-restore.md
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,7 @@ Phase 3, later (v1.x):

- Backups are asynchronous where the current implementation is synchronous; clients that assumed AVAILABLE on return must poll, which is what they do against DynamoDB.
- Long snapshot transactions on PostgreSQL delay vacuum for the backup duration; MongoDB snapshot windows bound backup duration by server configuration.
- A new dependency on the AWS S3 SDK (its lock entries pinned to the versions that build on the workspace's 1.88 toolchain, which also holds `crc` at 3.3.0 for the server; the licence notices change when PR 7 links the crate into the server) and an S3 mock in CI.
- A new dependency on the AWS S3 SDK (its lock entries pinned to the versions that build on the workspace's 1.91.1 toolchain, which also holds `crc` at 3.3.0 for the server; the licence notices change when PR 7 links the crate into the server) and an S3 mock in CI.
- A restore from an S3 store spools the whole compressed backup to local disk before loading any of it.
- One core at full utilization for the duration of a backup on compression; `max_concurrent_jobs` and `spawn_blocking` keep it off the request threads but do not make it free on a 2-vCPU host.
- Two code paths for one release while legacy backups remain readable.
Expand Down
2 changes: 1 addition & 1 deletion docs/getting-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ See [Local Development with Docker Compose](local-dev-docker-compose.md).
- SQLite (embedded; nothing to install)
- MongoDB 7.0+ with replica set (see `docs/local-mongodb-setup.md`)
- Cassandra 4.1+ running locally (see `docs/cassandra-setup.md`)
- Rust toolchain (1.88+)
- Rust toolchain (1.91.1+)
- AWS CLI v2 (for testing)
- Python 3.10+ with virtual environment (see [Python Environment Setup](../README.md#python-environment-setup) in the README)

Expand Down
2 changes: 1 addition & 1 deletion docs/manuals/04-quickstart-setup-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ This section gets you from zero to a working extenddb instance as fast as possib
### Prerequisites

- PostgreSQL 14+ running locally
- Rust toolchain 1.88+
- Rust toolchain 1.91.1+
- AWS CLI v2

### Steps
Expand Down
2 changes: 1 addition & 1 deletion docs/manuals/08-install-linux.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ If you prefer to run each step yourself, follow the sections below.

## Prerequisites

- Rust 1.88+ (`rustup update`)
- Rust 1.91.1+ (`rustup update`)
- PostgreSQL 14+
- Python 3.10+ (for test suites)
- AWS CLI v2 (for testing)
Expand Down
2 changes: 1 addition & 1 deletion docs/manuals/09-install-macos.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ If you prefer to run each step yourself, follow the sections below.

## Prerequisites

- Rust 1.88+ (`rustup update`)
- Rust 1.91.1+ (`rustup update`)
- PostgreSQL 14+ via Homebrew (`brew install postgresql@17`)
- Python 3.10+ (for test suites)
- AWS CLI v2 (for testing)
Expand Down
Loading