[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);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r28554 - in gnunet/src: consensus include set,
gnunet <=