:info
的结果,再或者是抛出一个异常),我们放弃该操作并且让当前线程去做新的事情。这可能会出现如下情况:崩溃的进程操作仍然在运行,并且可能会在后面的时间里被数据库执行。这意味着对于后面整个历史记录的剩余时间内,崩溃的操作跟其他操作是并发的。:info
的消息,因为我们不能确定该操作是成功了还是失败了。 但是,幂等操作,像读操作,并不会改变系统的状态。读操作是否成功不影响,因为效果是相同的。因此我们可以安全的将崩溃的读操作转为读操作失败,并提升checker的性能。:cas
操作中,处理该错误后,将能保持代码更加的清爽。jepsen.independent
命名空间提供这样的支持。{:type :invoke, :f :write, :value 3}
。我们想升级这个操作为写多个key。我们想操作value [key v]
而不是:value v
。concurrent-generator
,使得每个键有10个线程,多个键来自无限的整数序列(range)
,同时这些键的生成器生成自(fn [k] ...)
。 concurrent-generator
改变了我们的values的结构,从v
变成了[k v]
,因此我们需要更新我们的客户端,以便知道如何读写不同的键。"foo"
是如何消失的?现在每个键都被操作自身参数化了。注意我们修改数值的地方--例如:在:f :read
中——我们必须构建一个指定independent/tuple
的键值对。为元组使用特殊数据类型,才能允许jepsen.independent
在后面将不同键的历史记录分隔开来。