Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
d9fed10
docs: draft rfc for accepting backend database plugins
jcshepherd Jun 22, 2026
948150b
Merge branch 'main' of https://github.com/jcshepherd/extenddb
jcshepherd Jun 22, 2026
82aacdd
Merge branch 'ExtendDB:main' into main
jcshepherd Jun 26, 2026
70dfe1b
docs: addressing feedback on RFC-0002
jcshepherd Jun 26, 2026
9dbad6c
Merge branch 'ExtendDB:main' into main
jcshepherd Jul 9, 2026
208df8e
Merge branch 'ExtendDB:main' into main
jcshepherd Jul 20, 2026
1dc470c
Merge branch 'ExtendDB:main' into main
jcshepherd Aug 4, 2026
70e761f
Merge branch 'ExtendDB:main' into main
jcshepherd Aug 5, 2026
94cfdda
Merge branch 'main' of https://github.com/ExtendDB/extenddb
jcshepherd Sep 15, 2026
02314fb
feat: enable node-specific instance_id to be set through StorageConfig.
jcshepherd Sep 15, 2026
4e19666
feat: Apache Cassandra storage backend (in-tree)
jcshepherd Aug 28, 2026
9af025d
chore: fix unused var binding; cargo fmt cleanup
jcshepherd Aug 28, 2026
aa05314
chore: clippy pass on storage-postgres
jcshepherd Aug 28, 2026
6fc60da
chore(storage-cassandra): clippy fixes - format stings, doc cleanup, …
jcshepherd Aug 28, 2026
d6cfe3a
chore: removing unused index function, and cascade user deletes in a …
jcshepherd Aug 31, 2026
87bb1e1
chore(storage-cassandra): cargo fmt
jcshepherd Sep 1, 2026
ce84e90
fix: SSE and table class attributes, linearization of concurrent writ…
jcshepherd Sep 1, 2026
f5de29d
fix(cassandra-storage): four GSI correctness bugs in Cassandra backend
jcshepherd Sep 3, 2026
fc7cd4c
fix(storage-cassandra): five pytest integration test failures
jcshepherd Sep 4, 2026
afd9f6d
fix:fixing merge from main by plumbing table_throughput_mode through …
jcshepherd Sep 4, 2026
db705dc
feat(cassandra): Add DynamoDB-compatible TTL
robinnsc Sep 9, 2026
e289bda
fix(cassandra): fix transaction concurrency bugs and add GSI backfill
jcshepherd Sep 9, 2026
303cd03
chore(storage-cassandra): cargo fmt
jcshepherd Sep 9, 2026
5290368
chore(storage-cassandra): cargo fmt and clippy
jcshepherd Sep 10, 2026
73babee
docs: adding draft RFC for the Cassandra backend along with a barnyar…
jcshepherd Sep 10, 2026
1cd9321
fix(storage-cassandra): Single constant for CATALOG_VERSION, enforce …
jcshepherd Sep 14, 2026
0d12af0
chore(storage-cassandra): removing 'test' used for debugging (PR338 B11)
jcshepherd Sep 14, 2026
dd78118
fix(storage-cassandra): correctly map key placeholders to attribute n…
jcshepherd Sep 14, 2026
1dd8a57
fix(storage-cassandra): put_item() and delete_item() use occ_write() …
jcshepherd Sep 14, 2026
49f9532
fix(storage-cassandra): consolidate methods for checking 'applied' re…
jcshepherd Sep 14, 2026
5b971e7
fix(storage-cassandra): delete idempotency token if transaction ledge…
jcshepherd Sep 15, 2026
f15f43f
test: integration tests for concurrency control on mutating item oper…
jcshepherd Sep 15, 2026
845f933
chore:rebase from main
jcshepherd Sep 15, 2026
e94622f
feat: normalize stream record sequence numbers to backend-specified w…
jcshepherd Sep 15, 2026
214c8f0
test: unit test for sequence number padding
jcshepherd Sep 15, 2026
693c3c1
chore:merge from fix/streams-sequence-normalization
jcshepherd Sep 15, 2026
71d9992
fix(storage-cassandra): override sequence_number_width to 23 for HLC …
jcshepherd Sep 15, 2026
88b2750
fix: table tags are deleted along with the table
jcshepherd Sep 15, 2026
d147161
fix: fix overlooked call site for drop_ttl_index
jcshepherd Sep 15, 2026
d9aedff
fix:addressing 'PII' information in bootstrapper output
jcshepherd Sep 17, 2026
439ca5b
fix: restore the PR #339 work dropped by the rebase from main
robinnsc Sep 17, 2026
0aebbe4
fix: OCC delete fast path must write the partition delete high-water …
robinnsc Sep 17, 2026
fe657a3
test: port the plug-in repo's direct storage-trait integration suite
robinnsc Sep 15, 2026
a79080e
feat: ENABLING/DISABLING TTL states, non-blocking updates, durable ba…
robinnsc Sep 15, 2026
3223a92
test: wait out the TTL enable transition in the E2E disable tests
robinnsc Sep 15, 2026
df55185
test: fold the metadata suite into the direct integration binary
robinnsc Sep 18, 2026
69efe88
feat: Cassandra - ENABLING/DISABLING TTL states, non-blocking updates…
robinnsc Sep 19, 2026
bae4933
test: Porting over the Cassandra Repo integration suite
robinnsc Sep 19, 2026
12e25c5
fix(storage-cassandra): responding to PR feedback on extenddb init be…
jcshepherd Sep 18, 2026
c81bcb0
Merge remote-tracking branch 'origin/main' into feat/storage-cassandr…
jcshepherd Sep 22, 2026
9b3f26d
chore(tests): tests shouldn't assume GSI creation is async, test cons…
jcshepherd Sep 23, 2026
4f24818
fix:Pinning pgvector to 0.4.1, 0.4.2 requires sqlx 0.9.0 and we're cu…
jcshepherd Sep 23, 2026
c94b69e
chore:updating SOFTWARE-LICENSE-NOTICES.html
jcshepherd Sep 23, 2026
9ea0dce
test(storage-cassandra): limit parallelism for direct-integration tes…
jcshepherd Sep 23, 2026
60b540d
chore:refresh MongoDB and Dev licenses, add Cassandra license file an…
jcshepherd Sep 23, 2026
0c4d076
chore(storage-cassandra): add license notice check for Cassandra
jcshepherd Sep 23, 2026
a84012c
ci: add Cassandra CI workflow and test runner
jcshepherd Sep 28, 2026
2a31ab6
Merging back CI testing
jcshepherd Sep 28, 2026
979ba4d
fix(storage-cassandra): Unconditional deletes do not pass through OCC…
jcshepherd Sep 29, 2026
71ae9b4
chore: cargo fmt
jcshepherd Sep 29, 2026
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
227 changes: 227 additions & 0 deletions .github/workflows/integration-cassandra.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
# Copyright 2026 ExtendDB contributors
# SPDX-License-Identifier: Apache-2.0
name: Cassandra Integration Tests

