Korrektes Handling von Timeouts mit DevIo?

Begonnen von Creideiki, 26 Mai 2015, 12:10:29

Vorheriges Thema - Nächstes Thema

Creideiki

Hallo,

ich habe in meinem Modul (34_NUT) einen Mechanismus eingebaut, um zu erkennen, dass der NUT-Server nicht mehr antwortet. Damit sollte erreicht werden, dass die Verbindung neu aufgebaut wird, wenn beim Senden einer Anfrage die vorherige noch nicht beantwortet wurde:


if (defined $hash->{WaitForAnswer}) {
   # Keine Antwort auf die letzte Frage -> NUT nicht mehr erreichbar!
   Log3 $name, 3, "NUT antwortet nicht";
   DevIo_Disconnected($hash);
   DevIo_OpenDev($hash, 0, undef);
}


Das funktioniert aber nicht. Ich habe daraufhin rausgefunden, das DevIo_Disconnected explizit verhindert, dass ein direkt folgendes DevIo_OpenDev erfolgreich ist.

Also ist meine Methode offensichtlich falsch. Wie wäre denn die richtige Vorgehensweise?

rudolfkoenig

Du kannst zwischen Disconnected und Opendev $hash->{DevIoJustClosed} loeschen.

Das habe ich deswegen eingebaut, weil auf einem Linux System ein direkt nach dem Disconnect ausgefuehrtes OpenDev zu einem "unbrauchbaren" /dev/XXX gefuehrt hat, und ich musste das System neu booten, um das Problem loszuwerden.

Creideiki

OK. Da ich eh mit einem Netzwerkdevice arbeite, werde ich das mal so probieren.

Danke.

Creideiki

#3
Hallo,

da ergibt sich noch eine Frage:

Sehe ich das richtig, dass DevIo_OpenDev bei einem mißglückten Versuch, das Device zu öffnen, den Versuch automatisch wiederholt, bis er gelingt? Ich habe das im host:port-Teil so verstanden, dass er alle 60 Sekunden einen Versuch startet.

Das würde bedeuten, dass ich da bei einem möglichen Disconnect nur einmal DevIo_OpenDev mit entsprechendem Callback aufrufen und dann abwarten sollte, richtig?

Braucht mich dann eigentlich der Rückgabewert zu interessieren?


rudolfkoenig

Falls OpenDev das Geraet nicht oeffnen konnte, dann wird das Modul eigene ReadyFn alle 5 Sekunden aufgerufen, der wiederum OpenDev aufrufen sollte, falls STATE auf disconnected steht. OpenDev sorgt dafuer, dass Netzwerkverbindungen nur alle 60 Sekunden geoeffnet werden, da sowas schon mal laenger klemmen kann.

Der Rueckgabewert von OpenDev sollte DefineFn auch zurueckliefern.

Creideiki

Zitat von: rudolfkoenig am 01 Juni 2015, 07:43:39
Falls OpenDev das Geraet nicht oeffnen konnte, dann wird das Modul eigene ReadyFn alle 5 Sekunden aufgerufen, der wiederum OpenDev aufrufen sollte, falls STATE auf disconnected steht. OpenDev sorgt dafuer, dass Netzwerkverbindungen nur alle 60 Sekunden geoeffnet werden, da sowas schon mal laenger klemmen kann.
Ok. Dann hab ich das richtig verstanden. Danke.

ZitatDer Rueckgabewert von OpenDev sollte DefineFn auch zurueckliefern.
Meine DefineFn macht das auch brav; aber an anderen Stellen nutzt mir der Rückgabewert nichts, oder?