Skip to content

Capability catalogue

The complete shipped feature surface, one area per section, each row linking to the page that documents it in depth. This page is the authoritative capability inventory: a capability appears here only when it is backed by code and tests in the repository, and a config-gated or partial feature carries its caveat in the row.

Execution model

Capability Notes Reference
Typed operator DAGs Map, filter, reduce, keyed process, branching (fork), union with barrier alignment Operator model
Fluent API Pipeline / DataStream<T> / KeyedDataStream<T> builder chain Operator model
Operator parallelism Per-subtask keyed-state isolation, hash-partitioned shuffle Jobs and scheduling
Backpressure Bounded channels end to end, in-band flow control Task lifecycle
Columnar execution Operators opt in via process_columnar(); Arrow sidecar batches flow through shuffles without row materialisation Columnar execution
Async state execution Off-thread state reads with deadline-based resume and read coalescing for deferring backends Async state execution

Time, windows, CEP

Capability Notes Reference
Event time and watermarks Assigner strategies: monotonic, bounded out-of-orderness Time and windowing
Windows Tumbling, sliding, session and evicting tumbling windows; custom triggers (tumbling/sliding), CountEvictor/TimeEvictor on the evicting operator, allowed_lateness, late output tags. Evictors are not available on the aggregate window operators Time and windowing
Interval join Keyed stream-stream join, all 8 join types, watermark-driven eviction, late-arrival policy Time and windowing
Complex event processing NFA-based Pattern DSL: linear patterns, greedy quantifiers, strict/relaxed contiguity; reachable from SQL MATCH_RECOGNIZE Time and windowing

SQL

Built behind CLINK_BUILD_SQL (on by default, matching what CI, the release binaries, the runtime image and the Python wheel all build). One SQL file runs embedded or submits to a cluster, unchanged.

Capability Notes Reference
DDL and catalog CREATE TABLE ... WITH (connector=...), session or directory-persisted catalog, SHOW/DROP, EXPLAIN with row estimates, ANALYZE TABLE statistics SQL frontend
Queries Projection and filtering with three-valued null semantics, expressions, aggregates, GROUP BY (including windowed), HAVING, ORDER BY / LIMIT, subqueries, DISTINCT, top-N SQL frontend
Joins Stream-stream interval joins, multi-way INNER joins with cost-based reordering (applied only when estimated cheaper), lookup joins SQL frontend
Types BIGINT/DOUBLE/VARCHAR/BOOLEAN/timestamps, DECIMAL (exact, 128-bit), ARRAY/MAP/ROW, MULTISET SQL frontend
Pattern matching MATCH_RECOGNIZE v1 on the CEP engine SQL frontend
Extensibility Scalar UDFs (LANGUAGE SQL and native), UDAFs, the Table API producing the same JobGraphSpec SQL frontend
SQL-native ML CREATE MODEL / ML_PREDICT (HTTP, ONNX opt-in, native closures), VECTOR_SEARCH, full-refresh materialized tables SQL frontend

State

Capability Notes Reference
Keyed and broadcast state keyed_state<K,V> / broadcast_state<V> on the operator RuntimeContext State and backends
Backends In-memory, file-backed, changelog (WAL + materialisation), RocksDB (always built), ForSt (opt-in) including object-store-resident variants State and backends
Open snapshot format Snapshots are documented Arrow IPC; checkpoints open directly in pyarrow, DuckDB, Polars; Parquet and Iceberg export State snapshot format
Queryable state Live keyed state served over HTTP: JSON point lookups, whole-slot scans, Arrow IPC streams; one job can SELECT from another job's live state State and backends
Savepoints and state processor Offline savepoint read and transform API Fault tolerance and rescale
Schema evolution Migrate-at-restore with a migration registry and a pre-deploy compatibility gate Fault tolerance and rescale

Delivery guarantees

Capability Notes Reference
Checkpointing Chandy-Lamport barrier alignment; unaligned checkpoints at multi-input operators; async snapshot workers; fsync-gated acks Checkpointing
Exactly-once sinks Generic committer (prepare at barrier, commit on global durability, recover-and-re-commit): file, Kafka, Parquet, raw S3 multipart, Postgres PREPARE TRANSACTION Sink committer framework
Effectively-once upserts Changelog upsert and delete by PRIMARY KEY: Postgres, MySQL, Cassandra, Redis Sink committer framework
Source replay Source-offset recovery generalised across connectors Checkpointing
Schema Registry formats Confluent Schema Registry wire format on Kafka: registry-framed Avro, Protobuf and JSON Schema values decoded to and encoded from JSON rows, schemas auto-registered from the declared columns, poison-message policy Schema Registry formats
Machine-checked protocol The exactly-once protocol (barrier completion, 2PC sinks, confirmation markers, in-doubt resolution, recovery) is a TLA+ specification model-checked in CI over bounded configurations, with liveness; every campaign-found defect is a mutant TLC must refute. The engine records a protocol trace on request, and every trace the CI tests leave, plus a committed set, is model-checked as a behaviour of the specification. Proves the model, and that the recorded runs are behaviours of it, not the code in general Exactly-once specification

Scale and operations

