当依赖他人程序时,要清晰了解依赖的东西,而不是YY

上一篇 / 下一篇  2012-09-05 15:54:42 / 个人分类:经验总结

当程序里面的功能是嵌入了别人已有代码的功能的时候一定要清晰知道人家是如何支持的,以前我也以为别人的代码只要人家说这样可以这样这样,我们就认为是可以那样那样就行了。但是,最近测试的发现的一个bug让我算是颠覆了这种想法。

背景是这样的:程序依赖另外一个应用提供的删除hbase中前一天数据的功能。程序呢,会把一份hdfs上的数据bulkload到hbase中,注意,后面的逻辑计算是希望hbase中的这份完全数据等于hdfs上的,但是,了解hbase的人都知道,一般bulkload是不会删数据的而是添加或更新,ttl除外。
而当时呢,依赖了删除前一天数据的功能,而这个功能的删除维度是列族,比如有a列族,检查a列族下面的column,取最新的column的时间戳与当前时间比较,如果发现是昨天的就删除这个列。单看这个功能是ok的,以列族为单位,当这个列族没有任何更新的时候删除这个列族。
那么我们的程序呢,某个列族下有2个字段,其中一个字段就是我上面说的要跟hdfs完全保持一致的字段,而在bulkload这条记录进hbase之前,另外一个字段会先被bulkload进去,那么这个字段的时间戳就会被更新,而如果一条记录,同时包括这两个字段,那么这个列族就不会删除。简单举个例子,rowkey :111 同一列有两个字段 a:test1,a:test2,a:test1的更新导致a这个列的时间戳变成了今天,那么这个列族就不会删掉,而test1这个列里面依旧是老的数据。而如果今天hdfs的表里面没有test1这个字段,那么,对,hbase里面多数据了。说白了,其实设计的时候没有考虑到这种情况,而我到测试的时候发现了,而之所以发现是因为被依赖的那个程序是我测的,所有我觉得会有问题回去翻了一下,而在接手这个程序之前,程序是没有考虑到这种情况的,好在程序以前没出现这种特殊的字段,而这种情况也是一个巨大的坑记下了。
那么,引申一下如何避免,就是一定要清晰知道你依赖的东西是怎么回事,不能想当然就随意用,如果不确定找到对应的开发进行确认。否则,就等着悲剧吧。。。
再引申一下,发现测试一个东西如果你只关注你这一个模块是不够的,大部分问题都发生在模块的衔接部分,存在依赖的部分,嵌入其他模块的地方,而这些地方非常应该引起重视。


TAG:

 

评分:0

我来说两句

Open Toolbar