Scope media retry responses to active block attempts
This commit is contained in:
1 parent
16333b989d
commit
b1a3d0c6cd
2 files changed
+25
-8
No files matched your search
@@ -387,7 +387,8 @@ static void test_overloaded_next_holder(void) {
|
||||
ov.subcmd = MEDIA_SUBCMD_BLOCK_OVERLOADED;
|
||||
memcpy(ov.media_id, dl->media_id, 16); memcpy(ov.block_id, dl->blocks[0].block_id, 16);
|
||||
ov.retry_after_ms = 2000;
|
||||
media_download_handle_overloaded(inst, (const uint8_t*)&ov, sizeof(ov));
|
||||
memcpy(ov.transfer_id, dl->blocks[0].transfer_id, 16);
|
||||
media_download_handle_overloaded(inst, dl->group_id, 0x1111, (const uint8_t*)&ov, sizeof(ov));
|
||||
|
||||
int ok = dl->blocks[0].attempts == 0 && dl->blocks[0].holder_idx == 1 && dl->blocks[0].state == MD_BLK_REQ;
|
||||
if (ok) OK(); else FAIL("attempts=%d hidx=%d state=%d", dl->blocks[0].attempts, dl->blocks[0].holder_idx, dl->blocks[0].state);
|
||||
@@ -413,7 +414,8 @@ static void test_overloaded_wait(void) {
|
||||
struct media_pkt_block_overloaded ov; memset(&ov, 0, sizeof(ov));
|
||||
ov.subcmd = MEDIA_SUBCMD_BLOCK_OVERLOADED;
|
||||
memcpy(ov.media_id, dl->media_id, 16); memcpy(ov.block_id, dl->blocks[0].block_id, 16);
|
||||
media_download_handle_overloaded(inst, (const uint8_t*)&ov, sizeof(ov));
|
||||
memcpy(ov.transfer_id, dl->blocks[0].transfer_id, 16);
|
||||
media_download_handle_overloaded(inst, dl->group_id, 0x1111, (const uint8_t*)&ov, sizeof(ov));
|
||||
|
||||
int ok = dl->blocks[0].state == MD_BLK_WAIT && dl->blocks[0].attempts == 0;
|
||||
if (ok) OK(); else FAIL("state=%d attempts=%d", dl->blocks[0].state, dl->blocks[0].attempts);
|
||||
@@ -436,10 +438,15 @@ static void test_relay_full(void) {
|
||||
dl->blocks[0].state = MD_BLK_RECV;
|
||||
dl->inflight = 1;
|
||||
|
||||
uint64_t nodes[2] = { 0x3333, 0x4444 };
|
||||
media_download_handle_relay_full(inst, dl->media_id, dl->blocks[0].block_id, 0, nodes, 2);
|
||||
uint8_t packet[MEDIA_RELAY_FULL_HDR_SIZE + 2 * sizeof(uint64_t)] = {0};
|
||||
struct media_pkt_block_relay_full* full = (struct media_pkt_block_relay_full*)packet;
|
||||
full->subcmd = MEDIA_SUBCMD_BLOCK_RELAY_FULL; full->num_relay_nodes = 2;
|
||||
memcpy(full->media_id, dl->media_id, 16); memcpy(full->block_id, dl->blocks[0].block_id, 16);
|
||||
memcpy(full->transfer_id, dl->blocks[0].transfer_id, 16);
|
||||
uint64_t nodes[2] = {0x3333, 0x4444}; memcpy(packet + sizeof(*full), nodes, sizeof(nodes));
|
||||
media_download_handle_relay_full(inst, dl->group_id, 0x1111, packet, sizeof(packet));
|
||||
|
||||
int ok = dl->blocks[0].num_holders == 3 && dl->blocks[0].state == MD_BLK_REQ;
|
||||
int ok = dl->blocks[0].num_holders == 2 && dl->blocks[0].state == MD_BLK_REQ;
|
||||
if (ok) OK(); else FAIL("holders=%d state=%d", dl->blocks[0].num_holders, dl->blocks[0].state);
|
||||
|
||||
free_test_dl(inst, dl);
|
||||
@@ -566,7 +573,8 @@ static void test_overloaded_deadline(void) {
|
||||
add_holder(dl, 0, 0x1111); dl->blocks[0].holder_idx = 0; dl->blocks[0].state = MD_BLK_REQ; dl->inflight = 1;
|
||||
struct media_pkt_block_overloaded ov = {.subcmd = MEDIA_SUBCMD_BLOCK_OVERLOADED, .retry_after_ms = 1000};
|
||||
memcpy(ov.media_id, dl->media_id, 16); memcpy(ov.block_id, dl->blocks[0].block_id, 16);
|
||||
media_download_handle_overloaded(inst, (const uint8_t*)&ov, sizeof(ov));
|
||||
memcpy(ov.transfer_id, dl->blocks[0].transfer_id, 16);
|
||||
media_download_handle_overloaded(inst, dl->group_id, 0x1111, (const uint8_t*)&ov, sizeof(ov));
|
||||
int rc = md_dl_check_stall(dl, get_time_tb());
|
||||
int ok = !rc && dl->blocks[0].state == MD_BLK_WAIT && dl->blocks[0].wait_reason == MD_WAIT_RETRY
|
||||
&& dl->blocks[0].retry_at_tb > get_time_tb() && !dl->blocks[0].attempts && !dl->inflight;
|
||||
|
||||
@@ -258,14 +258,23 @@ static void pending_deletion(void) {
|
||||
/* Отказ/синхронное завершение/дубликат имеют разные правила владения аргументом. */
|
||||
uint8_t signatures[128] = {0}; struct media_index_result download = result; download.block_sigs = signatures;
|
||||
int completed = 0;
|
||||
assert(!media_download_start(inst, 0, &download, destinations[0], root, 0, download_done, &completed, NULL, NULL));
|
||||
assert(media_download_start(inst, 0, &download, destinations[0], root, 0, download_done, &completed, NULL, NULL) == -1);
|
||||
assert(!completed); /* Отсутствующий ключ автора — отказ до принятия владения callback. */
|
||||
assert(!media_download_start(inst, 0, &download, destinations[0], root, inst->node_id,
|
||||
download_done, &completed, NULL, NULL));
|
||||
assert(completed == 1); /* Нет суперузлов: completion уже вызван, dl освобождён. */
|
||||
assert(!media_index_delete_channel(db, "0", root));
|
||||
completed = 0;
|
||||
sqlite3_stmt* author = NULL;
|
||||
assert(!sqlite3_prepare_v2(db, "INSERT INTO nodes(node_id,ed25519_pubkey) VALUES(?,?)", -1, &author, NULL));
|
||||
assert(!sqlite3_bind_int64(author, 1, (sqlite3_int64)(inst->node_id ^ 0x55)));
|
||||
assert(!sqlite3_bind_blob(author, 2, inst->my_ed25519_pubkey, 32, SQLITE_STATIC));
|
||||
assert(sqlite3_step(author) == SQLITE_DONE && !sqlite3_finalize(author));
|
||||
assert(!media_download_start(inst, 0, &download, destinations[0], root, inst->node_id ^ 0x55,
|
||||
download_done, &completed, NULL, NULL));
|
||||
assert(!completed);
|
||||
assert(media_download_start(inst, 0, &download, destinations[0], root, 0, download_done, &completed, NULL, NULL) == -1);
|
||||
assert(media_download_start(inst, 0, &download, destinations[0], root, inst->node_id ^ 0x55,
|
||||
download_done, &completed, NULL, NULL) == -1);
|
||||
assert(!completed && !media_download_cancel(inst, download.media_id, NULL, 0) && completed == 1);
|
||||
assert(!media_index_delete_channel(db, "0", root));
|
||||
utun_instance_destroy(inst); uasync_destroy(ua, 0);
|
||||
|
||||
Reference in new issue
Block a user