プロジェクト

全般

プロフィール

Bug(バグ) #2900

OpenPNE2系からコンバートした環境で日記コメントが書き込めない現象が発生する場合がある

Mutsumi Imamura約12年前に追加. 8年以上前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2012-03-26
期日:
進捗率:

100%

3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)

説明

Overview (現象)

OpenPNE2系からコンバートした環境で日記コメントが書き込めない現象が発生する場合がある。
diary_comment_update (日記未読コメントテーブル) に存在しないメンバーが存在する場合に、日記コメントを投稿すると外部キー制約違反となりエラーが発生する。

コンバーターはOpenPNEコア側の機能で判断に迷う所ですが、本件の原因はプラグインにあると判断しこちらにチケットを作成しました。
opDiaryPluginプロジェクトにチケットを作成するのが不適切でしたら、お手数ですがOpenPNE3コアのプロジェクトにチケットの移動をお願いいたします。

再現バージョン

  • OpenPNE3.6.2
  • opDiaryPlugin1.4.0.1

再現手順

  1. diary_comment_update (日記未読コメントテーブル) に存在しないメンバーidがある日記データを準備する
  2. この日記にアクセスする
  3. この日記にコメントを投稿する
  4. 「サーバーが混み合ってます・・・・」のエラーメッセージが表示される(devモードで確認すると外部キー制約違反のエラーが表示される)

Causes (原因)

バグが発生した原因を記入

Way to fix (修正内容)

修正内容を記入


関連するチケット

関連している opDiaryPlugin - Bug(バグ) #3070: OpenPNE2系からOpenPNE 3.6.4 より前のバージョンへコンバートした環境で日記コメントが書き込めない現象が発生する場合がある Fixed(完了) 2012-06-07

関係しているリビジョン

リビジョン 8a1e9df3 (差分)
Hidenori Gotoほぼ12年前に追加

(refs #2900) Fixed converter SQL for diary_comment_update to check whether member exists.

履歴

#1 Mutsumi Imamura約12年前に更新

  • 説明 を更新 (diff)

#2 Mutsumi Imamuraほぼ12年前に更新

  • 対象バージョンv1.4.1 にセット

#3 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のレコードがある場合にエラーとなります。

修正方針

  1. コンバータ側での対処
    1. diary_comment_updateの不正レコードは、2からのアップグレード(コンバーター)により追加されます。コンバーターにて、存在しないメンバーに対してはdiary_comment_updateレコードが追加されないように修正します。
    2. data/upgrade/2/sql/diary.sql にて、SQL文を工夫する等
    3. この対応のみでは、すでにアップグレード済みの環境では問題が解決されません。
  2. opDiaryPlugin側で、diary_comment_updateの不正レコード対処コードを追加する
    1. この処理は1度行えばよいので、バッチまたはタスク、またはマイグレーションによるメンテナンスの実行という形が適切と考えています。
      1. メンテナンス処理にて、diary_comment_update内の不正レコードを削除します。

#4 Mutsumi Imamuraほぼ12年前に更新

  • 担当者Hidenori Goto にセット

#5 Hidenori Gotoほぼ12年前に更新

  • ステータスNew(新規) から Accepted(着手) に変更

#6 Hidenori Gotoほぼ12年前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

コンバーターの修正のみPull Requestしました。

https://github.com/openpne/OpenPNE3/pull/46

#7 Yuya Watanabeほぼ12年前に更新

note-6 でいただいた修正内容は OpenPNE 本体への修正のため,本チケットは OpenPNE 本体のプロジェクトに移動します.また,note-3 の 2 の修正方針については opDiaryPlugin のマイグレートスクリプトとして提供することが望ましいと思います.
そのため,opDiaryPlugin のプロジェクトに新しくチケットを追加( #3070 )して, 2 の修正方針はそちらで対応をお願いしたいです.

#8 Yuya Watanabeほぼ12年前に更新

  • プロジェクトopDiaryPlugin から OpenPNE 3 に変更
  • 対象バージョン を削除 (v1.4.1)

#9 Yuya Watanabeほぼ12年前に更新

  • 対象バージョンOpenPNE 3.6.4 にセット

#10 Yuya Watanabeほぼ12年前に更新

このチケットの内容

再現方法

  1. 2.14 をインストール
  2. 初期メンバ A を登録(SNS メンバ数 1)
  3. メンバを2人 B, C を追加(SNS メンバ数 3)
  4. メンバ A で日記 d を書く
  5. 日記 d に対して メンバ B がコメント x を書く
  6. メンバ B が退会する(SNS メンバ数 2)
  7. 3.6.3 へアップグレード
  8. メンバ C で日記 d に対してコメント y を書こうとする -> 503 エラー

その他バグについて(このチケットの問題とは別の問題)

2.14 で退会したはずのメンバのコメントが 3.6.3 で新規登録したメンバによって書かれたかのような処理が行われる.

再現方法

  1. 2.14 をインストール
  2. 初期メンバ A を登録(SNS メンバ数 1)
  3. メンバ B を追加(SNS メンバ数 2)
  4. メンバ C を追加(SNS メンバ数 3)
  5. メンバ A で日記 d を書く
  6. 日記 d に対して メンバ C がコメント x を書く
  7. メンバ C が退会する(SNS メンバ数 2)
  8. 3.6.3 へアップグレード
  9. 日記 d を閲覧する -> コメント x のメンバが非表示であることを確認する
  10. メンバ D を追加(SNS メンバ数 3)
  11. 日記 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)

#11 Yuya Watanabeほぼ12年前に更新

note-10 の問題は別チケット( #3074 )を作成しました.
本チケットの修正はレビューOKとして,下記コミットで stable-3.6.x にマージを行いました.

8a1e9df39dd0bcce522136147bcb660d0eea9eff

#12 Yuya Watanabeほぼ12年前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

#13 Yuma Sakataほぼ12年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

#14 kaoru n8年以上前に更新

  • 3.8 で発生するかUnknown (未調査) にセット

他の形式にエクスポート: Atom PDF