Skip to content

Zulia 5.3.1

Choose a tag to compare

@github-actions github-actions released this 20 Jul 19:54
· 8 commits to main since this release

Zulia 5.3.1

Bug Fixes

  • Nodes join the cluster only after they can serve. A starting node previously advertised its heartbeat while its indexes were still loading, so peers routed to a service port that was not yet listening and every federated request touching that node's shards failed instead of using replicas elsewhere. Heartbeat publishing is now deferred until index loading completes and the service port is bound. The membership pass is also safe for concurrent runs, node expiry is judged against a database clock timestamp so a whole-cluster restart detects crashed peers immediately, and the removal log distinguishes a clean shutdown or deregistration from a genuine expiry.
  • Replica segment replication is crash and race consistent. Inbound segment applies are serialized per index and shard, so a stream from a primary evicted mid-push can no longer interleave with the reloaded primary's next push and tear the replica directory. Every replicated file lands through sync plus atomic rename, so a re-shipped file is never briefly absent for a concurrent reader refresh. Shard role transitions (promotion, demotion, replica removal) hold the same per-shard apply lock so they cannot race an in-flight stream, an aborted stream deletes its partial pending file, and the per-shard lock map is released when an index is deleted.
  • Transient index eviction is durable and recoverable. Eviction now commits before the destructive unload and aborts if that commit fails, rather than rolling back acknowledged stores. A failed eviction backs the index off for 60 seconds instead of retrying every evictor pass, an Error during the commit no longer strands the index unusable until JVM restart, and shutdown reliably unloads an index whose eviction was aborted moments earlier. Unload closes every shard resource so a failed eviction cannot leak an IndexWriter and its write.lock, a taxonomy commit failure recovers the commit pair, and updateIndex no longer mistakes an in-flight eviction for an unloaded index.
  • Wildcard field patterns expand only against user-indexed fields. An all-field pattern such as *:query previously also expanded against internal bookkeeping fields, turning the search into false hits on every document. Bare patterns now expand only against user-indexed field names, while wrap-shaped patterns such as |*Title| and |||docL*||| still expand against the char and list length fields they target.
  • Global stats cover all matching documents when facets are co-requested. Requesting global numeric stats together with an individually-stored facet previously computed the stats over only a subset of the matching documents.
  • Client config is safe to mutate after loading. ClientIndexConfig and the update commands defensively copy their list inputs, so mutating a list after passing it, or mutating a loaded config, no longer changes the request behind the caller's back.
  • Hierarchical facet labels are no longer doubled in the query CLI output.
  • Restore and import close their zip streams on error paths. A failed zuliarestore or zuliaimport no longer leaks the extraction stream's file handle.
  • UI REST logins for unknown usernames fail cleanly and in constant time. An unknown username now costs the same bcrypt work as a real one, preventing timing-based username enumeration, and returns a clean failure instead of an internal error. As in 5.3.0, this module is a work in progress.

Dependencies

  • Micronaut platform 5.0.2 to 5.0.5, moving jackson-databind on the server and UI REST runtime classpaths from 3.1.3 to 3.1.4. That clears the July 2026 Jackson advisory batch: CVE-2026-54512 and CVE-2026-54513 (both HIGH) plus five moderate issues. An OSV scan of the resolved runtime and test classpaths of all modules shows no remaining known vulnerabilities.

Internal

  • Node identity (server address plus service port) is carried by a NodeKey record across membership tracking, connection pools, and shard placement weighting, replacing hand-built string keys and stripped Node messages. Shard role transitions dispatch on an explicit enum.