Browse Source

Include dataset identity in Merkle diagnostics

master
evgeny 5 days ago
parent
commit
f6bfd36a6c
  1. 28
      src/chat/merkle_sync.c
  2. 4
      tests/test_member_adapter.c

28
src/chat/merkle_sync.c

@ -173,8 +173,8 @@ static struct ms_session* ms_create(struct merkle_sync* ms, struct ETCP_CONN* co
snprintf(s->tree_ns, sizeof(s->tree_ns), "%u:%s", dataset, s->ns); snprintf(s->tree_ns, sizeof(s->tree_ns), "%u:%s", dataset, s->ns);
s->leader = ms->inst->node_id < s->peer; s->leader = ms->inst->node_id < s->peer;
s->next = ms->sessions; ms->sessions = s; s->next = ms->sessions; ms->sessions = s;
DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: attach ns=%s peer=%016llx conn=%p leader=%d", DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: attach dataset=%u ns=%s peer=%016llx conn=%p leader=%d",
s->ns, (unsigned long long)s->peer, (void*)conn, s->leader); s->dataset->id, s->ns, (unsigned long long)s->peer, (void*)conn, s->leader);
return s; return s;
} }
@ -208,8 +208,8 @@ static void ms_sent(struct ll_queue* q, void* arg) {
return; return;
} }
s->sent_bytes += len; s->sent_bytes += len;
DEBUG_DEBUG(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: TX ns=%s peer=%016llx round=%llu type=%u bytes=%zu", DEBUG_DEBUG(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: TX dataset=%u ns=%s peer=%016llx round=%llu type=%u bytes=%zu",
s->ns, (unsigned long long)s->peer, (unsigned long long)s->round, type, len); s->dataset->id, s->ns, (unsigned long long)s->peer, (unsigned long long)s->round, type, len);
if (type == MS_ERROR) { if (type == MS_ERROR) {
s->state = MS_FAILED; s->state = MS_FAILED;
ms_stop_deadline(s); ms_stop_deadline(s);
@ -221,8 +221,8 @@ static void ms_sent(struct ll_queue* q, void* arg) {
ms_stop_deadline(s); ms_stop_deadline(s);
if (s->revision == s->verified_revision) { if (s->revision == s->verified_revision) {
s->dirty = 0; s->dirty = 0;
DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: converged ns=%s peer=%016llx round=%llu tx=%llu rx=%llu", DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: converged dataset=%u ns=%s peer=%016llx round=%llu tx=%llu rx=%llu",
s->ns, (unsigned long long)s->peer, (unsigned long long)s->round, s->dataset->id, s->ns, (unsigned long long)s->peer, (unsigned long long)s->round,
(unsigned long long)s->sent_bytes, (unsigned long long)s->received_bytes); (unsigned long long)s->sent_bytes, (unsigned long long)s->received_bytes);
ms_notify(s, MT_OK); ms_notify(s, MT_OK);
return; return;
@ -254,8 +254,8 @@ static int ms_send(struct ms_session* s, int type, uint32_t request, const uint8
} }
static void ms_fail(struct ms_session* s, int error, const char* reason, int report) { static void ms_fail(struct ms_session* s, int error, const char* reason, int report) {
DEBUG_ERROR(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: failed ns=%s peer=%016llx round=%llu error=%d reason=%s", DEBUG_ERROR(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: failed dataset=%u ns=%s peer=%016llx round=%llu error=%d reason=%s",
s->ns, (unsigned long long)s->peer, (unsigned long long)s->round, error, reason); s->dataset->id, s->ns, (unsigned long long)s->peer, (unsigned long long)s->round, error, reason);
s->state = MS_FAILED; s->dirty = 0; s->waiting = 0; s->failure_error = error; s->state = MS_FAILED; s->dirty = 0; s->waiting = 0; s->failure_error = error;
if (s->work) { uasync_call_soon_cancel(s->ms->inst->ua, s->work); s->work = NULL; } if (s->work) { uasync_call_soon_cancel(s->ms->inst->ua, s->work); s->work = NULL; }
ms_discard_tx(s); ms_discard_tx(s);
@ -333,8 +333,8 @@ static int ms_begin(struct ms_session* s) {
if (!s->round) return -1; if (!s->round) return -1;
s->request_id = s->remote_request_id = 0; s->request_id = s->remote_request_id = 0;
s->state = MS_BEGIN_WAIT; s->dirty = 0; s->waiting = 0; s->state = MS_BEGIN_WAIT; s->dirty = 0; s->waiting = 0;
DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: begin ns=%s peer=%016llx round=%llu", DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: begin dataset=%u ns=%s peer=%016llx round=%llu",
s->ns, (unsigned long long)s->peer, (unsigned long long)s->round); s->dataset->id, s->ns, (unsigned long long)s->peer, (unsigned long long)s->round);
return ms_send(s, MS_BEGIN, 0, NULL, 0); return ms_send(s, MS_BEGIN, 0, NULL, 0);
} }
@ -485,8 +485,8 @@ static void ms_receive(struct ETCP_CONN* conn, struct ll_entry* entry) {
s->received_bytes += entry->len; s->received_bytes += entry->len;
const uint8_t* p = d + MS_HEADER; const uint8_t* p = d + MS_HEADER;
size_t len = entry->len - MS_HEADER; size_t len = entry->len - MS_HEADER;
DEBUG_DEBUG(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: RX ns=%s peer=%016llx round=%llu type=%u request=%u bytes=%zu state=%d", DEBUG_DEBUG(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: RX dataset=%u ns=%s peer=%016llx round=%llu type=%u request=%u bytes=%zu state=%d",
ns, (unsigned long long)s->peer, (unsigned long long)round, type, request, len, s->state); dataset, ns, (unsigned long long)s->peer, (unsigned long long)round, type, request, len, s->state);
int rc = 0, notify = 0; int rc = 0, notify = 0;
if (s->state == MS_FAILING) goto done; if (s->state == MS_FAILING) goto done;
if (type != MS_WAKE && type != MS_BEGIN && round != s->round) { if (type != MS_WAKE && type != MS_BEGIN && round != s->round) {
@ -550,8 +550,8 @@ static void ms_receive(struct ETCP_CONN* conn, struct ll_entry* entry) {
s->dirty = memcmp(root, p, sizeof(root)) != 0; s->dirty = memcmp(root, p, sizeof(root)) != 0;
if (s->dirty) rc = ms_schedule(s); if (s->dirty) rc = ms_schedule(s);
else { else {
DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: converged ns=%s peer=%016llx round=%llu", DEBUG_INFO(DEBUG_CATEGORY_MEMBER_SYNC, "merkle_sync: converged dataset=%u ns=%s peer=%016llx round=%llu",
s->ns, (unsigned long long)s->peer, (unsigned long long)s->round); s->dataset->id, s->ns, (unsigned long long)s->peer, (unsigned long long)s->round);
notify = 1; notify = 1;
} }
} }

