Tôi không chắc tại sao báo chí nói chung rằng API TrueTime của Google khó tái tạo (Có dây, Slashdot, v.v.).Tại sao API TrueTime của Google lại khó sao chép?
Tôi có thể hiểu rằng sẽ khó khăn như thế nào để nhận được khoảng thời gian lỗi thấp mà Google đang đạt được, nhưng tôi không thấy bản thân API sẽ rất khó khăn như thế nào.
Ví dụ: tôi đã bỏ một phiên bản bị tấn công cùng nhau. Đây là khoảng thời gian.
typedef struct TT_interval {
struct timeval earliest;
struct timeval latest;
} TT_interval;
Đây là chức năng hiện tại.
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;
}
Cuối cùng, đây là chức năng trước và sau (có hàm bao quanh hàm hiện tại và có thể sử dụng một chút phép tái cấu trúc DRY).
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;
}
Dường như tôi nhận được lỗi khoảng 5.000us đến 350.000us (sử dụng NTP công khai). Đây là một con số rất xa so với con số của Google, nhưng bạn cần phải bắt đầu từ đâu đó.
Khác với hiệu suất mờ nhạt, có một lỗ hổng lớn nào trong thiết kế này có thể ngăn chặn thứ gì đó giống như Spanner được xây dựng trên đầu trang không?
Chúng tôi vừa xuất bản một tài liệu mới về TrueTime và cách nó được sử dụng - https://cloud.google.com/spanner/docs/true-time-external-consistency –