*[PC]HDL4-G HDLups.pmを修正してみた

以前にも書いたことだが自分はHDL4-G専用UPSとして
Cyber Power社のBR 350UPSを使用している。

APC社のUPSじゃないからなのかHDL4-G起動時にかなりの
確率でハングアップしてしまう症状で苦労していた。
http://d.hatena.ne.jp/nakapon/20090813
この件があったのでtelnetを無効化したのだがそれでも
やはりハングすることがあった。

HDL4-G 8TB化の際にファームをいじる必要があったこと、
ねこしんさんのおかげでHDL4-Gシステムのバックアップが
完全にできるようになったことを機にUPS関連の調査を
続けていた。

先日apcupsd.confをいじって2台のHDL4-Gで1台のUPSをシェア
することに成功したのでひょっとして上記の症状に変化が
あるかと期待したのだが・・・->ダメでした。orz


本腰入れてUPS制御の調査をすることに。
いろいろと試してわかったのがHDL4-Gのメール通知設定の
システム起動終了通知を有効にしているとかなりの確率で
ハングすること。

無効にしていれば問題なく使える。


このことからHDL4-G起動時に処理が追っつかなくなってるんじゃないかと推測。

最初はメール通知処理を追っかけていたのだがあちこちに
点在しているので方針を転換してups制御周りを調査。

HDLhotplugから呼ばれるiswarnサブルーチンにたどり着いた。
iswarnはget_accessサブルーチンをcallしてUPSステータスを取得。
UPS接続有無を判定している。


ここでデッドロックでも起こしてるんじゃないだろうか?
タイミングをとるようにsleepを追加。

なお修正に失敗したり間違ったりするとHDL4-Gが起動しないかも。
またアイオーデータの修理を受け付けてもらえないと思われます。



修正ファイルは/usr/local/bin/HDLups.pm
追加した場所はget_access内のapcupsdデーモン起動直後と
iswarn内のget_access再取得(20回のループ)処理。
様子見で5秒を指定。
これで解決すると良いんだけど。
#余談だがget_access内のreturn undefはreturnの方が良いんじゃなかろうか?



if ( !defined $lines || $lines eq "" || $? > 0 ) {
# 一時的に daemon を起動する
$stop = 1;
`sudo /etc/init.d/apcupsd start`;
$lines = `/sbin/apcaccess 2>/dev/null`;
sleep(5);
}



# "STATUS"が空ならリトライする
if ( $sts eq '' ) {
sleep(5);
next;
}<追記>
ダメでした。orz
現在/etc/init.d/rc.localを見直し中。

R8contdとusbhdmngが怪しいんだけどR8contdはハードコーディングなので
ちょっと面倒そう。