Я не уверен, почему в прессе вообще говорится, что Google TrueTime API трудно реплицировать (Wired, Slashdot и т.д.).
Я могу понять, как было бы трудно получить низкие интервалы ошибок, которые Google достигнет, но я не вижу, как сам API будет очень сложным.
Например, я взломал взломанную вместе версию. Здесь интервал.
typedef struct TT_interval {
struct timeval earliest;
struct timeval latest;
} TT_interval;
Здесь функция now.
int TT_now(TT_interval* interval)
{
struct ntptimeval tv;
struct timeval delta;
struct timeval* earliest_p = &(interval->earliest);
struct timeval* latest_p = &(interval->latest);
struct timeval* now_p = &(tv.time);
struct timeval* delta_p = δ
timerclear(&delta);
timerclear(&interval->earliest);
timerclear(&interval->latest);
if(ntp_gettime(&tv) == 0) {
tv.maxerror = tv.maxerror > 0 ? tv.maxerror : -(tv.maxerror);
delta.tv_sec = delta.tv_sec + (tv.maxerror / 1000);
delta.tv_usec = delta.tv_usec + ((tv.maxerror % 1000) * 1000);
if(delta.tv_usec > 1000000) {
delta.tv_usec -= 1000000;
delta.tv_sec++;
}
timeradd(now_p, delta_p, latest_p);
timersub(now_p, delta_p, earliest_p);
} else {
printf("error on ntp_gettime. %s\n", strerror(errno));
return ERROR;
}
return SUCCESS;
}
Наконец, здесь функции before и after (которые являются оболочками вокруг функции now и могут использовать немного СУХОГО рефакторинга).
int TT_before(TT_interval* interval, bool* success)
{
struct timeval* latest_p;
struct timeval* earliest_p;
TT_interval now;
if(TT_now(&now) != SUCCESS) {
return ERROR;
}
latest_p = &(interval->latest);
earliest_p = &(now.earliest);
if(timercmp(latest_p, earliest_p, <) != 0) {
*success = true;
return SUCCESS;
} else {
*success = false;
return SUCCESS;
}
return ERROR;
}
int TT_after(TT_interval* interval, bool* success)
{
struct timeval* latest_p;
struct timeval* earliest_p;
TT_interval now;
if(TT_now(&now) != SUCCESS) {
return ERROR;
}
earliest_p = &(interval->latest);
latest_p = &(now.earliest);
if(timercmp(latest_p, earliest_p, <) != 0) {
*success = true;
return SUCCESS;
} else {
*success = false;
return SUCCESS;
}
return ERROR;
}
Кажется, что я получаю интервальные ошибки в пределах от 5000 до 350 000 (используя публичный NTPd). Это далеко от цифр Google, но вам нужно где-то начать.
Помимо тусклой производительности, есть ли главный недостаток в этом дизайне, который предотвратил бы создание чего-то вроде Spanner сверху?