include set size in result callback, needed by consensus
authorFlorian Dold <florian.dold@gmail.com>
Mon, 27 Feb 2017 00:18:54 +0000 (01:18 +0100)
committerFlorian Dold <florian.dold@gmail.com>
Mon, 27 Feb 2017 00:19:18 +0000 (01:19 +0100)
17 files changed:
src/consensus/consensus_protocol.h
src/consensus/gnunet-service-consensus.c
src/consensus/plugin_block_consensus.c
src/dv/gnunet-service-dv.c
src/include/gnunet_set_service.h
src/revocation/gnunet-service-revocation.c
src/scalarproduct/gnunet-service-scalarproduct-ecc_alice.c
src/scalarproduct/gnunet-service-scalarproduct-ecc_bob.c
src/scalarproduct/gnunet-service-scalarproduct_alice.c
src/scalarproduct/gnunet-service-scalarproduct_bob.c
src/set/gnunet-service-set_union.c
src/set/gnunet-set-profiler.c
src/set/set.h
src/set/set_api.c
src/set/test_set_api.c
src/set/test_set_intersection_result_full.c
src/set/test_set_union_result_symmetric.c

index 161c939cdd3e4bf8eccdb6578d9cf1d659ed19fb..43b6a963258b8b0d8851d9cf2027acefebe3a566 100644 (file)
@@ -89,6 +89,12 @@ struct GNUNET_CONSENSUS_RoundContextMessage
 };
 
 
+enum {
+  CONSENSUS_MARKER_CONTESTED,
+  CONSENSUS_MARKER_SIZE,
+};
+
+
 /**
  * Consensus element, either marker or payload.
  */
@@ -103,7 +109,7 @@ struct ConsensusElement
   /**
    * Is this a marker element?
    */
-  uint8_t is_contested_marker;
+  uint8_t marker;
 
   /* rest: element data */
 };
