Skip to content

Commit b09dc85

Browse files
Merge branch 'main' into fix/57-export-consistent-snapshot
2 parents 71982fc + f773e5b commit b09dc85

174 files changed

Lines changed: 15690 additions & 1996 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/extenddb/references/setup/02-dependency-checks.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ This file lists the dependency checks the `extenddb-setup` skill runs before pro
88

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

32-
If Rust is installed but `rustc --version` reports older than 1.85:
32+
If Rust is installed but `rustc --version` reports older than 1.88:
3333

3434
```bash
3535
rustup update
@@ -84,7 +84,7 @@ If `python3 --version` reports older than 3.10, upgrade via the same package man
8484

8585
## Version parsing
8686

87-
`rustc --version` prints `rustc 1.85.0 (abcdef0 2025-01-01)`. Extract the version field with `awk`:
87+
`rustc --version` prints `rustc 1.88.0 (abcdef0 2025-01-01)`. Extract the version field with `awk`:
8888

8989
```bash
9090
rustc --version | awk '{print $2}'
@@ -96,11 +96,11 @@ rustc --version | awk '{print $2}'
9696
psql --version | awk '{print $3}'
9797
```
9898

99-
Compare the extracted version against the minimum (1.85 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.
99+
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.
100100

101101
## Rust version upgrade path
102102

103-
If Rust is installed via rustup and `rustc --version` reports older than 1.85, the fix is:
103+
If Rust is installed via rustup and `rustc --version` reports older than 1.88, the fix is:
104104

105105
```bash
106106
rustup update

