
Descubrí que después de la última inserción del segundo intercalar (2016-12-31 23:59:60), nuestra aplicación CentOS7 que tiene subprocesos de trabajo inactivos durante 1 segundo entre trabajos, comenzó a activar los subprocesos inactivos inmediatamente en lugar de en un segundo. En general, todos los que duermen se despiertan 1 segundo antes de la hora prevista para despertarse.
La solución más sencilla y funcional es reiniciar la caja. Pero eso no es deseable en nuestro caso. ¿Hay alguna manera de solucionar este problema sin reiniciar?
PD. Como referencia, aquí hay un programa simple en C++ que reproduce el problema.
#include <boost/date_time.hpp>
#include <boost/thread.hpp>
#include <iostream>
using namespace std;
// this has to be run in a thread to be able to detect the issue
void check_thread()
{
size_t expected_delay = 1000;
cout << "Expected delay: " << expected_delay << " ms" << endl;
boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::universal_time();
boost::this_thread::sleep(boost::posix_time::milliseconds(1000));
boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::universal_time();
size_t actual_delay = (t2 - t1).total_milliseconds();
cout << "Actual delay: " << actual_delay << " ms" << endl;
if (abs(expected_delay - actual_delay) > 900) {
cout << "Too big delay difference: " << (expected_delay - actual_delay) << endl;
cout << "Possible leap second issue" << endl;
}
else {
cout << "No issues found" << endl;
}
}
int main()
{
boost::thread_group g;
g.create_thread(check_thread);
g.join_all();
return 0;
}
Edificio:
g++ sleep_test.cpp -Wl,-Bstatic -lboost_thread -lboost_system -lboost_date_time -Wl,-Bdynamic -rdynamic -pthread
Respuesta1
¿La hora de su sistema está sincronizada con ntpd
o ptp
? Si no, actualice su tzdata
paquete.
Para sistemas no sincronizados mediante ntpd o ptp, se requiere un paquete tzdata actualizado que contenga el segundo intercalar del 31 de diciembre. El paquete tzdata actualizado se lanzó como parte de RHEA-2016-1982, y cualquier sistema que use RHEL 7 que no esté sincronizado mediante ntpd o ptp debe actualizarse a tzdata-2016g-2.el7, o una versión posterior, para recibir esta solución.
Resolver problemas de segundo bisiesto en Red Hat Enterprise Linux
Respuesta2
Además de lo que dijo Troy, en los sistemas RHEL7 que no habían actualizado tzdata en el momento en que se aplica el segundo intercalar y que no ejecutan ntpd, se requiere un paso adicional: configure manualmente el tiempo 1 segundo hacia adelante y luego reviertalo:
date -s "+1 sec"
date -s "-1 sec"