なにげに地雷体質のえふしんです。
他のインスタンスでは問題ないのに、うちだけリモートフォローしたアカウントのアイコンがうまく表示されてないのに気がついたので調査中メモ(2017/4/21時点の情報です)
accountsテーブルに入ってる該当ユーザーの情報
mastodon=# select id,username,domain,created_at, display_name,avatar_file_name,avatar_content_type,avatar_file_size,avatar_updated_at from accounts where id = 194;
id | username | domain | created_at | display_name | avatar_file_name | avatar_content_type | avatar_file_size | avatar_updated_at
-----+----------+-----------+----------------------------+--------------+----------------------+---------------------+------------------+----------------------------
194 | **** | pawoo.net | 2017-04-19 15:02:21.665211 | | 7c6f3433b2115421.png | image/png | 2645 | 2017-04-19 15:02:21.793892
まぁ見れば、何が対応してるのか大体予測つきますよね。
/:class/:attachment/:id_partition/:style/:filename
id_partitionとは、paperclipの仕様で、12 would be converted to 000000012
という処理をされて3桁ずつ分けたのがパスになるようです。
マストドンはリモートフォローすると、アイコン画像をローカルにダウンロードしてるんですね。avatar_updated_atってのがあるので、おそらく一定周期で最新データを拾ってくれる、、のかな。(ソースコード読みましょうね)
ということでアイコンが表示されないのは、S3へのアイコンのコピーが失敗しているようですね。ファイルサイズは把握してるわけだから、アップロードに失敗しているらしい。何故だ...(続く)
つづき 1:
画像をアップするところは、ここらへんかな?
https://github.com/tootsuite/mastodon/blob/b155e6ccf55bbd0e2b07d6e06349849dd1f06f0a/app/models/account.rb
# Avatar upload
has_attached_file :avatar, styles: ->(f) { avatar_styles(f) }, convert_options: { all: '-quality 80 -strip' }
validates_attachment_content_type :avatar, content_type: IMAGE_MIME_TYPES
validates_attachment_size :avatar, less_than: 2.megabytes
すごいなー。これでPaperclip経由でファイルがアップロードされちゃうんだー。Railsすごいな。
つづき 2:
fetch_remote_account_service.rbを改造して、irb経由で、無理やりアカウント情報を更新してアイコンを更新してました。
で、思ったんだけど、ここ間違ってると思うんですよね。
UpdateRemoteProfileService.new.call(xml, account) unless account.nil?
ではなくて、
UpdateRemoteProfileService.new.call(body, account) unless account.nil?
じゃないと、うまくいかない。
このパスでリモートフォローしにいったらプロフィールの取得に失敗するんじゃないかなぁ。ちゃんと調べてないから問題があるのかまではわからないのだけど。とりあえずプログラム上は間違っている。
別口で、sidekiq経由でUpdateRemoteProfileServiceが呼び出されるパスがあって、そっちが動けばアイコン画像は更新される。どういうきっかけで動くのかまではよくわからない。
https://github.com/tootsuite/mastodon/blob/master/app/workers/remote_profile_update_worker.rb
ただissueとしては、「画像URLわかってるけどS3へのアップロードが失敗している」だからちょっと違うか。まぁ仮にネットワークやサーバ負荷の問題だったらS3アップロード失敗を検知して、次回の何かで更新させて欲しいですね。もう少ししつこく動いてもいいかな。
アイコンの更新は、accountテーブルにavatar_updated_at があるから時間経過で行うつもりなのかなぁ。
ぱっと検索する限り、該当処理が見つからないのが謎。
この辺に深掘りできる方がいらっしゃいましたらpull requestなど投げていただけるとありがたいです。他人任せですいませんw
p.s. ローカルからS3に画像を移したい場合は、この辺のメソッドを再度実行するようなバッチがあれば、一気に更新出来るような気がしますね。