Il y a eu pas mal de problèmes documentés autour de la cohabitation ZFS/PowerPath, et j'en tiens un beau. Une LUN de ma connaissance est baladée occasionnellement entre plusieurs serveurs pour permettre des gros transferts de données avec un débit raisonnable. Pour des raisons de compatibilité entre les différents systèmes impliqués, j'ai créé un dataset ZFS sur une partition de cette LUN.

Le volume s'est promené entre différentes machines sans soucis, puis, un beau matin, au moment de la ramener sur un serveur, j'ai eu droit au tristement célèbre "insufficient replicas" :

monpool UNAVAIL insufficient replicas c5t5006000000000000d0s6 UNAVAIL cannot open

Pourtant, ce même volume fonctionnait à merveille sur le serveur voisin (qui certes n'utilisait pas PowerPath, mais tout de même)!

En regardant d'un peu plus près, il s'avère que le système n'arrive pas à lire tous les labels, ce qui en soit ne devrait pas poser de soucis, c'est pour ça qu'ils sont redondés, mais ça indique tout de même un problème de détection du device :

# zdb -l /dev/dsk/c5t5006000000000000d0s6 -------------------------------------------- LABEL 0 -------------------------------------------- version=10 name='monpool' state=1 [...] -------------------------------------------- LABEL 1 -------------------------------------------- version=10 name='monpool' state=1 [...] -------------------------------------------- LABEL 2 -------------------------------------------- failed to read label 2 -------------------------------------------- LABEL 3 -------------------------------------------- failed to read label 3

Là encore, l'autre serveur voit les 4 labels correctement. Plus amusant encore, si on se réfère au device PowerPath, là, les 4 labels sont corrects!

# zdb -l /dev/dsk/emcpower123g -------------------------------------------- LABEL 0 -------------------------------------------- version=10 name='monpool' state=1 [...] -------------------------------------------- LABEL 1 -------------------------------------------- version=10 name='monpool' state=1 [...] -------------------------------------------- LABEL 2 -------------------------------------------- version=10 name='monpool' state=1 [...] -------------------------------------------- LABEL 3 -------------------------------------------- version=10 name='monpool' state=1 [...]

Aha! Voilà une piste sérieuse. Il est donc probable que le zpool import scanne le répertoire /dev/dsk et s'arrête à la première occurrence de mon pool, trouvée en /dev/dsk/c5tXXX, et ignore donc celle trouvée en /dev/dsk/emcpowerXXX. Malheureusement, il n'y a pas de moyen direct de forcer l'import avec un device spécifique. J'ai envisagé un moment de créer un nouveau lien sur le /dev/dsk/emcpower123g dans un autre répertoire, pour utiliser l'option -d du zpool import, mais ce type de manipulation m'ayant déjà planté un serveur, je n'étais pas très motivé.

Au final, un message obscur trouvé au fin fond des forums OpenSolaris m'a donné une idée, qui s'est avérée payante : un simple trespass de la LUN sur le Clariion a résolu le problème!

Il y a donc visiblement au moins deux incompréhensions entre ZFS et la couche PowerPath:

  • d'une part, le fait que ZFS s'arrête aux devices cXtXdX en ignorant les emcpowerXXX (sans doute pour des raisons d'ordre alphabétique) est limitant
  • d'autre part, dans le cas d'un chemin multipathé par PowerPath, il peut y avoir un problème d'I/O si on attaque un device cXtXdX sous-jacent plutôt que l'autre, selon le SP actuellement possesseur de la LUN. C'est d'ailleurs d'autant plus étrange que chaque fibre est reliée au deux SP, mais passons.

A noter, le serveur est configuré en actif/passif classique sur le Clariion (mode 1), il serait intéressant de voir ce que ça donne en ALUA (mode 4), mais il faut au moins du PowerPath 5.1 pour ça, et ma version installée est trop ancienne, c'est donc un test que je ne ferai pas.