客户端流导致的channel复用没有初始话

Aperta
#19 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
grpc, php

Direzione di ricerca

Inizia da GrpcClient.php recv, runReceiveCoroutine e closeRecv, quindi traccia come i canali vengono restituiti al channel pool e ottenuti da esso. Riproduci la sequenza client-streaming SendAndClose descritta nell'issue e verifica se nel canale riutilizzato rimangono dati di chiusura non letti. Il lavoro è completo quando una richiesta successiva non può leggere dati obsoleti dallo stream precedente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

对于一个客户端流来说 服务端调用了SendAndClose

Image

客户端函数runReceiveCoroutine 对这个流进行revc 实际上进行了3次
第一次是正常的数据返回 但是客户端流只允许调用一次recv 就不会触发到GrpcClientrecv中的 if (($response === false && $channel->errCode === SWOOLE_CHANNEL_TIMEOUT) || ($response instanceof Response && ! $response->pipeline)) {

Image

第二次是关闭

第三次response 为false 走到了如下流程:

Image

closeRecv函数在进行channel 回收的时候没有判断channel里面是否有数据 直接进行了回收

下一个请求获取从channel池里面获取channel 获取到旧的channel 此时channel里面的数据 是第一次请求获取响应中的第二个响应及关闭响应 导致GrpcClient.php中recv进行读取的时候 读到的数据是关闭请求 之后才会触发重置和回收channal

Image
我尝试进行多读一次 和 在closeRecv进行channel->pop() 是可以解决这个问题

Image

Image

不知道是不是我的使用方式有什么问题?

Lingua principale
PHP
Stelle
3
Fork
6
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di hyperf/grpc-client

Tutte le issue di hyperf/grpc-client

Issue simili

Altre issue su PHP

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.