Skip to main content

Aerospike Python Async Client — async I/O over the Aerospike Rust client core (PyO3)

Reason this release was yanked:

incomplete distro

Project description

Aerospike Python Async Client

Async I/O Python bindings for the Aerospike Rust client core. Built with PyO3; ships pre-built wheels for Linux (x86_64, aarch64), macOS (x86_64, arm64), and Windows (x86_64) on Python 3.10–3.14, including free-threaded builds (cp313t / cp314t).

Status: Public preview (alpha). Not yet production-ready; feedback welcome via GitHub Issues.

Not officially supported as a standalone client; APIs at this layer are undocumented and may change between releases without notice. This package is the low-level primitive layer underneath the Aerospike Python SDK. The reference sections below exist for SDK users who need to drop down to low-level configuration (TLS, multi-record transactions, strong-consistency read modes, wire compression) and for client contributors.

Resources

Installation

pip install aerospike-async

Pin to a specific release if you need reproducible builds:

pip install aerospike-async==0.6.0a1  # latest on PyPI as of this writing

Pre-built wheels are published for every supported platform/Python combination on regular CPython (3.10 – 3.14, ABI tags cp310cp314) and on the free-threaded builds (cp313t / cp314t), so no Rust toolchain is required for ordinary use. If pip resolves to an sdist on your platform, see Building from source below.

Quick start

import asyncio

from aerospike_async import (
    ClientPolicy,
    Key,
    ReadPolicy,
    WritePolicy,
    new_client,
)


async def main():
    client = await new_client(ClientPolicy(), "localhost:3000")

    key = Key("test", "demo", "user1")

    # Write a record (bins are plain dicts)
    await client.put(key, {"name": "Alice", "age": 28})

    # Read it back
    record = await client.get(key)
    print(record.bins)  # {'name': 'Alice', 'age': 28}

    # Read specific bins only
    record = await client.get(key, ["name"])
    print(record.bins)  # {'name': 'Alice'}

    # Delete the record
    await client.delete(key)

    await client.close()


asyncio.run(main())

TLS configuration

The client supports TLS for secure connections and PKI (certificate-based) authentication.

Basic TLS

from aerospike_async import ClientPolicy, TlsConfig, new_client

policy = ClientPolicy()
policy.tls_config = TlsConfig("path/to/ca-certificate.pem")
client = await new_client(policy, "tls-host:4333")

TLS with client authentication

policy = ClientPolicy()
policy.tls_config = TlsConfig.with_client_auth(
    "ca.pem",      # CA certificate
    "client.pem",  # Client certificate
    "client.key",  # Client private key
)
client = await new_client(policy, "tls-host:4333")

PKI authentication

PKI mode uses client certificates for authentication (no username/password required):

from aerospike_async import AuthMode

policy = ClientPolicy()
policy.tls_config = TlsConfig.with_client_auth("ca.pem", "client.pem", "client.key")
policy.set_pki_auth()  # or: policy.set_auth_mode(AuthMode.PKI)
client = await new_client(policy, "tls-host:4333")

TLS name in host strings

When the server certificate name differs from the connection hostname, specify the TLS name:

# Format: hostname:tls_name:port
# Example: connect to IP but validate certificate against "server.example.com"
client = await new_client(policy, "192.168.1.100:server.example.com:4333")

Authentication modes

The client supports multiple authentication modes via AuthMode:

  • AuthMode.NONE — no authentication
  • AuthMode.INTERNAL — internal authentication (username/password)
  • AuthMode.EXTERNAL — external authentication (LDAP, etc.)
  • AuthMode.PKI — certificate-based authentication (requires TLS + client cert)
from aerospike_async import AuthMode

policy = ClientPolicy()
policy.set_auth_mode(AuthMode.INTERNAL, user="admin", password="secret")
# or
policy.set_auth_mode(AuthMode.PKI)  # No user/password needed

Multi-record transactions (MRT)

Multi-record transactions require a strong-consistency namespace on the server (Aerospike 8.0+). Group operations into a single atomic transaction by attaching a Txn to each policy, then commit or abort:

from aerospike_async import CommitStatus, Txn
from aerospike_async.exceptions import CommitFailedError

txn = Txn()

write = WritePolicy()
write.set_txn(txn)
read = ReadPolicy()
read.set_txn(txn)

try:
    await client.put(key_a, {"balance": 100}, policy=write)
    await client.put(key_b, {"balance": 200}, policy=write)
    status = await client.commit(txn)
    assert status == CommitStatus.OK_VERIFIED
except CommitFailedError:
    await client.abort(txn)

MRT-specific failure result codes are exposed on ResultCode: MRT_BLOCKED, MRT_VERSION_MISMATCH, MRT_EXPIRED, MRT_TOO_MANY_WRITES, MRT_COMMITTED, MRT_ABORTED, MRT_ALREADY_LOCKED, MRT_MONITOR_EXISTS.

Strong consistency read modes

Every read-capable policy exposes read_mode_ap and read_mode_sc for tuning consistency on AP and SC namespaces respectively:

from aerospike_async import ReadModeAP, ReadModeSC

policy = ReadPolicy()
policy.set_read_mode_ap(ReadModeAP.One)             # AP namespace
policy.set_read_mode_sc(ReadModeSC.Linearize)       # SC namespace

Wire-protocol compression

Every policy exposes a use_compression flag (off by default) to enable compression of request/response payloads on the wire:

policy = WritePolicy()
policy.set_use_compression(True)

Versioning

