Mastodon でリモートインスタンスから自分のトゥートがみえなくなることがある

Mastodon v1.4 以降について

Mastodon v1.4 以降では、この問題が解消されています (配信時に 3xx/4xx 系が返っても配信解除を行わなくなった)。

下記は v1.4 未満の情報です。

★前提★ (2017年4月22日追記)

cryks.hateblo.jp

この文書は、すべての インスタンス管理者が、デイリータスク (mastodon:daily) を回していることが前提です

こんな現象がおきている

  1. トゥートする
  2. 特定のインスタンスにトゥートが出ない (プッシュされてない)
  3. なので、フォロワーにもトゥートが届かない
  4. ReplyやBoost/Favはちゃんと届く

PubSubHubbub

PubSubを司っているPubSubHubbubの配信先リストを眺めてみると、そのインスタンスが居なくなっている。

この状態で相手のインスタンスから自分のアカウントをフォローしなおしたりしても変わらない。

データベース上の subscriptions テーブル (自⇒リモートへの配信先URL一覧) からも消え失せており、callback_url/secret が分からないのでもはやお手上げである。

どうしてこうなった?

Mastodonは、トゥートをpushするときに、相手のサーバが3xx/4xxのステータスコードを返却すると、即座に配信を解除するようになっている。 (おそらく相手インスタンスの購読期限が切れたときなどのための処理だろう)

相手インスタンスが、サーバメンテナンスなどで一時的に404などが出ていて、そのときにトゥートを行うとこの現象が発生する。

改めてフォローしなおしても状況が変化しないのは、相手インスタンスはこちらの購読情報をまだ持っている (accounts テーブルにある subscription_expires_atに到達していない) からである。 (購読情報を持っている限り、新たに購読情報を送ることはしないようだ)

解決策

  • 相手のインスタンスcron でデイリータスクを回している限り、購読期限が7日なのでそのうち新しい配信先情報が送られてくる (ので、最大7日間待つ)
  • 定期的に subscriptions テーブルの dump をとって、問題が起きたら自分で復元してみる (自分でインスタンスを運用している場合)
  • 相手のインスタンスの管理者に SubscribeService.new.call(<自分のAccount>) を実行してくださいと言う (最終手段)

余談

Mastodon のコード中の subscription が、「購読している (accounts.subscription_expires_at 等)」「購読されている (subscriptions テーブル等)」と、自インスタンスから見るとまったく逆の意味で用いられている箇所があるので、文脈をよく読まないと混同してしまうので注意。

参考

qiita.com