on:
pull_request:
merge_group:
push:
branches: [main, feat/storage-cassandra-in-tree]

permissions:
contents: read

# The Cassandra backend's integration tests (crates/storage-cassandra/tests)
# talk to a live node at 127.0.0.1:9042 with cassandra/cassandra credentials
# and are not feature-gated — without this workflow they never run in CI and
# every green result is a local claim. The TTL claim protocol in particular
# fails silently if the stored item encoding drifts, so these tests are the
# only automated signal for a whole class of regressions.
#
# A single-node container is enough: the tests create their own keyspaces
# (RF=1) and run serially because the sweep and reconciliation passes are
<<<<<<< HEAD
# global. The stock image uses AllowAllAuthenticator, so the credentials the
# tests and health check send are accepted without an auth challenge.
=======
# global.
#
# The cassandra:4.1 image does not honour CASSANDRA_AUTHENTICATOR, so each job
# patches cassandra.yaml inside the running container and restarts it before
# running any tests. The health-check on the service container uses the default
# AllowAllAuthenticator credentials (no auth challenge), so the container is
# healthy before the patch step runs; after the restart a second wait loop
# confirms the node is back up with PasswordAuthenticator active.

>>>>>>> ci/cassandra-integration-workflow
jobs:
cassandra-storage:
runs-on: ubuntu-latest
services:
cassandra:
image: cassandra:4.1
ports:
- 9042:9042
env:
CASSANDRA_CLUSTER_NAME: extenddb-ci
HEAP_NEWSIZE: 128M
MAX_HEAP_SIZE: 1024M
options: >-
<<<<<<< HEAD
--health-cmd "cqlsh -u cassandra -p cassandra -e 'SELECT release_version FROM system.local'"
=======
--health-cmd "cqlsh -e 'SELECT release_version FROM system.local'"
>>>>>>> ci/cassandra-integration-workflow
--health-interval 15s
--health-timeout 10s
--health-retries 20
--health-start-period 60s
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
<<<<<<< HEAD
=======
- name: Configure Cassandra authentication
run: |
docker exec ${{ job.services.cassandra.id }} sed -i \
's/^authenticator: .*/authenticator: PasswordAuthenticator/' \
/etc/cassandra/cassandra.yaml
docker restart ${{ job.services.cassandra.id }}
for i in $(seq 1 30); do
if docker exec ${{ job.services.cassandra.id }} \
cqlsh -u cassandra -p cassandra \
-e 'SELECT release_version FROM system.local' \
>/dev/null 2>&1; then
echo "Cassandra ready with PasswordAuthenticator after ${i}s"
exit 0
fi
sleep 2
done
echo "Cassandra did not become ready" >&2; exit 1
>>>>>>> ci/cassandra-integration-workflow
- name: Unit tests
run: cargo test -p extenddb-storage-cassandra --lib
- name: TTL integration tests
run: cargo test -p extenddb-storage-cassandra --test ttl_integration -- --test-threads=1
<<<<<<< HEAD
=======
env:
EXTENDDB_TEST_CASSANDRA: required
>>>>>>> ci/cassandra-integration-workflow
- name: Direct storage-trait integration tests
# Ported from the plug-in repo's tests/rust suite. Parallel-safe:
# each test provisions its own account and keyspace; the shared
# control-plane setting test restores what it mutates.
run: cargo test -p extenddb-storage-cassandra --test direct_integration
<<<<<<< HEAD
=======
env:
EXTENDDB_TEST_CASSANDRA: required

