[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r36610 - gnunet/src/transport
From: |
gnunet |
Subject: |
[GNUnet-SVN] r36610 - gnunet/src/transport |
Date: |
Wed, 28 Oct 2015 14:02:55 +0100 |
Author: grothoff
Date: 2015-10-28 14:02:55 +0100 (Wed, 28 Oct 2015)
New Revision: 36610
Modified:
gnunet/src/transport/gnunet-service-transport_clients.c
gnunet/src/transport/gnunet-service-transport_clients.h
gnunet/src/transport/gnunet-service-transport_neighbours.c
Log:
-fix #4025
Modified: gnunet/src/transport/gnunet-service-transport_clients.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_clients.c 2015-10-28
10:27:16 UTC (rev 36609)
+++ gnunet/src/transport/gnunet-service-transport_clients.c 2015-10-28
13:02:55 UTC (rev 36610)
@@ -172,6 +172,40 @@
/**
+ * Closure for #handle_send_transmit_continuation()
+ */
+struct SendTransmitContinuationContext
+{
+ /**
+ * Client that made the request.
+ */
+ struct GNUNET_SERVER_Client *client;
+
+ /**
+ * Peer that was the target.
+ */
+ struct GNUNET_PeerIdentity target;
+
+ /**
+ * At what time did we receive the message?
+ */
+ struct GNUNET_TIME_Absolute send_time;
+
+ /**
+ * Unique ID, for logging.
+ */
+ unsigned long long uuid;
+
+ /**
+ * Set to #GNUNET_YES if the connection for @e target goes
+ * down and we thus must no longer send the
+ * #GNUNET_MESSAGE_TYPE_TRANSPORT_SEND_OK message.
+ */
+ int down;
+};
+
+
+/**
* Head of linked list of all clients to this service.
*/
static struct TransportClient *clients_head;
@@ -182,6 +216,14 @@
static struct TransportClient *clients_tail;
/**
+ * Map of peer identities to active send transmit continuation
+ * contexts. Used to flag contexts as 'dead' when a connection goes
+ * down. Values are of type `struct SendTransmitContinuationContext
+ * *`.
+ */
+static struct GNUNET_CONTAINER_MultiPeerMap *active_stccs;
+
+/**
* Head of linked list of all pending address iterations
*/
static struct AddressToStringContext *a2s_head;
@@ -675,33 +717,6 @@
/**
- * Closure for #handle_send_transmit_continuation()
- */
-struct SendTransmitContinuationContext
-{
- /**
- * Client that made the request.
- */
- struct GNUNET_SERVER_Client *client;
-
- /**
- * Peer that was the target.
- */
- struct GNUNET_PeerIdentity target;
-
- /**
- * At what time did we receive the message?
- */
- struct GNUNET_TIME_Absolute send_time;
-
- /**
- * Unique ID, for logging.
- */
- unsigned long long uuid;
-};
-
-
-/**
* Function called after the transmission is done. Notify the client that it
is
* OK to send the next message.
*
@@ -744,7 +759,7 @@
success,
(NULL != addr) ? addr->transport_name : "%");
- if (GST_neighbours_test_connected (&stcc->target))
+ if (GNUNET_NO == stcc->down)
{
/* Only send confirmation if we are still connected */
GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
@@ -761,6 +776,10 @@
GNUNET_NO);
}
GNUNET_SERVER_client_drop (stcc->client);
+ GNUNET_assert (GNUNET_OK ==
+ GNUNET_CONTAINER_multipeermap_remove (active_stccs,
+ &stcc->target,
+ stcc));
GNUNET_free (stcc);
}
@@ -842,6 +861,10 @@
stcc->client = client;
stcc->send_time = GNUNET_TIME_absolute_get ();
stcc->uuid = uuid_gen++;
+ (void) GNUNET_CONTAINER_multipeermap_put (active_stccs,
+ &stcc->target,
+ stcc,
+
GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE);
GNUNET_SERVER_client_keep (client);
GST_manipulation_send (&obm->peer,
obmm,
@@ -1548,6 +1571,8 @@
sizeof (struct GNUNET_MessageHeader) },
{NULL, NULL, 0, 0}
};
+ active_stccs = GNUNET_CONTAINER_multipeermap_create (128,
+ GNUNET_YES);
peer_nc = GNUNET_SERVER_notification_context_create (server, 0);
val_nc = GNUNET_SERVER_notification_context_create (server, 0);
plugin_nc = GNUNET_SERVER_notification_context_create (server, 0);
@@ -1587,6 +1612,8 @@
GNUNET_SERVER_notification_context_destroy (plugin_nc);
plugin_nc = NULL;
}
+ GNUNET_CONTAINER_multipeermap_destroy (active_stccs);
+ active_stccs = NULL;
}
@@ -1713,4 +1740,50 @@
}
+/**
+ * Mark the peer as down so we don't call the continuation
+ * context in the future.
+ *
+ * @param cls NULL
+ * @param peer peer that got disconnected
+ * @param value a `struct SendTransmitContinuationContext` to mark
+ * @return #GNUNET_OK (continue to iterate)
+ */
+static int
+mark_peer_down (void *cls,
+ const struct GNUNET_PeerIdentity *peer,
+ void *value)
+{
+ struct SendTransmitContinuationContext *stcc = value;
+
+ stcc->down = GNUNET_YES;
+ return GNUNET_OK;
+}
+
+
+/**
+ * Notify all clients about a disconnect, and cancel
+ * pending SEND_OK messages for this peer.
+ *
+ * @param peer peer that disconnected
+ */
+void
+GST_clients_broadcast_disconnect (const struct GNUNET_PeerIdentity *peer)
+{
+ struct DisconnectInfoMessage disconnect_msg;
+
+ GNUNET_CONTAINER_multipeermap_get_multiple (active_stccs,
+ peer,
+ &mark_peer_down,
+ NULL);
+ disconnect_msg.header.size = htons (sizeof(struct DisconnectInfoMessage));
+ disconnect_msg.header.type = htons
(GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT);
+ disconnect_msg.reserved = htonl (0);
+ disconnect_msg.peer = *peer;
+ GST_clients_broadcast (&disconnect_msg.header,
+ GNUNET_NO);
+
+}
+
+
/* end of file gnunet-service-transport_clients.c */
Modified: gnunet/src/transport/gnunet-service-transport_clients.h
===================================================================
--- gnunet/src/transport/gnunet-service-transport_clients.h 2015-10-28
10:27:16 UTC (rev 36609)
+++ gnunet/src/transport/gnunet-service-transport_clients.h 2015-10-28
13:02:55 UTC (rev 36610)
@@ -88,6 +88,16 @@
/**
+ * Notify all clients about a disconnect, and cancel
+ * pending SEND_OK messages for this peer.
+ *
+ * @param peer peer that disconnected
+ */
+void
+GST_clients_broadcast_disconnect (const struct GNUNET_PeerIdentity *peer);
+
+
+/**
* Broadcast the new validation changes to all clients monitoring the peer.
*
* @param peer peer this update is about (never NULL)
Modified: gnunet/src/transport/gnunet-service-transport_neighbours.c
===================================================================
--- gnunet/src/transport/gnunet-service-transport_neighbours.c 2015-10-28
10:27:16 UTC (rev 36609)
+++ gnunet/src/transport/gnunet-service-transport_neighbours.c 2015-10-28
13:02:55 UTC (rev 36610)
@@ -597,18 +597,11 @@
static void
neighbours_disconnect_notification (struct NeighbourMapEntry *n)
{
- struct DisconnectInfoMessage disconnect_msg;
-
GNUNET_log (GNUNET_ERROR_TYPE_INFO,
"Peer `%s' disconnected\n",
GNUNET_i2s (&n->id));
GST_manipulation_peer_disconnect (&n->id);
- disconnect_msg.header.size = htons (sizeof(struct DisconnectInfoMessage));
- disconnect_msg.header.type = htons
(GNUNET_MESSAGE_TYPE_TRANSPORT_DISCONNECT);
- disconnect_msg.reserved = htonl (0);
- disconnect_msg.peer = n->id;
- GST_clients_broadcast (&disconnect_msg.header,
- GNUNET_NO);
+ GST_clients_broadcast_disconnect (&n->id);
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r36610 - gnunet/src/transport,
gnunet <=