Capability Notes Reference
Cluster runtime Coordinator/Worker control plane over a length-prefixed TCP protocol; jobs deploy as compiled plugins or SQL Distributed runtime
Failover Lost-worker detection, drain, redeploy from the latest completed checkpoint (fail-fast by default, config-gated restarts) Fault tolerance and rescale
Rescale Change one operator's parallelism on a running job (clink rescale-op, HTTP, or the autoscaler). An operator whose edges are all keyed or parallelism-mismatched cuts over hot at one checkpoint barrier: sources do not rewind, unaffected operators keep running, key-group state repartitions onto the new subtasks. Anything ineligible, and any failed cutover, falls back to drain, replan and redeploy from the last completed checkpoint. Integer factors, declared bounds required. Whole-job rescale by role is refused for multi-operator jobs Fault tolerance and rescale
High availability Multi-coordinator leader election via etcd (opt-in); filesystem-backed job persistence; fencing epoch on every control frame so a superseded coordinator cannot deploy, cancel or commit Distributed runtime
Configuration checking clink lint reports settings that would be accepted and then ignored, or that contradict each other, without contacting a cluster; exits non-zero on anything a submission would refuse, and shares its parsing with clink run so the two cannot disagree Distributed runtime
Security TLS and mTLS on the cluster transport Network stack
Kubernetes Helm chart and a ClinkCluster/ClinkJob operator with savepoint-on-upgrade Distributed runtime
HTTP API and console JSON API, Prometheus metrics, SSE events, embedded dashboard; the full operations console is a separate project Distributed runtime
Efficiency Measured 1.9x to 5.3x less CPU per event than a JVM stream processor (median 2.45x, all 17 nexmark queries, five-node cluster, correctness-gated, raw per-run data published); a separate page prices it in instances, dollars and modelled CO2e Benchmarks / Cost and environmental footprint
Allocator choice jemalloc as the process allocator: on by default in the runtime image, opt-in for source builds (CLINK_WITH_JEMALLOC=ON, Linux). Steady state: +5% throughput on a windowed query, neutral elsewhere, no memory change. Under repeated recovery (measured across 27 whole-job restarts): a glibc worker retained 3.3 GB with the job gone; jemalloc with prompt purging plus Arrow's pool routed to it (ARROW_DEFAULT_MEMORY_POOL=system) cut per-restart growth from ~14 MiB to under 1 MiB and returned the memory. Allocator retention, not a leak - measured, not inferred. The allocator in use is reported by clink_node --version and at node startup Steady-state A/B

Observability and debugging

Capability Notes Reference
Metrics Counter and gauge registry, Prometheus exposition, per-process system gauges Distributed runtime
OTLP export Metrics plus lifecycle spans (submit, checkpoint, HA recovery, rescale) to any OpenTelemetry collector over OTLP/HTTP JSON; off unless --otlp-endpoint is given Distributed runtime
Structured logging clink::log facade with an in-memory ring served over HTTP and zstd-rotated files Distributed runtime
Data lineage Per-job source/sink dataset graph with column-level lineage for SQL; built-in OpenLineage exporter Data lineage
Deterministic replay Flight recorder captures per-epoch operator input; clink replay re-executes byte-identically offline and can freeze an incident into a regression test Replay determinism
Agent-facing diagnostics (MCP) clink-mcp, a Python MCP server over the diagnostic surface: checkpoint and savepoint inspection, capture and replay, lineage, queryable state, lint and EXPLAIN, as tools for any MCP client. Read-only; replay writes only to caller-named paths. Not on PyPI yet Diagnosing a pipeline with an agent

Embedding and APIs

Capability Notes Reference
Embedded engine clink run pipeline.sql: one process, no daemons; first result in ~155 ms (gated by a Release-build test) Embedded execution
C ABI libclink embeds the engine behind a pure-C ABI with Arrow C stream results Embedded execution
Python pyclink returns results as pyarrow tables Embedded execution
Arrow wire format Every operator-to-operator data frame is an Arrow IPC stream; columnar schemas for built-in types, binary fallback for user types Network stack
Testing framework Public clink::test harnesses: state inspection, snapshot/restore, failure injection, TestCluster Testing framework
Declared types One CLINK_FIELDS declaration per C++ type derives the byte codec (frozen layout, fixture-pinned), the Arrow schema and columnar batcher, registration defaults (channel name = type name), and a shape fingerprint that refuses a restore whose field list changed with no declared version bump Declared types
API compatibility Every installed header, C symbol and SQL statement carries a 1.x tier: Stable (source-compatible for the line, held by a tracked header manifest, an append-only C symbol manifest, compile-only conformance units and a frozen SQL corpus), Evolving (changes with notice), or Internal Compatibility, design record 011
Extension compatibility A compiled job/plugin binary loads on any engine build whose declared extension surface matches: the gate hashes a tracked header manifest plus the build options that surface uses, the pinned Arrow version and a toolchain identity (stdlib, sanitizers), so host-side changes do not invalidate deployed plugins. A refusal names the differing headers; an incompatible submit is refused before any plugin bytes ship; out-of-tree modules build with the packaged clink_add_job_module() Design record 010

Connectors

Twenty-plus sources and sinks, each documented with dependencies, factory names, options, and SQL usage in the connector catalogue: Kafka, Postgres (snapshot, CDC, sink), MySQL, ClickHouse, Cassandra, MongoDB, Redis, S3 and S3 Parquet, GCS Parquet, Azure Parquet, WebHDFS Parquet, Iceberg, Delta Lake (sink), Avro, HTTP, MQTT, NATS, Pulsar, RabbitMQ, file and built-ins; on Kafka, registry-framed Avro, Protobuf and JSON Schema values against a Confluent-compatible Schema Registry.