プロジェクト

全般

プロフィール

バグ #1305

未完了

Worldの初期化が頻繁に実行されている

Akira Ouchi さんが5年以上前に追加. ほぼ5年前に更新.

ステータス:
実装待ち
優先度:
通常
担当者:
-
対象バージョン:
プラグイン名:
ブランチ:
クラッシュする:
いいえ

説明

自分のプラグイン(Haiku)の問題切り分けをしていたところ、Worldの初期化が数秒おきという高頻度で実行されていることに気づきました。
自分のプラグインの他にTwitter WorldのInitializeにもプリントデバッグを差し込んだところ、同時に出力されているようだったので
使用している全部のWorldプラグインで頻繁に初期化が走っているようです。

(この辺) https://dev.mikutter.hachune.net/projects/mikutter/repository/main/revisions/master/entry/core/plugin/twitter/model/world.rb#L15

出力例

"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 さんが5年以上前に更新

  • 対象バージョン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

Akira Ouchi さんがほぼ5年前に更新

toshi_a 初音 さんがほぼ5年前に更新

#1329 の修正を適用したあとWorld追加系プラグインを抜くと、何度もActivityに以下のようなメッセージが表示されます。このissueで報告されているのと同じ原因だと思われます。

アカウント「worldon:mikutter@social.mikutter.hachune.net」に必要なworldonプラグインが見つからなかったため、このアカウントは一時的に利用できません。worldonプラグインを意図的に消したのであれば、このアカウントの登録を解除してください。

toshi_a 初音 さんがほぼ5年前に更新

  • ステータス分類待ち から 実装待ち に変更

cob odo さんがほぼ5年前に更新

あまり検証していませんが、それらしい経路はありました。

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をオーバーライドしておらず、似たような経路では発生しづらいのかなと思いました。

他の形式にエクスポート: Atom PDF