Ticket #139 (closed Bug: fixed)

Opened 13 years ago

Last modified 13 years ago

品牌排位接口死循环bug总结

Reported by: huangyucai Owned by: 黄育才
Priority: major Milestone:
Component: 产品库 Version: 产品库3.0
Keywords: bug,故障 Cc:
Due Date: 02/08/2013

Description

一、问题展示
1)cms报障,接口不能出数据,请求响应慢
2)检查服务器负载高,超过6.0,但是其他能正常访问
3)用threads.jsp检查发现

brand_type_top_json.jsp的线程一直在运行

初步判断可能:

1、接口被刷
2、程序存在死循环

应急解决:

试着重启一台服务器,检查负载,发现不会升高

二、问题代码
1、代码段

    for (int i =0, size = brandList.size(); i < size; i ++) {
    	brandId=0;
    	if(fixMap!=null&&fixMap.get(index+1)!=null){//如果存在固定排位
    		brandId=Integer.parseInt(fixMap.get(index+1).toString());//获取品牌的id
    	}
    	
    	if(brandId==0){//没有固定排位则从列表获取品牌的id
    		record = (Record)brandList.get(i);
    	    brandId = record.getValue("ID").asInt();
    	}else{//否则回退一次列表
    		i--;
    	}
    	
    	//去重处理
    	if(brandSet.contains(brandId)) continue;//如果已经有品牌id就跳过不添加
    	brandSet.add(brandId);
        
        //...省略封装json的代码

		index++;//条数自增
		if(index>=max) break;//达到数量就跳出
  }

2、bug产生过程

死循环Bug分析:

当brandList.size()=10,

brandList.get(2).getValue("ID").asInt()=39127
fixMap<10,39127>


循环当i=9

执行 brandId=Integer.parseInt(fixMap.get(index+1).toString());


执行 i--;


执行 if(brandSet.contains(brandId)) continue;如果已经有品牌id就跳过

不添加

此时i=8 执行循环i++


i=9


再执行循环,构成死循环

三、修改代码

加多两次循环,让代码结构和逻辑明朗化

	for(int i=0;i<brandList.size();i++){//先存入到brandIdList
		record = (Record)brandList.get(i);
		brandIdList.add(record.getValue("ID").asString());
	}
	if(fixMap!=null){//如果存在固定排位
		int size=brandIdList.size();//长度
		for(int i=0;i<size;i++){//迭代
			Object fixed=fixMap.get(i+1);
			if(fixed!=null){//如果指定当前位置中有固定
				if(brandIdList.contains(fixed.toString())){//如果已经存在,则先删除
					brandIdList.remove(fixed.toString());
				}
				brandIdList.add(i,fixed.toString());//添加到固定位置
			}
		}
	}
	for(int i=0;i<max&&i<brandIdList.size();i++){//迭代组装json
        }

四、总结:

1)逻辑较为复杂接口,在实现的时候要一步步来,代码要详细,条理清晰,这样可读性好,而且不容易出错
2)上线前测试要充分,不急于求成

Attachments

brand_type_top_json.jsp_bug.jsp Download (4.1 KB) - added by huangyucai 13 years ago.
问题jsp
brand_type_top_json.jsp_ok.jsp Download (4.1 KB) - added by huangyucai 13 years ago.
修改后的jsp

Change History

Changed 13 years ago by huangyucai

问题jsp

Changed 13 years ago by huangyucai

修改后的jsp

comment:1 Changed 13 years ago by chenchongqi

  • Status changed from new to closed
  • Resolution set to fixed
Note: See TracTickets for help on using tickets.