Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

All notable changes to `fastdb` and its bindings are documented here. Release entries are retained after publication. Historical implementation notes below preserve the evidence available at their original date.

## 0.2.4 — release preparation
## 0.2.4 — 2026-10-29

- Fix ownership of standalone native database factories and standalone feature-reference factories in the Python binding. Repeated truncate/fill/save/close and file load/read/close cycles release their native allocations.
- Pin borrowed buffers in the native database's release callback; release the export and shared mapping after its layers. Tables, rows, numeric arrays and chunks keep backing alive independently of the engine. Closing a RecordEngine releases its references; callers control checked-owner invalidation with `invalidate`.
- Obtain bulk numeric columns directly from the native table address and field offset without creating per-row feature and geometry caches. Checked aliases follow snapshot remaps and reject stale row/column access.
- Cache column accessors and arrays without table or fill-handler reference cycles, release obsolete builders, and attach NumPy chunk-array owners in C so cleanup is immediate with cyclic GC disabled. Engine-dependent writes after RecordEngine closure report a clear error; retained writable arrays remain usable.
- Synchronize Python, Rust, TypeScript/WASM and the Core bundle at version 0.2.4. The Core bundle version is derived from the shared package manifests.
- Local validation and memory measurements are recorded in [the native memory report](docs/reports/0.2.4-native-memory.md). Exact-source CI, release artifacts and publication remain pending in [the 0.2.4 draft release record](docs/releases/0.2.4.md).
- Memory measurements are in [the native memory report](docs/reports/0.2.4-native-memory.md). Release evidence is tracked in [the 0.2.4 release record](docs/releases/0.2.4.md).

## 0.2.3 — 2026-10-21

Expand Down
113 changes: 75 additions & 38 deletions docs/releases/0.2.4.md
Original file line number Diff line number Diff line change
@@ -1,43 +1,80 @@
# FastDB 0.2.4 release record — draft
# FastDB 0.2.4 release record

The coordinated release uses immutable tag `v0.2.4`, source
`f82fa13adeae2b87a295bf984821c85c44b55a3d`, for Python `fastdb4py`, npm
`fastdb4ts`, Rust `fastdb`/`fastdb-sys` and the Core SDK.

0.2.4 addresses standalone native database ownership, numeric column cache
retention, and mapped backing lifetime. The design, prior measurements, and
validation boundary are in the [native memory report](../reports/0.2.4-native-memory.md).

The coordinated release covers Python `fastdb4py`, npm `fastdb4ts`, Rust
`fastdb` and `fastdb-sys`, and the Core SDK bundles from one source commit.
Package manifests and lockfiles carry 0.2.4. Core bundle metadata derives the
version from the package manifests.

## Validation

Local checks pass 403 Python tests, compileall, sdist/wheel builds, 45 native
ASan/UBSan tests, 21 Rust unit/integration tests and one compile-fail doctest,
58 TypeScript/WASM tests, and both 117-symbol ABI checks on macOS ARM64.
Installed wheels on CPython 3.10 and 3.13 each pass all 403 Python tests.
Six-cycle, 15,498,593-row read/write
probes with cyclic GC disabled show bounded memory in the native memory report.
The release requires complete `tests.yml` and `release-artifacts.yml` runs for the
same final source on `main`, followed by exact-source consumer verification.

| Evidence | Value | Status |
| --- | --- | --- |
| Final source SHA | | Pending |
| Successful `tests.yml` run | | Pending |
| Successful `release-artifacts.yml` run | | Pending |
| Candidate manifest digest and artifact IDs | | Pending |
| Complete archive inventory and hashes | | Pending |
| Immutable `v0.2.4` tag and GitHub release assets | | Pending |
| PyPI workflow and published inventory | | Pending |
| crates.io workflow and archive hashes | | Pending |
| npm workflow and tarball hash | | Pending |
| Installed published-consumer checks | | Pending |

The candidate inventory comprises 35 Python wheels, one sdist, four Core
bundles, two Rust crates, and one npm tarball. Verify the native C++/C ABI/Rust
and installed-wheel consumers on Windows ARM64, along with the remaining
required platform and language gates. Record publication and installed
consumer evidence after the exact source and artifact identity checks pass.
retention, and mapped backing lifetime. The design, memory measurements and
local validation are in the [native memory report](../reports/0.2.4-native-memory.md).
The verified candidate keeps the 0.2.3 inventory of 43 archives: 35 Python
wheels, one sdist, four Core bundles, two Rust crates and one npm tarball.
Portable payload semantics and ABI-117 are unchanged.

## Exact-source validation

