操作
バグ #1305
未完了Worldの初期化が頻繁に実行されている
プラグイン名:
ブランチ:
クラッシュする:
いいえ
説明
自分のプラグイン(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に差し込む
Akira Ouchi さんが約7年前に更新
- 対象バージョン を 3.8 にセット
- 再現手順 を更新 (差分)
使用中のコミット
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
toshi_a 初音 さんが6年以上前に更新
#1329 の修正を適用したあとWorld追加系プラグインを抜くと、何度もActivityに以下のようなメッセージが表示されます。このissueで報告されているのと同じ原因だと思われます。
アカウント「worldon:mikutter@social.mikutter.hachune.net」に必要なworldonプラグインが見つからなかったため、このアカウントは一時的に利用できません。worldonプラグインを意図的に消したのであれば、このアカウントの登録を解除してください。
cob odo さんが6年以上前に更新
あまり検証していませんが、それらしい経路はありました。
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をオーバーライドしておらず、似たような経路では発生しづらいのかなと思いました。
操作