TL; DR: tgt-admin --show
добавлял не-ASCII-символы в свой вывод, что приводило к тому, что анализатор вывода в Cinder приводил к barf.Патч к коду пропускает строки с символами, отличными от ASCII (см. Ниже).
Поиск в файлах журнала обнаружил этот отчет:
2018-10-10 17:57:17.067 6970 ERROR cinder.service [req-a950a5bb-4f24-42dd-8ffc-4b2dd9153659 None None] Unhandled exception
2018-10-10 17:57:17.067 6970 TRACE cinder.service Traceback (most recent call last):
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 228, in _start_child
2018-10-10 17:57:17.067 6970 TRACE cinder.service self._child_process(wrap.server)
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 205, in _child_process
2018-10-10 17:57:17.067 6970 TRACE cinder.service launcher.run_server(server)
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 96, in run_server
2018-10-10 17:57:17.067 6970 TRACE cinder.service server.start()
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/service.py", line 385, in start
2018-10-10 17:57:17.067 6970 TRACE cinder.service self.manager.init_host()
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/volume/manager.py", line 209, in init_host
2018-10-10 17:57:17.067 6970 TRACE cinder.service self.driver.ensure_export(ctxt, volume)
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/volume/drivers/lvm.py", line 525, in ensure_export
2018-10-10 17:57:17.067 6970 TRACE cinder.service old_name=old_name)
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/volume/drivers/lvm.py", line 444, in _create_tgtadm_target
2018-10-10 17:57:17.067 6970 TRACE cinder.service old_name=old_name)
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/brick/iscsi/iscsi.py", line 231, in create_iscsi_target
2018-10-10 17:57:17.067 6970 TRACE cinder.service if not self._verify_backing_lun(iqn, tid):
2018-10-10 17:57:17.067 6970 TRACE cinder.service File "/usr/lib/python2.7/dist-packages/cinder/brick/iscsi/iscsi.py", line 114, in _verify_backing_lun
2018-10-10 17:57:17.067 6970 TRACE cinder.service if iqn in line and "Target %s" % tid in line:
2018-10-10 17:57:17.067 6970 TRACE cinder.service UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 0: ordinal not in range(128)
2018-10-10 17:57:17.067 6970 TRACE cinder.service
2018-10-10 17:57:17.088 6965 INFO cinder.service [-] Child 6970 exited with status 2
2018-10-10 17:57:17.088 6965 INFO cinder.service [-] _wait_child 1
2018-10-10 17:57:17.089 6965 INFO cinder.service [-] wait wrap.failed True
Обратите внимание на ошибку: UnicodeDecodeError: 'ascii' codec can't decode byte 0xf1 in position 0
.
Код сообщения об ошибке выглядит следующим образом:
for line in lines:
if iqn in line and "Target %s" % tid in line:
capture = True
if capture:
target_info.append(line)
if iqn not in line and 'Target ' in line:
capture = False
Глядя на трассировку стека и исходный код, я понял, что код пытается проанализировать вывод, сгенерированный tgt-admin --show
(см. метод TgtAdm._get_target
, который вызывается из create_iscsi_target
(около строки 220), который затем вызывает _verify_backing_lun
, где возникает ошибка).Это было проверено путем запуска команды вручную в less
и отмечением дополнительных символов в конце выходных данных.
Мой патч / исправление состоит в добавлении теста в анализатор вывода в виде try
блок, то есть:
for line in lines:
try:
line.decode('ascii')
except UnicodeDecodeError:
continue # @@@@ skip lines with non-ASCII characters
if iqn in line and "Target %s" % tid in line:
capture = True
if capture:
target_info.append(line)
if iqn not in line and 'Target ' in line:
capture = False
Это не идеально, но оно выбило меня из дыры, в которой я находился.