From 2beedf90ffdc6d9eb3d13e0868411cf371d06ff6 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 18 Feb 2017 18:59:45 +0100 Subject: [PATCH] append to TAIL of mutation list for processing in right order --- src/set/gnunet-service-set.c | 41 +++++++++++++++------- src/set/set_api.c | 3 +- src/set/test_set_union_copy.c | 65 +++++++++++++++++++++++++---------- 3 files changed, 77 insertions(+), 32 deletions(-) diff --git a/src/set/gnunet-service-set.c b/src/set/gnunet-service-set.c index 5633561ac..a545e8a06 100644 --- a/src/set/gnunet-service-set.c +++ b/src/set/gnunet-service-set.c @@ -805,16 +805,16 @@ execute_add (struct Set *set, el.data = &msg[1]; el.element_type = ntohs (msg->element_type); GNUNET_SET_element_hash (&el, &hash); - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Client inserts element %s of size %u\n", - GNUNET_h2s (&hash), - el.size); ee = GNUNET_CONTAINER_multihashmap_get (set->content->elements, &hash); if (NULL == ee) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client inserts element %s of size %u\n", + GNUNET_h2s (&hash), + el.size); ee = GNUNET_malloc (el.size + sizeof *ee); ee->element.size = el.size; GNUNET_memcpy (&ee[1], @@ -834,6 +834,11 @@ execute_add (struct Set *set, } else if (GNUNET_YES == _GSS_is_element_of_set (ee, set)) { + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client inserted element %s of size %u twice (ignored)\n", + GNUNET_h2s (&hash), + el.size); + /* same element inserted twice */ return; } @@ -843,7 +848,9 @@ execute_add (struct Set *set, .generation = set->current_generation, .added = GNUNET_YES }; - GNUNET_array_append (ee->mutations, ee->mutations_size, mut); + GNUNET_array_append (ee->mutations, + ee->mutations_size, + mut); } set->vt->add (set->state, ee); @@ -863,9 +870,6 @@ execute_remove (struct Set *set, msg = (const struct GNUNET_SET_ElementMessage *) m; el.size = ntohs (m->size) - sizeof *msg; - GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, - "Client removes element of size %u\n", - el.size); el.data = &msg[1]; el.element_type = ntohs (msg->element_type); GNUNET_SET_element_hash (&el, &hash); @@ -874,11 +878,17 @@ execute_remove (struct Set *set, if (NULL == ee) { /* Client tried to remove non-existing element. */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client removes non-existing element of size %u\n", + el.size); return; } if (GNUNET_NO == _GSS_is_element_of_set (ee, set)) { /* Client tried to remove element twice */ + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client removed element of size %u twice (ignored)\n", + el.size); return; } else @@ -887,7 +897,14 @@ execute_remove (struct Set *set, .generation = set->current_generation, .added = GNUNET_NO }; - GNUNET_array_append (ee->mutations, ee->mutations_size, mut); + + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Client removes element of size %u\n", + el.size); + + GNUNET_array_append (ee->mutations, + ee->mutations_size, + mut); } set->vt->remove (set->state, ee); } @@ -1505,9 +1522,9 @@ handle_client_mutation (void *cls, pm = GNUNET_new (struct PendingMutation); pm->mutation_message = GNUNET_copy_message (m); pm->set = set; - GNUNET_CONTAINER_DLL_insert (set->content->pending_mutations_head, - set->content->pending_mutations_tail, - pm); + GNUNET_CONTAINER_DLL_insert_tail (set->content->pending_mutations_head, + set->content->pending_mutations_tail, + pm); return; } execute_mutation (set, m); diff --git a/src/set/set_api.c b/src/set/set_api.c index 90dd708df..769be82d2 100644 --- a/src/set/set_api.c +++ b/src/set/set_api.c @@ -660,7 +660,8 @@ GNUNET_SET_add_element (struct GNUNET_SET_Handle *set, cont (cont_cls); return GNUNET_SYSERR; } - mqm = GNUNET_MQ_msg_extra (msg, element->size, + mqm = GNUNET_MQ_msg_extra (msg, + element->size, GNUNET_MESSAGE_TYPE_SET_ADD); msg->element_type = htons (element->element_type); GNUNET_memcpy (&msg[1], diff --git a/src/set/test_set_union_copy.c b/src/set/test_set_union_copy.c index 83a5862dd..c887a8958 100644 --- a/src/set/test_set_union_copy.c +++ b/src/set/test_set_union_copy.c @@ -115,7 +115,8 @@ check_count_iter (void *cls, GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Expected count (what: %s) to be %u, but it's actually %u\n", ci_cls->what, - ci_cls->expected_count, ci_cls->ongoing_count); + ci_cls->expected_count, + ci_cls->ongoing_count); ret = 1; GNUNET_SCHEDULER_shutdown (); return GNUNET_NO; @@ -123,8 +124,13 @@ check_count_iter (void *cls, ci_cls->cont (ci_cls->cont_cls); return GNUNET_NO; } + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Set `%s' has element %.*s\n", + ci_cls->what, + (int) element->size, + (const char *) element->data); - ci_cls->ongoing_count += 1; + ci_cls->ongoing_count++; return GNUNET_YES; } @@ -138,6 +144,10 @@ check_count (struct GNUNET_SET_Handle *set, { struct CountIterClosure *ci_cls = GNUNET_new (struct CountIterClosure); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "Checking count of %s\n", + what); + ci_cls->expected_count = expected_count; ci_cls->ongoing_count = 0; ci_cls->cont = cont; @@ -163,7 +173,7 @@ check_new_set_count (void *cls) { check_count (set2, "new set", - 4, + 3, &test_done, NULL); } @@ -173,15 +183,23 @@ static void copy_done (void *cls, struct GNUNET_SET_Handle *new_set) { - printf ("copy done\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "copy done\n"); set2 = new_set; - remove_element_str (set2, "spam"); - add_element_str (set2, "new1"); - add_element_str (set2, "new2"); - remove_element_str (set2, "new2"); - remove_element_str (set2, "new3"); + remove_element_str (set2, + "k5555"); + add_element_str (set2, + "n66666"); + add_element_str (set2, + "new2butremoved"); + remove_element_str (set2, + "new2butremoved"); + remove_element_str (set2, + "new3justremoved"); // Check that set1 didn't change. - check_count (set1, "old set", 3, + check_count (set1, + "old set", + 3, &check_new_set_count, NULL); } @@ -190,7 +208,8 @@ copy_done (void *cls, static void test_copy (void *cls) { - printf ("about to copy\n"); + GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, + "about to copy\n"); GNUNET_SET_copy_lazy (set1, ©_done, NULL); @@ -246,17 +265,25 @@ run (void *cls, &local_id); set1 = GNUNET_SET_create (cfg, GNUNET_SET_OPERATION_UNION); - add_element_str (set1, "foo"); - add_element_str (set1, "bar"); + add_element_str (set1, + "333"); + add_element_str (set1, + "k444"); /* duplicate -- ignored */ - add_element_str (set1, "bar"); - remove_element_str (set1, "foo"); + add_element_str (set1, + "k444"); + remove_element_str (set1, + "333"); /* non-existent -- ignored */ - remove_element_str (set1, "nonexist1"); - add_element_str (set1, "spam"); + remove_element_str (set1, + "999999999"); + add_element_str (set1, + "k5555"); /* duplicate -- ignored */ - remove_element_str (set1, "foo"); - add_element_str (set1, "eggs"); + remove_element_str (set1, + "333"); + add_element_str (set1, + "k2"); check_count (set1, "initial test", -- 2.25.1