4
tests/test_member_adapter.c

@ -17,7 +17,7 @@ static void put(struct UTUN_INSTANCE* inst, uint64_t id) {
} }
static void root(struct UTUN_INSTANCE* inst, uint8_t hash[32]) { static void root(struct UTUN_INSTANCE* inst, uint8_t hash[32]) {
assert(merkle_sync_read_hash(inst, "1001", 0, 0, hash) == 0); assert(merkle_sync_read_hash(inst, MT_DATA_MEMBERS, "1001", 0, 0, hash) == 0);
} }
static void public_key(const uint8_t priv[32], uint8_t pub[32]) { static void public_key(const uint8_t priv[32], uint8_t pub[32]) {
@ -86,7 +86,7 @@ static void test_owner_sizes(struct UASYNC* ua) {
root(&target, actual); assert(!memcmp(expected, actual, 32)); root(&target, actual); assert(!memcmp(expected, actual, 32));
assert(sqlite3_exec(target.topo_sqlite_db, "SAVEPOINT hash_tail", NULL, NULL, NULL) == SQLITE_OK); assert(sqlite3_exec(target.topo_sqlite_db, "SAVEPOINT hash_tail", NULL, NULL, NULL) == SQLITE_OK);
assert(topo_node_sqlite_member_owner_put(target.topo_sqlite_db, "1001", nid, tags, owner, 0) == 0); assert(topo_node_sqlite_member_owner_put(target.topo_sqlite_db, "1001", nid, tags, owner, 0) == 0);
assert(merkle_sync_recompute_path(&target, "1001", nid) == 1); assert(merkle_sync_recompute_path(&target, MT_DATA_MEMBERS, MT_DATA_MEMBERS, "1001", nid) == 1);
root(&target, actual); assert(memcmp(expected, actual, 32)); root(&target, actual); assert(memcmp(expected, actual, 32));
assert(sqlite3_exec(target.topo_sqlite_db, "ROLLBACK TO hash_tail; RELEASE hash_tail", NULL, NULL, NULL) == SQLITE_OK); assert(sqlite3_exec(target.topo_sqlite_db, "ROLLBACK TO hash_tail; RELEASE hash_tail", NULL, NULL, NULL) == SQLITE_OK);
tags[flip] = 'a'; tags[flip] = 'a';

Loading…
Cancel
Save