#undo #latency #no-std #rollback #generic #log #chunk

no-std retrace

安全、通用的可预测延迟回滚日志

1 个不稳定版本

0.1.0 2021 年 10 月 10 日

#2350数据结构

MIT/Apache

38KB
653

retrace

本包实现了一个安全、通用的可预测延迟回滚日志。

[dependencies]
retrace = "0.1.0"

Retrace 类型被实现为一个扁平块的不可锁链表。为了保持插入延迟的可预测性,它简单地缓冲它们,而不将它们应用于“尖端”状态,直到有足够的意图来处理一个块。然后构建块,将其 prepends 到链表中,并在大多数情况下在后台任务中实际产生尖端的状态。一旦完成,这个结果就被原子地放回到列表中,而不会影响现有的读者并加快后续查询的速度。

本包只包含安全代码,并声明了 #[forbid)

使用场景

本包的编写考虑了以下特性的用例,你的使用情况可能会有所不同

  • 追加操作必须快,并且不应有延迟峰值。
  • 追加操作是逐渐发生的,而不是一次性完成的。
  • 只要它不阻塞主线程,浪费一些 CPU 周期是可以接受的。

示例

use retrace::{Retrace, Reproducible, Options};

// For the example, a simple integer is used as state. A real world example
// would have a much more complex structure in place of this.
#[derive(Clone, PartialEq, Eq, Debug)]
struct Foo(i32);

impl Reproducible for Foo {
    type Intent = i32;
    type Error = ();

    fn apply(&mut self, intent: &Self::Intent) -> Result<(), Self::Error> {
        self.0 += *intent;
        Ok(())
    }
}

let mut retrace = Retrace::new(Foo(0), Options::default());

for i in 1..=100 {
    retrace.append(i);
}

for i in (1..=100).rev() {
    assert_eq!(
        Foo((1 + i) * i / 2),
        retrace.eval((100 - i) as usize).unwrap()
    );
}

功能

  • std: 默认启用。将 NativeSpawner 设置为默认的 Spawner。禁用此默认功能以支持 no-std

基准测试

$ cargo install cargo-criterion # if you haven't yet
$ cargo criterion --features=bench

由于缓存对于 retrace 是至关重要的,因此仅使用公共 API 难以对冷性能进行基准测试。 bench 功能提供了 Retrace::decache 方法,该方法用于基准测试冷查询性能。这对于任何其他目的都不是非常有用,并且除非用于基准测试,否则不应使用。

依赖关系

~185KB