親子関係が崩れてチケットの更新もできない

Redmine で、あるチケットの子チケットで急に更新ができなくなりました。次のようなエラーがでます。

Parent task translation missing: ja, activerecord, errors, models, issue, attributes, parent_issue_id, not_a_valid_parent

エラーだか何だか良くわからないメッセージですが、これは翻訳ファイルにエントリがないため、エラーコードがそのまま出ているせいです。

親子関係がおかしいのかと思ってチケットの親を消そうとしてもエラーになってしまったり、親チケットに新たな子チケットを作成すると、既存の子チケットが新たなチケットの子供になってしまったり。

どうやら http://www.redmine.org/issues/6143 のバグに該当してしまったようです。

この状態から復旧するにはデータベースを直接いじらないといけませんでした。

該当のチケットの状態を確認します。

mysql> select id,parent_id,root_id,lft,rgt from issues where id=XXXXX;
(XXXXX はチケットID)

parent_id, root_id に直接の親チケットと最上位の親チケットのIDが入っていて、lft, rgt に謎の数字が入っているのが確認できます。
Redmine のプログラムを見るに、この lft, rgt が親チケットの lft, rgt の範囲内に入っていないとエラーになってしまうようです(vendor/plugins/awesome_nested_set/lib/awesome_nested_set.rb の move_possible?())。

これらの値の整合性が取れてないために操作できなかったのでした。

復旧するには次のようにして一旦親子関係を解除します。

mysql> update issues set parent_id=null,root_id=XXXXX,lft=1,rgt=2 where id=XXXXX;
(XXXXX はチケットID)

その後はちゃんと更新できるようになっているので、ブラウザから更新して親チケットを指定するとちゃんと子チケットとして整合性が取れた状態になりました。

ということで、もしまた発生してしまった時のためのメモでした。