longpoll + ausgeschalteter client + vieeele status updates = fhem hängt.

Begonnen von geek, 22 Juni 2014, 22:59:47

Vorheriges Thema - Nächstes Thema

geek

Hi,

want_read und want_write sind in IO::Socket::SSL.pm definiert:

sub want_read  { shift->errstr == SSL_WANT_READ }
sub want_write { shift->errstr == SSL_WANT_WRITE }

die beiden Methoden zu verwenden ist deutlich übersichtlicher als die constants nur bei Bedarf zu importieren.

Der sleep findet nur in einem child prozess statt und verhindert ein CPU hog wenn syswrite bei wiederholten Aufrufen EWOULDBLOCK liefert. Einfach wäre, den Socket wieder blocking zu machen - da der Socket aber zwischen parent/child geteilt ist, bin ich nicht sicher ob das nur im child Prozess auf den Filedescriptor wirkt oder auf den Socket. Alternativ müßte dort auch mit select()+want_read/_write gewartet werden.

Wenns keine Tester gibt - wie wird sowas sonst gehandhabt?

Rainer

rudolfkoenig

ZitatWenns keine Tester gibt - wie wird sowas sonst gehandhabt?
Ich teste es bei mir, und danach check ich es ein. Bei Problemen gibts dann ein Aufschrei, und entweder wird es danach gefixt, oder ich nehme die Aenderung zurueck. So war doch hier im Juli auch.

Da es gerade parallel eine weiteres Problem gibt (FHEM-Absturz wg. Wide-Character, siehe http://forum.fhem.de/index.php?topic=29939), wuerde ich diese Aenderung erst mal auf ruhigere Tage verschieben. Kannst du dich (oder sonswer) in ein-zwei Wochen wieder melden?

geek

Hi,

klar - hat Zeit. Gibt ja Workarounds.

Soll ich in der Zeit noch nach ner alternativen Lösung für den sleep() schauen?
... oder Vermeiden, die undokumentierten want_read/_write Methoden zu nutzen?

Rainer

rudolfkoenig


Eigentich beides. Ist zwar nur fuer die Psyche, das ist aber auch wichtig.

geek

Hi,

so... beim Umbauen habe ich mir das noch genauer angeschaut... und noch einige Ecken und Kanten abrunden müssen.

Die meisten zusätlichen Änderungen sind auch ohne non-blocking relevant.

Habe den Patch daher in die einzelnen Schritte aufgeteilt:

  •     fhemweb: minor logging adjustments
       
        add name + pid to logging
        provide details on reason for socket close

  •     FHEMWEB/TcpServer: copy SSL to client socket
       
        to simplify checking for SSL use.
        will be used extensivly for nonblocking

  •     FHEMWEB: avoid crash on accept error

  •     fhem/FHEMWEB: handle addToWriteBuffer errors
       
        on a full buffer addToWriteBuffer just droppped the data without telling the caller.
        this caused strange issues (hanging longpoll,...).

  •     FHEMWEB: fix socket handling when forking
       
         a) while child writes a new request might arrive if client uses pipelining or
         b) parent doesn't know about ssl-session changes due to child writing to socket
         -> have to close socket in parent... so that its only used in this child.
       
        check for pid in addToWriteBuffer was matching in parent process, only. Renamed "pid" to be more obvious.
  •     prepare writing on non-blocking sockets
       
        converted current blocking writes to use a new function that'll handle this for non-blocking sockets.
        fehmweb was also mixing print/syswrite which is considered harmful - not sure if it actually caused issues.
        previously write errors weren't handled, either.
  •     made fhemweb sockets non-blocking

Da ich nachträglich Aufgeteilt habe bin ich nicht 100% sicher ob jeder Schritt einzeln funktioniert - im Ganzen läufts bei mir nun aber einwandfrei.

@Rudi: Würde mich freuen wenn du mal drüber schaust und anmerkst was ich noch ändern soll. Ich wette da gibts noch was :D

BTW: die "TcpServer_WriteBlocking" Aufrufe lassen sich theoretisch 1:1 durch addToWriteBuffer ersetzen... dann könnte aber die Größe des Buffers ein Problem werden. Um 100% nonblocking zu werden wäre das aber eigentlich nötig.

Rainer

geek

Hi,

*argh* -  doch noch nicht einwandfrei... kommt noch was.

Rainer

rudolfkoenig

Dann warte ich noch.
Hast Du eine Moeglichkeit dein Patch auch einem Windows Rechner zu testen?
Nonblocking@Windows ist etwas anders.

geek

Hi,

Fehler gefunden: Dicke Finger beim Aufteilen des Patches. Anbei die korrigierte Version.

IO::Socket::SSL sagt, es könne auch Nonblocking mit Windows... ein passendes System habe ich aber leider nicht.

Rainer

rudolfkoenig


geek

hi,

oh, tut "patch -p1 < nonblocking.diff" nicht? komisch.

Egal - hab's umformattiert, lässt sich jetzt mit "patch -p0 nonblocking-gesamt.patch" am Stück anwenden.

Alternativ sind die einzelnen Änderungen auch in separaten Dateien angehängt - ebenfalls für patch -p0.

Sollte das auch nicht gehen ... mit welchem Fehler steigt patch aus?

Rainer

rudolfkoenig


rudolfkoenig

Dein Patch ist zwar gross, ich habe aber keine Probleme damit entdecken koennen. Ich habe es eine Weile mit Linux (Ubuntu 14.04), OSX und WinXP getestet, mit und ohne SSL, hauptsaechlich mit fhem.cfg.demo.

Habe es nur kosmetisch geaendert und eingecheckt.