summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordefanor <defanor@uberspace.net>2020-03-02 03:39:32 +0300
committerdefanor <defanor@uberspace.net>2020-03-02 03:47:05 +0300
commit3b38c1223851ac41288644e0b7618655f75fd89a (patch)
tree06f9f5943e82598a3b8ae8bc95de12df5a9bdb48
parent2f504fef5de92f6f37d69dd0eaef9d7eba5e29a9 (diff)
Improve reconnect timings
-rw-r--r--src/rexmpp.c22
-rw-r--r--src/rexmpp.h1
2 files changed, 16 insertions, 7 deletions
diff --git a/src/rexmpp.c b/src/rexmpp.c
index 1ebe509..2ac87ce 100644
--- a/src/rexmpp.c
+++ b/src/rexmpp.c
@@ -16,6 +16,7 @@
#include <libxml/tree.h>
#include <libxml/xmlsave.h>
#include <gnutls/gnutls.h>
+#include <gnutls/crypto.h>
#include <gnutls/x509.h>
#include <gsasl.h>
@@ -257,15 +258,22 @@ void rexmpp_done (rexmpp_t *s) {
}
void rexmpp_schedule_reconnect (rexmpp_t *s) {
- gettimeofday(&(s->next_reconnect_time), NULL);
- if (s->reconnect_number < 10) {
- s->next_reconnect_time.tv_sec += (8 << s->reconnect_number);
- } else {
- s->next_reconnect_time.tv_sec += 3600;
+ if (s->reconnect_number == 0) {
+ gnutls_rnd(GNUTLS_RND_NONCE, &s->reconnect_seconds, sizeof(time_t));
+ if (s->reconnect_seconds < 0) {
+ s->reconnect_seconds = - s->reconnect_seconds;
+ }
+ s->reconnect_seconds %= 60;
}
- rexmpp_log(s, LOG_DEBUG, "Scheduled reconnect number %d, for %u.%u",
+ time_t seconds = s->reconnect_seconds << s->reconnect_number;
+ if (seconds > 3600) {
+ seconds = 3600;
+ }
+ gettimeofday(&(s->next_reconnect_time), NULL);
+ s->next_reconnect_time.tv_sec += seconds;
+ rexmpp_log(s, LOG_DEBUG, "Scheduled reconnect number %d, in %d seconds",
s->reconnect_number,
- s->next_reconnect_time.tv_sec, s->next_reconnect_time.tv_usec);
+ seconds);
s->reconnect_number++;
}
diff --git a/src/rexmpp.h b/src/rexmpp.h
index 08edf43..411be7d 100644
--- a/src/rexmpp.h
+++ b/src/rexmpp.h
@@ -206,6 +206,7 @@ struct rexmpp
/* Connection and stream management. */
unsigned int id_counter;
unsigned int reconnect_number;
+ time_t reconnect_seconds;
struct timeval next_reconnect_time;
xmlNodePtr stanza_queue;
uint32_t stanzas_out_count;