Longpoll mit HTTPMOD klappt nicht so recht wenn man zwischendurch was sendet

Begonnen von Torxgewinde, 14 April 2025, 21:26:20

Vorheriges Thema - Nächstes Thema

Torxgewinde

Hallo!
Ich habe HTTPMOD vermutlich in einer ungewöhnlichen Anwendung, nämlich zum pollen einer longpoll-HTTP-Schnittstelle von Matrix-Synapse. Dadurch besteht praktisch immer eine Verbindung und das Internal BUSY ist praktisch durchgegend auf 1. Wenn ich nun ein set Matrix sendText bla bla ausführe, scheint das Queuing nicht korrekt informiert zu werden.

Hier ein Trace:
2025.04.13 21:08:54 5: MatrixBot: set called with sendText mein toller text
2025.04.13 21:08:54 5: MatrixBot: set found option sendText in attribute set01Name
2025.04.13 21:08:54 4: MatrixBot: set will now set sendText -> mein toller text
2025.04.13 21:08:54 5: MatrixBot: AddToQueue adds type set01 to URL https://[$name:MatrixServer]/_matrix/client/v3/rooms/[$name:MatrixRoomID]/send/m.room.message?txnId=%%uuid%%, data {
  "msgtype": "m.text",
  "body": "$val"
}, header Authorization: Bearer $sid
application/json, retry 0, initial queue len: 0
2025.04.13 21:08:54 5: MatrixBot: HandleSendQueue called from AddToSendQueue, qlen = 1
2025.04.13 21:08:54 5: MatrixBot: HandleSendQueue - still waiting for reply, timeout is over twice - this should never happen. Stop waiting
2025.04.13 21:08:54 5: MatrixBot: HandleSendQueue - call with HTTP METHOD: POST

Fragt man untermittelbar vor dem Einreihen des set-Befehles in die Sendqueue mittels eines IExpr-Hacks ein paar Werte ab:

attr MatrixBot set01IExpr Log(1, "$name: LASTSEND >>".$hash->{'.LASTSEND'}."<<");;\
my $diff = gettimeofday() - $hash->{'.LASTSEND'};;\
Log(1, "$name: BUSY >>".$hash->{BUSY}."<<");;\
Log(1, "$name: diff >>".$diff."<<");;\
Log(1, "$name: timeout >>".AttrVal($name, "timeout", 2)."<<");;

2025.04.13 21:58:36 1: MatrixBot: LASTSEND >>1744574303.37606<<
2025.04.13 21:58:36 1: MatrixBot: BUSY >>1<<
2025.04.13 21:58:36 1: MatrixBot: diff >>13.3194410800934<<
2025.04.13 21:58:36 1: MatrixBot: timeout >>65<<

Passt EIGENTLICH alles, aber der Trace oben zeigt ja dass es irgendwie nicht klappt.

Was ich mir vorstellen kann, ist dass es nicht so ohne ist einfach BUSY uf 0 zu setzen wenn der Fehler erkannt wird. Besser könnte es sein HttpUtils_Close($alterHuHash) aufzurufen.

Ich konnte mir helfen indem ich longpolls gezielt abbreche:
attr MatrixBot set01IExpr #cancel an active longpoll\
if ($hash->{BUSY}\
    && $hash->{HttpUtils}\
    && $hash->{HttpUtils}->{url} =~ m|^https://[^/]+/_matrix/client/v3/sync\?timeout=\d+&filter=| ) {\
    Log(3, "$name: longpoll active, cutting it off now");;\
    HttpUtils_Close($hash->{HttpUtils});;\
}\
\
#just return $val unteraltered\
$val

aber ggf. weiß ja jemand (@StefanStrobel) was hier schief läuft.

Das Device an dem ich gearbeitet habe ist in dem Thread https://forum.fhem.de/index.php?topic=120834.msg1339487#msg1339487 zu finden.

Beste Grüße!