cassandra-pytest:
runs-on: ubuntu-latest
services:
cassandra:
image: cassandra:4.1
ports:
- 9042:9042
env:
CASSANDRA_CLUSTER_NAME: extenddb-ci
HEAP_NEWSIZE: 128M
MAX_HEAP_SIZE: 1024M
options: >-
--health-cmd "cqlsh -e 'SELECT release_version FROM system.local'"
--health-interval 15s
--health-timeout 10s
--health-retries 20
--health-start-period 60s
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Configure Cassandra authentication
run: |
docker exec ${{ job.services.cassandra.id }} sed -i \
's/^authenticator: .*/authenticator: PasswordAuthenticator/' \
/etc/cassandra/cassandra.yaml
docker restart ${{ job.services.cassandra.id }}
for i in $(seq 1 30); do
if docker exec ${{ job.services.cassandra.id }} \
cqlsh -u cassandra -p cassandra \
-e 'SELECT release_version FROM system.local' \
>/dev/null 2>&1; then
echo "Cassandra ready with PasswordAuthenticator after ${i}s"
exit 0
fi
sleep 2
done
echo "Cassandra did not become ready" >&2; exit 1
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install Python dependencies
run: pip install -r requirements.txt
- name: Build release (cassandra backend)
run: cargo build --release --no-default-features --features cassandra
- name: Run Cassandra pytest suite
run: devtools/run-cassandra-tests -- --pytest --comprehensive --parallel

cassandra-rust:
runs-on: ubuntu-latest
services:
cassandra:
image: cassandra:4.1
ports:
- 9042:9042
env:
CASSANDRA_CLUSTER_NAME: extenddb-ci
HEAP_NEWSIZE: 128M
MAX_HEAP_SIZE: 1024M
options: >-
--health-cmd "cqlsh -e 'SELECT release_version FROM system.local'"
--health-interval 15s
--health-timeout 10s
--health-retries 20
--health-start-period 60s
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Configure Cassandra authentication
run: |
docker exec ${{ job.services.cassandra.id }} sed -i \
's/^authenticator: .*/authenticator: PasswordAuthenticator/' \
/etc/cassandra/cassandra.yaml
docker restart ${{ job.services.cassandra.id }}
for i in $(seq 1 30); do
if docker exec ${{ job.services.cassandra.id }} \
cqlsh -u cassandra -p cassandra \
-e 'SELECT release_version FROM system.local' \
>/dev/null 2>&1; then
echo "Cassandra ready with PasswordAuthenticator after ${i}s"
exit 0
fi
sleep 2
done
echo "Cassandra did not become ready" >&2; exit 1
- uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install Python dependencies
run: pip install -r requirements.txt
- name: Build release (cassandra backend)
run: cargo build --release --no-default-features --features cassandra
- name: Run Cassandra rust integration suite
run: devtools/run-cassandra-tests -- --rust --rust-integration

cassandra-production-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
cache-on-failure: true
- name: Check production Cassandra feature graph
run: cargo check --release --no-default-features --features cassandra

cassandra-integration:
runs-on: ubuntu-latest
needs: [cassandra-storage, cassandra-pytest, cassandra-rust, cassandra-production-build]
if: always()
steps:
- run: |
if [ "${{ needs.cassandra-storage.result }}" != "success" ] || \
[ "${{ needs.cassandra-pytest.result }}" != "success" ] || \
[ "${{ needs.cassandra-rust.result }}" != "success" ] || \
[ "${{ needs.cassandra-production-build.result }}" != "success" ]; then
exit 1
fi
>>>>>>> ci/cassandra-integration-workflow
2 changes: 2 additions & 0 deletions .github/workflows/licenses.yml
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ jobs:
run: ./devtools/generate-software-license-notices --check
- name: MongoDB notices must be current
run: ./devtools/generate-software-license-notices --check --backend mongodb
- name: Cassandra notices must be current
run: ./devtools/generate-software-license-notices --check --backend cassandra
- name: DEV notices must be current
# The dev image ships SOFTWARE-LICENSE-NOTICES-DEV.html for its own
# feature set (sqlite,dev-mode). Same incident class as #271/#272: a
Expand Down
Loading
Loading