2 个版本 (1 个稳定版本)

2.0.0 2021年2月25日

#5 in #拜占庭

每月下载 27
byztimed 中使用

Apache-2.0 许可证

85KB
1.5K SLoC

Rust 819 SLoC // 0.1% comments C 740 SLoC // 0.1% comments

Byztime 是一种拜占庭容错协议,用于在多个对等节点之间同步时间,而不依赖于任何外部权威机构。此包封装了 byztime_sys(它又封装了 C 库 libbyztime),为从 byztimed 消耗时间的应用程序提供惯用的 Rust API。


lib.rs:

Byztime 是一种拜占庭容错协议,用于在多个对等节点之间同步时间,而不依赖于任何外部权威机构。此包封装了 [byztime_sys](它又封装了 C 库 libbyztime),为从 byztimed 消耗时间的应用程序提供惯用的 Rust API。

libbyztime 使用了一种“黑板”模式的单向通信。守护进程将时间偏移量和误差范围写入到 timedata 文件中,这是一个包含无锁数据结构的常规文件。消费者只需从文件中读取,而无需更改它或向守护进程发送任何类型的查询。

Byztime 识别三种类型的时钟

  • 本地时钟是一个表示自某个任意纪元以来经过时间的硬件时钟,例如上一次重启。在 Linux 上,这通过 CLOCK_MONOTONIC_RAW 实现。

  • 真实时钟跟踪墙时间(CLOCK_REALTIME)。Byztime 主要避免依赖它,但在网络在大量重启中失去多数时,仍然会使用它进行恢复。

  • 全局时钟是 Byztime 要同步的时钟。最初初始化时,它设置为真实时钟。最终,应该预计它会漂移,因为 Byztime 是设计来仅使节点彼此同步,而不是与任何其他东西同步。

Byztime 守护进程确定全局时钟和本地时钟之间的偏移量、该偏移量的最大误差范围以及该误差范围有效的本地时间。它将这些值记录在 timedata 文件中。消费者读取它们,然后从操作系统获取本地时间。根据这些输入,它们可以计算全局时间,以及重新计算误差范围以考虑自上次 timedata 更新以来可能发生的任何漂移。

简单消费者可以使用此包如下

  1. 可选地,调用 [install_sigbus_handler]。

  2. 使用路径调用 ConsumerContext::open 以获取 Context 对象。

  3. 可选地,调用 Context::slew。在循环中休眠并重试,直到成功。

  4. 调用 Context::global_time 获取带有误差界限的时间戳。

依赖项

~16–540KB