论文CORFU: A Distributed Shared Log以伪代码形式展示了该协议,该协议不验证删除消息。引用论文:
Upon <delete,addr> request:
mark addr deleted
respond ack
这意味着我们可以删除尚未写入的页面。这也意味着客户端可以使用过时的集群配置删除页面。这是否意味着论文中提出的协议可能会丢失删除?
根据论文 CORFU 保留删除地址的高水印作为内存空间优化。如果我们可以丢失删除,那么高水位线将不会移动,我们将耗尽内存。
如果我们使用 CORFU 进行状态机复制,我们可以对状态机进行快照并删除快照之前的日志。如果我们可以丢失删除,那么日志实际上将永远增长。
而不是仅仅应用删除而不进行验证,一个实现不会简单地使删除具有幂等性,但如下验证它们:
Upon <delete,epoch,addr> request:
if epoch != s.epoch respond err_sealed
else respond according to addr status:
if written mark addr deleted, <ack>
if available, <err_unwritten>
if deleted, <ack>
还是会以某种方式损害安全性或性能?