ChannelOutboundBuffer dolduğunda yazmaya ne olur?

Nov 20 2020

Bir kanal yanıt vermediğinde istek yazmak için ne olduğunu anlamaya çalışıyorum. Örneğin, bu, eş aniden ağdan ayrıldığında ve asla bir RST almadığımızda olur.

Belgeleri okumaktan ve netty kanalı arabelleklerini ve filigranları anlamaktan , yüksek WriterBufferWaterMark'a ulaşıldığında, ChannelOutboundBuffer'ın dolu olduğu ve:

Channel.isWritable () yanlış döndürmeye başlayacaktır.

Gönderen ) (Channel.isWritable :

Yalnızca ve yalnızca G / Ç iş parçacığı istenen yazma işlemini hemen gerçekleştirecekse doğru döndürür. Bu yöntem false döndürdüğünde yapılan herhangi bir yazma isteği, G / Ç iş parçacığı sıraya alınmış yazma isteklerini işlemeye hazır olana kadar sıraya alınır.

İlk sorum şuydu: Yine de yazmaya devam ettiğimizde ne olur ?

Netty kanalı isWritable , dahili bir arabellek olduğunu belirtirse ve sınırsız olduğunu ima ederse veriler nerede sıraya alınır .

Soru , yazma istekleri tam olarak nerede sıraya alınır ve daha da önemlisi bu kuyrukların boyutunu gözlemleyebilir miyim ?

Veya: Netty / OS bağlantının koptuğunu ve kapatılması gerektiğini tespit ettiğinde bir sınır var mı?

Yanıtlar

1 NormanMaurer Nov 24 2020 at 08:59

Hala sıraya girecek ChannelOutboundBuffer. Arabellek dolduktan sonra yazmayı bırakıp boşaltan yeniden başlamaktan sorumlusunuz. Bunu üzerinden gözlemleyebilirsiniz ChannelInboundHandler.channelWritabilityChanged(...).

cfstras Nov 25 2020 at 12:30

4.1.37'deki ChannelOutboundBuffer kaynağına bakıldığında, yöntem addMessageher zaman gelen iletileri , durumundan bağımsız olarakisWritable dahili bir bağlantılı listeye ekler . Bu liste sınırsız büyüyor.

Bu tamponun toplam bayt uzunluğuna üzerinden ulaşılabilir channel.unsafe().outboundBuffer().totalPendingWriteBytes().

Dolaylı bir değer için, unsafe () kullanmak istemiyorsanız, alternatif olarak channel.bytesBeforeWritable(), kuyruktaki baytları eksi düşük filigranı döndürecek olanı kullanabilirsiniz .