親子関係が崩れた時の対処

Redmineのチケットの親子関係が崩れて、親子の変更どころか更新すら出来なくなった時の対応のメモ。

mysql> select id,parent_id,root_id,lft,rgt from issues where id=2544;
+——+———–+———+——+——+
| id   | parent_id | root_id | lft  | rgt  |
+——+———–+———+——+——+
| 2544 |      2541 |    2520 |   36 |   36 |
+——+———–+———+——+——+
1 row in set (0.00 sec)

id=チケットのID
parent_id=直接親子関係になっているチケットのID
root_id=最上位の親チケットのID

lft,rgtはよくわからないけど、ググるとチケットのlft, rgt が、親チケットのlft, rgt の範囲内に入っていないとダメらしい。

なので、強制的に親子関係を解除する。

update issues set parent_id=null,root_id=2544,lft=1,rgt=2 where id=2544;

どんなタイミングで発生するかは分かんないけど、Redmine運用してて初めて発生した事象なので復旧手順をメモ。

Redmineの期日を強制する

「終了が無いタスクはねぇ!」と上司にお叱りを頂く事もあり、期日を登録する事を忘れてしまう自分の為にカスタマイズ。

Redmineのバージョンは1.3.3

参考にしたのはこちらのサイト様

①期日入力を必須
 app/models/issue.rbの「validates_presence_of」に「:due_date」を追加
    validates_presence_of :subject, :priority, :project, :tracker, :author, :status, :due_date

②期日のところに赤字の「*」を付ける
 app/views/issues/_attributes.html.erbの「due_date」のスタイルのとこに「:required => true」を追加
   <p><%= f.text_field :due_date, :required => true, :size => 10, :disabled => !@issue.leaf? %><%= calendar_for(‘issue_due_date’) if @issue.leaf? %></p>

passengerのRailsPoolIdleTime

Redmineの初回アクセス時とか、しばらく時間を明けた後の接続が非常に重い。

Aapcheのアクセスログに%Tを付けて「リクエストを扱うのに掛った時間(秒単位)」を取得すると、10秒も掛っている事が分かった。
Apache モジュール mod_log_config

調べたところ、RedmineをApacheで動かす為に使っているpassengerが、デフォルトで2分間、アクセスが無かったらRailsを止めているみたい。

つか、Redmineのページにも書いてあったの見落としていた・・・
Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用

このデフォルト値を変更する為、httpd.confに以下を追加してApacheを再起動する。
RailsPoolIdleTime 172800

※あまり時間を大きくするとリソースやら別の問題が出てきそうだから、とりあえず12時間に設定

あと、MySQLのスロークエリのログを取得する為、/etc/my.cnfに以下を追加
[mysqld]
long_query_time=2
log-slow-queries=/var/log/slow.log

ruby-garoon2icalをruby1.9で動かす

以前、ruby-garoon2icalを利用させて頂き、会社のサイボウズガルーンとgoogleカレンダー経由でiphoneのカレンダーに表示させていたが、ruby1.9.2にアップデートしてからプログラムがエラーを吐くようになった。

エラー箇所は「csv = CSV.parse(result3.body.toutf8)」の部分で、調べると改行コードがCR+LFだとエラーになるっぽい。

仕事のスケジュールが見えないと、何かとめんどくさいのでruby1.9で動くように改修。

たぶん上手い書き方があると思うけど、とりあえず動けば良いので、一旦改行コードがCR+LF形式のCSVを出力してから改行コードを置換すると言った幼稚な書き方をしています。

icalはちゃんと作成されたっぽいので、後はgoogleカレンダーの設定をやり直して待つだけ。

ちゃんと読み込むといいなぁ。

【追記】
cronで回したら以下のようなエラーが発生。
 /usr/local/lib/ruby/1.9.1/csv.rb:2027:in `=~': invalid byte sequence in US-ASCII (ArgumentError)
    from /usr/local/lib/ruby/1.9.1/csv.rb:2027:in `init_separators'
    from /usr/local/lib/ruby/1.9.1/csv.rb:1570:in `initialize'
    from /usr/local/lib/ruby/1.9.1/csv.rb:1335:in `new'
    from /usr/local/lib/ruby/1.9.1/csv.rb:1335:in `open'
    from /usr/local/apache2/htdocs/garoon2-sync/garoon2ical.rb:65:in `<main>'

ruby1.9から文字コードの取り扱いが厳格になった(ruby1.8を知らんが)らしいので、実行時に文字コードを指定する。

ruby -Ku garoon2ical.rb

【追記2】
同期したら文字化けしてた。
どうやらicsを直接見に行かせると、
charsetを送っていないらしい。
icsを吐くディレクトリに.htaccessを作成して

AddType “text/calendar; charset=utf-8” ics
を記載。

続きを読む ruby-garoon2icalをruby1.9で動かす