From 278d46b9850900742e9cb91aff95eafba8134d1d Mon Sep 17 00:00:00 2001 From: evgeny Date: Wed, 4 Nov 2026 00:32:08 +0100 Subject: [PATCH] Keep file and media roles independent of in-progress member sync --- src/media_delivery/media_delivery.c | 6 +++--- src/media_delivery/media_download.c | 2 +- src/member_files/member_files.c | 5 +++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/media_delivery/media_delivery.c b/src/media_delivery/media_delivery.c index d54502c21..9729bf15f 100644 --- a/src/media_delivery/media_delivery.c +++ b/src/media_delivery/media_delivery.c @@ -1117,7 +1117,7 @@ static int md_group_role(struct media_delivery_ctx* md, uint64_t group_id, uint6 if (!g || g->group_type != TOPO_GROUP_TYPE_CHAT || g->stopping || !g->channel_id[0]) return 0; char sql[256]; sqlite3_snprintf(sizeof(sql), sql, - "SELECT adm_tags FROM \"peers_%w\" WHERE node_id=? AND source=0 AND deleted=0 AND admitted=1", g->channel_id); + "SELECT adm_tags FROM \"peers_%w\" WHERE node_id=? AND record_state=0 AND source=0 AND deleted=0 AND admitted=1", g->channel_id); sqlite3_stmt* st = NULL; int rc = sqlite3_prepare_v2(md->db, sql, -1, &st, NULL); if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 1, (sqlite3_int64)node_id); @@ -1209,7 +1209,7 @@ void media_delivery_refresh_roles(struct UTUN_INSTANCE* inst) { md_seed_local(md, group->group_id); char sql[256]; sqlite3_snprintf(sizeof(sql), sql, - "SELECT node_id,adm_tags FROM \"peers_%w\" WHERE node_id!=? AND source=0 AND deleted=0 AND admitted=1", group->channel_id); + "SELECT node_id,adm_tags FROM \"peers_%w\" WHERE node_id!=? AND record_state=0 AND source=0 AND deleted=0 AND admitted=1", group->channel_id); sqlite3_stmt* st = NULL; int rc = sqlite3_prepare_v2(md->db, sql, -1, &st, NULL); if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 1, (sqlite3_int64)md->self_node_id); @@ -1569,7 +1569,7 @@ static int md_collect_supernodes(struct UTUN_INSTANCE* inst, uint64_t group_id, struct TOPO_GROUP* g = inst->topo_groups ? topo_groups_find(inst->topo_groups, group_id) : NULL; if (!g || g->group_type != TOPO_GROUP_TYPE_CHAT || !g->channel_id[0]) return 0; char sql[256]; - sqlite3_snprintf(sizeof(sql), sql, "SELECT node_id,adm_tags FROM \"peers_%w\" WHERE node_id!=? AND admitted=1", g->channel_id); + sqlite3_snprintf(sizeof(sql), sql, "SELECT node_id,adm_tags FROM \"peers_%w\" WHERE node_id!=? AND record_state=0 AND admitted=1", g->channel_id); sqlite3_stmt* st = NULL; int rc = sqlite3_prepare_v2(inst->md.db, sql, -1, &st, NULL); if (rc == SQLITE_OK) rc = sqlite3_bind_int64(st, 1, (sqlite3_int64)inst->node_id); diff --git a/src/media_delivery/media_download.c b/src/media_delivery/media_download.c index 9beb6c56c..03e642634 100644 --- a/src/media_delivery/media_download.c +++ b/src/media_delivery/media_download.c @@ -405,7 +405,7 @@ static void md_dl_collect_supernodes(struct UTUN_INSTANCE* inst, struct media_do struct TOPO_GROUP* g = inst->topo_groups ? topo_groups_find(inst->topo_groups, dl->group_id) : NULL; if (g && g->group_type == TOPO_GROUP_TYPE_CHAT && g->channel_id[0] && inst->topo_sqlite_db) { char sql[256]; - snprintf(sql, sizeof(sql), "SELECT node_id FROM peers_%s WHERE node_type=4 ORDER BY node_id", g->channel_id); + snprintf(sql, sizeof(sql), "SELECT node_id FROM peers_%s WHERE record_state=0 AND node_type=4 ORDER BY node_id", g->channel_id); sqlite3_stmt* st = NULL; int rc = sqlite3_prepare_v2(inst->topo_sqlite_db, sql, -1, &st, NULL); if (rc == SQLITE_OK) { diff --git a/src/member_files/member_files.c b/src/member_files/member_files.c index d5fe5f851..f8d0904c3 100644 --- a/src/member_files/member_files.c +++ b/src/member_files/member_files.c @@ -110,7 +110,7 @@ int member_files_member(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t nod (unsigned long long)group, (unsigned long long)node, storage); return 0; } char sql[256]; - snprintf(sql, sizeof(sql), "SELECT adm_tags,source,adm_tags_sig,deleted FROM \"peers_%llu\" WHERE node_id=? AND admitted=1", + snprintf(sql, sizeof(sql), "SELECT adm_tags,source,adm_tags_sig,deleted FROM \"peers_%llu\" WHERE node_id=? AND record_state=0 AND admitted=1", (unsigned long long)group); sqlite3_stmt* st = NULL; if (sqlite3_prepare_v2(inst->topo_sqlite_db, sql, -1, &st, NULL) != SQLITE_OK) { @@ -364,7 +364,8 @@ static void mf_roots(struct mf_job* j) { *r = j->request; r->kind = MF_RESPONSE; r->type = MF_DIRECTORY; r->data_len = 0; r->more = 0; if (*r->path || r->command != MF_LIST) { r->status = MF_INVALID_PATH; return; } char sql[256]; - snprintf(sql, sizeof(sql), "SELECT node_id,join_ts,update_ts,adm_tags FROM \"peers_%llu\" WHERE deleted=0 AND source=0 AND admitted=1 ORDER BY node_id", + snprintf(sql, sizeof(sql), "SELECT node_id,join_ts,update_ts,adm_tags FROM \"peers_%llu\"" + " WHERE record_state=0 AND deleted=0 AND source=0 AND admitted=1 ORDER BY node_id", (unsigned long long)j->group); sqlite3_stmt* st = NULL; EVP_MD_CTX* hash = EVP_MD_CTX_new(); if (!hash || EVP_DigestInit_ex(hash, EVP_sha256(), NULL) != 1 ||