[Расследование] VCD Error: No row with the given identifier exists

Вернувшись на рабочее место после выходных, я получил от одного из крупных клиентов заявку о том, что у него перестали включаться некоторые ВМ, таска падает с ошибкой вида:

[ 2c728624-3b93-463e-8f99-cf5386f089bf ] Internal Server Error - No row with the given identifier exists: [com.vmware.vcloud.common.model.net.LogicalNetworkModel#40bbadee-76dc-4760-bac8-0293a79a595f]

Никаких внятных сообщений в логах VCD (vcloud-container-debug.log) я не обнаружил. Там конечно присутвовали простыни Java логов об ошибке но понять причину было нельзя, отсылка была лишь к NetworkServiceImpl, а значит искать надо было что-то связанное с сетями.

Сначала я попробовал выяснить что же происходило ПЕРЕД тем как начала воспроизводиться проблема (т.к. новые ВМ у клиента создаются регулярно это не составило особого труда) — я не обнаружил сначала ничего криминального, однако отметил что не задолго до появления первой ошибки включения ВМ была создана сеть Client195726_Network3056.

Я не придал этому особого значения, лишь посмотрел в раздел Networks Org vDC и обнаружив что там такой сети уже нет, продолжил искать источник проблемы.

Также я попробовал создать в этом vDC новую isolated сеть и получил ту же самую ошибку при нажатии на кнопку Finish визарда создания сети.

В конечном итоге я предположил что при создании сети или включении ВМ производится некий запрос к БД, в процессе которого возвращаются данные, которые приводят к появлению этой ошибки.

Чтобы отловить запрос я запустил визард создания новой изолированной сети в этом Org vDC заполнив только необходимые для создания сети параметры (name = test, gateway cidr = 192.168.1.1/24), после чего на Primary Cell моей моего инстанса VCD я открыл cli vpostgres из под пользователя postgres и подключился к БД vcloud:

su - postgres
psql
\c vcloud

Для того чтобы включить логирование запросов в файл логов я выполнил следующую команду:

ALTER SYSTEM set log_statement = 'all';

После чего открыл лог файл с текущей датой создания в папке /var/vmware/vpostgres/current/pgdata/log/ и нажал Finish в визарде создания сети.

После изучения запросов в лог-файле я обнаружил следующий запрос который происходит во время выполнения визарда

2022-03-21 11:51:48.042 UTC [8294] LOG:  execute <unnamed>: /* Method: unknown */ /* criteria query */ select this_.id as y0_ from tenant_network_logical_resource this_ where this_.vdc_id=$1 and this_.name=$2
2022-03-21 11:51:48.042 UTC [8294] DETAIL:  parameters: $1 = '56d0ab0d-dae9-41fa-b1f2-92aefe4b8686', $2 = 'test'

Параметры запроса однозначно указывают на нашего «пациента» — uuid Org vDC и имя сети. Запрос выполняется для таблицы tenant_network_logical_resource.

Не забываем отключать логирование запросов, чтобы наши логи не раздувались:

ALTER SYSTEM set log_statement = 'none';

Сделав выборку по этой таблице для моего Org VDC я получил список сетей этой Org vDC в которой ключевое было это количество строк:

select * from tenant_network_logical_resource where vdc_id = '56d0ab0d-dae9-41fa-b1f2-92aefe4b8686';
...
(65 rows)

В то время как UI VCD убеждал меня что в данном Org vDC всего 64 сети.

Путем обычного визуального сравнения (писать хитрые запросы уже было некогда) я прошелся по списку имен из UI и этой таблицы и обнаружил искомую сеть с именем Client195726_Network3056, задачу на создание которой я находил ранее, но обнаружить задачу об удалении этой сети не смог. Тем не менее она не отображалась в UI, но существовала в таблице tenant_network_logical_resource.

Внимание!

Дальнейшие действия должны выполняться только сотрудником GSS VMware или под их непосредственным руководством. Если Вы сделали их самостоятельно, вы сделали это на свой страх и риск. Автор этого блога не несет никакой ответственности за Ваши действия.

Перед дальнейшими действиями я создал резервную копию БД

/opt/vmware/appliance/bin/create-backup.sh

Далее, я попробовал удалить запись о злосчастной сети из этой таблицы, однако получил ошибку о том что с данной записью связана запись из таблицы shared_org_vdc_network

delete from tenant_network_logical_resource where name = 'Client195726_Network3056';
ERROR:  update or delete on table "tenant_network_logical_resource" violates foreign key constraint "fk_sha_org_vd_ne2ten_net_lo_re" on table "shared_org_vdc_network"
DETAIL:  Key (id)=(f24ad9c8-5b35-4293-bee3-63a357d7a593) is still referenced from table "shared_org_vdc_network".

Чтобы корректно удалить запись из подчиненной таблицы я получил id сети из таблицы tenant_network_logical_resource :

select id from tenant_network_logical_resource where name = 'Client195726_Network3056';
                  id                  
--------------------------------------
 f24ad9c8-5b35-4293-bee3-63a357d7a593 

Убедился что связанная запись в наличии:

select * from shared_org_vdc_network where lr_id = 'f24ad9c8-5b35-4293-bee3-63a357d7a593';
                  id                  |                lr_id                 |                org_id                
--------------------------------------+--------------------------------------+--------------------------------------
 30d4db07-87db-4afa-89a9-e193474715b4 | f24ad9c8-5b35-4293-bee3-63a357d7a593 | cbb2a6eb-09f5-412c-bcfa-6e0cec7cbfae

Удалил эту запись:

delete from shared_org_vdc_network where lr_id = 'f24ad9c8-5b35-4293-bee3-63a357d7a593';
DELETE 1

И удалил запись сети:

delete from tenant_network_logical_resource where name = 'Client195726_Network3056';
DELETE 1

Собственно на этом все. Проблемы с запуском ВМ и созданием новых сетей в этом Org vDC более не воспроизводятся.

Добавить комментарий

Ваш адрес электронной почты не будет опубликован.