etcp: reset_id эпоха ресета — фикс потери NODEINFO при флапе
Добавлен 64-битный reset_id (эпоха ресета) в INIT-фреймы и STCP-handshake: - генерится один раз при создании conn, меняется только при фатальном ресете (normalizer desync / bad fragment size); - при приёме чужого id slave принимает эпоху пира и ресетится, master держит свою; - первый id принимается без ресета (свежие при init); - «tcp peer clean» реинит гейтится по смене id — нет повторного сброса seq. Это устраняет коллизию seq=1 (RX dup) из-за двойного реинита нескольких TCP-линков, из-за которой NODEINFO пира терялся и member не возвращался online. Также: chat member online теперь из topo_group (без БД/merkle), тест test_etcp_seq_collision.
This commit is contained in:
1 parent
f7c08f8f5e
commit
61c572cae4
29 files changed
+663
-385
No files matched your search
@@ -82,7 +82,7 @@ static void onMemberListCallback(const uint8_t* data, int len) {
|
||||
}
|
||||
|
||||
static void onMemberUpdatedCallback(const uint8_t* data, int len) {
|
||||
if (len < 1 + 64 + 1 + 79) return;
|
||||
if (len < 1) return;
|
||||
uint8_t cl = data[0];
|
||||
if (len < 1 + (int)cl + 1 + 79) return;
|
||||
if (s_mainWindow)
|
||||
@@ -90,7 +90,7 @@ static void onMemberUpdatedCallback(const uint8_t* data, int len) {
|
||||
}
|
||||
|
||||
static void onMemberRemovedCallback(const uint8_t* data, int len) {
|
||||
if (len < 1 + 64 + 8) return;
|
||||
if (len < 1) return;
|
||||
uint8_t cl = data[0];
|
||||
if (len < 1 + (int)cl + 8) return;
|
||||
uint64_t nid; memcpy(&nid, data + 1 + cl, 8);
|
||||
|
||||
Reference in new issue
Block a user