Category report
Database drivers and connection pools
Research date: 2026-10-09.
This selection covers 28 GitHub repositories implementing database wire protocols, reusable driver interfaces, application connection pools, and network poolers. It includes relational, document, wide-column, key-value, and analytical databases. The focus is the engineering at the boundary between application concurrency, network state, database sessions, and reusable resources—not query builders or database engines themselves. Monorepos count once; relevant subsystems are identified below.
The criteria are:
- C1 — Correctness: substantial invariants, concurrency, protocol semantics, adversarial inputs, or failure recovery.
- C2 — Abstractions: reusable interfaces and components serving materially different applications, drivers, or runtimes.
- C3 — Performance and structure: concrete resource, throughput, latency, or allocation constraints addressed through an understandable design.
- C4 — Evolution: sustained development supported by compatibility work, tests, migrations, or documented complexity management—not merely repository age.
The criteria assessments and suggested study topics are engineering judgments grounded in the linked primary material. They are not claims that every component is exemplary. Sources generally describe the default branch, which may contain unreleased changes. Canonical names and archive flags were checked through GitHub's repository API; none of the selected repositories was marked archived. Activity is not uniform, and a noteworthy older activity snapshot is called out explicitly.
Application connection pools
brettwooldridge/HikariCP
Java; JDBC connection pool. Study how a specialized resource allocator combines thread-local reuse with cross-thread handoff, rather than treating a pool as a simple blocking queue.
- C1: Borrowing uses atomic transitions between available and in-use states even when another thread can take an entry visible in a thread-local cache. Timeout accounting and waiter counts must remain correct across competing borrowers.
- C3: The allocator first checks a local cache, then a shared collection, then a handoff queue. Its source exposes the locality, contention, and waiting tradeoffs directly. The change history records adjustments for virtual-thread spinning and yield frequency, making this a useful example of optimization changing with the runtime.
Entry points: ConcurrentBag implementation, change history.
agroal/agroal
Java; transaction-aware JDBC pool. Particularly useful for studying how pooling interacts with transaction enlistment, operational controls, and application-server integration.
- C1: Acquisition can reuse a connection already associated with a transaction. The implementation checks incompatible read-only changes, optionally rejects repeated acquisition by the same thread, and distinguishes immediate from graceful flushing of active connections.
- C2: The public datasource separates pool configuration, connection creation, transaction integration, exception classification, validation, listeners, and interceptors. These are concrete extension points for different JDBC drivers and transaction environments, with documented callback restrictions.
Entry points: ConnectionPool implementation, configuration and lifecycle guide.
elixir-ecto/db_connection
Elixir; driver behaviour, connection ownership, and pooling infrastructure. Study a design that transfers connection state to the calling process instead of sending every query through a dedicated connection process.
- C1: An ETS holder records ownership and checkout state. If a client dies without returning its connection, the heir mechanism recovers the holder and the connection is discarded; deadlines likewise prevent reuse of a possibly corrupted session. These mechanics are explained in the design overview.
- C2: Driver callbacks cover connection establishment, transactions, prepared operations, cursors, and encoding/decoding, allowing different database adapters to share lifecycle machinery.
- C3: Direct access to holder state avoids extra message-passing copies. The pool uses a CoDel-derived queue algorithm to reject excessive waiting under overload rather than allowing latency to grow without bound.
Entry points: driver behaviour and callback contracts, connection-pool implementation.
deadpool-rs/deadpool
Rust; asynchronous object and database connection pools. The relevant monorepo subsystem is crates/deadpool, with separate adapters for database clients. Study how generic resource management remains explicit about cancellation and failed recycling.
- C1: Semaphore permits bound concurrent checkout; drop guards repair accounting if acquisition does not complete. An unready resource is detached and removed from the size count if recycling or creation is interrupted or fails. Waiting, creation, and recycling have separate timeout handling.
- C2: The
Managertrait separates resource creation, validation/recycling, and detachment from the pool. Backend-specific types and errors fit the same allocator without hiding lifecycle decisions behind a database-specific API.
Entry points: managed pool implementation, Manager contract.
r2dbc/r2dbc-pool
Java; reactive R2DBC connection pool built on Reactor Pool. Study resource ownership when acquisition, cleanup, and close are publishers whose work depends on subscription.
- C1: Acquisition includes cancellation/discard handling. The pooled wrapper tracks transactions, performs cleanup and rollback during release, and invalidates resources when cleanup fails. This exposes failure paths that are easy to miss in a superficially simple asynchronous
closeAPI. - C2: The pool wraps an R2DBC
ConnectionFactory, supports driver lifecycle callbacks, and composes application-provided allocation/release hooks with validation. It provides database-specific lifecycle coordination above the generic Reactor allocator.
Entry points: ConnectionPool, PooledConnection.
Activity limitation: the GitHub API snapshot reported pushed_at as 2024-11-28. It was not archived; this is an implementation study selection, not a claim of current release cadence.
Network connection poolers
pgbouncer/pgbouncer
C; PostgreSQL protocol-level pooler. Study the difference between reusing a TCP connection and safely reassigning a database session.
- C1: Server handling examines
ReadyForQuerytransaction status before considering a backend reusable, rejects transaction blocks in statement-pooling mode, and handles protocol errors and parameter state. Replication connections receive special pooling treatment. See the server protocol implementation. - C3: Session, transaction, and statement pooling deliberately trade session affinity for backend reuse. The feature compatibility matrix documents the consequences for temporary tables, advisory locks, notifications, and prepared statements; it also explains processing without requiring whole packets in memory.
- C4: The dated changelog spans many years of protocol, authentication, portability, and test work, including continued correction of packet-buffer and authentication edge cases.
yandex/odyssey
C; multithreaded PostgreSQL connection pooler. A useful counterpart to PgBouncer for studying coroutine-based networking and the boundaries between protocol parsing, routing, and scheduling.
- C1: The documented client lifecycle includes startup, cancellation routing, authentication, backend attachment, parameter setup, and transaction-aware detachment. The router coordinates connection limits and maps cancellation keys to the appropriate backend.
- C2: The internals separate PostgreSQL message construction/validation into Kiwi and coroutine scheduling/network I/O into Machinarium, with distinct router, worker, cron, and configuration responsibilities.
- C3: Workers run coroutine schedulers over event loops. The architecture documents a special single-worker path that avoids unnecessary cross-thread notification costs, as well as the potential cost of centralized routing.
Entry points: architecture and lifecycle walkthrough, pooling modes and session-state implications. Treat the architecture document as a guide to the code; some embedded filenames reflect older layouts.
supabase/supavisor
Elixir; distributed, multi-tenant PostgreSQL pooler. Study pooling when the pool itself has cluster membership, tenant identity, and failover concerns.
- C1: The client state machine distinguishes busy and idle states, postpones graceful shutdown during work, handles socket/TLS failure, and drops its backend reference after transaction-mode completion. Backend return is coordinated with response forwarding rather than simply with receipt of a client request.
- C2: Tenant pools and client/backend handlers separate shared infrastructure from individual sessions and pooling modes. The cluster integration test exercises independent pools before cluster formation, consolidation afterwards, queries across nodes, and continued operation after a node stops.
Entry points: client state machine, cluster-pooling integration test. The inspected test is explicitly tagged flaky; its scenarios are evidence of intended guarantees, not proof that every failure case is solved.
PostgreSQL drivers and their pools
jackc/pgx
Go; PostgreSQL driver, protocol toolkit, and connection pool. Study the boundary between database-specific capabilities and a reusable pool with explicit hooks.
- C1: Returning a pooled connection destroys it if it is closed, busy, or still in a transaction. Release is idempotent, and destruction notifies health checking so the pool can replenish capacity.
- C2: The pool offers connection preparation, release, tracing, and health-check hooks. The broader toolkit exposes wire-protocol and type-mapping components alongside a
database/sqladapter, supporting applications and infrastructure such as proxies or replication clients, as described in the repository overview.
Entry points: pooled connection release, pool and hook contracts.
psycopg/psycopg
Python/Cython; Psycopg 3 PostgreSQL adapter and pooling packages. Study both background resource preparation and the transaction semantics of reducing network round trips.
- C1: Pool return includes transaction completion, optional reset, and rejection of broken or expired connections. Pipeline documentation explains how one failed command aborts subsequent queued commands until synchronization, including the implications for implicit transactions.
- C2: Connection classes, configuration callbacks, reset callbacks, synchronous/asynchronous pools, and null-pool operation provide reusable mechanisms for different application lifecycles.
- C3: Workers establish replacement connections outside the borrowing request, with retry backoff. Pipeline mode batches protocol exchanges; its documentation states when network latency makes that useful and identifies unsupported operations rather than promising universal speedups.
Entry points: pool lifecycle and sizing, pipeline protocol and error semantics.
MagicStack/asyncpg
Python/Cython; asyncio PostgreSQL driver with a native protocol implementation. The pool is especially instructive for cancellation-safe cleanup and preventing use after release.
- C1: Release waits for pending protocol cancellation, resets session state, and terminates the connection if reset fails.
asyncio.shieldprotects the return operation from caller cancellation; connection proxies are invalidated after release. - C2: Pool holders, proxies, initialization/setup/reset callbacks, expiration generations, and asynchronous acquisition contexts separate application customization from lifecycle bookkeeping.
- C3: Connections are reused through holders, with inactivity and query-count retirement policies. The implementation makes replacement and maintenance work visible, offering a concrete way to reason about reuse costs without relying on the README's comparative benchmark claims.
Entry point: pool implementation, callback contracts, and release logic.
npgsql/npgsql
C#; PostgreSQL provider for .NET with integrated pooling. Study how logical connections borrow physical connectors while sharing both asynchronous and synchronous infrastructure.
- C1: Opening a connector first reserves capacity using compare-and-exchange. A pool-clear counter identifies connectors created before invalidation, and channel wakeups account for connectors that were physically closed or broken.
- C3: An idle-connector channel handles reuse; the implementation deliberately uses an unbounded channel because the separate connector count enforces the pool limit. Idle pruning uses sampled usage information, and timer creation suppresses execution-context capture to avoid extending unrelated object lifetimes.
Entry point: PoolingDataSource implementation. The repository overview supplies the surrounding provider, data-source, and PostgreSQL-type context.
pgjdbc/pgjdbc
Java; PostgreSQL JDBC driver. Study a protocol engine that must reconcile JDBC operations with PostgreSQL's extended-query, COPY, and error-recovery machinery.
- C1: The query executor maintains pending response queues, locks the connection during multi-step COPY operations, and implements optional savepoint-based recovery. Its documented state machines make the interactions between transaction state, prepared execution, and result processing inspectable.
- C2: Standard JDBC contracts sit over a PostgreSQL-specific protocol implementation, serving ordinary JDBC applications while exposing COPY and other specialized operations.
- C3: The executor estimates buffered responses and forces synchronization/result consumption to avoid a client and server both blocking while trying to write. This is a concrete protocol-level performance/correctness tradeoff.
Entry point: QueryExecutorImpl and its state-machine overview; repository introduction establishes JDBC and native-protocol scope.
brianc/node-postgres
JavaScript/TypeScript; PostgreSQL client monorepo. Counted once for pg, pg-pool, pg-protocol, cursor, and streaming packages. Study an event-driven pool whose difficult cases are callback timing and ownership rather than blocking-thread synchronization.
- C1: The pool guards double release, handles acquisition callbacks that arrive after timeout, removes clients released with errors, and coordinates shutdown with checked-out clients. Idle error listeners are part of resource ownership.
- C2: Protocol, pooled client, cursor, and query-stream packages are independently reusable parts of the same client family, documented in the monorepo map.
- C3: Separate active, idle, and waiting collections implement bounded connection reuse, use-count/lifetime retirement, and idle timers.
allowExitOnIdlealso makes interaction with the Node event loop explicit.
Entry point: pg-pool implementation.
MySQL-family drivers
go-sql-driver/mysql
Go; MySQL wire-protocol driver for database/sql. The pool belongs to Go's standard library; this repository is valuable for the driver-side obligations that make pooled connections safe.
- C1: Context cancellation marks the connection unusable and closes its resources.
ResetSessionchecks for closed/busy connections and performs a stale-connection probe at a point where returningErrBadConnwill not silently replay an operation that already wrote data. - C2: The driver implements the standard driver contracts for connections, context-aware execution, statements, and session validation. Application code can use ordinary
database/sqlpooling while the driver retains MySQL-specific connection and protocol logic.
Entry point: connection, cancellation, and ResetSession implementation; driver configuration and usage. The study topic is precisely the retry/connection-validity boundary, not an assertion that this repository implements its own pool.
sidorares/node-mysql2
JavaScript; MySQL client, protocol implementation, and callback/promise pools. Study how API compatibility coexists with a distinct parser and explicit pooled-session cleanup.
- C1: Pool configuration is copied per connection because commands such as
changeUsermutate it. When reset-on-release is enabled, reset failure removes the connection rather than handing it to another borrower; removed connections and queued callbacks are handled separately. - C2: The project combines text/prepared execution, connection and pool APIs, and promise wrappers. Its history section explicitly describes the rewritten protocol parser and compatibility relationship with Node MySQL, so it is not counted here as a mere copy of that project.
- C3: Free connections, bounded creation, waiting callbacks, and idle retirement are separated in the pool rather than mixed into query encoding.
Entry points: base pool, base connection/protocol coordination.
mysql-net/MySqlConnector
C#; MySQL/MariaDB provider for .NET with an asynchronous connection pool. Study cancellation-aware borrowing and the distinction between a logical connection and a reusable server session.
- C1: Checkout reserves a semaphore slot, rejects sessions from an obsolete pool generation, and resets sessions before reuse when configured or required by a database override. The implementation separately records leased sessions and recovers leaked ones.
- C2: Connection settings, server sessions, pool metadata, logging/metrics, and synchronous/asynchronous I/O behaviour are separated. This lets the same provider expose conventional .NET connection APIs while keeping session management reusable.
- C3: Idle-session reuse, bounded creation, minimum-size replenishment, and controlled leaked-session scans address connection-establishment and contention costs in an identifiable pool layer.
Entry point: ConnectionPool implementation; provider overview.
trilogy-libraries/trilogy
C with Ruby bindings; embeddable MySQL-compatible client. Study a small but substantive layering of protocol parsing, nonblocking I/O, and blocking convenience APIs.
- C1: Commands have separate send/receive phases. Partial writes require explicit flushing, and a query returning rows must be completely consumed before another command is legal. The public header documents these protocol-state obligations and error outcomes.
- C2: The protocol API is decoupled from I/O; the nonblocking client lets an embedding runtime wait for readiness, while the blocking layer and Ruby binding build on it. This is a meaningful reusable implementation rather than only a language wrapper.
- C3: The design targets embedding and limited dynamic allocation while retaining a streaming packet parser and explicit buffer ownership.
Entry points: nonblocking client contract, client implementation. The README also states protocol/encoding limitations; it should not be read as complete MySQL feature parity.
Typed, cross-database, and analytical interfaces
transact-rs/sqlx
Rust; asynchronous multi-database drivers, typed query APIs, and pooling. Relevant monorepo components include sqlx-core and the PostgreSQL, MySQL, and SQLite drivers. This is the canonical repository returned when the former launchbadge/sqlx URL was checked.
- C1: Pool documentation explicitly explains why cancellation after obtaining a connection can discard it rather than risk returning an unsafe resource. It calls out the consequential case of a single-connection in-memory SQLite database. Pool closure wakes/rejects waiting acquisitions.
- C2: A generic pool works with database-specific implementations and the
Executorabstraction, with optional compile-time query checking alongside dynamic SQL. - C3: Acquisition fairness, a hard connection limit, inexpensive shared handles, and the distinction between explicit asynchronous close and ordinary Rust drop make resource constraints part of the API contract.
Entry points: pool contracts and cancellation discussion, pool internals.
paurkedal/ocaml-caqti
OCaml; typed relational connectors and runtime-parameterized pooling. Study first-class modules and functors as an alternative to inheritance-based driver interfaces.
- C1: Request specifications carry parameter types, row types, and result multiplicity. The request contract distinguishes cached prepared queries from one-shot queries and explains why caching dynamically generated requests can leak resources on long-lived connections. Pool use employs finalization to return borrowed resources.
- C2: A common driver signature and URI-based selection support different databases; the pool is parameterized over the concurrency system and alarm implementation. The overview distinguishes established adapters from experimental runtime/driver integrations.
- C3: Bounded size, prioritized waiters, validation, idle-age reaping, and reuse counts are explicit pool mechanisms rather than application-specific conventions.
Entry points: typed request contract, platform-independent pool implementation.
apache/arrow-adbc
C/C++, Go, Java, C#, Python, and other bindings; Arrow database API, driver managers, and drivers. Counted once; the study focus is the shared API and driver-manager boundary, not the wider Arrow ecosystem.
- C2: The driver manager dynamically loads a driver's function table and dispatches using the database/connection/statement object's associated driver. A common ABI permits drivers implemented in different languages to serve the same application.
- C3: The API is designed around columnar result and parameter batches, bulk ingestion, and optional partitioned result retrieval. Its abstractions directly address data movement and analytical parallelism instead of forcing every client through a row-at-a-time interface.
- C1: Distinct database, connection, statement, result, and error lifecycles expose ownership and state boundaries across FFI. The specification also defines structured error information and incremental partitioned execution semantics.
Entry points: how drivers and the manager interact, API semantics and lifecycle specification. ADBC is an API standard; Flight SQL is a wire protocol, and they should not be conflated.
ClickHouse/clickhouse-go
Go; ClickHouse native and database/sql interfaces with pooling and bulk insertion. Study an analytical driver's batch lifecycle and the adaptation between row-oriented application APIs and columnar transport.
- C1: Batch state distinguishes sent and released resources. Error paths release connections, invalid batches retain their error state, and connection release/reacquisition is explicit for long-lived batches and flush options.
- C2: The driver supports both ClickHouse-specific and standard Go SQL interfaces, plus TCP and HTTP transports, with shared configuration and query capabilities.
- C3: Native column encoding, block-oriented ingestion, configurable buffering, and compression address bulk data movement. The overview explicitly identifies the lower-level
ch-gocodec dependency, so codec implementation credit should not all be assigned to this repository.
Entry points: batch implementation, driver/pool-facing implementation.
Cluster-aware clients and other database protocols
mongodb/mongo-go-driver
Go; official MongoDB driver, BSON facilities, topology management, and pools. Study invalidation when a logical endpoint or load-balanced service changes while requests are in flight.
- C1: The pool has paused, ready, and closed states; generation changes invalidate stale connections. Clearing can target a particular service ID in load-balanced mode, while ordinary clearing pauses the pool and handles queued requests. Distinct locks protect state and connection-creation coordination.
- C2: Pool events, configurable connection/handshake behaviour, service-aware invalidation, and driver error contracts connect the allocator to topology management without making application callers manage sockets.
- C3: Maximum pool size, maximum simultaneous connection creation, idle eviction, and background maintenance are separate controls, allowing connection storms and checkout pressure to be reasoned about independently.
Entry point: topology pool implementation. The repository overview identifies the supported driver and links its major-version migration material.
apache/cassandra-java-driver
Java; Cassandra-family CQL driver with per-node multiplexed connection pools. Study why a pool supporting many simultaneous requests per socket needs different sizing and cancellation rules from a JDBC pool.
- C1: Stream IDs associate responses with outstanding requests; timeouts can leave orphaned streams. The documentation describes heartbeat failure, available-stream accounting, and safeguards against calling blocking wrappers on driver I/O threads.
- C2: Load balancing, retry, speculative execution, request handlers, and per-node pools are distinct components around the session API.
- C3: The concurrency guide deliberately uses atomic coordination on the request path to avoid extra thread switches, while administrative work uses thread-confined inner objects for simpler state management. It explains the tradeoff rather than merely claiming to be asynchronous.
Entry points: developer concurrency design, pooling and multiplexing guide. The Apache repository is counted once, not again under the older DataStax lineage.
scylladb/scylla-rust-driver
Rust; asynchronous CQL driver optimized for ScyllaDB and compatible with Cassandra. Study pools that route to CPU shards within database nodes, in addition to choosing a node.
- C1: Pool state distinguishes initialization, broken/empty pools, and usable connections. Initialization registers for notification before checking state to avoid a missed wakeup; keyspace changes coordinate with the background refiller instead of silently changing only one connection.
- C3: Pool sizing can be per host or per shard; the implementation documents connection-storm tradeoffs when shard-aware ports are unavailable. Shared connection snapshots and background refill keep request routing separate from pool repair.
- C2: Reconnection policies, host configuration, shard selection, and connection storage are separate types, allowing Cassandra's unsharded case and Scylla's sharded case to share machinery.
Entry point: connection pool, shard selection, and refiller; driver scope and routing capabilities.
redis/lettuce
Java; Redis client with synchronous, asynchronous, and reactive APIs. Study connection multiplexing and response backpressure before assuming every database client should allocate one socket per caller. The canonical repository is now under redis.
- C1: The command handler associates decoded replies with queued commands, treats unsolicited push messages separately, and handles partial protocol decoding and channel lifecycle changes. The README also states the restrictions on sharing a connection for blocking or transactional operations.
- C2: Multiple API styles, codecs, cluster/sentinel support, and command interfaces share the client infrastructure.
- C3: Demand-aware decoding toggles Netty auto-read according to downstream demand; queue bounds and decode-buffer policy expose memory/backpressure decisions at the transport layer.
Entry point: CommandHandler, response decoding, and backpressure.
oracle/python-oracledb
Python/Cython; Oracle Database driver with direct-protocol Thin mode and Oracle Client-based Thick mode. Study how one public API accommodates materially different connection implementations. It is the successor to cx_Oracle, which is not counted separately.
- C1: The Thin pool tracks pending requests and new, used, busy, and retiring connections separately. Matching requests to connection classes, replacing unsuitable sessions at capacity, and notifying waiters require explicit coordination.
- C2: The DB-API surface and pooling interface span two implementations, while documentation explicitly distinguishes their capabilities and process-level mode selection rules.
- C3: Thin-mode pool growth runs in background work; acquisition modes determine how callers wait. The comparison also explains differences in forced pool shutdown, making latency and cleanup behaviour observable API choices.
Entry points: Thin pool implementation, Thin/Thick behaviour comparison.
FreeTDS/freetds
C; TDS protocol implementation and DB-Library, CT-Library, and ODBC interfaces for SQL Server/Sybase-family databases. The relevant subsystems are the shared src/tds layer and the client interfaces above it; the bundled pooler is not the main reason for inclusion.
- C1: Token processing tracks reading, pending, idle, and failed states, including cancellation and multiple-result boundaries. Cancellation must consume protocol tokens appropriately before a session is considered reusable.
- C2: A shared wire layer supports several client APIs, with separate library-specific implementations and test harnesses, as documented in the source-layout overview.
- C4: The change history includes development records from 1998 and later release series with numeric-conversion fixes, old-server compatibility, Unicode/ODBC changes, thread-safety work, and expanded tests. This is concrete evidence of long-term compatibility management, not just an old repository timestamp.
Entry points: TDS token/state processing, release and historical change notes.
Coverage and search notes
Discovery used 24 live search formulations across JDBC pools; PostgreSQL protocol clients; Rust async pools and typed drivers; Go/Node/.NET MySQL drivers; Cassandra/MongoDB topology and multiplexing; Elixir and C network poolers; Arrow/ODBC/TDS interfaces; Oracle Thin/Thick implementations; OCaml connectors; and reactive database APIs. Follow-up searches emphasized cancellation, validation/recycling, shard-aware routing, and reconnect behaviour. The final round largely surfaced alternative implementations, forks, or adjacent data-access gateways within already covered architectural families, so the selection stopped after the three additions for Oracle, OCaml, and reactive pooling.
Verification used canonical GitHub repository API responses, repository pages where available, and direct reads of primary source files, design documents, API guides, tests, and changelogs. Every retained repository has an inspected implementation or substantive architectural source beyond its repository description/README. Source paths were checked against successfully retrieved files; unsuccessful guessed paths were not retained as citations. SQLx and Lettuce use their verified current owners. No candidate code was executed, dependencies installed, or large repositories cloned.
This is representative rather than exhaustive. ORMs and SQL builders such as Sequel were excluded from this category's core selection; database engines, tutorials, generated bindings, and awesome-lists were also excluded. Additional implementations such as r2d2, SOCI, other R2DBC drivers, and broader data-access gateways surfaced during discovery but were not fully audited or ranked against this selection. Their omission is not a negative quality judgment. Embedded-only SQLite wrappers, graph-database clients, and additional commercial-database drivers receive less coverage than networked relational systems. The list exceeds the rough 25-project guide to retain distinct BEAM, OCaml, reactive-streams, Oracle, and columnar designs rather than collapsing them into the more familiar PostgreSQL/MySQL examples.
The research establishes useful study entry points and evidenced design problems. It does not establish benchmark rankings, uniform test coverage, current production suitability, or the absence of defects. Tests described above were read, not run; default-branch documentation and older architecture notes can differ from released versions.