Closed Jesn closed 3 years ago
It seems that your program did not get any heartbeat from the upstream, which make watchdog think the program has dead, and then it did a reset after 60 seconds.
Cloud you please:
So that we can look into this problem deeper?
padlocal Gateway 没有heartbeat 发送过来,以上情况在ts-wechaty 和 .net-wechaty 均会出现。经过本地nas测试,.net wechaty 和padlocal Gateway在同一台服务器上,不会出现类似情况,应该是和网络有关
Link to #84
I have reproduced this issue on a Tencent Cloud server hosted in Beijing.
The problem was caused by the leaking of heartbeats from PadLocal. @padlocal
Here are the details:
heartbeat
event so that it can prove itself is alive and healthy. See: https://github.com/wechaty/wechaty-puppet/blob/bab9e29c088c33fa8bc6e148d9bdadbd453fd138/src/puppet.ts#L253-L254heartbeat
event to emit when there are no other events, so if your bot idle for more than 60 seconds, then the Wechaty Puppet system will think the puppet provider has dead, so it will call reset
to try to recover the puppet.Logs:
02:00:13 INFO StarterBot Message#Text[🗣Contact<OssChat>@👥Room<ChatOps - Heartbeat 💖>] [太阳]
02:01:13 WARN Puppet dogReset() reason: {"data":"onGrpcStreamEvent(EVENT_TYPE_MESSAGE)","timeout":60000}
02:01:13 VERB Puppet reset(onGrpcStreamEvent(EVENT_TYPE_MESSAGE))
02:01:13 VERB PuppetService stop()
02:01:13 VERB StateSwitch <PuppetService> off(pending) <- (false)
02:01:13 VERB PuppetService stopGrpcStream()
02:01:13 VERB PuppetService stopGrpcClient()
02:01:13 VERB Puppet selfId()
02:01:13 VERB StateSwitch <PuppetService> off(true) <- (pending)
02:01:13 INFO StarterBot Contact<Mike (李卓桓)> logout
02:01:13 VERB PuppetService start()
02:01:13 VERB StateSwitch <PuppetService> on(pending) <- (false)
02:01:13 VERB PuppetService startGrpcClient()
02:01:13 VERB PuppetService discoverServiceIp(e49007b7-7523-4a80-bfdb-1be0de3844b9)
02:01:14 VERB PuppetService startGrpcStream()
02:01:14 VERB StateSwitch <PuppetService> on(true) <- (pending)
02:01:14 VERB PuppetService onGrpcStreamEvent({type:EVENT_TYPE_LOGIN(25), payload:"{"contactId":"wxid_a8d806dzznm822"}"})
02:01:14 INFO StarterBot Contact<Mike (李卓桓)> login
02:01:15 VERB PuppetService onGrpcStreamEvent({type:EVENT_TYPE_READY(23), payload:"{"data":"ready"}"})
02:01:15 VERB StateSwitch <WechatyReady> on(true) <- (true)
02:01:20 VERB PuppetService onGrpcStreamEvent({type:EVENT_TYPE_READY(23), payload:"{"data":"ready"}"})
02:01:20 VERB StateSwitch <WechatyReady> on(true) <- (true)
Add heartbeat
event to PadLocal.
Here's an example from our puppeteer puppet, which emits heartbeats in the browser, so if the browser dead, we will get to know because the heartbeat has lost.
@padlocal I hope I have described the design of heartbeat
clearly, so please help us to add heartbeat
to PadLocal, and let me know if you have any questions. Thanks!
Same bug if padlocal with matrix-appservice-wechaty
matrix-appservice-wechaty | 09:12:25 WARN Puppet dogReset() reason: {"data":"onGrpcStreamEvent(EVENT_TYPE_MESSAGE)","timeout":60000}
matrix-appservice-wechaty | 09:12:25 SILL Puppet throttleReset() payload: "{"data":"onGrpcStreamEvent(EVENT_TYPE_MESSAGE)","timeout":60000}"
matrix-appservice-wechaty | 09:12:25 SILL Puppet constructor() resetThrottleQueue.subscribe() reason: "onGrpcStreamEvent(EVENT_TYPE_MESSAGE)"
matrix-appservice-wechaty | 09:12:25 VERB Puppet reset(onGrpcStreamEvent(EVENT_TYPE_MESSAGE))
matrix-appservice-wechaty | 09:12:25 VERB PuppetService stop()
matrix-appservice-wechaty | 09:12:25 SILL StateSwitch <PuppetService> off() is false
matrix-appservice-wechaty | 09:12:25 SILL StateSwitch <PuppetService> off() is false
matrix-appservice-wechaty | 09:12:25 VERB StateSwitch <PuppetService> off(pending) <- (false)
matrix-appservice-wechaty | 09:12:25 VERB PuppetService stopGrpcStream()
matrix-appservice-wechaty | 09:12:25 VERB PuppetService startGrpcStream() eventStream.on(end)
matrix-appservice-wechaty | 09:12:25 VERB PuppetService stopGrpcClient()
matrix-appservice-wechaty | 09:12:25 VERB Puppet selfId()
matrix-appservice-wechaty | 09:12:25 SILL Contact ready() @ Puppet#1<PuppetService>(@yswtrue:yswtrue.com) with id="wxid_1scxaiqf7a6t21"
matrix-appservice-wechaty | 09:12:25 SILL Contact ready() isReady() true
matrix-appservice-wechaty | 09:12:25 SILL StateSwitch <PuppetService> off() is pending
matrix-appservice-wechaty | 09:12:25 VERB StateSwitch <PuppetService> off(true) <- (pending)
matrix-appservice-wechaty | 09:12:25 VERB WechatyManager onLogout(Contact<Roy>)
matrix-appservice-wechaty | 09:12:25 VERB ContactSelf name()
matrix-appservice-wechaty | 09:12:25 VERB MiddleManager directMessageToMatrixConsumer("You are now logged out from Wechat. Your user name is: Roy. send `!login` to me to get a new QR Code to scan for logging in.", "Wechaty#ckkz7ngg9000107mn86nqh4wp<>(@yswtrue:yswtrue.com)")
PadLocal puppet has not implemented heartbeat currently, will support this feature soon
Great to know that the PadLocal will support heartbeat soon, cheers!
Fixed in wechaty-puppet-padlocal@0.2.37
wechaty is always disconnected and reconnected .....
padlocal gateway is running on
dev.chatie.io