id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	due_date
139	品牌排位接口死循环bug总结	huangyucai	黄育才	"一、问题展示
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）上线前测试要充分，不急于求成"	Bug	closed	major		产品库	产品库3.0	fixed	bug，故障		02/08/2013
