libparitypp (20260405+21) unstable; urgency=medium

  * Replace per-socket waitRead polling loop in store_stripe Phase 2 with
    waitReadMulti: single epoll/kqueue/poll call waits on all pending nodes
    at once, eliminating CPU-burning spin when nodes are slow to respond

 -- Jan Koester <jan.koester@tuxist.de>  Sun, 05 Apr 2026 00:00:00 +0000

libparitypp (20260405+20) unstable; urgency=medium

  * Add VACUUM protocol command (0x07) for remote block store compaction
  * Move vacuum() to block_store base class (default no-op, file_block_store
    overrides)
  * Add client::vacuum_all_nodes() to broadcast VACUUM to all cluster peers

 -- Jan Koester <jan.koester@tuxist.de>  Sun, 05 Apr 2026 00:00:00 +0000

libparitypp (20260404+19) unstable; urgency=medium

  * Replace busy-spin accept loop with poll-based waitRead (fixes 100% CPU
    usage on one core when idle)

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 04 Apr 2026 00:00:00 +0000

libparitypp (20260404+18) unstable; urgency=medium

  * Replace per-file block storage with append-only binary file
    (single blocks.bin per node instead of thousands of .blk files)
  * Add vacuum() method to compact file by dropping deleted records
  * In-memory index rebuilt on startup by scanning the data file

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 04 Apr 2026 00:00:00 +0000

libparitypp (20260404+17) unstable; urgency=medium

  * Catch netplus::NetException explicitly in store_stripe Phase 1 and
    Phase 2 (does not inherit std::exception, was falling through to
    catch(...) losing the error message)

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 04 Apr 2026 00:00:00 +0000

libparitypp (20260404+16) unstable; urgency=medium

  * Flush UDP datagrams immediately after sendStreamData (pumpNetwork)
  * Verify connection state after ensure_connected before using socket
  * Per-node diagnostic in store_stripe error: address, port, failure reason
    (connect failed, send timeout, response timeout, server non-OK, exception)

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 04 Apr 2026 00:00:00 +0000

libparitypp (20260404+15) unstable; urgency=medium

  * Add error_message() virtual method to store_session interface
  * Capture stripe failure details in client_store_session instead of
    logging to cerr (lost when daemonized)
  * Retry failed remote nodes once with a fresh connection in store_stripe
    (fixes stale QUIC connections between streaming sessions)

 -- Jan Koester <jan.koester@tuxist.de>  Sat, 04 Apr 2026 00:00:00 +0000

libparitypp (20260404+14) unstable; urgency=medium

  * Remove all std::cerr debug logging to eliminate data races
  * Replace ostringstream with snprintf in file_block_store to fix
    std::ctype<char>::_M_widen_init() BSS race

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 00:00:00 +0000

libparitypp (20260404+13) unstable; urgency=medium

  * Fix store_stripe Phase 2: check hasStreamData before waitRead (buffered responses)
  * Close leaked streams when Phase 1 send fails

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 23:00:00 +0200

libparitypp (20260404+12) unstable; urgency=medium

  * Fix pipelined response collection: use waitRead() instead of busy-poll
  * Increase timeout to 15s, handle null sockets gracefully

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 23:00:00 +0200

libparitypp (20260404+11) unstable; urgency=medium

  * Pipeline store_stripe: send all blocks in parallel, then collect responses
  * Reduces per-stripe latency from O(n*RTT) to O(RTT)

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 21:30:00 +0200

libparitypp (20260404+10) unstable; urgency=medium

  * Rebuild against libnetplus 20260404+6

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 21:00:00 +0200

libparitypp (20260404+9) unstable; urgency=medium

  * Stripe-based store/retrieve: fixed 16KB stripes with independent parity
  * Add store_session for incremental streaming store (feed chunks, finalize)
  * Add begin_store(group_id, total_size) to client
  * Peak RAM reduced from full payload to ~16KB per stripe

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 18:00:00 +0200

libparitypp (20260403+8) unstable; urgency=medium

  * Add retry logic (3 attempts) to store(gid) for transient connection failures
  * Add set_local_node() to bypass QUIC for self-node via direct block_store
  * Add erasure-coded store/retrieve with deterministic group_id
  * store(group_id, data) prepends 8-byte length header for padding removal
  * retrieve(group_id) reconstructs data with automatic size detection

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 09:00:00 +0200

libparitypp (20260403+5) unstable; urgency=medium

  * replicate_to_peers now returns success count instead of void

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 08:00:00 +0200

libparitypp (20260403+4) unstable; urgency=medium

  * Add periodic resync every 60s in server accept loop

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 06:00:00 +0200

libparitypp (20260403+3) unstable; urgency=medium

  * Rebuild against libnetplus 20260403+2 (client handshake debug logging)

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 02:00:00 +0200

libparitypp (20260403+2) unstable; urgency=medium

  * Rebuild against libnetplus 20260403+1 (udp::sendTo, clean sendPacket)

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 01:00:00 +0200

libparitypp (20260403+1) unstable; urgency=medium

  * Rebuild against libnetplus 20260403 (QUIC debug logging)

 -- Jan Koester <jan.koester@tuxist.de>  Fri, 04 Apr 2026 00:10:00 +0200

libparitypp (20260403) unstable; urgency=medium

  * Add debug logging to load_certs: warn on cert/key load failure,
    log loaded certificate CN and key size

 -- Jan Koester <jan.koester@tuxist.de>  Thu, 03 Apr 2026 23:55:00 +0200

libparitypp (20260401) unstable; urgency=medium

  * Initial Debian packaging with multiarch support.

 -- Jan Koester <jan.koester@tuxist.de>  Wed, 01 Apr 2026 00:00:00 +0200
