gnunet-svn
[Top][All Lists]
Advanced

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

[taler-exchange] branch master updated: proposed fix for #6667


From: gnunet
Subject: [taler-exchange] branch master updated: proposed fix for #6667
Date: Thu, 31 Dec 2020 21:23:36 +0100

This is an automated email from the git hooks/post-receive script.

grothoff pushed a commit to branch master
in repository exchange.

The following commit(s) were added to refs/heads/master by this push:
     new 3399ece8 proposed fix for #6667
3399ece8 is described below

commit 3399ece8c3600ab630b9c99d47f6c3511c5c72f2
Author: Christian Grothoff <christian@grothoff.org>
AuthorDate: Thu Dec 31 21:23:33 2020 +0100

    proposed fix for #6667
---
 src/util/taler-helper-crypto-eddsa.c | 42 ++++++++++++++++++++++++++----------
 src/util/taler-helper-crypto-rsa.c   | 42 ++++++++++++++++++++++++++----------
 2 files changed, 62 insertions(+), 22 deletions(-)

diff --git a/src/util/taler-helper-crypto-eddsa.c 
b/src/util/taler-helper-crypto-eddsa.c
index 6cf4c466..8e05302c 100644
--- a/src/util/taler-helper-crypto-eddsa.c
+++ b/src/util/taler-helper-crypto-eddsa.c
@@ -432,7 +432,13 @@ free_key (struct Key *key)
 
 
 /**
- * Send a message starting with @a hdr to @a client.
+ * Send a message starting with @a hdr to @a client.  We expect that
+ * the client is mostly able to handle everything at whatever speed
+ * we have (after all, the crypto should be the slow part). However,
+ * especially on startup when we send all of our keys, it is possible
+ * that the client cannot keep up. In that case, we throttle when
+ * sending fails. This does not work with poll() as we cannot specify
+ * the sendto() target address with poll(). So we nanosleep() instead.
  *
  * @param addr address where to send the message
  * @param addr_size number of bytes in @a addr
@@ -446,18 +452,32 @@ transmit (const struct sockaddr_un *addr,
 {
   ssize_t ret;
 
-  ret = GNUNET_NETWORK_socket_sendto (unix_sock,
-                                      hdr,
-                                      ntohs (hdr->size),
-                                      (const struct sockaddr *) addr,
-                                      addr_size);
-  if (ret != ntohs (hdr->size))
+  for (unsigned int i = 0; i<100; i++)
   {
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO,
-                         "sendto");
-    return GNUNET_SYSERR;
+    ret = GNUNET_NETWORK_socket_sendto (unix_sock,
+                                        hdr,
+                                        ntohs (hdr->size),
+                                        (const struct sockaddr *) addr,
+                                        addr_size);
+    if ( (-1 == ret) &&
+         (EAGAIN == errno) )
+    {
+      /* Wait a bit, in case client is just too slow */
+      struct timespec req = {
+        .tv_sec = 0,
+        .tv_nsec = 1000
+      };
+      nanosleep (&req, NULL);
+      continue;
+    }
+    if (ret == ntohs (hdr->size))
+      return GNUNET_OK;
+    if (ret != ntohs (hdr->size))
+      break;
   }
-  return GNUNET_OK;
+  GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
+                       "sendto");
+  return GNUNET_SYSERR;
 }
 
 
diff --git a/src/util/taler-helper-crypto-rsa.c 
b/src/util/taler-helper-crypto-rsa.c
index c581be31..9539277c 100644
--- a/src/util/taler-helper-crypto-rsa.c
+++ b/src/util/taler-helper-crypto-rsa.c
@@ -498,7 +498,13 @@ free_dk (struct DenominationKey *dk)
 
 
 /**
- * Send a message starting with @a hdr to @a client.
+ * Send a message starting with @a hdr to @a client.  We expect that
+ * the client is mostly able to handle everything at whatever speed
+ * we have (after all, the crypto should be the slow part). However,
+ * especially on startup when we send all of our keys, it is possible
+ * that the client cannot keep up. In that case, we throttle when
+ * sending fails. This does not work with poll() as we cannot specify
+ * the sendto() target address with poll(). So we nanosleep() instead.
  *
  * @param addr address where to send the message
  * @param addr_size number of bytes in @a addr
@@ -512,18 +518,32 @@ transmit (const struct sockaddr_un *addr,
 {
   ssize_t ret;
 
-  ret = GNUNET_NETWORK_socket_sendto (unix_sock,
-                                      hdr,
-                                      ntohs (hdr->size),
-                                      (const struct sockaddr *) addr,
-                                      addr_size);
-  if (ret != ntohs (hdr->size))
+  for (unsigned int i = 0; i<100; i++)
   {
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO,
-                         "sendto");
-    return GNUNET_SYSERR;
+    ret = GNUNET_NETWORK_socket_sendto (unix_sock,
+                                        hdr,
+                                        ntohs (hdr->size),
+                                        (const struct sockaddr *) addr,
+                                        addr_size);
+    if ( (-1 == ret) &&
+         (EAGAIN == errno) )
+    {
+      /* Wait a bit, in case client is just too slow */
+      struct timespec req = {
+        .tv_sec = 0,
+        .tv_nsec = 1000
+      };
+      nanosleep (&req, NULL);
+      continue;
+    }
+    if (ret == ntohs (hdr->size))
+      return GNUNET_OK;
+    if (ret != ntohs (hdr->size))
+      break;
   }
-  return GNUNET_OK;
+  GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING,
+                       "sendto");
+  return GNUNET_SYSERR;
 }
 
 

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

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