QA #725
未完了親子チケットの階層崩れを修正したい
説明
■現象/要望¶
親子階層が複雑なチケットを更新すると、チケットの親子階層表示が異常になる場合がある。
(親チケット以外の子チケットとして表示される。)
現象発生時、issueテーブル上のlft,rgt項目が異常になっていた。
parent_idの値は、編集前の正しい親チケットIDが設定されていた。
修復手順を確認したい。
■解決策¶
Rails Console上から、チケット階層構造を修正する下記メソッドを実行することで修復できる。
但し、データ修復対応であり、現象発生を防止するものではない。
下記、rebuild_treeでチケット全部の階層構造を修復するが、件数が多い場合は時間が掛かる。
rebuild_single_treeで親チケットを指定すれば、短時間で修復可能。(Redmine3.4以降)
[root redmine]# pwd
/var/lib/redmine
[root redmine]# bundle exec rails console production
Loading production environment (Rails 4.2.8)
irb(main):001:0>
irb(main):002:0* Issue.rebuild_tree!
=> []
irb(main):004:0> Issue.rebuild_single_tree(1)!
ワンライナーの対応(Redmineのルートから実行とする)
RAILS_ENV=production rails runner 'Issue.rebuild_single_tree!(1)'
RAILS_ENV=production bundle exec ruby bin/rails runner 'Issue.rebuild_single_tree!(1)'
■対応状況¶
Rails Console上から、チケット階層構造を修正する下記メソッドを実行することで修復できる。
但し、データ修復対応であり、現象発生を防止するものではない。
■補足¶
関連情報
ProjectもIssueと同様に階層構造を持つため、同様な修復作業が必要になる場合がある。
Project.rebuild_tree! の様に実行する。
詳細不明だが、Redmine3.3以降で発生頻度が増加したかもしれない。(Redmine本体以外が関連する可能性含)
Rebuild a single nested set with nested_set plugin
http://www.redmine.org/issues/24167
issue parents is wrong
http://www.redmine.org/issues/27066
直近2年間のnested_set.rb変更内容
http://www.redmine.org/projects/redmine/repository/show/trunk/lib/redmine/nested_set
奈良 裕記 さんが6年以上前に更新
手元の環境(CentOS7/3.4.3/闇鍋)では、下記で実行できました。
[root redmine]# pwd
/var/lib/redmine
[root redmine]# bundle exec rails console production
Loading production environment (Rails 4.2.8)
irb(main):001:0>
irb(main):002:0* Issue.rebuild_tree!
=> []
irb(main):004:0> Issue.rebuild_single_tree(1)!
ワンライナーでも可能な筈ですが、手元の環境ではエラーになったので、取り急ぎ上記紹介します。
[root redmine]# ruby bin/rails runner 'Issue.rebuild_tree!' RAILS_ENV=production
/var/lib/redmine/vendor/bundle/ruby/2.4.0/gems/activerecord-4.2.8/lib/active_record/connection_adapters/connection_specification.rb:248:in `resolve_symbol_connection': 'development' database is not configured. Available: ["production"] (ActiveRecord::AdapterNotSpecified)
以下略
[root redmine]# grep -r rebuild_tree lib/*
lib/redmine/nested_set/issue_nested_set.rb: def rebuild_tree!
lib/redmine/nested_set/project_nested_set.rb: def rebuild_tree!
清水 朋子 さんが6年以上前に更新
奈良 裕記 さんは書きました:
下記理解で合ってますか?
チケットの親子階層表示がおかしくなる場合がある。
発生条件不明(同一原因の再発可能性有)なら、データ修復の暫定対応だと思いますが。
コマンドの操作方法を調べていただき、ありがとうございます!
上記のご理解で合ってます。
この事象はRedmineで親子チケットの関係を更新すると、時々発生します。
回避策はなく、事象が起きたらデータ修正以外に対策がありません。
こちらの環境では、バックログプラグインによる拡張機能として、マウスのドラッグ&ドロップでチケットの親子関係を更新してるため、発生頻度が上がっているのかもしれません。
教えていただいたコマンド操作でチケット単位でデータ修正できれば、他のユーザには影響無くRedmineを止めずにメンテナンスできるので、助かります!