diff --git a/.github/workflows/integration-cassandra.yml b/.github/workflows/integration-cassandra.yml new file mode 100644 index 000000000..08ad150a8 --- /dev/null +++ b/.github/workflows/integration-cassandra.yml @@ -0,0 +1,226 @@ +# 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 + +# Supersede an in-flight run of the SAME pull request when a new push arrives, +# so repeated pushes do not stack up on a capped pool. Non-PR runs get a group +# unique to the run (run_id): merge-group runs reuse a ref across re-queues, +# and GitHub concurrency replaces a PENDING run in a group even with +# cancel-in-progress false, so keying them by ref would let one merge-group +# run cancel another and evict its queue entry. +concurrency: + group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.event.pull_request.number || github.run_id }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + + +# The Cassandra backend's integration tests (crates/storage-cassandra/tests) +# talk to a live node at 127.0.0.1:9042 with default cassandra/cassandra +# credentials. This workflow enables them to run in CI. +# +# A single-node Cassandra installation is enough. the tests create their own +# keyspaces with replication factor (RF) of 1 (one). +# +# The cassandra:4.1 image does not recognize CASSANDRA_AUTHENTICATOR as an +# environment variable for configuring authentication, so each job patches +# cassandra.yaml inside the running container to enable password auth, and +# restarts it before running any tests. The health-check on the service container +# uses the default AllowAllAuthenticator auth (no auth challenge) before the +# patch step runs. After the restart a second wait loop confirms the node is +# back up with PasswordAuthenticator active. + +jobs: + cassandra-storage: + # Dedicated ExtendDB runner group (Ubuntu 24.04, 4 vCPU / 16 GB, capped at + # 20 concurrent). ubuntu-latest is an Amazon-wide shared pool where our jobs + # waited 10-90 minutes to start (2026-09-29/30); see integration.yml. + runs-on: extenddb_ubuntu-2404_4-core + timeout-minutes: 45 + 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 90); 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 + - name: Unit tests + run: cargo test -p extenddb-storage-cassandra --lib + - name: TTL integration tests + continue-on-error: true # TTL integration tests are known-flaky under CI load; tracked in #338 + run: cargo test -p extenddb-storage-cassandra --test ttl_integration -- --test-threads=1 + env: + EXTENDDB_TEST_CASSANDRA: required + - 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 + env: + EXTENDDB_TEST_CASSANDRA: required + + cassandra-pytest: + runs-on: extenddb_ubuntu-2404_4-core + timeout-minutes: 45 + 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 90); 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: extenddb_ubuntu-2404_4-core + timeout-minutes: 45 + 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 90); 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-integration + + cassandra-production-build: + runs-on: extenddb_ubuntu-2404_4-core + timeout-minutes: 15 + 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: extenddb_ubuntu-2404_4-core + timeout-minutes: 75 + 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 diff --git a/.github/workflows/licenses.yml b/.github/workflows/licenses.yml index e466004d2..e2e78c11f 100644 --- a/.github/workflows/licenses.yml +++ b/.github/workflows/licenses.yml @@ -75,6 +75,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 diff --git a/Cargo.lock b/Cargo.lock index c24f1fa07..a2797101c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -71,6 +71,15 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + [[package]] name = "anstream" version = "1.0.0" @@ -166,7 +175,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -178,7 +187,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -212,7 +221,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -224,6 +233,15 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -320,7 +338,7 @@ checksum = "7aa268c23bfbbd2c4363b9cd302a4f504fb2a9dfe7e3451d66f35dd392e20aca" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -492,6 +510,26 @@ version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -504,6 +542,30 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +[[package]] +name = "cassandra-protocol" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2b9432628147943eb265642273714eb5a5451bb61f652c1f06001c0ef3e099b" +dependencies = [ + "arc-swap", + "bitflags", + "bytes", + "chrono", + "crc32fast", + "derivative", + "derive_more", + "float_eq", + "integer-encoding", + "itertools 0.14.0", + "lz4_flex", + "num-bigint", + "snap", + "thiserror", + "time", + "uuid", +] + [[package]] name = "cc" version = "1.2.62" @@ -516,6 +578,42 @@ dependencies = [ "shlex", ] +[[package]] +name = "cdrs-tokio" +version = "9.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a209ff3bbfc3db4e1699cb0aff12dfd7a7361e3820736cba5d24eecb6ee224e8" +dependencies = [ + "arc-swap", + "atomic", + "bytemuck", + "cassandra-protocol", + "cdrs-tokio-helpers-derive", + "derivative", + "derive_more", + "futures", + "fxhash", + "itertools 0.14.0", + "rand 0.10.2", + "serde_json", + "thiserror", + "tokio", + "tracing", + "uuid", +] + +[[package]] +name = "cdrs-tokio-helpers-derive" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61cefbb7648a59bd7de42b0d8bdb5a39e029f429305190dec4e5ed56f98859cf" +dependencies = [ + "itertools 0.11.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "cfg-if" version = "1.0.4" @@ -533,6 +631,19 @@ dependencies = [ "rand_core 0.10.1", ] +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "cipher" version = "0.4.4" @@ -574,7 +685,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -870,7 +981,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.117", ] [[package]] @@ -881,7 +992,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -939,6 +1050,17 @@ dependencies = [ "serde_core", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive-syn-parse" version = "0.2.0" @@ -947,7 +1069,7 @@ checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -958,7 +1080,7 @@ checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -980,7 +1102,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.117", "unicode-xid", ] @@ -1016,7 +1138,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1113,6 +1235,7 @@ dependencies = [ "extenddb-app", "extenddb-config", "extenddb-storage", + "extenddb-storage-cassandra", "extenddb-storage-mongodb", "extenddb-storage-postgres", "extenddb-storage-sqlite", @@ -1281,6 +1404,33 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "extenddb-storage-cassandra" +version = "0.1.13" +dependencies = [ + "aes-gcm", + "async-trait", + "base64 0.22.1", + "bcrypt", + "bigdecimal", + "cdrs-tokio", + "chrono", + "crc32fast", + "extenddb-auth", + "extenddb-core", + "extenddb-storage", + "futures", + "rand 0.9.4", + "serde", + "serde_json", + "time", + "tokio", + "toml", + "tracing", + "uuid", + "zeroize", +] + [[package]] name = "extenddb-storage-mongodb" version = "0.1.13" @@ -1388,6 +1538,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float_eq" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a80e3145d8ad11ba0995949bbcf48b9df2be62772b3d351ef017dff6ecb853" + [[package]] name = "flume" version = "0.11.1" @@ -1509,7 +1665,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1541,6 +1697,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -1874,6 +2039,30 @@ dependencies = [ "tower-service", ] +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.2.0" @@ -2010,6 +2199,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "integer-encoding" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c00403deb17c3221a1fe4fb571b9ed0370b3dcd116553c77fa294a3d918699" + [[package]] name = "ipconfig" version = "0.3.4" @@ -2038,6 +2233,24 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -2071,7 +2284,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn", + "syn 2.0.117", ] [[package]] @@ -2090,7 +2303,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2203,6 +2416,15 @@ version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +[[package]] +name = "lz4_flex" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef0d4ed8669f8f8826eb00dc878084aa8f253506c4fd5e8f58f5bce72ddb97e" +dependencies = [ + "twox-hash", +] + [[package]] name = "macro_magic" version = "0.5.1" @@ -2212,7 +2434,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2226,7 +2448,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2237,7 +2459,7 @@ checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2248,7 +2470,7 @@ checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2428,7 +2650,7 @@ dependencies = [ "macro_magic", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2658,7 +2880,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2673,9 +2895,9 @@ dependencies = [ [[package]] name = "pgvector" -version = "0.4.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3673cba5b9a124916096a423b806a9f29620972c6c97b08db5f2053e9428b481" +checksum = "fc58e2d255979a31caa7cabfa7aac654af0354220719ab7a68520ae7a91e8c0b" dependencies = [ "sqlx", ] @@ -2779,7 +3001,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.117", ] [[package]] @@ -3208,7 +3430,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3276,7 +3498,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3395,6 +3617,12 @@ dependencies = [ "serde", ] +[[package]] +name = "snap" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886" + [[package]] name = "socket2" version = "0.6.3" @@ -3486,7 +3714,7 @@ dependencies = [ "quote", "sqlx-core", "sqlx-macros-core", - "syn", + "syn 2.0.117", ] [[package]] @@ -3509,7 +3737,7 @@ dependencies = [ "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", - "syn", + "syn 2.0.117", "tokio", "url", ] @@ -3655,6 +3883,17 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.117" @@ -3666,6 +3905,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -3680,7 +3930,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3763,7 +4013,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3865,7 +4115,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4012,7 +4262,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4067,6 +4317,12 @@ dependencies = [ "tracing-serde", ] +[[package]] +name = "twox-hash" +version = "2.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86a801b3cea342a06d468c8710662aa29e5e05e4f5c0d62f00bbb7f2ad7941c2" + [[package]] name = "typed-builder" version = "0.22.0" @@ -4084,7 +4340,7 @@ checksum = "0e48cea23f68d1f78eb7bc092881b6bb88d3d6b5b7e6234f6f9c911da1ffb221" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4307,7 +4563,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wasm-bindgen-shared", ] @@ -4397,6 +4653,41 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "windows-link" version = "0.2.1" @@ -4625,7 +4916,7 @@ dependencies = [ "heck", "indexmap", "prettyplease", - "syn", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -4641,7 +4932,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -4756,7 +5047,7 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -4777,7 +5068,7 @@ checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4797,7 +5088,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -4818,7 +5109,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4851,7 +5142,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 36cd0c1c7..051cd94f0 100755 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,7 @@ members = [ "crates/storage", "crates/config", "crates/storage-postgres", + "crates/storage-cassandra", "crates/storage-mongodb", "crates/storage-sqlite", "crates/auth", @@ -30,8 +31,9 @@ extenddb-cache = { path = "crates/cache" } extenddb-engine = { path = "crates/engine" } extenddb-storage = { path = "crates/storage" } extenddb-config = { path = "crates/config" } -extenddb-storage-postgres = { path = "crates/storage-postgres" } +extenddb-storage-cassandra = { path = "crates/storage-cassandra" } extenddb-storage-mongodb = { path = "crates/storage-mongodb" } +extenddb-storage-postgres = { path = "crates/storage-postgres" } extenddb-storage-sqlite = { path = "crates/storage-sqlite" } extenddb-auth = { path = "crates/auth" } extenddb-server = { path = "crates/server" } @@ -63,11 +65,15 @@ urlencoding = { version = "2.1" } moka = { version = "0.12", features = ["future"] } # Database +cdrs-tokio = { version = "9.0", features = ["derive"] } sqlx = { version = "0.8", default-features = false, features = ["runtime-tokio", "tls-rustls-aws-lc-rs", "postgres", "json", "time", "uuid", "bigdecimal", "derive"] } # Vector column type for the PostgreSQL backend. The `sqlx` feature gives a typed # `Vector` that encodes and decodes pgvector's binary format, so embeddings keep # f32 bit-exactness instead of going through a hand-written text parser. -pgvector = { version = "0.4", default-features = false, features = ["sqlx"] } +# +# Pinned to 0.4.1 as of 10/2026: 0.4.2 pulls in transitive dependency version bumps +# so of which are problematic. Do not allow to float until those are resolved. +pgvector = { version = "=0.4.1", default-features = false, features = ["sqlx"] } mongodb = "3" bson = "2.13" dashmap = "6" @@ -82,6 +88,7 @@ aes-gcm = "0.10" rand = "0.9" # Time +chrono = "0.4" time = { version = "0.3", features = ["serde", "formatting", "parsing"] } # TLS diff --git a/SOFTWARE-LICENSE-NOTICES-CASSANDRA.html b/SOFTWARE-LICENSE-NOTICES-CASSANDRA.html new file mode 100644 index 000000000..6c71c3b77 --- /dev/null +++ b/SOFTWARE-LICENSE-NOTICES-CASSANDRA.html @@ -0,0 +1,9475 @@ + + + + + + + + +
+
+

ExtendDB Software License Notices

+

This page lists licenses for Rust packages distributed in the ExtendDB PostgreSQL container image.

+
+ +

Overview of licenses:

+ + +

All license text:

+ +
+ + + diff --git a/SOFTWARE-LICENSE-NOTICES.html b/SOFTWARE-LICENSE-NOTICES.html index 758dc1a09..2531f2688 100644 --- a/SOFTWARE-LICENSE-NOTICES.html +++ b/SOFTWARE-LICENSE-NOTICES.html @@ -486,7 +486,7 @@

Apache License 2.0

Used by: