Skip to content
Draft
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
4 changes: 2 additions & 2 deletions .github/workflows/integration.yml
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ jobs:
EXTENDDB_ADMIN_PASSWORD: ${{ steps.init.outputs.admin_password }}
EXTENDDB_TEST_PG_ADMIN_CONNECTION_STRING: postgresql://postgres:devpass@127.0.0.1:5432
EXTENDDB_TEST_BACKUP_STORE: filesystem
run: devtools/run-tests --extenddb --pytest --comprehensive --parallel --filter "not import_export"
run: devtools/run-tests --extenddb --pytest --comprehensive --parallel

# moto for the job suite's store-outage cell, the one cell that
# exercises `spool_path` on PostgreSQL (an S3 download into the spool,
Expand Down Expand Up @@ -332,7 +332,7 @@ jobs:
# A file-backed SQLite server without [backup.store] writes to the
# defaulted root beside the database file.
EXTENDDB_TEST_BACKUP_STORE: filesystem
run: devtools/run-tests --extenddb --pytest --comprehensive --parallel --filter "not import_export"
run: devtools/run-tests --extenddb --pytest --comprehensive --parallel

- name: Run the backup store and job suites
run: python3 -m pytest tests/test_backup_store_config.py tests/test_backup_job.py -v -rP -p no:cacheprovider
Expand Down
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,7 @@ Expression parsing lives in `crates/core/src/expression/`. This is pure sync Rus
| Admin Guide | `docs/manuals/05-admin-guide.md` | Server lifecycle, configuration, IAM |
| Security Model | `docs/manuals/10-security-model.md` | Threat model, auth, authz |
| Deployment Guide | `docs/manuals/11-deployment-guide.md` | Self-hosted, multi-cloud, air-gapped |
| Backup and Restore | `docs/manuals/14-backup-and-restore.md` | Backup strategy, drills, recovery |
| Differences from DynamoDB | `docs/differences-from-dynamodb.md` | Behavioral differences |
| Troubleshooting | `docs/troubleshooting.md` | Common errors and solutions |
| Storage Component Design | `docs/design/04-component-storage.md` | Storage trait design |
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ docs/
| [Admin Guide](docs/manuals/05-admin-guide.md) | Server lifecycle, configuration, IAM management |
| [Security Model](docs/manuals/10-security-model.md) | Threat model, authentication, authorization |
| [Deployment Guide](docs/manuals/11-deployment-guide.md) | Self-hosted, multi-cloud, air-gapped deployments |
| [Backup and Restore](docs/manuals/14-backup-and-restore.md) | Backup strategy, recovery figures, restore drill, catalog-loss recovery |
| [Differences from DynamoDB](docs/differences-from-dynamodb.md) | Behavioral differences and unsupported operations |
| [Troubleshooting](docs/troubleshooting.md) | Common errors and solutions |

Expand Down
4 changes: 2 additions & 2 deletions crates/app/src/cmd_init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ pub struct InitArgs {
#[arg(long)]
backend: Option<String>,

/// Data database name (default: extenddb)
/// Data database name (default: the catalog's name without its `_catalog` suffix)
#[arg(long)]
data_db: Option<String>,

/// Catalog database name (default: <data-db>_catalog)
/// Catalog database name (default: extenddb_catalog, or the config file's)
#[arg(long)]
catalog_db: Option<String>,

Expand Down
11 changes: 10 additions & 1 deletion docs/adr/0019-cassandra-logical-backup-restore.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,17 @@
# ADR-0019: Logical backup and restore for Cassandra

**Status:** Accepted
**Status:** Superseded in part by the off-host backup design, [15-backup-restore.md](../design/15-backup-restore.md)
**Date:** 2026-08-03

> Superseded in part. `CreateBackup` on Cassandra still writes the in-catalog backup this record describes,
> before it returns. The rest has changed: `RestoreTableFromBackup` runs as a background job that answers
> `CREATING` and restores the secondary indexes, a reconciler resolves an interrupted restore, a backup in a
> configured backup store restores into Cassandra, and the continuous-backup status is no longer stored. The
> reconciler also removes an in-catalog backup whose `CreateBackup` did not finish and that no process owns,
> so the Negative consequence that interrupted operations need a future reconciliation worker no longer holds
> for the create. The [Backup and Restore manual](../manuals/14-backup-and-restore.md) is the operator's account and the design
> is the record.

## Context

ExtendDB's `BackupEngine` exposes DynamoDB-compatible on-demand backup, restore, listing, deletion, and continuous-backup status operations. Cassandra's native snapshots are node-local SSTable artifacts managed through `nodetool`, JMX, and filesystem/object-storage tooling. They cannot be created, enumerated, or restored through the CQL session available to this plugin, and a distributed snapshot requires cluster-level orchestration outside the storage trait.
Expand Down
2 changes: 1 addition & 1 deletion docs/adr/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ decision, write a new ADR.
| [0016](0016-cassandra-index-table-primary-key-structure.md) | Cassandra: index table primary-key structure | Accepted |
| [0017](0017-cassandra-transaction-implementation.md) | Cassandra: TransactWriteItems / TransactGetItems implementation | Accepted |
| [0018](0018-cassandra-stream-implementation.md) | Cassandra: DynamoDB Streams implementation | Accepted |
| [0019](0019-cassandra-logical-backup-restore.md) | Cassandra: logical backup and restore | Accepted |
| [0019](0019-cassandra-logical-backup-restore.md) | Cassandra: logical backup and restore | Superseded in part by [design 15](../design/15-backup-restore.md) |
| [0020](0020-cassandra-occ-update-item.md) | Cassandra: optimistic concurrency control for UpdateItem and PutItem | Accepted |
| [0021](0021-cassandra-lwt-delete-atomicity-gap.md) | Cassandra: LWT delete atomicity gap and required worker/saga pattern | Accepted |
| [0022](0022-trust-policy-deny-over-allow.md) | Role trust-policy evaluation follows IAM Deny-over-Allow order | Accepted |
Expand Down
2 changes: 2 additions & 0 deletions docs/build-docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,8 @@
"docs/local-postgres-setup.md"),
(18, "event-ticketing-demo", "Event Ticketing Platform Demo", "getting-started",
"docs/manuals/13-event-ticketing-demo.md"),
(19, "backup-and-restore", "Backup and Restore", "usage",
"docs/manuals/14-backup-and-restore.md"),
]


Expand Down
Loading
Loading