Performance
Group send: directed LID-PN probe inget_devices_from_registry (#823)
Each call to get_devices_from_registry resolves a Jid to its canonical lookup keys before hitting the device registry cache. Previously, the key resolver (resolve_lookup_keys) only received the bare user string. It blindly probed both directions of the LID-PN map — get_phone_number then get_current_lid — for every group member. This resulted in 3 moka lookups per participant before the registry lookup.
Server-aware probe. A hot caller in get_devices_from_registry already holds the full Jid, and the namespace fully determines which direction is meaningful:
- A LID user (
@lid) can only appear in thelid → pnmap. - A PN user (
@s.whatsapp.net) can only appear in thepn → lidmap.
resolve_lookup_keys_for_jid dispatches on the JID’s server field and probes exactly one direction for LID/PN JIDs. All other namespaces keep the existing two-probe fallback. This turns 3 cache operations per member into 2 with no change in the resulting canonical keys.
A concurrent-resolution prototype (Benchmark (release, warm caches, 800 members × 2 devices, 500 iterations):buffered(50)stream, mirroring WA Web’sSESSION_CHECKbatching) was measured and rejected: 962 µs vs. 675 µs serial for a warm 800-member send (+43% slower). Moka hits resolve immediately, so there is no I/O to overlap and the stream machinery is pure overhead. The reliable gain comes from doing less work per member, not reordering the same work.
| Warm 800-member send | |
|---|---|
| Before (blind two-probe) | 675 µs |
| After (server-aware probe) | 497 µs (−26%) |
get_devices_from_registry keeps its existing signature; the directed probe is an internal implementation detail.