gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r28554 - in gnunet/src: consensus include set


From: gnunet
Subject: [GNUnet-SVN] r28554 - in gnunet/src: consensus include set
Date: Tue, 13 Aug 2013 02:58:15 +0200

Author: dold
Date: 2013-08-13 02:58:14 +0200 (Tue, 13 Aug 2013)
New Revision: 28554

Modified:
   gnunet/src/consensus/gnunet-service-consensus.c
   gnunet/src/include/gnunet_protocols.h
   gnunet/src/set/gnunet-service-set.c
   gnunet/src/set/gnunet-service-set_union.c
   gnunet/src/set/test_set_api.c
Log:
- proper shutdown sequence for set makes consensus happy


Modified: gnunet/src/consensus/gnunet-service-consensus.c
===================================================================
--- gnunet/src/consensus/gnunet-service-consensus.c     2013-08-12 23:13:13 UTC 
(rev 28553)
+++ gnunet/src/consensus/gnunet-service-consensus.c     2013-08-13 00:58:14 UTC 
(rev 28554)
@@ -968,6 +968,8 @@
       }
       break;
     default:
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "P%d got unexpected set request in 
round %d from P%d\n",
+                  session->local_peer_idx, session->current_round, index);
       GNUNET_break_op (0);
       return;
   }

Modified: gnunet/src/include/gnunet_protocols.h
===================================================================
--- gnunet/src/include/gnunet_protocols.h       2013-08-12 23:13:13 UTC (rev 
28553)
+++ gnunet/src/include/gnunet_protocols.h       2013-08-13 00:58:14 UTC (rev 
28554)
@@ -1784,8 +1784,13 @@
  */
 #define GNUNET_MESSAGE_TYPE_SET_ITER_DONE 589
 
+/**
+ * Iteration end marker for the client.
+ */
+#define GNUNET_MESSAGE_TYPE_SET_P2P_DIE 590
 
 
+
 
/*******************************************************************************
  * TESTBED LOGGER message types
  
******************************************************************************/

Modified: gnunet/src/set/gnunet-service-set.c
===================================================================
--- gnunet/src/set/gnunet-service-set.c 2013-08-12 23:13:13 UTC (rev 28553)
+++ gnunet/src/set/gnunet-service-set.c 2013-08-13 00:58:14 UTC (rev 28554)
@@ -291,7 +291,9 @@
 set_destroy (struct Set *set)
 {
   /* If the client is not dead yet, destroy it.
-   * The client's destroy callback will destroy the set again. */
+   * The client's destroy callback will destroy the set again.
+   * We do this so that the tunnel end handler still has a valid set handle
+   * to destroy. */
   if (NULL != set->client)
   {
     struct GNUNET_SERVER_Client *client = set->client;
@@ -299,11 +301,20 @@
     GNUNET_SERVER_client_disconnect (client);
     return;
   }
+  GNUNET_assert (NULL != set->state);
+  set->vt->destroy_set (set->state);
+  set->state = NULL;
   if (NULL != set->client_mq)
   {
     GNUNET_MQ_destroy (set->client_mq);
     set->client_mq = NULL;
   }
+  if (NULL != set->iter)
+  {
+    GNUNET_CONTAINER_multihashmap_iterator_destroy (set->iter);
+    set->iter = NULL;
+  }
+  GNUNET_CONTAINER_DLL_remove (sets_head, sets_tail, set);
   if (NULL != set->elements)
   {
     GNUNET_CONTAINER_multihashmap_iterate (set->elements,
@@ -311,15 +322,6 @@
     GNUNET_CONTAINER_multihashmap_destroy (set->elements);
     set->elements = NULL;
   }
-  if (NULL != set->iter)
-  {
-    GNUNET_CONTAINER_multihashmap_iterator_destroy (set->iter);
-    set->iter = NULL;
-  }
-  GNUNET_assert (NULL != set->state);
-  set->vt->destroy_set (set->state);
-  set->state = NULL;
-  GNUNET_CONTAINER_DLL_remove (sets_head, sets_tail, set);
   GNUNET_free (set);
 }
 
@@ -1079,7 +1081,7 @@
 
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "dispatching mesh message (type: %u)\n",
               ntohs (message->type));
-  /* FIXME: do this before or after the handler? */
+  /* do this before the handler, as the handler might kill the tunnel */
   GNUNET_MESH_receive_done (tunnel);
   ret = tc->vt->msg_handler (tc->op, message);
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "handled mesh message (type: %u)\n",
@@ -1124,6 +1126,7 @@
     {dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_IBF, 0},
     {dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENTS, 0},
     {dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_DONE, 0},
+    {dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_DIE, 0},
     {dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_ELEMENT_REQUESTS, 0},
     {dispatch_p2p_message, GNUNET_MESSAGE_TYPE_SET_P2P_SE, 0},
     {NULL, 0, 0}

