Clustron Zaris 2.0.0
Type: MAJOR (SemVer) — a wire-breaking change requires all clients to upgrade. Dependencies (unchanged): Nodus 1.1.0, Keyvus 1.1.0, Numerous 0.9.0.
⚠️ Breaking change — upgrade all clients to 2.0.0
Native key routing now uses XMODEM CRC16 (CRC16(key) % 16384 → segment), aligning Zaris's own hashing with Redis Cluster slots. This is wire-incompatible with 1.x clients, which hash keys with the old scheme and would misroute.
To prevent silent data misplacement, the server now rejects pre-2.0.0 clients at the connection handshake with a clear error:
Incompatible client: protocol 1 is older than this server supports (minimum 2). Upgrade the client.
Action required: upgrade every client to Clustron.Zaris.Client 2.0.0. A 1.x client will not connect to a 2.0.0 server. (RESP/Redis clients are unaffected — they already route by CRC16 slots.)
Rolling upgrade: upgrade the servers first (a 2.0.0 client is rejected only by… nothing — it works against 2.0.0), then upgrade clients. During the window, un-upgraded 1.x clients are cleanly refused rather than corrupting placement.
Artifacts in this folder
clustron-zaris-2.0.0-win-x64.zip— installable server package (Management Service + node runtime + tools + web console).nuget/Clustron.Zaris.*.2.0.0.nupkg(+.snupkg) — Abstractions, Client, InProc, SDK, DistributedCache, HybridCache.
New features (since 1.1.0)
- Redis-protocol (RESP) front-end — Streams (log + consumer groups + blocking), server-side data structures (hash/list/set/sorted-set), and native pub/sub, usable from any Redis client (validated against StackExchange.Redis).
- CRC16 slot-aligned routing — Zaris segments now map to Redis Cluster slots (the breaking change above), so
CLUSTER SLOTS/MOVEDline up with real Redis clients. - Client-compatibility gate — the server rejects incompatible clients at the HELLO handshake by wire-protocol version (now enforced; see breaking change).
- Large-object chunking (off by default) for big plain values.
- Console size visibility — per-store avg/max item-size KPIs.
Fixes
- Bulk/batch GET returned no value (client):
GetManyAsyncand typedExecuteBatchAsync<T>GETs came back empty (a swallowedZarisEntry-vs-raw deserialization mismatch in the cluster client). Now decodes both encodings. - Fault A (durability): a
MigrationCompletedmap regen no longer reshuffles a healthy, untouched partition off its live owner (which reset its epoch and lost in-flight acked writes). - Fault B (durability): writes are no longer acknowledged while a partition's active ownership is transitioning — they fail-closed as retryable
Unavailableinstead of being acked into a handoff/regen window and lost. - Performance: RF1 replication op-log skip, SET read-before-write fusion, striped hot counters, allocation-free GET/SET fast path, typed-delegate cluster-owner lookup.