Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: account migration #10507

Merged
merged 28 commits into from
Apr 8, 2023
Merged

feat: account migration #10507

merged 28 commits into from
Apr 8, 2023

Conversation

nmkj-io
Copy link
Contributor

@nmkj-io nmkj-io commented Apr 7, 2023

What

Moveアクティビティによるアカウントの引っ越し(フォロワー引き継ぎ)に対応する。一度引っ越したアカウントでは二度と引っ越しできなくなるが、フォローや投稿は引き続き可能。引っ越したアカウント(PersonオブジェクトにmovedToが設定されている)に対しては引っ越し先を表示する。

Calckey の実装に基づいています。

#5475 を一部解決。

This PR implements the account migration functionality using Move activity. The old account won't be migrated again, but still functional. If the account has movedTo value, its new account is indicated in its old profile page.

Some codes were adopted from Calckey.

Partially resolves #5475

Why

アカウントの引っ越しに対応するため。例えば Mastodon → Mastodon のフォロワー引き継ぎにも対応する。

This also enables Misskey to follow account migrations between Mastodon servers.

Additional info (optional)

Migration

  • Misskey → Misskey
  • Misskey → Mastodon
  • Mastodon → Misskey
  • Mastodon → Mastodon

Follower Relationships

  • Remote follow from Mastodon
  • Remote follow from Misskey
  • Local follow from Misskey

以上の組み合わせでフォロワーが引き継がれることを確認した。

I confirmed followers are transferred with the above combinations.

Checklist

  • Read the contribution guide
  • Test working in a local environment
  • (If needed) Update CHANGELOG.md
  • (If possible) Add tests

Screenshot 2023-04-07 at 07-50-58 Misskey
Screenshot 2023-04-07 at 07-53-22 Misskey

@github-actions github-actions bot added ‼️ wrong locales This PR edits locales other than the ja-JP one. See locales/README.md packages/backend Server side specific issue/PR packages/frontend Client side specific issue/PR labels Apr 7, 2023
@codecov
Copy link

codecov bot commented Apr 7, 2023

Codecov Report

Merging #10507 (6908376) into develop (eb30976) will decrease coverage by 0.10%.
The diff coverage is 56.02%.

@@             Coverage Diff             @@
##           develop   #10507      +/-   ##
===========================================
- Coverage    75.26%   75.17%   -0.10%     
===========================================
  Files          881      885       +4     
  Lines        86409    86982     +573     
  Branches      5883     5911      +28     
===========================================
+ Hits         65039    65390     +351     
- Misses       21370    21592     +222     
Impacted Files Coverage Δ
...ges/backend/src/core/activitypub/ApInboxService.ts 17.47% <5.76%> (-1.00%) ⬇️
.../backend/src/core/activitypub/ApRendererService.ts 75.95% <32.00%> (-1.59%) ⬇️
packages/backend/src/core/AccountMoveService.ts 43.85% <43.85%> (ø)
...end/src/core/activitypub/models/ApPersonService.ts 63.11% <50.00%> (-0.09%) ⬇️
...ges/backend/src/server/api/endpoints/i/known-as.ts 66.30% <66.30%> (ø)
...ackages/backend/src/server/api/endpoints/i/move.ts 70.58% <70.58%> (ø)
packages/backend/src/core/AccountUpdateService.ts 100.00% <100.00%> (ø)
packages/backend/src/core/CoreModule.ts 100.00% <100.00%> (ø)
packages/backend/src/core/activitypub/type.ts 94.13% <100.00%> (+0.14%) ⬆️
...ges/backend/src/core/entities/UserEntityService.ts 92.91% <100.00%> (+0.07%) ⬆️
... and 7 more

... and 3 files with indirect coverage changes

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

A→B/B→A/A→C

A→B/B→Aってできるの(というかやっていいの)?

followとunfollowでawaitをする必要は無い

同時多発的にfollow, unfollowを走らせるのは負荷的にまずい気がする

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

A→B/B→Aってできるの(というかやっていいの)?

この実装ではそのような使い方はできない(古いアカウントは二度と元通りに使えない)と引越し実行時に警告が出るようになってます。

同時多発的にfollow, unfollowを走らせるのは負荷的にまずい気がする

follow、unfollowは引っ越し先がリモートの場合はキューに入ります。引っ越し先がローカルの場合はキューに入りません。

負荷が有るとしたら follow, unfollow 関数のなかで findOneByOrFail している(クエリする)部分だと思います。

this.usersRepository.findOneByOrFail({ id: _follower.id }),

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

負荷が有るとしたら follow, unfollow 関数のなかで findOneByOrFail している(クエリする)部分

checkBlockedもデータベースに問い合わせる可能性がある

1000人や1万人単位で移動があると大変なことになりそう

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

1000人や1万人単位で移動があると大変なことになりそう

最悪ケースはリモートユーザーのフォロワー1万人が全員同じMisskeyサーバーに属していた場合です。(かなり特殊事例だとは思います)
この場合そのリモートユーザーがフォロワー1万人と同じMisskeyサーバーに引っ越してきた場合は1万回followとunfollow処理がローカルで走ることになります。これはMastodonも同様だと思います。

https://github.com/mastodon/mastodon/blob/99e3e152cd2180cfa9a5bcafae208d44f31078f8/app/workers/move_worker.rb#L10

