Hauptmenü

Select error

Begonnen von jw9, 24 April 2022, 12:40:46

Vorheriges Thema - Nächstes Thema

rudolfkoenig

ZitatWieso kann fhem nicht ein maximales timeout vorgeben?
Klar ist das moeglich, aber welches Problem wird dadurch geloest?


ZitatOh, und ich sehe gerade, bei EAGAIN werden neuerdings auch filedescriptoren rausgeworfen?
Um genau zu sein werden bei EAGAIN alle FDs sinnlos auf Gueltigkeit geprueft. Ich wollte damit zwei Zeilen Code sparen.
Ob jetzt 0.1s vergeudete Zeit in 0.0001% der Faelle schlimmer ist, oder zwei Zeilen mehr, ist mAn Geschmacksache.


ZitatWas genau hast Du getestet? Den Original-Code, oder den mit dem patch?
Deinen ersten Vorschlag:
ZitatMeiner Meinung nach sollte der Code-Block, der anfängt mit "if($nfound < 0) {" unmittelbar nach dem select() kommen.
Dein erster Patch loest das Problem vmtl. auch (wie ich das geschrieben habe), erfordert aber mehr Umbau, was ich vermeide, um Nebeneffekte zu minimieren.


ZitatIch sehe keinen Grund, in diesem Zusammenhang weiterhin auf DbLog einzuprügeln...
Ich wollte damit nur deinen Verdacht entkraeften, dass DbLog die Ursache fuer die unerklaerliche Abfrage ist:
ZitatIch habe einen Verdacht: jemand ist beim Debuggen den Fall "$nfound<0 && $err==0" gestolpert und nicht erkannt, dass die Ursache darin liegt, dass DbLog (oder irgend ein anderes Modul) sich vorgedrängelt hat.
Generell pruegele ich nicht auf Module ein, im Gegenteil, bin vmtl. zu tolerant.


ZitatWie wäre es mit folgender Variante:
Ich sehe z.Zt. noch nicht das Problem, was dadurch geloest wird.
Wenn Du einen Testfall hast...

jw9

Zitat von: rudolfkoenig am 09 Mai 2022, 11:30:58
Klar ist das moeglich, aber welches Problem wird dadurch geloest?
Jenes, über welches Du Dich in https://forum.fhem.de/index.php/topic,127414.msg1219621.html#msg1219621 beschwert hattest: wenn das signal nach "if($gotSig) {" aber noch vor dem Aufruf von select eintrifft, dann wird select nicht mit EINTR abgebrochen, sondern wird sehr lange benötigen bis das (unter Umständen) lange timeout abläuft.

Zitat
Um genau zu sein werden bei EAGAIN alle FDs sinnlos auf Gueltigkeit geprueft. Ich wollte damit zwei Zeilen Code sparen.
Du sparst damit aber keine einzige Zeile. Schau Dir mal meinen letzten Patch an: die unsinnige Behandlung von $err==0 wird durch die Behandlung von $err==11 ersetzt. Das ist exakt ein einziges Zeichen mehr gegenüber dem ursprünglichen Code. Verglichen mit dem aktuellen Code ist es sogar ein Stück kürzer  :-*

Zitat
Ob jetzt 0.1s vergeudete Zeit in 0.0001% der Faelle schlimmer ist, oder zwei Zeilen mehr, ist mAn Geschmacksache.
Die vergeudete Zeit ist Geschmackssache, da stimme ich Dir zu.

Eine saubere Fehlerbehandlung halte ich hingegen nicht für eine Geschmackssache. Der aktuelle Code läuft bei EAGAIN auf die() wenn die drei vorherigen select-Aufrufe einen Fehler geliefert haben, weil $nbad==0 && $errcount>3. Zugegeben, die Wahrscheinlichkeit dafür ist extrem gering. Ein Code der unabhängig von Wahrscheinlichkeiten immer korrekt funktioniert wäre aber vorzuziehen, IMHO...

Zitat
Deinen ersten Vorschlag:Dein erster Patch loest das Problem vmtl. auch (wie ich das geschrieben habe),
Vergiss bitte meinen ersten patch, da hatte ich ebenfalls den die() übersehen...

Zitat
erfordert aber mehr Umbau, was ich vermeide, um Nebeneffekte zu minimieren.
Nebeneffekte minimiert man indem man eine saubere Fehlerbehandlung macht. YMMV.

Zitat
Ich sehe z.Zt. noch nicht das Problem, was dadurch geloest wird.
Wenn Du einen Testfall hast...
Einen Testfall für eine sehr unwahrscheinliche Racing-Condition einzufordern ist ein bisschen unfair, meinst Du nicht? ;-)

Wie und warum Fehler auftreten können habe ich ja schon mehrfach sehr ausführlich beschrieben. Wozu benötigst Du da noch Testfälle?