librelist archives

« back to archive

关于今天发现并解决的bug的说明

关于今天发现并解决的bug的说明

From:
Tang Daogang
Date:
2012-07-18 @ 14:44
是这样的。之前我们在使用filter的时候,会莫名其妙出现很多:

[Warning] @makeObject - Object is invalid.

但是,事实上,很我警告都是误报。那个实例还是有值的。问题出在这里:bamboo在曾经某一个时间对filter添加了partial
got特性。这个特性是这样的。对传入filter的是一张表的情况。如:

filter({ status=xxx, name=yyyy })。bamboo从redis中取的时候,只会取出 status, name, id
3个字段的内容,而不是用hgetall取全部。好了,这本身没什么问题。问题出在,有的实例可能status为nil,

在存储到redis中时,在redis根本不占位(redis自身的空间回收机制决定的),取出来的时候,就发现status字段无值。然后,如果name字段也是同样的情况的话,就只剩id字段(肯定有值),在getPartialFromRedisPipeline函数中,会调用makeObject来根据传入的表制作对象。在makeObject中,会使用
isValidInstance检查传进来的表是不是有效对象。而检测的方法就是对这个表进行遍历,看是否有有效的非id字段的其它字段的值。

由于从这个实例获取的值传到isValidInstance中,发现,只有id字段有值,其它都没值。于是判断这个实例不是有效实例,于是打出[Warning]
@makeObject - Object is invalid.。但是,这个实例除
status和name字段的其它字段是有值的,也即是说这确实是个有效实例。只是对这个filter的规则不感冒而已。于是,这出现了误报的情况。


好了,如果仅仅是误报,那还只是干扰视听,看起来心烦。更严重的问题是,后来又加入了自动清理策略。对于使用makeObject出来,发现是无效的实例对象的索引,会自动清除(外键索引和主键索引)。于是就发生了柯南式的悲剧――所有的用户索引全没了,连getById都不起作用。

好了,此问题已修正。


-- 
Nothing is impossible.