gnunet-svn
[Top][All Lists]
Advanced

[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;
   }
 
+
 }
 
 




reply via email to

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