Files
amethyst/quartz/src
Claude 64624bdfdb perf(quartz): streaming filter deserializer to remove tree allocation
The relay-inbound path (REQ / COUNT / NEG-OPEN) was the only place
ManualFilterDeserializer still went through `jp.codec.readTree(jp)`,
materializing a full ObjectNode per filter before walking it. The
Command/Message/Event deserializers next door already stream straight
off the JsonParser; this brings filter parsing onto the same shape.

- Add ManualFilterDeserializer.fromJson(JsonParser): mirrors
  EventDeserializer's hand-rolled token loop. Dispatches on field
  name, reads the seven fixed keys + dynamic #x / &x tag arrays via
  nextToken / nextTextValue / longValue / intValue, and drops invalid
  entries silently (same tolerance as the tree-based mapNotNull path).
- Wire the four internal call sites — three in CommandDeserializer
  (REQ, COUNT, NEG-OPEN) and the standalone FilterDeserializer — to
  the streaming overload.
- Keep the existing fromJson(ObjectNode) overload as-is for any
  external/cross-format adapter that already has a tree in hand.

For a single REQ with N filters this drops N ObjectNode trees per
inbound frame, which at 10k connections × ~5 filters × 1 msg/s is
~50k tree allocations/sec we don't have to do. No behavioral change:
all quartz JVM tests pass (including the cross-mapper round-trip
suite that compares Jackson and KotlinSerialization output) and
geode's relay tests pass.
2026-05-07 20:41:39 +00:00
..