Project

General

Profile

バグ #853

Message#replyto_source及びMessage#quoting_messagesが落ちる

Added by Yuhsuke Masaki about 3 years ago. Updated about 3 years ago.

Status:
終了
Priority:
通常
Target version:
プラグイン名:
ブランチ:
クラッシュする:

Description

常にではありませんが、特にreplyto_messagesは頻繁に落ちます。
findbyid内でSystemExitを発生させています。

Plugin.create(:test_plugin) do
on_update do | service, messages |
messages.each do |msg|
rep = msg.replyto_source(true)
msg.quoting_messages(true)
end
end
end

というコードにおいて

/home/aki/.share/local/repos/mikutter/core/retriever.rb:208:in `abort': exit
from /home/aki/.share/local/repos/mikutter/core/retriever.rb:208:in `rescue in findbyid'
from /home/aki/.share/local/repos/mikutter/core/retriever.rb:189:in `findbyid'
from /home/aki/.share/local/repos/mikutter/core/retriever.rb:114:in `get'
from /home/aki/.share/local/repos/mikutter/core/message.rb:233:in `replyto_source'
from /home/aki/.mikutter/plugin/test_plugin/test_plugin.rb:6:in `block (3 levels) in <top (required)>'
from /home/aki/.mikutter/plugin/test_plugin/test_plugin.rb:5:in `each'
from /home/aki/.mikutter/plugin/test_plugin/test_plugin.rb:5:in `block (2 levels) in <top (required)>'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/listener.rb:25:in `call'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:97:in `block (2 levels) in call_all_listeners'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `each'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:96:in `block in call_all_listeners'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `catch'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:95:in `call_all_listeners'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/pluggaloid-1.1.1/lib/pluggaloid/event.rb:45:in `block (2 levels) in call'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/delayer-0.0.2/lib/delayer/procedure.rb:24:in `run'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:58:in `run_once'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/delayer-0.0.2/lib/delayer/extend.rb:30:in `run'
from /home/aki/.share/local/repos/mikutter/vendor/bundle/ruby/2.3.0/gems/delayer-0.0.2/lib/delayer.rb:43:in `method_missing'
from /home/aki/.share/local/repos/mikutter/core/plugin/gtk/delayer.rb:10:in `block in boot'
from /home/aki/.share/local/repos/mikutter/core/plugin/gtk/mainloop.rb:10:in `main'
from /home/aki/.share/local/repos/mikutter/core/plugin/gtk/mainloop.rb:10:in `mainloop'
from ./mikutter.rb:63:in `boot!'
from ./mikutter.rb:92:in `<main>'
notice: ./mikutter.rb:69:in `rescue in boot!': catch exception `SystemExit'
notice: ./mikutter.rb:71:in `rescue in boot!': => `SystemExit'
notice: ./mikutter.rb:96:in `rescue in <main>': catch SystemExit
notice: ./mikutter.rb:80:in `error_handling!': catch SystemExit

といった具合です。


再現手順

プラグインのコールバック内でMessage#replyto_sourceまたはMessage#quoting_messagesを呼ぶ

History

#1

Updated by toshi_a 初音 about 3 years ago

  • Status changed from 新規 to レビュー待ち
  • Assignee set to Yuhsuke Masaki

これらのメソッドの第一引数 force_retrieve は、

真なら、ツイートがメモリ上に見つからなかった場合Twitter APIリクエストを発行する

とあります。具体的には、バックトレースを見てもらったらわかるように、Retriever::Model.findbyid を呼んでいます。

mikutterでは、UIスレッドでのAPIリクエストはabortします。リクエストが返ってくるまでmikutterを操作できなくなり、フリーズしたように見えるからです。以下のいずれかの対策を行ってください。

  • 引数force_retrieveにfalseを指定する … メモリ上から見つけられない時、APIリクエストを発生させずnilを返します
  • 別のThreadでリクエストする … UIスレッド以外であれば問題ありません
  • Message#replyto_source_d を使用する … Deferredを返すのでUIスレッドでも使用できます。Deferredについては、以下のページが参考になると思います。

3つめのMessage#{replyto_source,quoting_messages)_dを呼ぶのが推奨されます。

mikutter側の問題としては、歴史的経緯による歪なAPIとドキュメンテーションの不足です。後者はすぐに解決できるのですが、このあたりのコードはmikutter 3.5に向けて大幅に変更しているところなので、RDocの修正はそちらの様子を見て行います。

以上の話で解決できたら、チケットのステータスを「終了」に、問題の意図を勘違いしているなど対応が必要なら、注記にその旨を書いた上で担当者を私に変更してください。

#2

Updated by Yuhsuke Masaki about 3 years ago

  • Status changed from レビュー待ち to 終了
  • % Done changed from 0 to 100

ご指摘の方法で動作することを確認しました。
ありがとうございました。

Also available in: Atom PDF