Modified: gnunet/src/set/gnunet-service-set_union.c
===================================================================
--- gnunet/src/set/gnunet-service-set_union.c   2013-08-12 23:13:13 UTC (rev 
28553)
+++ gnunet/src/set/gnunet-service-set_union.c   2013-08-13 00:58:14 UTC (rev 
28554)
@@ -180,6 +180,11 @@
     * a linked list.
     */
   struct OperationState *prev;
+
+  /**
+   * Did we send the client that we are done?
+   */
+  int client_done_sent;
 };
 
 
@@ -981,12 +986,17 @@
   struct GNUNET_MQ_Envelope *ev;
   struct GNUNET_SET_ResultMessage *rm;
 
+  GNUNET_assert (GNUNET_NO == eo->client_done_sent);
+
+  eo->client_done_sent = GNUNET_YES;
+
   ev = GNUNET_MQ_msg (rm, GNUNET_MESSAGE_TYPE_SET_RESULT);
   rm->request_id = htonl (eo->spec->client_request_id);
   rm->result_status = htons (GNUNET_SET_STATUS_DONE);
   rm->element_type = htons (0);
   GNUNET_MQ_send (eo->spec->set->client_mq, ev);
 
+  union_operation_destroy (eo);
 }
 
 
@@ -1067,12 +1077,14 @@
 
 
 /**
- * Callback used for notifications
- *
- * @param cls closure
+ * Handle a 'DIE' message from the remote peer.
+ * This indicates that the other peer is terminated.
+ * 
+ * @param cls the union operation
+ * @param mh the message
  */
 static void
-peer_done_sent_cb (void *cls)
+handle_p2p_die (void *cls, const struct GNUNET_MessageHeader *mh)
 {
   struct OperationState *eo = cls;
 
@@ -1090,22 +1102,24 @@
 handle_p2p_done (void *cls, const struct GNUNET_MessageHeader *mh)
 {
   struct OperationState *eo = cls;
+  struct GNUNET_MQ_Envelope *ev;
 
   if (eo->phase == PHASE_EXPECT_ELEMENTS_AND_REQUESTS)
   {
     /* we got all requests, but still have to send our elements as response */
-    struct GNUNET_MQ_Envelope *ev;
 
     GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got DONE, sending final DONE after 
elements\n");
     eo->phase = PHASE_FINISHED;
     ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_P2P_DONE);
-    GNUNET_MQ_notify_sent (ev, peer_done_sent_cb, eo);
     GNUNET_MQ_send (eo->mq, ev);
     return;
   }
   if (eo->phase == PHASE_EXPECT_ELEMENTS)
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got final DONE\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "got final DONE, trying to send 
DIE\n");
+    /* send the die message, which might not even be delivered,
+     * as we could have shut down before that */
+    ev = GNUNET_MQ_msg_header (GNUNET_MESSAGE_TYPE_SET_P2P_DIE);
     eo->phase = PHASE_FINISHED;
     send_client_done_and_destroy (eo);
     return;
@@ -1290,6 +1304,9 @@
     case GNUNET_MESSAGE_TYPE_SET_P2P_DONE:
       handle_p2p_done (eo, mh);
       break;
+    case GNUNET_MESSAGE_TYPE_SET_P2P_DIE:
+      handle_p2p_die (eo, mh);
+      break;
     default:
       /* something wrong with mesh's message handlers? */
       GNUNET_assert (0);
@@ -1314,18 +1331,20 @@
   {
     struct GNUNET_MQ_Envelope *ev;
     struct GNUNET_SET_ResultMessage *msg;
+
     ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SET_RESULT);
     msg->request_id = htonl (op->spec->client_request_id);
     msg->result_status = htons (GNUNET_SET_STATUS_FAILURE);
     msg->element_type = htons (0);
     GNUNET_MQ_send (op->spec->set->client_mq, ev);
     GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "other peer disconnected 
prematurely\n");
+    union_operation_destroy (op);
+    return;
   }
-  else
-  {
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "other peer disconnected 
(finished)\n");
-  }
-  union_operation_destroy (op);
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "other peer disconnected (finished)\n");
+  /* maybe the other peer did not get to send his 'DIE' message before he 
died? */
+  if (GNUNET_NO == op->client_done_sent)
+    send_client_done_and_destroy (op);
 }
 
 

Modified: gnunet/src/set/test_set_api.c
===================================================================
--- gnunet/src/set/test_set_api.c       2013-08-12 23:13:13 UTC (rev 28553)
+++ gnunet/src/set/test_set_api.c       2013-08-13 00:58:14 UTC (rev 28554)
@@ -232,7 +232,6 @@
 
   test_iter ();
 
-  return;
   set1 = GNUNET_SET_create (cfg, GNUNET_SET_OPERATION_UNION);
   set2 = GNUNET_SET_create (cfg, GNUNET_SET_OPERATION_UNION);
   GNUNET_CRYPTO_hash_create_random (GNUNET_CRYPTO_QUALITY_WEAK, &app_id);




reply via email to

[Prev in Thread] Current Thread [Next in Thread]