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

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

sendmailはresolveを記憶しているのか

サーバの参照先DNSを変更する為、「/etc/resolve.conf」を修正したネットワークを再起動した後から、メールが配送出来なくなった。

ログを見ると、名前解決がタイムアウトしてるっぽい。

調べると、sendmailはresolveを覚えているみたいなので、「/etc/resolve.conf」を変更した後にsendmailも再起動する必要があるらしい。

何年か前に同じエラーがあった気がするが、今度こそ忘れないようにメモ。

OpenVPNのTAPアダプタ

利用者がPCを買い替えたのでOpenVPNの再設定を行ったが、いざ使おうとするとエラーが出て接続できないと連絡があった。

クライアントのログを見ると、末尾に以下のエラーメッセージが。
All TAP-Win32 adapters on this system are currently in use.

ググって、OpenVPNクライアントで複数のコネクションを確立するのページを発見。

“複数”のOpenVPN、、、環境が違うが、たぶんOpenVPN GUIのインストール時に、TAPアダプタのインストールをし忘れたんだろう。

記載の通り、クライアント側で
C:\Program Files\OpenVPN\bin\addtap.batを実行し、TAPアダプタの新規作成を行うと、見事VPNに接続が出来た。

20111027.jpgのサムネール画像

Can’t create/write to file ‘/tmp/xxxxxx’

作業していたら、突然MySQLが落ちた。

mysqldの再起動を行っても、以下のようなエラーが/var/lib/mysql/hoge.errに記録されるだけで起動できない。

111026 11:38:54 mysqld_safe mysqld from pid file /var/lib/mysql/hoge.pid ended
111026 11:38:54 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
111026 11:38:54 [Note] Plugin ‘FEDERATED’ is disabled.
111026 11:38:54 InnoDB: The InnoDB memory heap is disabled
111026 11:38:54 InnoDB: Mutexes and rw_locks use GCC atomic builtins
111026 11:38:54 InnoDB: Compressed tables use zlib 1.2.3
111026 11:38:54 InnoDB: Using Linux native AIOG /usr/sbin/mysqld: Can’t create/write to file ‘/tmp/ib96HR1Q’ (Errcode: 28)
111026 11:38:54  InnoDB: Error: unable to create temporary file; errno: 28
111026 11:38:54 [ERROR] Plugin ‘InnoDB’ init function returned error.
111026 11:38:54 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
111026 11:38:54 [ERROR] Unknown/unsupported storage engine: InnoDB
111026 11:38:54 [ERROR] Aborting

111026 11:38:54 [Note] /usr/sbin/mysqld: Shutdown complete

111026 11:38:54 mysqld_safe mysqld from pid file /var/lib/mysql/hoge.pid ended

どうやらテンポラリディレクトリに指定している/tmp内にファイルが書き込めないらしい。

/tmpのパーミッションを777にして、mysqldの再起動。

ん~、変化なし。

色々調べたが、直前の作業の時に出来たゴミを捨ててなかったのが原因で、/tmpがある/の容量が100%を指していた為だった。

Apache Killerの対策

8/24に会社から連絡があり、取り急ぎ対策が必要なApacheには、アドバイザリ通りの記述行い対策しました。
おかげでエヴァ波の地上波の前半を見逃した・・・orz

# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (?:,.*?){5,5} bad-range=1
RequestHeader unset Range env=bad-range

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3. RequestHeader unset Request-Range

あと、仕事上付き合いがある徳丸氏のブログにも本件について書かれており、MaxClientsのチューニングが重要だと。

ウチもApache2.2を使っているが、MaxClientsのデフォルト値は150だった。
Apache Killerの対策をしないと、MaxClients150×24MBで、3600MB(約3.5GB)のメモリをApacheだけで食う事になる。

契約しているVPSはメモリ1GBコースだから、無理www

つーことで、httpd-mpm.confのMaxClients数を25に落とす。
こんな寂れたブログを見に来る人もいないだろうからw

–2011.8.31 追記–
8/30に2.2.20がリリースされました。
http://archive.apache.org/dist/httpd/httpd-2.2.20.tar.bz2

apache2.0系はまだ未リリースみたい。
暫定対策が済んでいないapacheがあれば、至急アップデートを行いましょう。

mailmanの入れ直し

VPSに引っ越しした時に放置していたメーリングリストサーバ「Mailman」を入れ直した。

会社のメーリングリストサーバでもMailmanを使っていますが、構成が少し違っただけでハマったのでメモ。
(ほとんどsatospoを参照w)

ちなみに会社の構成は楽して作ったので全てRPMで導入、設置してるから気づかなかったw

VPSではApacheをソースインストールしてるが、Mailmanをインストールしたらsetguiがnobody(ApacheをRPMでインストールした時のユーザー)を指定しないと動かなかったから、しょうがなくMailmanをソースからインストール(2011.8.21時点での最新は2.1.14+j6)

Mailmanはpythonプログラムだが、2.1.14以降でpython2.5以上でしか動かなくなったっぽいので、さらにpythonをソースからインストール。