Project

General

Profile

バグ #1305

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

Added by Akira Ouchi 11 months ago. Updated 5 months ago.

Status:
実装待ち
Priority:
通常
Assignee:
-
Target version:
プラグイン名:
ブランチ:
クラッシュする:
No

Description

自分のプラグイン(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に差し込む

History

#1

Updated by Akira Ouchi 11 months 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
#2

Updated by Akira Ouchi 5 months ago

  • Description updated (diff)
  • 再現手順 updated (diff)
#3

Updated by toshi_a 初音 5 months ago

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

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

Updated by toshi_a 初音 5 months ago

  • Status changed from 分類待ち to 実装待ち
#5

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

Also available in: Atom PDF