记录skynet中call和fork的误用

      还是里程碑系统里出的问题,这个系统的确是相当复杂。事情的经过是这样的:周一QA反馈线上服务器里程碑里的一个任务的状态不对,任务目标已经达成,进度条还存在,直觉告诉我,数据的存档有问题,并且是周五停服维护后产生的。我首先查了服务器程序启动时,里程碑加载的存档数据的日志,发现和QA反馈的现象是一致的;然后,我从这个任务的完成日期开始,查了这天及前面3天的里程碑任务修改的日志,3天,是因为这个任务最多进行3天(配置里填的),最终发现,在7.26,这个任务刚开启的时候,因为服务器满足了任务的条件,直接就达成目标了,然后开启了下一个任务,同时这个任务会进行几次存档。我的做法是使用fork来设置这个任务的结束状态及存档,同时开启下一个任务,问题出在这里,我对fork的理解不准确,我想的是让fork里的函数在这一次消息处理之后执行。实际上,fork产生的协程是在主线程(一个lua_State)里被唤醒的,就是说,只要这次消息处理中,任何一次call调用,都会让出处理器给主线程,自然就会唤醒fork产生的协程。而我在这里的用法就是这样,在fork代码后面,使用call来保存里程碑任务数据,最终在两个协程里,极短的时间内,对一个任务数据进行存档,在数据存档服务里,都会检查存不存在这个里程碑任务的记录,操作这个数据库的服务只开了一个,这两次存档操作是独立的,查询这个记录存不存在的两个请求是连续的,都返回不存在,当然,两条存档请求都认为是自己应该插入了,自然是后面的一次存档因为主键冲突而无法插入,导致

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值