summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Sustrik <sustrik@250bpm.com>2010-10-17 09:54:12 +0200
committerMartin Sustrik <sustrik@250bpm.com>2010-10-17 09:54:12 +0200
commite8e2944f45eab3e22dc46ceac3225a886ca468ad (patch)
treecc37fe526ffe74b2f48130ca9810f63cdb518f27
parent8b8837688a97c4d05aff01a6dea7ac5a35b21fa2 (diff)
ZMQ_RECONNECT_IVL socket options added.
Signed-off-by: Martin Sustrik <sustrik@250bpm.com>
-rw-r--r--doc/zmq_getsockopt.txt15
-rw-r--r--doc/zmq_setsockopt.txt13
-rw-r--r--include/zmq.h1
-rw-r--r--src/config.hpp3
-rw-r--r--src/options.cpp59
-rw-r--r--src/options.hpp3
-rw-r--r--src/zmq_connecter.cpp15
-rw-r--r--src/zmq_connecter.hpp2
8 files changed, 80 insertions, 31 deletions
diff --git a/doc/zmq_getsockopt.txt b/doc/zmq_getsockopt.txt
index 54d6b58..903d95f 100644
--- a/doc/zmq_getsockopt.txt
+++ b/doc/zmq_getsockopt.txt
@@ -212,8 +212,8 @@ Default value:: 0
Applicable socket types:: all
-ZMQ_LINGER: Set linger period for socket shutdown
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ZMQ_LINGER: Retrieve linger period for socket shutdown
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The 'ZMQ_LINGER' option shall retrieve the period for pending outbound
messages to linger in memory after closing the socket. Value of -1 means
infinite. Pending messages will be kept until they are fully transferred to
@@ -227,6 +227,17 @@ Option value unit:: milliseconds
Default value:: -1
Applicable socket types:: all
+ZMQ_RECONNECT_IVL: Retrieve reconnect period for connection-based transports
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The 'ZMQ_RECONNECT' option shall retrieve the period indicating how long it
+takes for a disconnected underlying connection to attempt to reconnect.
+
+[horizontal]
+Option value type:: int
+Option value unit:: milliseconds
+Default value:: 100
+Applicable socket types:: all
+
ZMQ_FD: Retrieve file descriptor associated with the socket
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
diff --git a/doc/zmq_setsockopt.txt b/doc/zmq_setsockopt.txt
index 5cbdaf6..e2747c0 100644
--- a/doc/zmq_setsockopt.txt
+++ b/doc/zmq_setsockopt.txt
@@ -232,6 +232,19 @@ Default value:: -1
Applicable socket types:: all
+ZMQ_RECONNECT_IVL: Set reconnect period for connection-based transports
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+The 'ZMQ_RECONNECT' option shall be set to specify how long it takes for a
+disconnected underlying connection to attempt to reconnect. The interval
+can be randomised to some extent by 0MQ to prevent reconnection storms.
+
+[horizontal]
+Option value type:: int
+Option value unit:: milliseconds
+Default value:: 100
+Applicable socket types:: all
+
+
RETURN VALUE
------------
The _zmq_setsockopt()_ function shall return zero if successful. Otherwise it
diff --git a/include/zmq.h b/include/zmq.h
index b565c50..f4d2656 100644
--- a/include/zmq.h
+++ b/include/zmq.h
@@ -192,6 +192,7 @@ ZMQ_EXPORT int zmq_term (void *context);
#define ZMQ_EVENTS 15
#define ZMQ_TYPE 16
#define ZMQ_LINGER 17
+#define ZMQ_RECONNECT_IVL 18
/* Send/recv options. */
#define ZMQ_NOBLOCK 1
diff --git a/src/config.hpp b/src/config.hpp
index 3f57be2..7d5ce52 100644
--- a/src/config.hpp
+++ b/src/config.hpp
@@ -69,9 +69,6 @@ namespace zmq
// Maximum number of events the I/O thread can process in one go.
max_io_events = 256,
- // How long to wait (milliseconds) till reattempting to connect.
- reconnect_period = 100,
-
// Should initial connection attempts be delayed?
wait_before_connect = false,
diff --git a/src/options.cpp b/src/options.cpp
index c9e330f..5e92e74 100644
--- a/src/options.cpp
+++ b/src/options.cpp
@@ -35,6 +35,7 @@ zmq::options_t::options_t () :
rcvbuf (0),
type (-1),
linger (-1),
+ reconnect_ivl (100),
requires_in (false),
requires_out (false),
immediate_connect (true)
@@ -137,6 +138,18 @@ int zmq::options_t::setsockopt (int option_, const void *optval_,
}
linger = *((int*) optval_);
return 0;
+
+ case ZMQ_RECONNECT_IVL:
+ if (optvallen_ != sizeof (int)) {
+ errno = EINVAL;
+ return -1;
+ }
+ if (*((int*) optval_) < 0) {
+ errno = EINVAL;
+ return -1;
+ }
+ reconnect_ivl = *((int*) optval_);
+ return 0;
}
errno = EINVAL;
@@ -147,24 +160,6 @@ int zmq::options_t::getsockopt (int option_, void *optval_, size_t *optvallen_)
{
switch (option_) {
- case ZMQ_LINGER:
- if (*optvallen_ < sizeof (int)) {
- errno = EINVAL;
- return -1;
- }
- *((int*) optval_) = linger;
- *optvallen_ = sizeof (int);
- return 0;
-
- case ZMQ_TYPE:
- if (*optvallen_ < sizeof (int)) {
- errno = EINVAL;
- return -1;
- }
- *((int*) optval_) = type;
- *optvallen_ = sizeof (int);
- return 0;
-
case ZMQ_HWM:
if (*optvallen_ < sizeof (uint64_t)) {
errno = EINVAL;
@@ -246,6 +241,34 @@ int zmq::options_t::getsockopt (int option_, void *optval_, size_t *optvallen_)
*((uint64_t*) optval_) = rcvbuf;
*optvallen_ = sizeof (uint64_t);
return 0;
+
+ case ZMQ_TYPE:
+ if (*optvallen_ < sizeof (int)) {
+ errno = EINVAL;
+ return -1;
+ }
+ *((int*) optval_) = type;
+ *optvallen_ = sizeof (int);
+ return 0;
+
+ case ZMQ_LINGER:
+ if (*optvallen_ < sizeof (int)) {
+ errno = EINVAL;
+ return -1;
+ }
+ *((int*) optval_) = linger;
+ *optvallen_ = sizeof (int);
+ return 0;
+
+ case ZMQ_RECONNECT_IVL:
+ if (*optvallen_ < sizeof (int)) {
+ errno = EINVAL;
+ return -1;
+ }
+ *((int*) optval_) = reconnect_ivl;
+ *optvallen_ = sizeof (int);
+ return 0;
+
}
errno = EINVAL;
diff --git a/src/options.hpp b/src/options.hpp
index 9b57ab6..47a0d63 100644
--- a/src/options.hpp
+++ b/src/options.hpp
@@ -57,6 +57,9 @@ namespace zmq
// Linger time, in milliseconds.
int linger;
+ // Interval between attempts to reconnect, in milliseconds.
+ int reconnect_ivl;
+
// These options are never set by the user directly. Instead they are
// provided by the specific socket type.
bool requires_in;
diff --git a/src/zmq_connecter.cpp b/src/zmq_connecter.cpp
index 82c3ca1..2dd9576 100644
--- a/src/zmq_connecter.cpp
+++ b/src/zmq_connecter.cpp
@@ -54,20 +54,21 @@ zmq::zmq_connecter_t::~zmq_connecter_t ()
rm_fd (handle);
}
-int zmq::zmq_connecter_t::get_reconnect_period ()
+int zmq::zmq_connecter_t::get_reconnect_ivl ()
{
#if defined ZMQ_HAVE_WINDOWS
- return (reconnect_period + (((int)GetCurrentProcessId () * 13)
- % reconnect_period));
+ return (options.reconnect_ivl + (((int) GetCurrentProcessId () * 13)
+ % options.reconnect_ivl));
#else
- return (reconnect_period + (((int)getpid () * 13) % reconnect_period));
+ return (options.reconnect_ivl + (((int) getpid () * 13)
+ % options.reconnect_ivl));
#endif
}
void zmq::zmq_connecter_t::process_plug ()
{
if (wait)
- add_timer (get_reconnect_period (), reconnect_timer_id);
+ add_timer (get_reconnect_ivl (), reconnect_timer_id);
else
start_connecting ();
}
@@ -90,7 +91,7 @@ void zmq::zmq_connecter_t::out_event ()
if (fd == retired_fd) {
tcp_connecter.close ();
wait = true;
- add_timer (get_reconnect_period (), reconnect_timer_id);
+ add_timer (get_reconnect_ivl (), reconnect_timer_id);
return;
}
@@ -139,5 +140,5 @@ void zmq::zmq_connecter_t::start_connecting ()
// Handle any other error condition by eventual reconnect.
wait = true;
- add_timer (get_reconnect_period (), reconnect_timer_id);
+ add_timer (get_reconnect_ivl (), reconnect_timer_id);
}
diff --git a/src/zmq_connecter.hpp b/src/zmq_connecter.hpp
index 3af78cb..f9ff7ba 100644
--- a/src/zmq_connecter.hpp
+++ b/src/zmq_connecter.hpp
@@ -56,7 +56,7 @@ namespace zmq
void start_connecting ();
// Internal function to return the reconnect backoff delay.
- int get_reconnect_period ();
+ int get_reconnect_ivl ();
// Actual connecting socket.
tcp_connecter_t tcp_connecter;