Actions
バグ #1305
openWorldの初期化が頻繁に実行されている
プラグイン名:
ブランチ:
クラッシュする:
No
Description
自分のプラグイン(Haiku)の問題切り分けをしていたところ、Worldの初期化が数秒おきという高頻度で実行されていることに気づきました。
自分のプラグインの他にTwitter WorldのInitializeにもプリントデバッグを差し込んだところ、同時に出力されているようだったので
使用している全部のWorldプラグインで頻繁に初期化が走っているようです。
出力例
"Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:44:27" "Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:44:46" "Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:44:48" "Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:44:50" "Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:45:02" "Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:45:04" "Twitter:: called initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user from initialize!!!!!!!!!!!!!!!!!!!!!!!!" "Haiku::get_user : 2018-11-07 22:45:08"
Haikuプラグインではキャッシュなど考慮しておらず、
この出力のタイミングで毎回APIを叩いていたことがわかったため、ひとまずはキャッシュ的な対応をする予定です。
再現手順
プリントデバッグを任意のWorldのinitializeに差し込む
Updated by Akira Ouchi about 6 years ago
- Target version set to 3.8
- 再現手順 updated (diff)
使用中のコミット
commit 20f04f2fbecac7a5ea6faa6ce554f55bee4a380a (HEAD -> master, tag: 3.8.2, origin/master, origin/HEAD) Author: Toshiaki Asai <toshi.alternative@gmail.com> Date: Sun Oct 28 13:30:35 2018 +0900 version 3.8.2
Updated by Akira Ouchi over 5 years ago
Updated by toshi_a 初音 over 5 years ago
#1329 の修正を適用したあとWorld追加系プラグインを抜くと、何度もActivityに以下のようなメッセージが表示されます。このissueで報告されているのと同じ原因だと思われます。
アカウント「worldon:mikutter@social.mikutter.hachune.net」に必要なworldonプラグインが見つからなかったため、このアカウントは一時的に利用できません。worldonプラグインを意図的に消したのであれば、このアカウントの登録を解除してください。
Updated by cob odo over 5 years ago
あまり検証していませんが、それらしい経路はありました。
Plugin.filtering(:worlds, y) # なんらかのプラグインからのいずれかの呼び出し -> Plugin[:world].load_world_ifn -> @worlds ||= Plugin::World::Keep.accounts.map { |id, serialized| ... provider.new(serialized) ... } ここで各worldオブジェクトの初期化が走る このうちtwitterプラグインのケースを見る -> Plugin::Twitter::World#initialize -> Plugin::Twitter::World#user_initialize (twitter/:account/:verify_credentials).user.next で Plugin::Twitter::World#user_received を予約して終了 すべてのworldオブジェクトの初期化完了後、@worldsが初期化される。 (twitter/:account/:verify_credentials)のレスポンスが来る -> Plugin::Twitter::World#user_received -> Plugin.call(:world_modify, self) -> Plugin[:world].modify_world -> @worlds = nil # 次回 filter_worlds ですべてのworldオブジェクト作り直し
Plugin.filtering(:worlds)
が比較的多用されるフィルタであることと、twitterのレスポンス次第では発生しそうかなと思いました。
要するにinitialize
からPlugin.call(:world_modify)
されると結果的に連鎖しそうです。
他のプラグインの状況がよくわからないですが、WorldonではWorld#initialize
をオーバーライドしておらず、似たような経路では発生しづらいのかなと思いました。
Actions