- [Run Tests 40932272066](https://github.com/world-in-progress/fastdb/actions/runs/40932272066): complete success, including sanitizers.
- [Release Artifacts 40932272107](https://github.com/world-in-progress/fastdb/actions/runs/40932272107): complete success; one retained 43-archive candidate. The native Windows x64 and ARM64 jobs each passed 41 C++ tests, including `legacy.lifetime`, and the ABI export check.

Release Artifacts for the version merge `8f24619`
([run 40926228094](https://github.com/world-in-progress/fastdb/actions/runs/40926228094))
failed to compile `tests/cpp/test_legacy_lifetime.cpp` with MSVC. The test
included `windows.h` after private headers that use `namespace std`, so the RPC
`byte` typedef was ambiguous with `std::byte`.
[PR #45](https://github.com/world-in-progress/fastdb/pull/45) defines
`WIN32_LEAN_AND_MEAN`. Pull-request CI does not build native Windows targets,
so the run above is the first Windows compile of the fix.

The combined candidate is artifact `12922534983`; its GitHub ZIP digest is
`sha256:f7cb6fdf7e408d4b282f6baff7ea41001a3315d16fad88d1a14501068262b6bc`.
The exact CI `release-manifest.json` is 13,092 bytes, SHA-256
`8a07ab93409811bb5e11418876ba082594758c2b3b87a766699c447586a9c5bf`.
The Python fragment is artifact `12924197817`. The candidate passed the
release verifier for its source SHA.

## Windows x64 check before publication

A Windows 11 x64 machine installed the candidate CPython 3.10 wheel from this
run into a fresh environment.

- With cyclic GC disabled, six write cycles and six read cycles of a
15,498,593-row F32 table kept the process commit charge (`PrivateUsage`)
flat: write cycles changed it by 0 bytes and read cycles by at most 4 KiB.
The published 0.2.3 wheel grew by 374–379 MiB per write cycle and
312–317 MiB per read cycle in the same script. Removing the data file after
the cycles succeeded.
- The full Python suite passed 397 tests and skipped one. The five failures
are Windows shared-memory defects that also fail with 0.2.3 and its tests:
- `ObjectEngine.share()` closes its only handle, which deletes a Windows
named mapping before `ObjectEngine.load` opens it (four tests).
- `FastSerializer.loads_shm` compares the requested range with the
page-rounded size of an opened Windows mapping. The out-of-range test
therefore reaches the native loader, which raises
`Invalid FastDB database buffer.` instead of the size error; 0.2.3 raised
`AttributeError` there.

These Windows defects are not regressions and remain open.

## Publication

- [PyPI 40940243958](https://github.com/world-in-progress/fastdb/actions/runs/40940243958): the tag push reused the exact-source Python artifact.
- [npm 40940925984](https://github.com/world-in-progress/fastdb/actions/runs/40940925984) and [Rust 40940920531](https://github.com/world-in-progress/fastdb/actions/runs/40940920531) published and verified the tested archives.

The [GitHub release](https://github.com/world-in-progress/fastdb/releases/tag/v0.2.4)
retains the candidate archives, exact CI manifest, CI proof and publication
receipt.

All 39 public registry files were downloaded and matched the CI manifest by
size and SHA-256: 36 PyPI files, one npm tarball and two Rust crates.
Consumer checks against the published bytes:

- Python 3.10 on macOS ARM64 installed `fastdb4py==0.2.4` with
`--only-binary=:all:` into a fresh environment and passed all 403 Python
tests from the release source.
- The public npm tarball passed the packed `fastdb4ts/payload` inventory and
Wasm smoke check of `tests/ci/check_ts_payload_package.py`.
- No registry-only Rust consumer was built for this release. Both published
crates are byte-identical to the tested candidate.

See [publishing](publishing.md) for the source-bound publication process and
the [0.2.3 record](0.2.3.md) for the previous platform matrix.
8 changes: 5 additions & 3 deletions docs/reports/0.2.4-native-memory.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,10 @@ doctest, 58 TypeScript/WASM tests and 117-symbol native and WASM ABI checks.
The three shutdown scripts each return zero twice in both Python runtimes.
The six retained-view/release scenarios and chained writes pass on CPython
3.10. Release policy tests pass 105 cases and 98 subtests.
Windows, Linux, macOS x86_64 and free-threaded Python have
not been executed for this fix. Registry artifacts and the complete release
matrix remain subject to the [publishing process](../releases/publishing.md).
Pull-request CI ran the Python suite on Linux x86_64 with CPython 3.12 and
free-threaded 3.13. Release Artifacts built every wheel, ran its read/write
smoke and payload tests, and ran the native Core tests on Windows x64 and
ARM64. Before publication, a Windows x64 machine ran the full Python suite and
the memory loops; see the [0.2.4 release record](../releases/0.2.4.md).

Raw logs, measurements and build archives are kept outside the source repository.
Loading