Browse Source

Cover early BOUND in the delayed helper confirmation regression

master
evgeny 6 days ago
parent
commit
3b922ced78
  1. 2
      src/stream/stream_proto.h
  2. 10
      tests/test_stream_service.c

2
src/stream/stream_proto.h

@ -1,6 +1,6 @@
/* Части RS имеют непроверенный внешний заголовок; подписанная пачка находится внутри RS. /* Части RS имеют непроверенный внешний заголовок; подписанная пачка находится внутри RS.
* Данные ETCP-выдачи (handle/сессия/путь) добавляются снаружи и в подпись не входят. * Данные ETCP-выдачи (handle/сессия/путь) добавляются снаружи и в подпись не входят.
* seq/subblock берутся из заголовка RS; второго независимого номера блока нет. */ * seq/subblock берутся из заголовка RS; seq повторяется в подписанной пачке и сверяется после decode. */
#ifndef STREAM_PROTO_H #ifndef STREAM_PROTO_H
#define STREAM_PROTO_H #define STREAM_PROTO_H

10
tests/test_stream_service.c

@ -1096,9 +1096,11 @@ static void relay_test_status(struct ETCP_CONN *conn, struct ll_entry *entry) {
&& entry->dgram[ROUTER_SVC_PAYLOAD_OFF + 2] == STREAM_CMD_RELAY_STATUS) { && entry->dgram[ROUTER_SVC_PAYLOAD_OFF + 2] == STREAM_CMD_RELAY_STATUS) {
relay_statuses_seen++; relay_statuses_seen++;
size_t payload = ROUTER_SVC_PAYLOAD_OFF + STREAM_WIRE_HEADER; size_t payload = ROUTER_SVC_PAYLOAD_OFF + STREAM_WIRE_HEADER;
if (relay_race.hold_ready && entry->len > payload && entry->dgram[payload] == STREAM_RELAY_READY) { if (relay_race.hold_ready && entry->len > payload
&& (entry->dgram[payload] == STREAM_RELAY_READY || entry->dgram[payload] == STREAM_RELAY_BOUND)) {
relay_race.ready_held++; relay_race.ready_held++;
DEBUG_DEBUG(DEBUG_CATEGORY_STREAM, "bootstrap test holds READY ordinal=%u", relay_race.ready_held); DEBUG_DEBUG(DEBUG_CATEGORY_STREAM, "bootstrap test holds availability status=%u ordinal=%u",
entry->dgram[payload], relay_race.ready_held);
queue_dgram_free(entry); queue_entry_free(entry); return; queue_dgram_free(entry); queue_entry_free(entry); return;
} }
} }
@ -1206,7 +1208,7 @@ static void test_supernode_relay(void) {
CHECK(stream_subscribe_open(nodes[2], GROUP2, nodes[3]->node_id, &viewers[2]) == STREAM_OK); CHECK(stream_subscribe_open(nodes[2], GROUP2, nodes[3]->node_id, &viewers[2]) == STREAM_OK);
test_clock_run_for(ua, 500); stream_close(viewers[2]); viewers[2] = NULL; test_clock_run_for(ua, 500); stream_close(viewers[2]); viewers[2] = NULL;
test_clock_run_for(ua, 2000); CHECK(relay_requests_seen == requests_before); test_clock_run_for(ua, 2000); CHECK(relay_requests_seen == requests_before);
/* Merkle объявляет буфер помощника раньше STATUS READY: выбранная выдача должна удержать STARTING-запрос. */ /* Merkle объявляет буфер до STATUS READY/BOUND: выбранная выдача должна удержать STARTING-запрос. */
memset(&relay_race, 0, sizeof(relay_race)); relay_race.hold_ready = relay_race.watch_provider = 1; memset(&relay_race, 0, sizeof(relay_race)); relay_race.hold_ready = relay_race.watch_provider = 1;
relay_race.epoch = origin.descriptor.source_epoch; relay_race.epoch = origin.descriptor.source_epoch;
relay_drop_source = 1; relay_drop_source = 1;
@ -1222,7 +1224,7 @@ static void test_supernode_relay(void) {
CHECK(relay_race.provider_info_tb - relay_race.provider_tb < 2000); CHECK(relay_race.provider_info_tb - relay_race.provider_tb < 2000);
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] provider callback starts INFO without 1s roster wait: elapsed_ms=%llu", DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] provider callback starts INFO without 1s roster wait: elapsed_ms=%llu",
(unsigned long long)((relay_race.provider_info_tb - relay_race.provider_tb) / 10)); (unsigned long long)((relay_race.provider_info_tb - relay_race.provider_tb) / 10));
DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] helper INFO before delayed READY keeps selected pending issuance; no premature CANCEL"); DEBUG_INFO(DEBUG_CATEGORY_STREAM, "[PASS] helper INFO before delayed READY/BOUND keeps selected pending issuance; no premature CANCEL");
test_clock_run_for(ua, 2000); test_clock_run_for(ua, 2000);
struct stream_selection_info stable_before, stable_after; struct stream_selection_info stable_before, stable_after;
CHECK(stream_selection_get_info(viewers[2], &stable_before) == STREAM_OK); CHECK(stream_selection_get_info(viewers[2], &stable_before) == STREAM_OK);

Loading…
Cancel
Save