バグ #853
完了Message#replyto_source及びMessage#quoting_messagesが落ちる
説明
常にではありませんが、特に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を呼ぶ
toshi_a 初音 さんが8年以上前に更新
- ステータス を 新規 から レビュー待ち に変更
- 担当者 を 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については、以下のページが参考になると思います。
- mikutter開発日記: mikutterにDeferred入れたらどうなるのっと [[http://mikutter.blogspot.jp/2011/07/mikutterdeferred.html]]
- toshia/delayer-deferred: Delayerを利用してjsdeferredをRubyに移植したもの [[https://github.com/toshia/delayer-deferred]]
3つめのMessage#{replyto_source,quoting_messages)_dを呼ぶのが推奨されます。
mikutter側の問題としては、歴史的経緯による歪なAPIとドキュメンテーションの不足です。後者はすぐに解決できるのですが、このあたりのコードはmikutter 3.5に向けて大幅に変更しているところなので、RDocの修正はそちらの様子を見て行います。
以上の話で解決できたら、チケットのステータスを「終了」に、問題の意図を勘違いしているなど対応が必要なら、注記にその旨を書いた上で担当者を私に変更してください。
Yuhsuke Masaki さんが8年以上前に更新
- ステータス を レビュー待ち から 終了 に変更
- 進捗率 を 0 から 100 に変更
ご指摘の方法で動作することを確認しました。
ありがとうございました。