[chrony/f20] reconnect client sockets (#1124059)
Miroslav Lichvar
mlichvar at fedoraproject.org
Fri Aug 15 10:13:17 UTC 2014
commit 2e02b570e333ef2a7725e805ef634829367ffa33
Author: Miroslav Lichvar <mlichvar at redhat.com>
Date: Fri Aug 15 11:56:28 2014 +0200
reconnect client sockets (#1124059)
chrony-reconnect.patch | 85 ++++++++++++++++++++++++++++++++++++++++++++++++
chrony.spec | 2 +
2 files changed, 87 insertions(+), 0 deletions(-)
---
diff --git a/chrony-reconnect.patch b/chrony-reconnect.patch
new file mode 100644
index 0000000..7748447
--- /dev/null
+++ b/chrony-reconnect.patch
@@ -0,0 +1,85 @@
+diff --git a/ntp_core.c b/ntp_core.c
+--- a/ntp_core.c
++++ b/ntp_core.c
+@@ -279,12 +332,17 @@ start_initial_timeout(NCR_Instance inst)
+
+ /* Mark source active */
+ SRC_SetActive(inst->source);
++ }
++}
+
+- /* Open client socket */
+- if (inst->mode == MODE_CLIENT) {
+- assert(inst->local_addr.sock_fd == INVALID_SOCK_FD);
+- inst->local_addr.sock_fd = NIO_GetClientSocket(&inst->remote_addr);
+- }
++/* ================================================== */
++
++static void
++close_client_socket(NCR_Instance inst)
++{
++ if (inst->mode == MODE_CLIENT && inst->local_addr.sock_fd != INVALID_SOCK_FD) {
++ NIO_CloseClientSocket(inst->local_addr.sock_fd);
++ inst->local_addr.sock_fd = INVALID_SOCK_FD;
+ }
+ }
+
+@@ -305,11 +363,7 @@ take_offline(NCR_Instance inst)
+ /* And inactive */
+ SRC_UnsetActive(inst->source);
+
+- /* Close client socket */
+- if (inst->mode == MODE_CLIENT && inst->local_addr.sock_fd != INVALID_SOCK_FD) {
+- NIO_CloseClientSocket(inst->local_addr.sock_fd);
+- inst->local_addr.sock_fd = INVALID_SOCK_FD;
+- }
++ close_client_socket(inst);
+
+ NCR_ResetInstance(inst);
+ }
+@@ -328,7 +382,7 @@ NCR_GetInstance(NTP_Remote_Address *remote_addr, NTP_Source_Type type, SourcePar
+
+ switch (type) {
+ case NTP_SERVER:
+- /* Client socket will be obtained when timer is started */
++ /* Client socket will be obtained when sending request */
+ result->local_addr.sock_fd = INVALID_SOCK_FD;
+ result->mode = MODE_CLIENT;
+ break;
+@@ -758,6 +812,13 @@ transmit_timeout(void *arg)
+ DEBUG_LOG(LOGF_NtpCore, "Transmit timeout for [%s:%d]",
+ UTI_IPToString(&inst->remote_addr.ip_addr), inst->remote_addr.port);
+
++ /* Open new client socket */
++ if (inst->mode == MODE_CLIENT) {
++ close_client_socket(inst);
++ assert(inst->local_addr.sock_fd == INVALID_SOCK_FD);
++ inst->local_addr.sock_fd = NIO_GetClientSocket(&inst->remote_addr);
++ }
++
+ /* Check whether we need to 'warm up' the link to the other end by
+ sending an echo exchange to ensure both ends' ARP caches are
+ primed. On loaded systems this might also help ensure that bits
+@@ -1257,6 +1318,10 @@ receive_packet(NTP_Packet *message, struct timeval *now, double now_err, NCR_Ins
+ adjust_poll(inst, 0.1);
+ }
+
++ /* If in client mode, no more packets are expected to be coming from the
++ server and the socket can be closed */
++ close_client_socket(inst);
++
+ requeue_transmit = 1;
+ }
+
+diff --git a/ntp_io.c b/ntp_io.c
+--- a/ntp_io.c
++++ b/ntp_io.c
+@@ -273,7 +266,7 @@ connect_socket(int sock_fd, NTP_Remote_Address *remote_addr)
+ }
+
+ if (connect(sock_fd, &addr.u, addr_len) < 0) {
+- LOG(LOGS_ERR, LOGF_NtpIO, "Could not connect NTP socket to %s:%d : %s",
++ DEBUG_LOG(LOGF_NtpIO, "Could not connect NTP socket to %s:%d : %s",
+ UTI_IPToString(&remote_addr->ip_addr), remote_addr->port,
+ strerror(errno));
+ return 0;
diff --git a/chrony.spec b/chrony.spec
index 3365582..4e6af93 100644
--- a/chrony.spec
+++ b/chrony.spec
@@ -22,6 +22,7 @@ Source9: chrony-wait.service
# simulator for test suite from https://github.com/mlichvar/clknetsim.git
Source10: clknetsim-%{clknetsim_ver}.tar.gz
%{?gitpatch:Patch0: chrony-%{version}%{?prerelease}-%{gitpatch}.patch.gz}
+Patch1: chrony-reconnect.patch
BuildRequires: libcap-devel libedit-devel nss-devel pps-tools-devel
BuildRequires: bison texinfo systemd-units
@@ -46,6 +47,7 @@ clocks, system real-time clock or manual input as time references.
%prep
%setup -q -n %{name}-%{version}%{?prerelease} -a 10
%{?gitpatch:%patch0 -p1}
+%patch1 -p1 -b .reconnect
%{?gitpatch: echo %{version}-%{gitpatch} > version.txt}
More information about the scm-commits
mailing list