[bug] EventPool.request — geri-dönüşsüz (WOM) paketlerde Promise askıda kalıyor #33

Closed
opened 2026-06-16 23:54:10 +03:00 by saqut · 1 comment
Owner

Sorun: EventPool.request çağrısından sonra, dönen paketin bir WOM (response beklemeyen / geri-dönüşsüz) paketi olduğu belli olsa bile Promise resolve için bekletiliyor — yani asla çözülmeyen bir Promise askıda kalıyor.

Beklenen: Gönderilen paket WOM ise Promise ya direkt resolve edilmeli ya da hiç oluşturulmamalı. request semantiği yalnızca response bekleyen paketlere ayrılmalı; WOM yolu ayrı olmalı.

Go portu notu: Bu davranış WSTS Go implementasyonunda baştan doğru kurulmalı — WOM gönderiminde bekleyen (waiter/channel) bırakılmamalı.

Bitti kriteri: WOM gönderiminde askıda Promise/waiter kalmıyor; request/response ve WOM yolları ayrı; regression testi var.

**Sorun:** `EventPool.request` çağrısından sonra, dönen paketin bir **WOM** (response beklemeyen / geri-dönüşsüz) paketi olduğu belli olsa bile Promise `resolve` için bekletiliyor — yani asla çözülmeyen bir Promise askıda kalıyor. **Beklenen:** Gönderilen paket WOM ise Promise ya **direkt resolve edilmeli** ya da hiç oluşturulmamalı. `request` semantiği yalnızca response bekleyen paketlere ayrılmalı; WOM yolu ayrı olmalı. **Go portu notu:** Bu davranış WSTS Go implementasyonunda baştan doğru kurulmalı — WOM gönderiminde bekleyen (waiter/channel) bırakılmamalı. **Bitti kriteri:** WOM gönderiminde askıda Promise/waiter kalmıyor; request/response ve WOM yolları ayrı; regression testi var.
saqut added this to the 1.0.0 milestone 2026-06-16 23:54:10 +03:00
saqut added the
engine
bug
labels 2026-06-16 23:54:10 +03:00
saqut changed title from [bug] Bilinen engine bug'ları (eski #19, #9) to [bug] EventPool.request — geri-dönüşsüz (WOM) paketlerde Promise askıda kalıyor 2026-06-17 00:19:01 +03:00
Author
Owner

Düzeltildi (go-rewrite, commit 91ebbef).

Kök neden (iki yönlü): (a) Engine dispatcher numeric-id + action 'R' olan her frame'e anında [result,id,'E'] yanıtlıyordu — handler nil dönse bile [null,id,'E']. (b) SDK EventPool.request() WOM paketler için de waiter (promise) kaydediyordu. Sonuç: cevabı out-of-band gelen request/to'da sahte yanıt waiter'ı erken çözüp siliyor, gerçek cevap (response/to) kayboluyordu; saf WOM'da gereksiz waiter kalıyordu.

Çözüm:

  • Engine: handler nil dönerse dispatcher yanıt göndermez (nil = 'cevabım yok / out-of-band gelecek'). Tel şekilleri değişmedi; yalnızca SDK'nın kullanamadığı sahte null-E frame'i kalktı.
  • SDK: EventPool.only() (WOM, waiter bırakmaz) eklendi; Peer.send ve Room.send handshake'siz dalı artık only() kullanır. request() yalnızca cevap bekleyen paketlere ayrıldı. Public API sabit.

Bitti kriteri karşılandı: WOM gönderiminde askıda promise/waiter kalmıyor; request/response ve WOM yolları ayrı; regression testleri var (TestServerNoReplyOnNilResult, TestRequestResponseRoundTrip). go test -race ./... yeşil.

Düzeltildi (go-rewrite, commit 91ebbef). **Kök neden (iki yönlü):** (a) Engine dispatcher numeric-id + action 'R' olan her frame'e anında `[result,id,'E']` yanıtlıyordu — handler nil dönse bile `[null,id,'E']`. (b) SDK `EventPool.request()` WOM paketler için de waiter (promise) kaydediyordu. Sonuç: cevabı out-of-band gelen `request/to`'da sahte yanıt waiter'ı erken çözüp siliyor, gerçek cevap (`response/to`) kayboluyordu; saf WOM'da gereksiz waiter kalıyordu. **Çözüm:** - Engine: handler `nil` dönerse dispatcher yanıt göndermez (`nil` = 'cevabım yok / out-of-band gelecek'). Tel şekilleri değişmedi; yalnızca SDK'nın kullanamadığı sahte `null`-`E` frame'i kalktı. - SDK: `EventPool.only()` (WOM, waiter bırakmaz) eklendi; `Peer.send` ve `Room.send` handshake'siz dalı artık `only()` kullanır. `request()` yalnızca cevap bekleyen paketlere ayrıldı. Public API sabit. **Bitti kriteri karşılandı:** WOM gönderiminde askıda promise/waiter kalmıyor; request/response ve WOM yolları ayrı; regression testleri var (`TestServerNoReplyOnNilResult`, `TestRequestResponseRoundTrip`). `go test -race ./...` yeşil.
saqut closed this issue 2026-06-17 08:11:42 +03:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: saqut/MWSE#33
No description provided.