Project

General

Profile

Bug(バグ) #2900

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

Added by Mutsumi Imamura almost 8 years ago. Updated over 4 years ago.

Status:
Fixed(完了)
Priority:
Normal(通常)
Assignee:
Target version:
Start date:
2012-03-26
Due date:
% Done:

100%

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

Description

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 (修正内容)

修正内容を記入


Related issues

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

Associated revisions

Revision 8a1e9df3 (diff)
Added by Hidenori Goto over 7 years ago

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

History

#1 Updated by Mutsumi Imamura almost 8 years ago

  • Description updated (diff)

#2 Updated by Mutsumi Imamura over 7 years ago

  • Target version set to v1.4.1

#3 Updated by Hidenori Goto over 7 years ago

例外発生箇所

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 Updated by Mutsumi Imamura over 7 years ago

  • Assignee set to Hidenori Goto

#5 Updated by Hidenori Goto over 7 years ago

  • Status changed from New(新規) to Accepted(着手)

#6 Updated by Hidenori Goto over 7 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

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

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

#7 Updated by Yuya Watanabe over 7 years ago

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

#8 Updated by Yuya Watanabe over 7 years ago

  • Project changed from opDiaryPlugin to OpenPNE 3
  • Target version deleted (v1.4.1)

#9 Updated by Yuya Watanabe over 7 years ago

  • Target version set to OpenPNE 3.6.4

#10 Updated by Yuya Watanabe over 7 years ago

このチケットの内容

再現方法

  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 Updated by Yuya Watanabe over 7 years ago

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

8a1e9df39dd0bcce522136147bcb660d0eea9eff

#12 Updated by Yuya Watanabe over 7 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

#13 Updated by Yuma Sakata over 7 years ago

  • Status changed from Pending Testing(テスト待ち) to Fixed(完了)
  • % Done changed from 70 to 100

テストOKです。

#14 Updated by kaoru n over 4 years ago

  • 3.8 で発生するか set to Unknown (未調査)

Also available in: Atom PDF