Verify invite deadlines and transport loss with shared owners

This commit is contained in:
evgeny committed 2026-10-24 15:38:42 +02:00
1 parent 21d8b3844e
commit 5e8ff95c99
2 files changed
+17 -3

No files matched your search

+2 -2
View File
@@ -12,8 +12,8 @@
* Успех — транспортный UP; группа удерживает сессию до DOWN, обмен таблицами
* продолжается отдельно. На класс не более двух попыток, CONNECTING: 2 s.
* Автоповторы с backoff 1,2,4,8,16,30 s; проверка списка раз в 1 s, пока цель
* суперузлов не достигнута. Без UP всех суперузлов не переходим к desktop,
* пока каждый суперузел не проверен; mobile разрешён после проверки desktop
* суперузлов не достигнута. При отсутствии UP-суперузлов desktop разрешён
* только после проверки каждого суперузла; mobile разрешён после проверки desktop
* и лишь при отсутствии UP обоих старших классов. Уже поднятые резервы сохраняются.
* В standby новые автоматические попытки ждут burst; ручная стартует сразу.
* READY/recovery не изменяются.
+15 -1
View File
@@ -238,6 +238,20 @@ int main(void) {
REQUIRE(reply.calls == 1 && reply.event == TGI_EVENT_TIMEOUT && !a->group_invites);
fail_request_send = 0;
/* Реальный общий таймер завершает молчащий запрос, сохраняя чужое владение NCD. */
REQUIRE(begin_wait(a, gid, &node, &reply) == 0);
deadline = get_time_tb() + 30000;
while (!reply.calls && get_time_tb() < deadline) uasync_poll(ua, 20);
REQUIRE(reply.calls == 1 && reply.event == TGI_EVENT_TIMEOUT && !a->group_invites);
REQUIRE(node_conn_direct_get_conn(owner_handle) == conn && !conn->close_requested);
/* DOWN завершает запрос немедленно; повторное UP не вызывает второй callback. */
REQUIRE(begin_wait(a, gid, &node, &reply) == 0);
conn->links_up = 0; etcp_cbk_fire(conn, ETCP_CBK_EVENT_DOWN);
REQUIRE(reply.calls == 1 && reply.event == TGI_EVENT_TIMEOUT && !a->group_invites);
conn->links_up = 1; etcp_cbk_fire(conn, ETCP_CBK_EVENT_UP);
REQUIRE(reply.calls == 1 && node_conn_direct_get_conn(owner_handle) == conn && !conn->close_requested);
/* Ошибка записи проверенного описания обязана запрещать успешный callback. */
REQUIRE(sqlite3_exec(a->topo_sqlite_db, "CREATE TEMP TRIGGER invite_write_fail BEFORE INSERT ON channels "
"BEGIN SELECT RAISE(ABORT,'invite audit failure'); END", NULL, NULL, NULL) == SQLITE_OK);
@@ -251,7 +265,7 @@ int main(void) {
REQUIRE(!memcmp(x25519, expected_x, 32) && !memcmp(ed25519, expected_ed, 32));
REQUIRE(!topo_node_find_by_id(group_a, b->node_id));
REQUIRE(node_conn_direct_get_conn(owner_handle) == conn && !conn->close_requested);
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "test invite fault checks: %zu truncations, isolation, framing, signature, OOM, timer, send, SQL PASS",
DEBUG_INFO(DEBUG_CATEGORY_GENERAL, "test invite: %zu truncations, isolation, framing, signature, OOM, timer, DOWN, send, SQL PASS",
valid_size);
result = 0;
cleanup: