RHEL 6 に "self_fence=on" および "force_unmount=on" を設定した場合にノードが再起動せず、サブマウントにより fs リソースが失敗します
Environment
- Red Hat Enterprise Linux (RHEL) 6 (および High Availability アドオン)
/etc/cluster/cluster.conf
における 1 つまたは複数のファイルシステムベースのリソース (fs
、clusterfs
、netfs
など)
Issue
- アクティブなサブマウントによって
fs
リソースが停止しない場合は、self_fence
に失敗します (ノードが再起動しません)。 - "force_unmount" オプションが有効な場合は、"self_fence=on" ロジックが実行されません。
Resolution
回避方法: リソースで force_unmount
属性を無効にします。たとえば、次のようになります。
<fs name="myFS" fstype="ext4" device="/dev/test/lv1" mountpoint="/mnt/lv1" self_fence="on" force_unmount="off"/>
Root Cause
この問題は現在 Bugzilla #908457 でRed Hat Engineering によって追跡されています。
プロセスがそれをアクティブに使用している場合を除いて fs ベースのリソースが停止できない場合は、リソースのエージェントが "self fence" ロジックを飛ばす可能性があります。これにより、ノードが再起動するのではなく、サービスが failed 状態になります。なぜなら、リソースエージェントのファイルシステムライブラリーにある、fuser が 1 を返すとエラーを返すロジックによってセルフフェンスのチェックが実行されないためです。fuser が kill するプロセスを見つけられない時 (たとえばカーネルのサブシステムがそれを使用したり、サブマウントがそのファイルシステムを使用している場合) にこの状況が生じ、ファイルシステムをアンマウントできません。
Diagnostic Steps
ファイルシステム (/data) のリソースを "self_fence=on" および "force_unmount=on" オプション (/etc/cluster/cluster.conf ファイルの <fs>
タグ) で作成します。それから、ファイルシステムの一番上 (/data/mnt) に小さい ISO イメージをマウントします。このマウントにより、ファイルシステムのリソースが自身をアンマウントすることができず、理論的には "self_fence" オプションのトリガーとなります。
node2:/var/log/messages:
Jan 28 09:25:05 node2 rgmanager[40100]:I am node #2
Jan 28 09:25:05 node2 rgmanager[40100]:Resource Group Manager Starting
Jan 28 09:25:05 node2 rgmanager[40100]:Loading Service Data
Jan 28 09:25:07 node2 rgmanager[40100]:Initializing Services
Jan 28 09:25:07 node2 rgmanager[40892]:[fs] /dev/dm-21 is not mounted
Jan 28 09:25:07 node2 rgmanager[40100]:Services Initialized
Jan 28 09:25:07 node2 rgmanager[40100]:State change:Local UP
Jan 28 09:25:07 node2 rgmanager[40100]:State change: node1-priv UP
Jan 28 09:25:25 node2 rgmanager[41067]:[fs] mounting /dev/dm-21 on /data
Jan 28 09:25:25 node2 rgmanager[41087]:[fs] mount /dev/dm-21 /data
Jan 28 09:25:25 node2 rgmanager[40100]:Service service:fstest_node2 started
Jan 28 09:26:07 node2 corosync[39213]: [CKPT ] Checkpoint dlmplock.rgmanager (18):
Jan 28 09:26:09 node2 corosync[39213]: [CKPT ] Checkpoint dlmplock.rgmanager (18):
Jan 28 09:29:18 node2 rgmanager[40100]:Stopping service service:fstest_node2
Jan 28 09:29:18 node2 rgmanager[43405]:[fs] unmounting /data
Jan 28 09:29:19 node2 rgmanager[43446]:[fs] Sending SIGTERM to processes on /data
Jan 28 09:29:24 node2 rgmanager[43527]:[fs] unmounting /data
Jan 28 09:29:24 node2 rgmanager[43568]:[fs] Sending SIGKILL to processes on /data
Jan 28 09:29:24 node2 rgmanager[40100]: stop on fs "node2_data" returned 1 (generic error)
Jan 28 09:29:24 node2 rgmanager[40100]:#12:RG service:fstest_node2 failed to stop; intervention required
Jan 28 09:29:24 node2 rgmanager[40100]:Service service:fstest_node2 is failed
以下は、ハングアップしている "umount" プロセスを kill するために "fuser" を試行するコードおよび行番号です。
/usr/share/cluster/utils/fs-lib.sh:
...
844 # Force unmount: try #1: send SIGTERM
845 if [ $try -eq 1 ]; then
846 # Try fs-specific force-unmount, if provided
847 do_force_unmount
848 if [ $?-eq 0 ]; then
849 # if this succeeds, we should be done
850 continue
851 fi
852
853 ocf_log warning "Sending SIGTERM to processes on $mp"
854 fuser -TERM -kvm "$mp"
855 continue
856 else
857 ocf_log warning "Sending SIGKILL to processes on $mp"
858 fuser -kvm "$mp"
859
860 case $? in
861 0)
862 ;;
863 1)
864 return $OCF_ERR_GENERIC
865 ;;
866 2)
867 break
868 ;;
869 esac
870 fi
...
"self_fence" が有効 (かつ $umount_failed=yes) な場合、ノードは自分で再起動する必要があります。"force_unmount" が有効でアンマウントに失敗していると、このコードブロックは実行されません。
...
885 if [ -n "$umount_failed" ]; then
886 ocf_log err "'umount $mp' failed, error=$ret_val"
887
888 if [ "$self_fence" ]; then
889 ocf_log alert "umount failed - REBOOTING"
890 sync
891 reboot -fn
892 fi
893 return $OCF_ERR_GENERIC
894 fi
...
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments