using namespace isc::log;
using namespace isc::util;
+namespace {
+
+/// @brief Timeout for synchronization of leases with partner.
+///
+/// This timeout is very high because in some cases the number of
+/// gathered leases is huge. Syncing should not really take that
+/// long, but if the partner doesn't respond we can't do anything
+/// useful anyway. So, it doesn't really matter.
+const long HA_SYNC_TIMEOUT = 60000;
+
+}
+
namespace isc {
namespace ha {
post_sync_action(error_message.empty(),
error_message);
}
- });
+ }, HttpClient::RequestTimeout(HA_SYNC_TIMEOUT));
}
ConstElementPtr
boost::scoped_ptr<SocketInfo> candidate;
IfacePtr iface;
fd_set sockets;
+ fd_set write_sockets;
int maxfd = 0;
FD_ZERO(&sockets);
+ FD_ZERO(&write_sockets);
/// @todo: marginal performance optimization. We could create the set once
/// and then use its copy for select(). Please note that select() modifies
if (!callbacks_.empty()) {
BOOST_FOREACH(SocketCallbackInfo s, callbacks_) {
FD_SET(s.socket_, &sockets);
+
+ // Sometimes we want to react to socket writes, not only to reads.
+ // However, current use cases are limited to CommandMgr which
+ // doesn't trigger any callbacks. For all use cases that install
+ // callbacks we don't react to socket reads being afraid what we
+ // can break.
+ /// @todo This whole solution is temporary and implemented for
+ /// #5649.
+ if (!s.callback_) {
+ FD_SET(s.socket_, &write_sockets);
+ }
if (maxfd < s.socket_) {
maxfd = s.socket_;
}
// zero out the errno to be safe
errno = 0;
- int result = select(maxfd + 1, &sockets, NULL, NULL, &select_timeout);
+ int result = select(maxfd + 1, &sockets, &write_sockets, NULL, &select_timeout);
if (result == 0) {
// nothing received and timeout has been reached
boost::scoped_ptr<SocketInfo> candidate;
fd_set sockets;
+ fd_set write_sockets;
int maxfd = 0;
FD_ZERO(&sockets);
+ FD_ZERO(&write_sockets);
/// @todo: marginal performance optimization. We could create the set once
/// and then use its copy for select(). Please note that select() modifies
BOOST_FOREACH(SocketCallbackInfo s, callbacks_) {
// Add it to the set as well
FD_SET(s.socket_, &sockets);
+
+ // Sometimes we want to react to socket writes, not only to reads.
+ // However, current use cases are limited to CommandMgr which
+ // doesn't trigger any callbacks. For all use cases that install
+ // callbacks we don't react to socket reads being afraid what we
+ // can break.
+ /// @todo This whole solution is temporary and implemented for
+ /// #5649.
+ if (!s.callback_) {
+ FD_SET(s.socket_, &write_sockets);
+ }
if (maxfd < s.socket_) {
maxfd = s.socket_;
}
// zero out the errno to be safe
errno = 0;
- int result = select(maxfd + 1, &sockets, NULL, NULL, &select_timeout);
+ int result = select(maxfd + 1, &sockets, &write_sockets, NULL, &select_timeout);
if (result == 0) {
// nothing received and timeout has been reached