.agents/skills/extenddb/references/setup/03-build-stage.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,4 @@ This should print the extenddb version string. If it does not, the build failed
5959
cargo build --release --verbose
6060
```
6161

62-
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.85, or a disk full condition under `target/`. The verbose output names the failing crate and the missing dependency.
62+
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.

.github/CODEOWNERS

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# CODEOWNERS — auto-requests reviewers and (with branch protection enabled)
2+
# requires their approval to merge.
3+
#
4+
# Order matters: the LAST matching pattern wins.
5+
# Syntax: <path-glob> <owner1> <owner2> ...
6+
#
7+
# To enforce: in repo Settings → Branches → branch protection rule for `main`,
8+
# enable "Require review from Code Owners".
9+
10+
# Default — any file not matched below.
11+
* @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
12+
13+
# Wire protocol & DynamoDB-compatible API surface.
14+
crates/server/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
15+
crates/core/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
16+
17+
# Storage abstraction — breaking changes ripple to every backend.
18+
crates/storage/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
19+
crates/storage-postgres/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
20+
crates/engine/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
21+
22+
# Auth & SigV4 — security-sensitive.
23+
crates/auth/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
24+
25+
# Public CLI surface.
26+
crates/bin/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
27+
28+
# Process & governance documents.
29+
docs/adr/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
30+
docs/rfcs/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
31+
CONTRIBUTING.md @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen
32+
.github/ @amrith @c33howard @jcshepherd @pdf-amzn @LeeroyHannigan @yesyayen

.github/pull_request_template.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ Closes #
2121
- [ ] I have added or updated tests for new functionality
2222
- [ ] I have updated documentation if behavior changed
2323
- [ ] Breaking changes are noted below (if any)
24+
- [ ] If this changes the wire protocol, `Storage` trait, auth model, on-disk
25+
format, or public CLI surface, an RFC has been accepted or is linked
26+
below. Otherwise, an ADR captures the decision (link below).
27+
28+
ADR / RFC: <!-- link or "n/a" -->
2429

2530
## Breaking changes
2631

.github/workflows/clippy.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: Clippy
2+
on:
3+
pull_request:
4+
merge_group:
5+
push:
6+
branches: [main]
7+
8+
jobs:
9+
clippy:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v6
13+
- uses: dtolnay/rust-toolchain@stable
14+
with:
15+
components: clippy
16+
- uses: Swatinem/rust-cache@v2
17+
- run: cargo clippy --all-targets -- -D warnings

.github/workflows/fmt.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
name: Format
2+
on:
3+
pull_request:
4+
merge_group:
5+
push:
6+
branches: [main]
7+
8+
jobs:
9+
fmt:
10+
runs-on: ubuntu-latest
11+
steps:
12+
- uses: actions/checkout@v6
13+
- uses: dtolnay/rust-toolchain@stable
14+
with:
15+
components: rustfmt
16+
- run: cargo fmt --all -- --check

.github/workflows/test.yml

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
name: Test
2+
on:
3+
pull_request:
4+
merge_group:
5+
push:
6+
branches: [main]
7+
8+
permissions:
9+
contents: read
10+
11+
jobs:
12+
run-tests:
13+
runs-on: ubuntu-latest
14+
strategy:
15+
matrix:
16+
toolchain: [stable, "1.88.0"]
17+
steps:
18+
- uses: actions/checkout@v4
19+
- uses: dtolnay/rust-toolchain@master
20+
with:
21+
toolchain: ${{ matrix.toolchain }}
22+
- uses: Swatinem/rust-cache@v2
23+
- run: cargo test --workspace
24+
25+
test:
26+
runs-on: ubuntu-latest
27+
needs: run-tests
28+
if: always()
29+
steps:
30+
- run: |
31+
if [ "${{ needs.run-tests.result }}" != "success" ]; then
32+
exit 1
33+
fi

AGENTS.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ License. ExtendDB is a clean-room implementation of the DynamoDB wire protocol,
99
by AWS engineers. It is not a fork of DynamoDB and contains no DynamoDB source code. ExtendDB speaks the DynamoDB wire
1010
protocol: any AWS SDK, CLI, or tool that works with DynamoDB works with ExtendDB, unchanged.
1111

12-
- **Language:** Rust (edition 2024, MSRV 1.85+)
12+
- **Language:** Rust (edition 2024, MSRV 1.88+)
1313
- **Storage backend:** PostgreSQL 14+
1414
- **Architecture:** Async (tokio), trait-based storage abstraction
1515
- **Authentication:** Mandatory SigV4 with built-in IAM (users, groups, roles, policies)
@@ -81,7 +81,7 @@ extenddb (bin)
8181

8282
### Prerequisites
8383

84-
- Rust 1.85+ (`rustup update`)
84+
- Rust 1.88+ (`rustup update`)
8585
- PostgreSQL 14+ running locally (see `docs/local-postgres-setup.md`)
8686
- Python 3.10+ for tests (`python3 -m venv ~/venvs/extenddb-venv && source ~/venvs/extenddb-venv/bin/activate && pip install -r requirements.txt`)
8787

@@ -288,7 +288,7 @@ Or use the web console at `https://127.0.0.1:8000/console/`.
288288
# Health check
289289
curl --cacert ~/.extenddb/tls/cert.pem https://127.0.0.1:8000/health
290290

291-
# Prometheus metrics
291+
# JSON metrics (DynamoDB CloudWatch-style)
292292
curl --cacert ~/.extenddb/tls/cert.pem https://127.0.0.1:8000/metrics
293293

294294
# Syslog (Linux)
@@ -369,14 +369,14 @@ python3 docs/build-docs.py
369369
## Code Style and Conventions
370370

371371
- **Rust edition:** 2024
372-
- **MSRV:** 1.85
372+
- **MSRV:** 1.88
373373
- **Async:** tokio, no `#[async_trait]` (use RPITIT)
374374
- **Error handling:** `thiserror` for library errors, `anyhow` for application errors
375375
- **Serialization:** `serde` + `serde_json`
376376
- **Database:** `sqlx` with compile-time query checking (PostgreSQL)
377377
- **HTTP:** `axum` + `tower` + `hyper`
378378
- **Logging:** `tracing` + `tracing-subscriber`
379-
- **Metrics:** `metrics` + `metrics-exporter-prometheus`
379+
- **Metrics:** in-memory `MetricsCollector` (`crates/core/src/metrics/`), exposed as JSON via `/metrics` with DynamoDB CloudWatch-style metric names and dimensions
380380
- **TLS:** `rustls` + `axum-server`
381381

382382
### Naming Conventions

CONTRIBUTING.md

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,39 @@
11
# Contributing to ExtendDB
22

