Como consertar o segundo problema de suspensão sem reiniciar

4

Descobri que, após a inserção mais recente do segundo bissexto (2016-12-31 23:59:60), nosso aplicativo CentOS7 que tem segmentos de trabalho aguardando por 1 segundo entre os trabalhos, começou a ativar os encadeamentos do sono imediatamente em vez de em um segundo. Em geral, todos os dormidos estão acordados 1 segundo antes do tempo de vigília esperado.

A solução mais simples e funcional é reinicializar a caixa. Mas isso não é desejável no nosso caso. Existe uma maneira de corrigir isso sem reiniciar?

PS. Para referência, aqui está um programa simples em C ++ que reproduz o 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;
}

Construção:

g++ sleep_test.cpp -Wl,-Bstatic -lboost_thread -lboost_system -lboost_date_time -Wl,-Bdynamic -rdynamic -pthread
    
por amosk 13.01.2017 / 22:51

2 respostas

0

Além do que Troy disse, nos sistemas RHEL7 que não atualizaram o tzdata no momento em que o segundo bissexto é aplicado e não está executando o ntpd, é necessário um passo extra - ajuste manualmente o tempo em 1 segundo para a frente e depois reverta:

date -s "+1 sec"
date -s "-1 sec"
    
por 26.01.2017 / 13:36
5

A hora do seu sistema está sincronizada com ntpd ou ptp ? Caso contrário, atualize seu pacote tzdata .

For systems not synchronized by ntpd or ptp an updated tzdata package that contains the December 31st leap second is required. The updated tzdata package was released as part of RHEA-2016-1982, and any systems using RHEL 7 that are not synchronized by ntpd or ptp should update to tzdata-2016g-2.el7, or a later version, to receive this fix.

Resolva os problemas do segundo salto no Red Hat Enterprise Linux

    
por 14.01.2017 / 00:22