DRBD の failover と iSCSI Enterprise Target の起動タイミング

drbdadm primary コマンドを実行したあと、自分がちゃんと Primary になったのを確認してから iscsi-target を起動しよう、という話。

1ヶ月ほど前から DRBD + Keepalived + iSCSI target を VMware ESXi から使うメモ - 酒日記 はてな支店 で検証した構成を元に、実マシンで iSCSI target を作って ESXi から使用中。
# 15台ほどの VM を乗っけて試験運用

DRBD の failover を起こす際に、以下のようなスクリプトを実行しているのだけど

#!/bin/sh
# backup -> master になるときに実行
drbdadm primary all
service iscsi-target start
#!/bin/sh
# master -> backup になるときに実行
service iscsi-target stop
drbdadm secondary all

backup が master に昇格する際、"drbdadm primary all" から返ってきた直後に、実際に Primary じゃないのに iscsi-target を起動してしまうと

kernel: iscsi_trgt: open_path(119) Can't open /dev/drbd1 -30
kernel: iscsi_trgt: fileio_attach(283) -30
ietd: Can't create a logical unit 30 1 1 Path=/dev/drbd1,Type=fileio 

とエラーが起きるものの、ietd は起動してしまうので iSCSI のリクエストを処理しようとして固まると。

ちゃんと自分が Primary になったことを確認してから iscsi-target を起動する必要がある。

#!/bin/sh
while /bin/true; do
  drbdadm primary all
  PRIMARY=`cat /proc/drbd | egrep "st:Primary/"`
  if [ -z "$PRIMARY" ]; then
    echo "not primary"
    sleep 1
  else
    echo "primary"
    service iscsi-target start
    exit 
  fi
done

とここまで書いて、考えてみたら、最初のスクリプトは drbdadm primary が成功したかどうか考慮してないことに気がついた。もしかして単に失敗してたのか。