フォロー処理を全てキューイングする場合はそもそもfollowの実装を書き直す必要があると思います。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

最悪ケースはリモートユーザーのフォロワー1万人が全員同じMisskeyサーバーに属していた場合です。(かなり特殊事例だとは思います)

misskey.ioの状況を見ると(ioからフォロワー1万あるというのは)割とあり得る

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

フォロー処理を全てキューイングする場合はそもそもfollowの実装を書き直す必要がある

(これが嫌なのでアカウント移行に手をつけてなかったというのはある)

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

followに限ればフォローのインポートが参考になるのでそれを使う手はあります。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

フォローのインポートが参考になる

フォローインポートも1回のジョブで全部インポートしようとするのでならない

(そして案の定、ユーザーが数千件のフォローインポートを誰かが行うと阿鼻叫喚になる)

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

(つまり: フォローのジョブキュー化はどっちみちやらなくてはならない

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

フォローインポートも1回のジョブで全部インポートしようとするのでならない

ではフォローのインポートも含めて根本的に直す必要がありますね……。ただ中規模以下のサーバーでは無視できる話だと思うので、コントロールパネルから(もしくはロールで)引っ越しを無効にできるようにすれば妥協策になります。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

(引越の有効無効をロールで簡単に制限できるのはなんかちょっと違う気がしている)

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

(引越の有効無効をロールで簡単に制限できるのはなんかちょっと違う気がしている)

ちなみにロールにすると「misskey.ioに居るがフォロワーはそんなに多くないので引っ越したい」という要求に対応できるようになります。(引っ越しを承認制にする)

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

あるいは、一定数以上のフォロワーが居る場合は引っ越しを許可しないという処理もできます。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

一定数以上のフォロワーが居る場合は

コンディショナルロールで設定できるのでロールで実装するということになりそう

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

全く別の問題: 移行先のアカウントでフォローされまくることになるので、通知破壊される

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

全く別の問題: 移行先のアカウントでフォローされまくることになるので、通知破壊される

これは仕方ないですね……。(Mastodonでも起こる)

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

一定数以上のフォロワーが居る場合は

コンディショナルロールで設定できるのでロールで実装するということになりそう

フォロー処理がジョブキューになるまで一旦これでやってみます。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

あとフォローだけじゃなくてユーザーリストやブロック・ミュート関係も移行する必要がある

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

あとフォローだけじゃなくてユーザーリストやブロック・ミュート関係も移行する必要がある

これは引っ越し機能ではなくインポート・エクスポートしてもらう形になります。

(引っ越しはあくまでフォロワーに着いてきてもらうための機能)

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

(引っ越しはあくまでフォロワーに着いてきてもらうための機能)

それが嫌という意見は多くある
フォロワーがついてくるならブロック・ミュートも追従するべき

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

(引っ越しはあくまでフォロワーに着いてきてもらうための機能)

それが嫌という意見は多くある フォロワーがついてくるならブロック・ミュートも追従するべき

Misskey同士なら可能かもしれません。MastodonやAkkomaとは現状その互換性が無いですが、やめる理由にはならないと思います。

処理を分けることはできます。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

引っ越しする人から他の人に対してのブロックミュートリストはエクスポート/インポートでいい

私が言いたいのは他の人から引っ越しする人に対してのブロックミュートについてで、これは互換性は関係ないはず
(moveアクティビティを受け取ったらフォローと同様にブロックやミュートをコピーしたい

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

他の人から引っ越しする人に対してのブロックミュートについてで、これは互換性は関係ないはず (moveアクティビティを受け取ったらフォローと同様にブロックやミュートをコピーしたい

Moveアクティビティはフォロー関係がひとつでもあるサーバーにしか飛ばないので、飛んでくることを期待して楽観的な処理にすることはできます。

Moveを受信したときにローカルユーザーのブロック・ミュート関係をチェックする。

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

楽観的な処理で良さそう

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

(新規に発見 or 何らかの拍子にアップデートされたユーザーでも引っ越し関係はデータとしてあるのだからブロック・ミュート処理を行うのは可能ではありそう)

@tamaina
Copy link
Contributor

tamaina commented Apr 8, 2023

優先順位(個人的な勝手な意見)

  • フォローのジョブキュー化ができるまではアカウント移行機能は復活させたくない
  • 通知破壊はmutingNotificationTypesにfollowを自動で追加するみたいな処理を入れると良さそう
  • ブロック・ミュート関係はoptinal (機能をブロックするまでの問題ではない)

@nmkj-io
Copy link
Contributor Author

nmkj-io commented Apr 8, 2023

フォローのジョブキュー化ができるまではアカウント移行機能は復活させたくない

大量のローカルユーザーが一つのリモートユーザーをフォローしていて、そのリモートユーザーが引っ越した場合は人数制限で解決しないので、引っ越し機能はジョブキュー化が完了するまで保留にした方が良いでしょう。

(ジョブキュー化すればそもそも人数制限などの回りくどいものが必要ないと仮定した話ではあります。)

中規模以下のサーバーと大規模サーバーで引っ越し対応に齟齬を許すならセキュリティオプションにするという手もありますが、どのみちジョブキュー化で両方解決するならそれに越したことはないと思いますので。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
packages/backend Server side specific issue/PR packages/frontend Client side specific issue/PR ‼️ wrong locales This PR edits locales other than the ja-JP one. See locales/README.md
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Account Migration (Move)
4 participants