ydb-platform / nbs

Network Block Store
Apache License 2.0
50 stars 14 forks source link

[NBS] Клиент не может подключиться к сервису после рестарта хоста #1345

Open EvgeniyKozev opened 1 month ago

EvgeniyKozev commented 1 month ago

У клиента есть ssd-io диск. Он на него пишет и в этот момент хост, на котором находится NBS рестартует.

-- Reboot --
Jun 01 12:39:32 : Started Network Block Storage.

После ребура, клиент приходит с эвентом StopEndpoit

Jun 01 12:40:54 NBS_SERVER\[12712\]: 2024-06-01T12:40:54.956568Z :BLOCKSTORE_SERVER INFO: cloud/blockstore/libs/diagnostics/server_stats.cpp:317: \[c:4444\] StopEndpoint #6420659179433539271 REQUEST \{ Headers \{ ClientId: "4444" Timestamp: 1717245654832315 RequestId: 6420659179433539271 RequestTimeout: 60000 \} UnixSocketPath: "/var/lib/yc/compute-node/instances/4444/sandbox/nbs/endpoints/4444-2" \}

Мы отдаем S_FALSE

Jun 01 12:40:55 NBS_SERVER\[12712\]: 2024-06-01T12:40:55.005254Z :BLOCKSTORE_SERVER INFO: cloud/blockstore/libs/diagnostics/server_stats.cpp:545: \[c:4444\] StopEndpoint #6420659179433539271 RESPONSE request completed (execution: 48.682ms, postponed: 0, predicted: 0, backoff: 0, size: 0 B, unaligned: 0, error: S_FALSE endpoint "/var/lib/yc/compute-node/instances/4444/sandbox/nbs/endpoints/4444-2" hasn't been started yet)

При этом насколько я понимаю эндпойнт продолжает существовать.

Jun 01 12:40:55 yc-compute-node\[12127\]: \[nbs/endpoints.go:401\] E: \[i=4444\] \[o=4444\] stop_endpoint finished but endpoint socket still exists: "/var/lib/yc/compute-node/instances/4444/sandbox/nbs/endpoints/4444-2".

Клиент пытается слать KickEndpoint, но с другим идентификатором и получает ошибку

 E_INVALID_SESSION Error acquiring device "4444" with client "4444-1@4444" already acquired by another client: "4444-2@4444"cloud/storage/core/libs/common/error.h:268: . Will retry after 1m16s.

И так по кругу. Ошибка возникает потому, что DA не дает захватить девайсы т.к. он не ребутался.

qkrorlqr commented 4 weeks ago

Ошибка возникает потому, что DA не дает захватить девайсы т.к. он не ребутался.

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

DA не дает захватить девайсы - и правильно не дает, если старый эндпоинт существует