libparitypp (20260407+31) unstable; urgency=medium

  * New release

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

libparitypp (20260406+30) unstable; urgency=medium

  * Add mark_node_dead() public method: allows external callers to propagate
    dead-node info between client instances (e.g. session_client_ syncs from
    pclient_ health monitor), avoiding redundant connect timeouts on dead nodes

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

libparitypp (20260406+29) unstable; urgency=medium

  * Make client thread-safe: add internal mutex_ to all public methods
    (store, retrieve, remove, list, replicate_to_peers, fetch_from_peers,
    get_node_status, get_cluster_status, list_groups_on_node,
    vacuum_all_nodes, set_local_node, begin_store/flush_stripe)
  * External callers no longer need their own mutex around client calls

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

libparitypp (20260406+28) unstable; urgency=medium

  * rebuild

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

libparitypp (20260405+27) unstable; urgency=medium

  * Parallelize store_stripe and retrieve_stripe Phase 1: send to all
    remote nodes concurrently via std::async instead of sequentially
  * Parallelize store_stripe Phase 1b retry with fresh connections

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

libparitypp (20260405+26) unstable; urgency=medium

  * retrieve(): return empty vector instead of throwing when no stripes
    exist for a group_id (fixes spam on fresh/empty clusters)

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

libparitypp (20260405+25) unstable; urgency=medium

  * Add retrieve_range(group_id, offset, length): fetch only the stripes
    needed for a byte range, accounting for 8-byte framing header

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

libparitypp (20260405+24) unstable; urgency=medium

  * Pipeline retrieve_stripe: send FETCH_BLOCK to all nodes simultaneously,
    collect responses with waitReadMulti (parallelize block fetches per stripe)
  * Auto-retry in client::store on stale QUIC connections: reset all
    connections and retry once on first stripe failure
  * Gate all debug logging behind NDEBUG macro (no output in Release builds)

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

libparitypp (20260405+23) unstable; urgency=medium

  * Increase STRIPE_SIZE from 16KB to 4MB to reduce roundtrips per store
    (e.g. 188MB: 11490 stripes -> 46 stripes)

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

libparitypp (20260405+22) unstable; urgency=medium

  * Add diagnostic stderr logging to client::store and store_stripe for
    debugging import hangs (stripe progress, failure diagnostics)

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

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
