Browse Source

chat: пишем local_attrs атомарно при вставке своего медиа (гонка с MSG_RECEIVED)

proxy
evgeny 1 week ago
parent
commit
328d36376c
  1. 13
      src/chat/chat_msg.c

13
src/chat/chat_msg.c

@ -216,16 +216,19 @@ static void on_media_registered(void* arg, int err, const struct media_index_res
u_free(sig_msg); u_free(json); u_free(full_data); u_free(mctx); return;
}
int ret = db_sync_insert_signed(si, json, strlen(json), json_sig, 64, ts, NULL);
/* local_attrs готовим заранее и пишем атомарно при вставке — иначе GUI по
MSG_RECEIVED может прочитать сообщение раньше отдельного UPDATE (гонка),
и своё голосовое покажется «без медиа» (серый media bar + попытка скачать) */
const char* base = strrchr(mctx->media_dest, '/');
const char* filename = base ? base + 1 : mctx->media_dest;
char attrs[1100]; snprintf(attrs, sizeof(attrs), "{\"st\":\"fl\",\"fp\":\"%s\"}", filename);
int ret = db_sync_insert_signed(si, json, strlen(json), json_sig, 64, ts, attrs);
if (ret != 0) {
DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "%s: media insert failed ret=%d", CC_ID, ret);
} else {
DEBUG_INFO(DEBUG_CATEGORY_CHAT_SYNC, "%s: media message inserted ch=%s ts=%llu",
CC_ID, mctx->channel_id, (unsigned long long)ts);
const char* base = strrchr(mctx->media_dest, '/');
const char* filename = base ? base + 1 : mctx->media_dest;
char attrs[1100]; snprintf(attrs, sizeof(attrs), "{\"st\":\"fl\",\"fp\":\"%s\"}", filename);
chat_core_update_local_attrs(mctx->inst, mctx->channel_id, ts, json_sig, attrs);
/* анонсируем блоки суперузлам — иначе первый скачивающий не найдёт держателя */
media_delivery_announce_media(mctx->inst, strtoull(mctx->channel_id, NULL, 10),

Loading…
Cancel
Save