3-
Thank you for your interest in contributing to ExtendDB.
3+
Thank you for your interest in contributing to ExtendDB!
44

55
## Getting Started
66

77
### Prerequisites
88

9-
- Rust 1.85+ (stable)
9+
- Rust 1.88+ (stable)
1010
- PostgreSQL 14+
1111
- Python 3.10+ (for integration tests)
1212

13+
### Prepare
14+
15+
Familiarize yourself with ExtendDB's design and developer expectations by reviewing:
16+
- [Architecture Guide](/docs/manuals/01-architecture-guide.md)
17+
- [Design Guide](/docs/manuals/02-design-guide.md)
18+
- [Developer Guide](/docs/manuals/06-developer-test-guide.md)
19+
20+
### Recommended Workflow
21+
22+
We suggest following the workflow below for proposing and contributing improvements to ExtendDB:
23+
1. Find or create an issue in [ExtendDB's Open Issues](https://github.com/ExtendDB/extenddb/issues) that
24+
describes the fix, improvement or feature that you plan to work on.
25+
1. For large changes, refactorings, new features, or changes to API specifications, wire protocol, backend
26+
storage traits, authentication or authorization, schema or CLI commands, please submit an
27+
[RFC](docs/rfcs/README.md) as a pull request and link it to the GitHub issue. Allow time for the RFC to
28+
be reviewed, discussed and voted on.
29+
1. Create a fork of the [ExtendDB 'main' branch](https://github.com/ExtendDB/extenddb/tree/main).
30+
1. Clone your fork into your development environment.
31+
1. Make, build, test and self-review your changes on a feature branch on your fork.
32+
1. Make your changes with clear, focused commits.
33+
1. Ensure all tests pass and code is properly formatted.
34+
1. Submit your changes as a pull request, linked to the issue and (if applicable) RFC that your
35+
work addresses.
36+
1337
### Build
1438

1539
```bash
@@ -23,7 +47,7 @@ cargo build --workspace
2347
cargo test --workspace
2448

2549
# Integration tests (requires a running extenddb server)
26-
pytest tests/
50+
devtools/run-tests --extenddb --pytest
2751
```
2852

2953
### Code Style
@@ -39,13 +63,26 @@ cargo clippy -- -W clippy::pedantic -W clippy::unwrap_used -W clippy::expect_use
3963
- Address all clippy warnings or add `#[allow(...)]` with a justification comment.
4064
- Avoid `.unwrap()` and `.expect()` in library crates — use `?` or explicit error handling.
4165

42-
### Submitting Changes
66+
## When you need an ADR or an RFC
67+
68+
ExtendDB uses two lightweight processes to keep core decisions reviewable:
69+
70+
- **ADR** ([`docs/adr/`](docs/adr/)) — records a decision *after* it has been
71+
made, in four sections: Context, Options Considered, Decision, Consequences.
72+
Use for narrower, internal calls (for example, "we chose `ring` over
73+
`openssl`" or "ADRs live in `docs/adr/`").
74+
- **RFC** ([`docs/rfcs/`](docs/rfcs/)) — proposes a change *before* it is made and
75+
invites a comment period. Use for changes to the wire protocol, the
76+
`Storage` trait, the auth model, on-disk format, or the public CLI surface.
77+
See [`docs/rfcs/README.md`](docs/rfcs/README.md) for the lifecycle.
78+
79+
If you are not sure which to write, open an issue describing the change. A
80+
maintainer will tell you which path fits.
4381

44-
1. Fork the repository and create a branch from `main`.
45-
2. Make your changes with clear, focused commits.
46-
3. Ensure all tests pass and code is formatted.
47-
4. Open a pull request with a description of what changed and why.
82+
Some areas are protected by [`.github/CODEOWNERS`](.github/CODEOWNERS) — PRs
83+
touching them require approval from the listed owners.
4884

4985
## License
5086

51-
By contributing, you agree that your contributions will be licensed under the [Apache License 2.0](LICENSE).
87+
By contributing, you agree that your contributions will be licensed under the
88+
[Apache License 2.0](LICENSE).

0 commit comments

Comments
 (0)