Bug(バグ) #2900
完了OpenPNE2系からコンバートした環境で日記コメントが書き込めない現象が発生する場合がある
100%
説明
Overview (現象)¶
OpenPNE2系からコンバートした環境で日記コメントが書き込めない現象が発生する場合がある。
diary_comment_update (日記未読コメントテーブル) に存在しないメンバーが存在する場合に、日記コメントを投稿すると外部キー制約違反となりエラーが発生する。
コンバーターはOpenPNEコア側の機能で判断に迷う所ですが、本件の原因はプラグインにあると判断しこちらにチケットを作成しました。
opDiaryPluginプロジェクトにチケットを作成するのが不適切でしたら、お手数ですがOpenPNE3コアのプロジェクトにチケットの移動をお願いいたします。
再現バージョン¶
- OpenPNE3.6.2
- opDiaryPlugin1.4.0.1
再現手順¶
- diary_comment_update (日記未読コメントテーブル) に存在しないメンバーidがある日記データを準備する
- この日記にアクセスする
- この日記にコメントを投稿する
- 「サーバーが混み合ってます・・・・」のエラーメッセージが表示される(devモードで確認すると外部キー制約違反のエラーが表示される)
Causes (原因)¶
バグが発生した原因を記入
Way to fix (修正内容)¶
修正内容を記入
Hidenori Goto さんが12年以上前に更新
例外発生箇所¶
lib\model\doctrine\PluginDiaryCommentUpdateTable.class.php L36-39
$this->createQuery()->update() ->set('last_comment_time', '?', $now) ->where('diary_id = ?', $diary->id) ->execute();
上記クエリー実行時に、diary_comment_updateテーブル内で該当diary_idレコードのうち、存在しないmember_idのレコードがある場合にエラーとなります。
修正方針¶
- コンバータ側での対処
- diary_comment_updateの不正レコードは、2からのアップグレード(コンバーター)により追加されます。コンバーターにて、存在しないメンバーに対してはdiary_comment_updateレコードが追加されないように修正します。
- data/upgrade/2/sql/diary.sql にて、SQL文を工夫する等
- この対応のみでは、すでにアップグレード済みの環境では問題が解決されません。
- opDiaryPlugin側で、diary_comment_updateの不正レコード対処コードを追加する
- この処理は1度行えばよいので、バッチまたはタスク、またはマイグレーションによるメンテナンスの実行という形が適切と考えています。
- メンテナンス処理にて、diary_comment_update内の不正レコードを削除します。
- この処理は1度行えばよいので、バッチまたはタスク、またはマイグレーションによるメンテナンスの実行という形が適切と考えています。
Hidenori Goto さんが12年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
コンバーターの修正のみPull Requestしました。
Yuya Watanabe さんが12年以上前に更新
note-6 でいただいた修正内容は OpenPNE 本体への修正のため,本チケットは OpenPNE 本体のプロジェクトに移動します.また,note-3 の 2 の修正方針については opDiaryPlugin のマイグレートスクリプトとして提供することが望ましいと思います.
そのため,opDiaryPlugin のプロジェクトに新しくチケットを追加( #3070 )して, 2 の修正方針はそちらで対応をお願いしたいです.
Yuya Watanabe さんが12年以上前に更新
- プロジェクト を opDiaryPlugin から OpenPNE 3 に変更
- 対象バージョン を削除 (
v1.4.1)
Yuya Watanabe さんが12年以上前に更新
このチケットの内容¶
再現方法¶
- 2.14 をインストール
- 初期メンバ A を登録(SNS メンバ数 1)
- メンバを2人 B, C を追加(SNS メンバ数 3)
- メンバ A で日記 d を書く
- 日記 d に対して メンバ B がコメント x を書く
- メンバ B が退会する(SNS メンバ数 2)
- 3.6.3 へアップグレード
- メンバ C で日記 d に対してコメント y を書こうとする -> 503 エラー
その他バグについて(このチケットの問題とは別の問題)¶
2.14 で退会したはずのメンバのコメントが 3.6.3 で新規登録したメンバによって書かれたかのような処理が行われる.
再現方法¶
- 2.14 をインストール
- 初期メンバ A を登録(SNS メンバ数 1)
- メンバ B を追加(SNS メンバ数 2)
- メンバ C を追加(SNS メンバ数 3)
- メンバ A で日記 d を書く
- 日記 d に対して メンバ C がコメント x を書く
- メンバ C が退会する(SNS メンバ数 2)
- 3.6.3 へアップグレード
- 日記 d を閲覧する -> コメント x のメンバが非表示であることを確認する
- メンバ D を追加(SNS メンバ数 3)
- 日記 d を閲覧する -> コメント x が メンバ D によって書かれたことになっている
原因¶
メンバのデータを表すテーブルの auto_increment の値が 2.14 のときのものと一致していない.
mysql> show table status where name = "c_member"; +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+ | c_member | MyISAM | 10 | Dynamic | 2 | 64 | 128 | 281474976710655 | 3072 | 0 | 4 | 2012-06-11 01:28:50 | 2012-06-11 01:28:50 | NULL | utf8_general_ci | NULL | | | +----------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+ 1 row in set (0.00 sec) mysql> show table status where name = "member"; +--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+ | Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options | Comment | +--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+ | member | InnoDB | 10 | Compact | 2 | 8192 | 16384 | 0 | 32768 | 0 | 3 | 2012-06-11 01:28:50 | NULL | NULL | utf8_unicode_ci | NULL | | Saves informations of members; InnoDB free: 1845248 kB; (`invite_member_id`) REF | +--------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+----------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
Yuya Watanabe さんが12年以上前に更新
note-10 の問題は別チケット( #3074 )を作成しました.
本チケットの修正はレビューOKとして,下記コミットで stable-3.6.x にマージを行いました.
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。