HTTPUtils_NonblockingGet - grosse Post requests (> 30 k)

Begonnen von viegener, 29 September 2015, 15:39:51

Vorheriges Thema - Nächstes Thema

viegener

@Rudi: Habe gerade mit verschiedenen Post Requests bis zu 8MB getestet, funktioniert soweit einwandfrei!

Danke für die Änderung!

PS: Woher hast Du die Info, dass der Buffer bei Ubuntu 700k gross ist? Ich habe nur die folgende Quelle gefunden, die auch für Ubuntu 14.04 nur 16k als Default beschreibt: http://manpages.ubuntu.com/manpages/trusty/en/man7/tcp.7.html

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

viegener

Zitat von: viegener am 21 Oktober 2015, 17:40:05
Was möglicherweise noch anfällt ist, dass man explizit den Fall EAGAIN als Rückgabecode nicht zum Abbruch sondern als Hinweis noch etwas zu warten verwenden muss.


@Rudi: Ich habe für den Fall EAGAIN noch einen Patch erstellt, der in diesem Fall einfach noch eine Runde dreht...
Achso und den Threadtitel angepasst, da es ja jetzt ganz viele Tester geben wird  ;)

Johannes
Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

rudolfkoenig


rudolfkoenig

ZitatWoher hast Du die Info, dass der Buffer bei Ubuntu 700k gross ist?
Aus erster Hand: ich habe es selbst gemessen, waehrend ich directWriteFn implementiert habe.
Ist aber 'ne Weile her.

viegener

Zitat von: rudolfkoenig am 21 Oktober 2015, 21:14:18
Und wann tritt EAGAIN auf?

Vereinfacht gesagt, wenn der Puffer immernoch voll ist:

ZitatWhen the message does not fit into the send buffer of the socket, send normally blocks, unless the socket has been placed in non-blocking I/O mode. In non-blocking mode it would return EAGAIN in this case. The select(2) call may be used to determine when it is possible to send more data.

Ist also eher COMEAGAINLATER ;)

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

rudolfkoenig

War eigentlich eine Fangfrage, weil das Socket bei IO::Socket::INET->new auf nonblocking gesetzt wurde.
Und da directWriteFn erst nach der select-Freigabe aufgerufen wird, sollte EAGAIN nie auftreten.

viegener

Zitat von: rudolfkoenig am 21 Oktober 2015, 21:43:47
War eigentlich eine Fangfrage, weil das Socket bei IO::Socket::INET->new auf nonblocking gesetzt wurde.
Und da directWriteFn erst nach der select-Freigabe aufgerufen wird, sollte EAGAIN nie auftreten.

Aua, Du hast ja so recht, jetzt habe ich fhem.pl nochmals genauer gelesen. Ich hatte bisher angenommen die directWriteFn würde in der main loop immer aufgerufen unabhängig vom status des IOs. Inzwischen habe ich verstanden, dass die direct*Fn's nur unterscheiden wer aufgerufen wird, aber aufgerufen wird trotzdem nur wenn der select den filehandle zurückliefert.

Also verigss den Patch...

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können