index 9d5d35c944868705d43833c9aa6e4529d0d044bd..44b6dc21b369ca1f9f17f6160c46fd51d5208579 100644 (file)
@@ -141,6 +141,7 @@ GNUNET_NETWORK_STRUCT_END
 enum PhaseKind
 {
   PHASE_KIND_ALL_TO_ALL,
+  PHASE_KIND_ALL_TO_ALL_2,
   PHASE_KIND_GRADECAST_LEADER,
   PHASE_KIND_GRADECAST_ECHO,
   PHASE_KIND_GRADECAST_ECHO_GRADE,
@@ -528,6 +529,7 @@ phasename (uint16_t phase)
   switch (phase)
   {
     case PHASE_KIND_ALL_TO_ALL: return "ALL_TO_ALL";
+    case PHASE_KIND_ALL_TO_ALL_2: return "ALL_TO_ALL_2";
     case PHASE_KIND_FINISH: return "FINISH";
     case PHASE_KIND_GRADECAST_LEADER: return "GRADECAST_LEADER";
     case PHASE_KIND_GRADECAST_ECHO: return "GRADECAST_ECHO";
@@ -668,7 +670,7 @@ send_to_client_iter (void *cls,
     GNUNET_assert (GNUNET_BLOCK_TYPE_CONSENSUS_ELEMENT == element->element_type);
     ce = element->data;
 
-    GNUNET_assert (GNUNET_NO == ce->is_contested_marker);
+    GNUNET_assert (0 == ce->marker);
 
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                 "P%d: sending element %s to client\n",
@@ -864,11 +866,13 @@ task_other_peer (struct TaskEntry *task)
  *
  * @param cls closure
  * @param element a result element, only valid if status is GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status see enum GNUNET_SET_Status
  */
 static void
 set_result_cb (void *cls,
                const struct GNUNET_SET_Element *element,
+               uint64_t current_size,
                enum GNUNET_SET_Status status)
 {
   struct TaskEntry *task = cls;
@@ -940,7 +944,7 @@ set_result_cb (void *cls,
   if ( (GNUNET_SET_STATUS_ADD_LOCAL == status) || (GNUNET_SET_STATUS_ADD_REMOTE == status) )
   {
     if ( (GNUNET_YES == setop->transceive_contested) &&
-         (GNUNET_YES == consensus_element->is_contested_marker) )
+         (CONSENSUS_MARKER_CONTESTED == consensus_element->marker) )
     {
       GNUNET_assert (NULL != output_rfn);
       rfn_contest (output_rfn, task_other_peer (task));
@@ -1001,7 +1005,7 @@ set_result_cb (void *cls,
       GNUNET_assert (NULL != consensus_element);
       if (GNUNET_YES == setop->do_not_remove)
         break;
-      if (GNUNET_YES == consensus_element->is_contested_marker)
+      if (CONSENSUS_MARKER_CONTESTED == consensus_element->marker)
         break;
       GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
                   "Removing element in Task {%s}\n",
@@ -1325,11 +1329,19 @@ commit_set (struct ConsensusSession *session,
     }
   }
 #else
+
+  if (PHASE_KIND_ALL_TO_ALL_2 == task->key.kind)
+  {
+    struct GNUNET_SET_Element element;
+    struct ConsensusElement ce = { 0 };
+  }
+
+
   if ( (GNUNET_YES == setop->transceive_contested) && (GNUNET_YES == set->is_contested) )
   {
     struct GNUNET_SET_Element element;
     struct ConsensusElement ce = { 0 };
-    ce.is_contested_marker = GNUNET_YES;
+    ce.marker = CONSENSUS_MARKER_CONTESTED;
     element.data = &ce;
     element.size = sizeof (struct ConsensusElement);
     element.element_type = GNUNET_BLOCK_TYPE_CONSENSUS_ELEMENT;
@@ -2847,11 +2859,42 @@ construct_task_graph (struct ConsensusSession *session)
     put_task (session->taskmap, &task);
   }
 
+  round += 1;
   prev_step = step;
-  step = NULL;
+  step = create_step (session, round, GNUNET_NO);;
+#ifdef GNUNET_EXTRA_LOGGING
+  step->debug_name = GNUNET_strdup ("all to all 2");
+#endif
+  step_depend_on (step, prev_step);
+
+
+  for (i = 0; i < n; i++)
+  {
+    uint16_t p1;
+    uint16_t p2;
+
+    p1 = me;
+    p2 = i;
+    arrange_peers (&p1, &p2, n);
+    task = ((struct TaskEntry) {
+      .key = (struct TaskKey) { PHASE_KIND_ALL_TO_ALL_2, p1, p2, -1, -1 },
+      .step = step,
+      .start = task_start_reconcile,
+      .cancel = task_cancel_reconcile,
+    });
+    task.cls.setop.input_set = (struct SetKey) { SET_KIND_CURRENT, 0 };
+    task.cls.setop.output_set = task.cls.setop.input_set;
+    task.cls.setop.do_not_remove = GNUNET_YES;
+    put_task (session->taskmap, &task);
+  }
 
   round += 1;
 
+  prev_step = step;
+  step = NULL;
+
+
+
   /* Byzantine union */
 
   /* sequential repetitions of the gradecasts */
index 3ad3357604b178719c77b97cce94f367536721c1..0cb64867e1d1227283f6468147b9badae185fb84 100644 (file)
@@ -63,7 +63,7 @@ block_plugin_consensus_evaluate (void *cls,
 
   const struct ConsensusElement *ce = reply_block;
 
-  if ( (GNUNET_YES == ce->is_contested_marker) ||
+  if ( (0 != ce->marker) ||
        (0 == ce->payload_type ) )
     return GNUNET_BLOCK_EVALUATION_OK_MORE;
 
index e4b664f4b653f50728bfaa2d807ff65834959d8c..7d101c8ae46d2718ae4f4a72649699c1a489ab96 100644 (file)
@@ -1346,11 +1346,13 @@ check_target_added (void *cls,
  *
  * @param cls the `struct DirectNeighbor` we're building the consensus with
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status see `enum GNUNET_SET_Status`
  */
 static void
 handle_set_union_result (void *cls,
                         const struct GNUNET_SET_Element *element,
+                         uint64_t current_size,
                         enum GNUNET_SET_Status status)
 {
   struct DirectNeighbor *neighbor = cls;
index f9b477f47e6250c50593c0edfad75a62566c79bb..ca46d874673cce196020b37fd00394b230393228 100644 (file)
@@ -275,11 +275,13 @@ typedef void
  *
  * @param cls closure
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status see `enum GNUNET_SET_Status`
  */
 typedef void
 (*GNUNET_SET_ResultIterator) (void *cls,
                               const struct GNUNET_SET_Element *element,
+                              uint64_t current_size,
                               enum GNUNET_SET_Status status);
 
 /**
index 0ac963f6360f8be15a6d4e22e1c476494880fcf1..99bec1fc8a034147b7ca0ed24c4768decbcb7242 100644 (file)
@@ -432,11 +432,13 @@ handle_p2p_revoke (void *cls,
  *
  * @param cls closure
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status see `enum GNUNET_SET_Status`
  */
 static void
 add_revocation (void *cls,
                 const struct GNUNET_SET_Element *element,
+                uint64_t current_size,
                 enum GNUNET_SET_Status status)
 {
   struct PeerEntry *peer_entry = cls;
index b7b839b6f518349e6e3b55c43994b9172168aff2..ca92fb9ead83ce0f5456a4ad3cf4563660a6cb42 100644 (file)
@@ -687,11 +687,13 @@ send_alices_cryptodata_message (struct AliceServiceSession *s)
  *
  * @param cls closure with the `struct AliceServiceSession`
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status what has happened with the set intersection?
  */
 static void
 cb_intersection_element_removed (void *cls,
                                  const struct GNUNET_SET_Element *element,
+                                 uint64_t current_size,
                                  enum GNUNET_SET_Status status)
 {
   struct AliceServiceSession *s = cls;
index 8a5b3a5b2459326f478317890cda123f4c3194fd..3851ca76347b2f2aa797a937ebba329c31deda41 100644 (file)
@@ -580,11 +580,13 @@ handle_alices_cryptodata_message (void *cls,
  *
  * @param cls closure with the `struct BobServiceSession`
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status what has happened with the set intersection?
  */
 static void
 cb_intersection_element_removed (void *cls,
                                  const struct GNUNET_SET_Element *element,
+                                 uint64_t current_size,
                                  enum GNUNET_SET_Status status)
 {
   struct BobServiceSession *s = cls;
index 697baa9bd51d71f65fde7e21cf715511443a9fdb..6d7a0a3b84e7a18077655fc4311f63d5669211d5 100644 (file)
@@ -924,11 +924,13 @@ send_alices_cryptodata_message (struct AliceServiceSession *s)
  *
  * @param cls closure with the `struct AliceServiceSession`
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status what has happened with the set intersection?
  */
 static void
 cb_intersection_element_removed (void *cls,
                                  const struct GNUNET_SET_Element *element,
+                                 uint64_t current_size,
                                  enum GNUNET_SET_Status status)
 {
   struct AliceServiceSession *s = cls;
index 5d2df017b3a2a6eee71c75061548b3eac50ac570..f3b5327f1d75f2a86b316444c1cb990299f83cf7 100644 (file)
@@ -879,11 +879,13 @@ handle_alices_cryptodata_message (void *cls,
  *
  * @param cls closure with the `struct BobServiceSession`
  * @param element a result element, only valid if status is #GNUNET_SET_STATUS_OK
+ * @param current_size current set size
  * @param status what has happened with the set intersection?
  */
 static void
 cb_intersection_element_removed (void *cls,
                                  const struct GNUNET_SET_Element *element,
+                                 uint64_t current_size,
                                  enum GNUNET_SET_Status status)
 {
   struct BobServiceSession *s = cls;
index 5037b7bfd821e560f78d9958e2fc67eb26f8ece7..82c45453d076cbd4359d43aba2e500b329be0cc4 100644 (file)
@@ -1285,6 +1285,7 @@ send_client_element (struct Operation *op,
   rm->result_status = htons (status);
   rm->request_id = htonl (op->spec->client_request_id);
   rm->element_type = element->element_type;
+  rm->current_size = GNUNET_htonll (GNUNET_CONTAINER_multihashmap32_size (op->state->key_to_element));
   GNUNET_memcpy (&rm[1], element->data, element->size);
   GNUNET_MQ_send (op->spec->set->client_mq, ev);
 }
@@ -1307,6 +1308,7 @@ send_done_and_destroy (void *cls)
   rm->request_id = htonl (op->spec->client_request_id);
   rm->result_status = htons (GNUNET_SET_STATUS_DONE);
   rm->element_type = htons (0);
+  rm->current_size = GNUNET_htonll (GNUNET_CONTAINER_multihashmap32_size (op->state->key_to_element));
   GNUNET_MQ_send (op->spec->set->client_mq, ev);
   /* Will also call the union-specific cancel function. */
   _GSS_operation_destroy (op, GNUNET_YES);
@@ -1969,8 +1971,8 @@ union_evaluate (struct Operation *op,
     LOG (GNUNET_ERROR_TYPE_DEBUG,
          "sent op request without context message\n");
 
-  op->state->initial_size = GNUNET_CONTAINER_multihashmap_size (op->spec->set->content->elements);
   initialize_key_to_element (op);
+  op->state->initial_size = GNUNET_CONTAINER_multihashmap32_size (op->state->key_to_element);
 }
 
 
@@ -2000,8 +2002,8 @@ union_accept (struct Operation *op)
   op->state->se = strata_estimator_dup (op->spec->set->state->se);
   op->state->demanded_hashes = GNUNET_CONTAINER_multihashmap_create (32, GNUNET_NO);
   op->state->salt_receive = op->state->salt_send = 42;
-  op->state->initial_size = GNUNET_CONTAINER_multihashmap_size (op->spec->set->content->elements);
   initialize_key_to_element (op);
+  op->state->initial_size = GNUNET_CONTAINER_multihashmap32_size (op->state->key_to_element);
   /* kick off the operation */
   send_strata_estimator (op);
 }
index cfbb5602a2d7fcf941a3f34e1df3ceff2752bece..d83e034a684c8c396b4c5ede9e4168f35803a6c2 100644 (file)
@@ -162,6 +162,7 @@ check_all_done (void)
 static void
 set_result_cb (void *cls,
                const struct GNUNET_SET_Element *element,
+               uint64_t current_size,
                enum GNUNET_SET_Status status)
 {
   struct SetInfo *info = cls;
index 207f098bc2700b6c719addaa930a00925d754f85..258e2bff9de2c69abf40c03fddab46aeef18743e 100644 (file)
@@ -250,6 +250,11 @@ struct GNUNET_SET_ResultMessage
    */
   struct GNUNET_MessageHeader header;
 
+  /**
+   * Current set size.
+   */
+  uint64_t current_size;
+
   /**
    * id the result belongs to
    */
index 2b09725e8ccbfe9c7e9350674d96523f691efaa3..0ae02e35ae6b7fcffb91d00060547d15e27bb234 100644 (file)
@@ -432,6 +432,7 @@ do_final:
   {
     oh->result_cb (oh->result_cls,
                    NULL,
+                   GNUNET_ntohll (msg->current_size),
                    result_status);
   }
   else
@@ -453,6 +454,7 @@ do_element:
   if (NULL != oh->result_cb)
     oh->result_cb (oh->result_cls,
                    &e,
+                   GNUNET_ntohll (msg->current_size),
                    result_status);
 }
 
@@ -538,6 +540,7 @@ handle_client_set_error (void *cls,
     if (NULL != set->ops_head->result_cb)
       set->ops_head->result_cb (set->ops_head->result_cls,
                                 NULL,
+                                0,
                                 GNUNET_SET_STATUS_FAILURE);
     set_operation_destroy (set->ops_head);
   }
index 4bc6bd1c3ace06538b13fdc7cda95d4603077461..63c88107780cd63214c7adc4db70512d3c892f13 100644 (file)
@@ -55,6 +55,7 @@ static struct GNUNET_SCHEDULER_Task *tt;
 static void
 result_cb_set1 (void *cls,
                 const struct GNUNET_SET_Element *element,
+                uint64_t size,
                 enum GNUNET_SET_Status status)
 {
   switch (status)
index cbe1ce1492ec1655630f70dfc61951f95917a336..be9d63646c33e060160a50da6d8f478d17e5c8f2 100644 (file)
@@ -56,6 +56,7 @@ static struct GNUNET_SET_OperationHandle *oh2;
 static void
 result_cb_set1 (void *cls,
                 const struct GNUNET_SET_Element *element,
+                uint64_t current_size,
                 enum GNUNET_SET_Status status)
 {
   static int count;
index 8dff40ec0e317c49c6e8535ea944ec0c6b636ac2..88739fcaf9fe83bf7a168c27ce14af1698b7d7ce 100644 (file)
@@ -77,6 +77,7 @@ static struct GNUNET_SCHEDULER_Task *timeout_task;
 static void
 result_cb_set1 (void *cls,
                 const struct GNUNET_SET_Element *element,
+                uint64_t current_size,
                 enum GNUNET_SET_Status status)
 {
   switch (status)