Как метод «после» и «до» реализован в Google Spanner truetime? - PullRequest
1 голос
/ 04 июля 2019

По словам их пейджера, в нем говорится: «Методы TT.after () и TT.before () являются удобными обертками вокруг TT.now ()».

А согласно Что такое API TrueTime в Google Spanner?

Он также предоставляет две функции:

  1. после того, как (t) вернет true, если t определенно прошел. Например. t <сейчас (). самое раннее. </li>
  2. before (t) возвращает true, если t определенно не прибыл, или t> now (). Latest.

Мой вопрос:

  1. На всех серверах в гаечном ключе TT.now() возвращает одинаковый результат?
  2. Возможно ли для заданного времени t, что на сервере A before(t) верно, а на сервере B - false?
  3. Они монотонные? например На сервере A TT.after(t) - это правда, а когда-нибудь позже, возможно ли, что TT.after(t) - это ложь?

Ответы [ 2 ]

2 голосов
/ 05 июля 2019

Подробнее о работе Truetime и Spanner см. В разделе 3 Spanner Whitpaper (1) .

Обсуждение того, как это можно реализовать, находится в вопросе "Почему API Google TrueTime трудно дублировать?"(2)

В официальном документе Spanner значение TrueTime представляет собой не одно значение, а отметку времени диапазон , которая гарантированно содержит абсолютное значение.Этот диапазон учитывает потенциальный дрейф часов - который в сети Google с синхронизацией часов сервера с атомным / GPS эталонным временем каждые 30 сек составляет до 7 мс (из документа).

Так что если TTstamp1это диапазон (t1_lo, t1_hi) и TTstamp2 это диапазон (t2_lo, t2_hi), тогда before() и after() просто сравнивают крайние значения этих диапазонов, чтобы убедиться, что они не перекрываются.

TTstamp1.before(TTValue2) = t1_hi < t2_lo
TTstamp1.after(TTValue2) = t1_lo > t2_hi

Ответ на ваши вопросы, таким образом:

  1. Нет, TT.now() не возвращает одинаковый результат на всех серверах, даже если он вызывается с точно такой жемгновенный.Однако значения, полученные на всех серверах при вызове в этот момент, будут перекрывать друг друга, а это означает, что ни один из них не является ни до, ни после друг друга.

  2. Таким образом, для данного TrueTime t технически возможно , что на сервере A t.before(now) равно true и на сервере B t.before(now)false из-за сравнения перекрытий и различий между возможными диапазонами.Это не проблема для Spanner, поскольку он будет ждать , пока не будет перекрытия (t.before(now)==true), прежде чем совершать транзакцию и сохранять ее временную метку.

(Примечание: эта информация взята из публичных технических документов и документации)

0 голосов
/ 17 июля 2019

Согласно рисунку ниже, TT.after(t) - это TT.now().earliest > t, так что я думаю, вполне возможно, что TT.before(t) - это TT.now().latest < t.

Попробуйте ответить на мой вопрос:

  1. TT.now () не возвращает одинаковый результат на всех серверах одновременно.
  2. Да, это возможно. Хотя для случая TT.after() это означает, что время t определенно прошло только на некоторых серверах.
  3. Я не знаю. Если это возможно, то это означает, что t определенно пройден, а затем не уверен насчет этого, что звучит немного странно

Я думаю, что «определенно» в их описании немного вводит в заблуждение, они просто должны быть «выше, чем самые последние» или «ниже, чем самые ранние»

enter image description here

...