PAC follows SemVer. Pre-releases use the MAJOR.MINOR.PATCH-{alpha,beta,rc}.N form (e.g. 0.4.0-alpha.1). PyPI normalizes these on upload to the equivalent PEP 440 spelling (0.4.0a1).

Cargo.toml is the single source of truth; pyproject.toml does not duplicate the version. maturin reads it from Cargo.toml when it builds the wheel, so the two are guaranteed to match.

See the Development section for the bump procedure.

License

Apache License 2.0. See LICENSE for details.


Development / Contributing

The sections below are for client contributors. Downstream users do not need any of this — pip install aerospike-async is sufficient to use the package.

Prerequisites

This project uses PyO3 to build a Rust extension for Python. You will need:

  • Python 3.10 - 3.14, or 3.14t (free-threaded) for high-throughput / PSDK AsyncPool work. Recommended installer: uv (uv python install 3.14.5+freethreaded) or pyenv with a dedicated environment.
  • Rust toolchain (rustc + cargo) — always required when building from source
  • Aerospike server — required for integration tests

If Rust is not already installed:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

# Verify
rustc --version
cargo --version

Building from source

Install Python build/test dependencies (any virtualenv works; pyenv is recommended):

pip install -r requirements.txt

Build & test in one step (Rust build, stub regeneration, full test suite):

make dev-test

Or build only — produces a development wheel and installs it into the active virtualenv:

make dev

Regenerate Python stubs (only needed after modifying Rust code):

make stubs

Configuration

Edit aerospike.env to match your Aerospike database node configuration:

export AEROSPIKE_HOST=localhost:3000

For local-only overrides (e.g. TLS certificate paths), create an aerospike.env.local file in the repo root. It is gitignored and automatically sourced by aerospike.env.

Running tests

make test          # unit + integration
make test-unit     # unit tests only (no server required)
make test-int      # integration tests only (requires running Aerospike server)

macOS file descriptor limit. On macOS, you may encounter ConnectionError: Failed to connect to host(s) errors when running the full test suite. The default file descriptor limit (256) can be exceeded by the async client's concurrent connections.

ulimit -n 4096   # current shell session
make test

To make this permanent, add ulimit -n 4096 to your shell profile (~/.zshrc or ~/.bash_profile).

Bumping the version

Bumps are manual and happen in PRs against dev. Promotion workflows (dev → stage → main) do not mutate the version.

# 1. Edit Cargo.toml [package] version field, then refresh Cargo.lock:
#    e.g. 0.6.0-alpha.1  →  0.6.0-alpha.2
cargo check    # or: cargo update -p aerospike_async --precise 0.6.0-alpha.2

# 2. Confirm:
bin/get-version    # prints 0.6.0-alpha.2

# 3. Open a PR against dev with just this change.

Reading the version programmatically

Anywhere a build script, CI step, or release tool needs the version:

bin/get-version    # → 0.6.0-alpha.1

The script parses the first version field inside the [package] table of Cargo.toml. It has no Python or cargo runtime dependencies — usable from any shell, container, or CI environment.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_38_aarch64.whl (5.1 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.38+ ARM64

aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_34_x86_64.whl (5.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

aerospike_async-0.6.0a2-cp310-cp310-macosx_11_0_arm64.whl (4.9 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

aerospike_async-0.6.0a2-cp310-cp310-macosx_10_12_x86_64.whl (5.2 MB view details)

Uploaded CPython 3.10macOS 10.12+ x86-64

File details

Details for the file aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 c1d34b21cdab1397493f55795a8852f1ccfa51781a53c206a4301a309fdc8827
MD5 9cb269d15ed577d3be60c109f5b23f3d
BLAKE2b-256 d26778880e88571bbeca331fb6e18eab512ed24e6fe058ee354ae590adf5eafe

See more details on using hashes here.

Provenance

The following attestation bundles were made for aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_38_aarch64.whl:

Publisher: publish-artifact.yaml on citrusleaf/artifact-publisher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 bd221e7e4b7c503f2c0813b811b85bd6964207edd98dbfca482ed14ca675d9b7
MD5 21daa93ae616f493352827234c353dd7
BLAKE2b-256 13aedc9db5099911903c3adfad62bfb6be0dd343756416b6417beec7ff4f9313

See more details on using hashes here.

Provenance

The following attestation bundles were made for aerospike_async-0.6.0a2-cp310-cp310-manylinux_2_34_x86_64.whl:

Publisher: publish-artifact.yaml on citrusleaf/artifact-publisher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aerospike_async-0.6.0a2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for aerospike_async-0.6.0a2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9d0bb9d030965ae8ec491d724ee71b43d15d9568985eac5a4b857f98143a7f84
MD5 d94d31367b5000ae2cb8e493dd5c2a0c
BLAKE2b-256 67d780e2fe39d115edc42a96620735340a198321686261af298824ec78b4223d

See more details on using hashes here.

Provenance

The following attestation bundles were made for aerospike_async-0.6.0a2-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: publish-artifact.yaml on citrusleaf/artifact-publisher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file aerospike_async-0.6.0a2-cp310-cp310-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for aerospike_async-0.6.0a2-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 144e227f4056bc9d28da74c3eed1ab005c54e4007a39134fbdd8a59b40df8c97
MD5 54fdc8126e32cd7c3c9beaecda9d5158
BLAKE2b-256 838670afac8b13fae21ac638d82f196dbe61867a420949f8f0d1af0a93e829cd

See more details on using hashes here.

Provenance

The following attestation bundles were made for aerospike_async-0.6.0a2-cp310-cp310-macosx_10_12_x86_64.whl:

Publisher: publish-artifact.yaml on citrusleaf/artifact-publisher

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page