Voilà qu'un beau matin, une node d'un cluster Oracle RAC décide de se tuer. Voiçi l'analyse postmortem qui a permis de détecter un problème de désynchronisation d'horloge (TOD & tick). On commence par ici ...
# cd /var/core/`hostname`
# file *.0
unix.0: ELF 64-bit MSB executable SPARCV9 Version 1, UltraSPARC1 Extensions Required, statically linked, not stripped, no debugging information available
vmcore.0: SunOS 5.10 Generic_127127-11 64-bit SPARC crash dump from 'xxxxxx'
# mdb unix.0 vmcore.0
Loading modules: [ unix krtld genunix specfs dtrace ufs sd mpt px ssd fcp fctl md ip hook neti sctp arp usba zfs random ipc nfs sppp crypto cpc fcip logindmux ptm ]
>
> ::panicinfo
cpu 17
thread 30009bf86c0
message forced crash dump initiated at user request
tstate 4400001600
g1 b
g2 0
g3 11ca714
g4 6e0
g5 88000000
g6 0
g7 30009bf86c0
o0 1211a68
o1 2a100a9b9e8
o2 1
o3 0
o4 fffffffffffffff5
o5 1000
o6 2a100a9b0b1
o7 1068368
pc 104980c
npc 1049810
y 0
> 30009bf86c0::thread -p
ADDR PROC LWP CRED
0000030009bf86c0 600b7cb50b8 600bab9af30 6009a003d98
> 600b7cb50b8::ps -ft
S PID PPID PGID SID UID FLAGS ADDR NAME
R 29139 28993 1772 1772 0 0x4a004000 00000600b7cb50b8 /crs/10.2.0/bin/oprocd.bin run -t 1000 -m 500 -f
T 0x30009bf86c0 <TS_ONPROC>
> 600b7cb50b8::walk thread |::findstack
stack pointer for thread 30009bf86c0: 2a100a9b0b1
000002a100a9b161 kadmin+0x4a4()
000002a100a9b221 uadmin+0x11c()
000002a100a9b2e1 syscall_trap+0xac()
Le démon opcrod est à l'origine du suicide de la node (commande uadmin). Pour rappel le démon oprocd surveille le cluster RAC et réalise le fencing du cluster RAC (isolement primitif d'un noeud lors d'une défaillance de celui-ci). Lors de ce fencing, oprocd effectue des vérifications de fonctionnement, puis se fige. Si le réveil de l’oprocd n’a pas lieu avant une durée configurée, celui-ci procède au redémarrage du noeud du cluster.
Après une petite recherche, il s'agit d'un problème de TOD : bug suivant 6595936. L'ajout des deux paramètres suivants dans le fichier system a permis de corriger le problème définitivement.
# cat /etc/system
...
* Bug ID 6595936
set tod_broken = 1
set dosynctodr = 0
..