队列Rollback的设计

有一个队列包含了N个block,每个block是队列中的一个元素。block很大,一个block中可以容纳M个item(M>1)。

这个队列的基本使用模式就是:不断的有item过来,往block里面填充,一旦block满,就创建一个新的block,后继item都填往新block。

rollback的定义:最后一个item填充到block中后,由于出现了某种错误(如超出最大使用内存限制),需要把这个item删除掉,将队列恢复到删除前的状态。

有这么几种场景需要考虑:

1. 队列为空,插入第一个item后就需要回滚,插入前后队列中新增了一个block

2. 某个block插入第x个item后需要回滚,插入前后并没有创建新的block

3. 某个block插入第x个item时发现block满,新建一个block,将item插入到新block后回滚,插入前后队列中新增了一个block


2这种场景比较容易处理,只要插入前记录下rollback_pos,需要回滚的时候,将block中的pos恢复到rollback_pos即可。

1、3两种场景逻辑上很相似,编程上略有区别:1中队列头指针为NULL,3中队列头指针不为NULL,需要分别处理。

场景1的处理办法:发现需要回滚,free新建的block,令队列头指针为NULL,pos为0

场景3的处理办法:插入前记录rollback_block和rollback_pos,发现需要回滚,free新建的block,令队列头指针=rollback_block,pos=rollback_pos


这里最复杂的部分是free新建的block,如果能不去free block,问题会简单很多,三个场景可以用一个通用的算法解决:

插入前记录rollback_block和rollback_pos,发现需要回滚,令队列头指针=rollback_block,pos=rollback_pos

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值