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

v2化に伴うデータのマイグレーション #22

Open
wants to merge 7 commits into
base: v1tov2
from

Conversation

@asonas
Copy link
Collaborator

commented Jul 16, 2019

(今日asakusa.rbに言って相談しようと思ったんですが、予定があっていけなさそうだったのでプルリクをしたためました)

このPRで達成されること

  • cfp-appをv1からv2のコードベースへ移行する
    • RubyKaigi仕様なパッチ以外はすべて rubycentral/cfp-app の master に追従させます
  • DBに破壊的な変更が入っているためデータのマイグレーションを行う
    • 相談したいことがいくつかあります(後述)

手元で動作確認する方法

$ bundle install
$ bin/rails db:drop db:creat
$ heroku pg:backups:download
$ pg_restore --verbose --clean --no-acl --no-owner -h localhost -U $(whoami) -d cfp_app_development latest.dump
$ bin/rails ridgepole:apply
$ bin/rails v1_to_v2:apply
$ bin/rails s 

やったこと

  • 主にユーザー周りのデータ移行
    • 開発環境でログインして過去のイベントなどを見ることができます

やりのこしていること

  • タイムテーブルまわりのデータ移行
    • データとしては存在するけどWeb上でプロポーザルが見れない
  • 作業の進め方をまだ書いていない
    • あとで書きます...!

相談したいこと

認証に関連するテーブルがガラッと変わっている

v1 のコードベースでは Person has many Services という関連になっており、1人のユーザーが複数のサービス(Twitter,GitHub)を使ってひとつのユーザーとして認証できるようになっています。
コードでいうとこのあたりの処理です。
https://github.com/ruby-no-kai/cfp-app/blob/rubykaigi2019/app/models/person.rb#L63-L69

v2では User モデルにすべてが集約されているので、たとえば v1 時代にTwitterとGitHub両方でログインしていたユーザーの関連を壊すことになります。
このv2の変更に影響する人の数は283人です。

[2] pry(main)> Service.group(:person_id).having("count(person_id) = 2").count.length
   (1.0ms)  SELECT COUNT(*) AS count_all, "services"."person_id" AS services_person_id FROM "services" GROUP BY "services"."person_id" HAVING (count(person_id) = 2)
=> 283
[3] pry(main)> Person.count
   (1.2ms)  SELECT COUNT(*) FROM "people"
=> 709

今回のデータをマイグレーションするバッチでは、複数のサービスでサインアップしていた人に対しては github に決め打ちにして移行います。
複数のサービスでサインアップしていた人が、GitHubでログインした場合、過去のプロポーザルなどを閲覧することは可能ですが、Twitterを経由してログインした場合には、新たにUserのレコードが作成されることになって、過去のプロポーザルを見ることはできません。
相談したいこととしては、

  • 過去にCfPを送った方々のプロポーザルをどれぐらい頑張って見れるようにするか?
    1. 認証部分に手を入れて、v1のような User has many Providers を実現する
    1. 特定の Provider を指定してデータを移行する(今回のパッチ)
    • v2 のテーブル定義やコードベースをそのまま使うのでv2のコードに
    • v1 時代にCfPを送って下さっていたユーザーにとってはよくわからない挙動だし、不親切かも

あたりを決めたいです。

不正な Person レコードについて

不正なレコードがあって、移行バッチ内で除外しています。

  • servicesが存在しない
    • 5
      • Proposalなし
      • 403 が同じアカウント
      • 過去にオーガナイザーだったぽい
    • 171
      • Proposalあり
      • 179 が同じアカウント
    • 172
      • Proposalあり
      • 252 が同じアカウント
  • アカウント重複問題
    • 61
    • 588

serivcesが存在しない

何らかの理由で services のレコードが作成されなかったパターン...?
servicesが存在しないとログインが不可能になり、その人が投稿したリソースにアクセスができなくなるので可能な限り移行をします。

  • 5 の方はProposalが存在しないのでそこまで致命的ではありませんが、かつてオーガナイザーだったようでCfPへのコメントがいくつか残っているようでした
    • 移行しないと一部のCfPのページで nil アクセスになって落ちるので移行させます
  • 171と172 の方は別のアカウントが存在するのでそれぞれ、 179, 252に移行させます

今回のデータ移行ではservicesが存在しないとアカウントが正常に作成されないので、servicesが存在しない場合はusers.providerusers.uid のカラムにダミーのデータをそれぞれ UNKNOWN, 9999999999を格納します。

アカウント重複問題

以前のRubyKaigiでタイムテーブルを出力する上でアカウントを重複させることで解決していたように記憶してます
servicesも同じレコードが追加されているんですが、認証時には.firstを持ってきているので問題が起きていませんでした
https://github.com/ruby-no-kai/cfp-app/blob/rubykaigi2019/app/models/person.rb#L35

移行する段階でメールアドレスが重複してエラーになるので、ダミーのメールアドレスを入れてエラーを回避します。

@asonas asonas referenced this pull request Jul 16, 2019

@asonas asonas changed the base branch from rubykaigi2019 to v1tov2 Jul 16, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
1 participant
You can’t perform that action at this time.