Skip to content

v1.0.25

Latest

Choose a tag to compare

@georgeh0 georgeh0 released this 06 Oct 05:50
· 13 commits to main since this release
17c84f1

What's Changed

  • feat(env): add Environment.close() to release the LMDB environment explicitly, so the same db path can be reopened without waiting for every Python reference to be collected (fixes EnvAlreadyOpened on free-threaded Python 3.14, where threads started inside a component kept the environment alive) by @georgeh0 in #2481
  • feat(memo): a memo state function can return recollect_after_run=True in MemoStateOutcome to have its state collected again after a re-run, for states that depend on what the function body read by @georgeh0 in #2474
  • Rust SDK ergonomics: #[cocoindex::function(memo, batching)] with per-item memoization, the context_key! macro, and connector schemas derived from Rust row types (SchemaFields, TableSchema::from_row) with vector dimensions resolved at runtime from the embedder by @tomz-alt in #2287
  • GPUPool rewritten in Rust; it can now acquire multiple whole GPUs at once, and no longer loses wake-ups across event loops by @YaxinCheng in #2277
  • Performance for large target updates
    • Much less memory per declared target state: declared states are released right after pre-commit, and Python row values are held in encoded form (a 1.14 M-row component previously held ~1.33 GiB of row dicts) by @georgeh0 in #2469
    • fingerprint_object / memo fingerprints compute plain data natively (~9脳 faster per row); existing fingerprints are unchanged by @georgeh0 in #2470
    • Target handlers can set tracks_value_fingerprint = True to skip reconcile() for unchanged values, so an update where most rows are unchanged runs no per-row Python at commit by @georgeh0 in #2472
    • Postgres: upserts go through INSERT ... SELECT FROM unnest(arrays) for tables with builtin scalar/array columns by @georgeh0 in #2471
    • Postgres: multi-column-key deletes use IN (VALUES ...) instead of an OR chain whose planning time grew quadratically by @georgeh0 in #2458
  • fix(core): when one component's write fails (e.g. a target connector's reconcile() raises), only that component fails, not every component batched into the same transaction (including other apps sharing the Environment) by @georgeh0 in #2451
  • fix(core): scoped coco.exception_handlers now receive failures of mount_each items from a LiveMap (and auto_refresh items) by @georgeh0 in #2478
  • fix(core): preview no longer reports actions more than once when its write batch re-runs after the LMDB map grows by @georgeh0 in #2447
  • fix(surrealdb): statement errors are raised instead of swallowed; values sent as typed CBOR; string/integer/array record IDs; record writes use UPSERT ... MERGE and add TableTarget.declare_fields for multi-owner records; HNSW-only vector indexes for SurrealDB 3 by @martinschaer in #2439
  • fix(valkey): un-declaring an index or running App.drop() now also deletes its document hashes by @georgeh0 in #2419
  • fix(valkey): CocoIndex connections are identifiable in the server's CLIENT LIST (LIB-NAME cocoindex); requires valkey-glide>=2.5.2 by @AbhayMahalle in #2443
  • fix(localfs): recursive walk_dir stops at symlink cycles instead of walking forever by @Sujit-1509 in #2456
  • fix(amazon_s3): zero-length reads and partial reads of empty objects return empty bytes instead of sending an invalid range request by @Sujit-1509 in #2437
  • docs(target): state that reconcile() may run more than once per commit by @georgeh0 in #2475

New Contributors

Full Changelog: v1.0.24...v1.0.25