[Расследование] 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 более не воспроизводятся.