[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] r24561 - gnunet/src/transport
From: |
gnunet |
Subject: |
[GNUnet-SVN] r24561 - gnunet/src/transport |
Date: |
Fri, 26 Oct 2012 14:22:21 +0200 |
Author: wachs
Date: 2012-10-26 14:22:21 +0200 (Fri, 26 Oct 2012)
New Revision: 24561
Modified:
gnunet/src/transport/plugin_transport_unix.c
Log:
simplify retry mechanism
Modified: gnunet/src/transport/plugin_transport_unix.c
===================================================================
--- gnunet/src/transport/plugin_transport_unix.c 2012-10-26 11:38:04 UTC
(rev 24560)
+++ gnunet/src/transport/plugin_transport_unix.c 2012-10-26 12:22:21 UTC
(rev 24561)
@@ -43,6 +43,8 @@
#include "transport.h"
#define MAX_PROBES 20
+#define MAX_RETRIES 3
+#define RETRY 0
#define LOG(kind,...) GNUNET_log_from (kind, "transport-unix",__VA_ARGS__)
@@ -486,7 +488,7 @@
* peer disconnected...)
* @param cont_cls closure for cont
*
- * @return the number of bytes written, -1 on errors
+ * @return on success : the number of bytes written, 0 n retry, -1 on errors
*/
static ssize_t
unix_real_send (void *cls,
@@ -511,19 +513,13 @@
if (send_handle == NULL)
{
- /* We do not have a send handle */
- GNUNET_break (0);
- if (cont != NULL)
- cont (cont_cls, target, GNUNET_SYSERR, payload, 0);
- return -1;
+ GNUNET_break (0); /* We do not have a send handle */
+ return GNUNET_SYSERR;
}
if ((addr == NULL) || (addrlen == 0))
{
- /* Can never send if we don't have an address */
- GNUNET_break (0);
- if (cont != NULL)
- cont (cont_cls, target, GNUNET_SYSERR, payload, 0);
- return -1;
+ GNUNET_break (0); /* Can never send if we don't have an address */
+ return GNUNET_SYSERR;
}
/* Prepare address */
@@ -545,86 +541,54 @@
sb = (struct sockaddr *) &un;
sbs = slen;
+resend:
/* Send the data */
sent = 0;
sent = GNUNET_NETWORK_socket_sendto (send_handle, msgbuf, msgbuf_size, sb,
sbs);
- if ((GNUNET_SYSERR == sent) && ((errno == EAGAIN) || (errno == ENOBUFS)))
+ if (GNUNET_SYSERR == sent)
{
- /* We have to retry later: retry */
- return 0;
- }
+ if ((errno == EAGAIN) || (errno == ENOBUFS))
+ return RETRY; /* We have to retry later */
+ if (errno == EMSGSIZE)
+ {
+ socklen_t size = 0;
+ socklen_t len = sizeof (size);
- if ((GNUNET_SYSERR == sent) && (errno == EMSGSIZE))
- {
- socklen_t size = 0;
- socklen_t len = sizeof (size);
-
- GNUNET_NETWORK_socket_getsockopt ((struct GNUNET_NETWORK_Handle *)
- send_handle, SOL_SOCKET, SO_SNDBUF,
&size,
- &len);
-
- if (size < msgbuf_size)
- {
- LOG (GNUNET_ERROR_TYPE_DEBUG,
- "Trying to increase socket buffer size from %i to %i for
message size %i\n",
- size,
- ((msgbuf_size / 1000) + 2) * 1000,
- msgbuf_size);
- size = ((msgbuf_size / 1000) + 2) * 1000;
- if (GNUNET_NETWORK_socket_setsockopt
- ((struct GNUNET_NETWORK_Handle *) send_handle, SOL_SOCKET, SO_SNDBUF,
- &size, sizeof (size)) == GNUNET_OK)
+ GNUNET_NETWORK_socket_getsockopt ((struct GNUNET_NETWORK_Handle *)
+ send_handle, SOL_SOCKET, SO_SNDBUF,
&size,
+ &len);
+ if (size < msgbuf_size)
{
- /* Increased buffer size, retry sending */
- return 0;
+ LOG (GNUNET_ERROR_TYPE_DEBUG,
+ "Trying to increase socket buffer size from %i to %i for
message size %i\n",
+ size, ((msgbuf_size / 1000) + 2) * 1000, msgbuf_size);
+ size = ((msgbuf_size / 1000) + 2) * 1000;
+ if (GNUNET_OK == GNUNET_NETWORK_socket_setsockopt
+ ((struct GNUNET_NETWORK_Handle *) send_handle, SOL_SOCKET,
SO_SNDBUF,
+ &size, sizeof (size)))
+ goto resend; /* Increased buffer size, retry sending */
+ else
+ {
+ /* Could not increase buffer size: error, no retry */
+ GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
+ return GNUNET_SYSERR;
+ }
}
else
{
- /* Could not increase buffer size: error, no retry */
- GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "setsockopt");
- return -1;
+ /* Buffer is bigger than message: error, no retry
+ * This should never happen!*/
+ GNUNET_break (0);
+ return GNUNET_SYSERR;
}
}
- else
- {
- /* Buffer is bigger than message: error, no retry
- * This should never happen!*/
- GNUNET_break (0);
- return -1;
- }
}
-
LOG (GNUNET_ERROR_TYPE_DEBUG,
"UNIX transmit %u-byte message to %s (%d: %s)\n",
(unsigned int) msgbuf_size, GNUNET_a2s (sb, sbs), (int) sent,
(sent < 0) ? STRERROR (errno) : "ok");
-
- /* Calling continuation */
- if (cont != NULL)
- {
- if (sent == GNUNET_SYSERR)
- cont (cont_cls, target, GNUNET_SYSERR, payload, 0);
- else if (sent > 0)
- cont (cont_cls, target, GNUNET_OK, payload, msgbuf_size);
- else
- GNUNET_break (0);
- }
-
- /* return number of bytes successfully sent */
- if (sent > 0)
- return sent;
- if (sent == 0)
- {
- /* That should never happen */
- GNUNET_break (0);
- return -1;
- }
- /* failed and retry: return 0 */
- if (GNUNET_SYSERR == sent)
- return 0;
- /* default */
- return -1;
+ return sent;
}
struct gsi_ctx
@@ -930,7 +894,7 @@
static void
unix_plugin_select_write (struct Plugin * plugin)
{
- static int retry_counter;
+ static int retry_counter = 0;
int sent = 0;
struct UNIXMessageWrapper * msgw = plugin->msg_head;
@@ -946,26 +910,26 @@
msgw->payload,
msgw->cont, msgw->cont_cls);
- if (sent == 0)
+ if (0 == sent)
{
- /* failed and retry */
- retry_counter++;
- GNUNET_STATISTICS_set (plugin->env->stats,"# UNIX retry attempt",
- retry_counter, GNUNET_NO);
- return;
+ retry_counter ++;
+ if (retry_counter <= MAX_RETRIES)
+ {
+ GNUNET_STATISTICS_update (plugin->env->stats,"# UNIX retry attempts",
+ 1, GNUNET_NO);
+ return; /* retry */
+ }
+ else
+ sent = GNUNET_SYSERR; /* abort */
}
+ retry_counter = 0;
- if (retry_counter > 0 )
+ if (GNUNET_SYSERR == sent)
{
- /* no retry: reset counter */
- retry_counter = 0;
- GNUNET_STATISTICS_set (plugin->env->stats,"# UNIX retry attempt",
- retry_counter, GNUNET_NO);
- }
+ /* failed and no retry */
+ if (NULL != msgw->cont)
+ msgw->cont (msgw->cont_cls, &msgw->session->target, GNUNET_SYSERR,
msgw->payload, 0);
- if (sent == -1)
- {
- /* failed and no retry */
GNUNET_CONTAINER_DLL_remove(plugin->msg_head, plugin->msg_tail, msgw);
GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
@@ -981,9 +945,12 @@
return;
}
- if (sent > 0)
+ else if (sent >= 0)
{
/* successfully sent bytes */
+ if (NULL != msgw->cont)
+ msgw->cont (msgw->cont_cls, &msgw->session->target, GNUNET_OK,
msgw->payload, msgw->msgsize);
+
GNUNET_CONTAINER_DLL_remove(plugin->msg_head, plugin->msg_tail, msgw);
GNUNET_assert (plugin->bytes_in_queue >= msgw->msgsize);
@@ -999,6 +966,7 @@
return;
}
+
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] r24561 - gnunet/src/transport,
gnunet <=