问题排查:订单状态到“可结算”后,还能状态变更
排查思路:
搜索源代码关键字:客人已离店
>查询state_machine_log表
>再根据操作人“系统”来确认是:OrderShowServlet.java
>到web.xml查找:/order/sm/show
>access_log
查看access_log :
zcat access_log.2013-02-02* | grep /order/sm/show?orderId=777235 | more
192.168.224.19 - - [02/Feb/2013:00:02:02 +0800] "GET /order/sm/show?orderId=777235 HTTP/1.0" 200 54 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534
.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" "-" hms.qunar.com 211.151.112.5
192.168.224.19 - - [02/Feb/2013:00:03:57 +0800] "GET /order/sm/show?orderId=777235 HTTP/1.0" 200 54 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534
.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" "-" hms.qunar.com 211.151.112.5
192.168.224.18 - - [02/Feb/2013:00:05:57 +0800] "GET /order/sm/show?orderId=777235 HTTP/1.0" 200 54 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534
.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" "-" hms.qunar.com 211.151.112.5
192.168.224.19 - - [02/Feb/2013:00:07:56 +0800] "GET /order/sm/show?orderId=777235 HTTP/1.0" 200 54 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534
.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" "-" hms.qunar.com 211.151.112.5
192.168.224.18 - - [02/Feb/2013:00:09:56 +0800] "GET /order/sm/show?orderId=777235 HTTP/1.0" 200 54 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534
.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" "-" hms.qunar.com 211.151.112.5
每隔2分钟执行一次,很有可能是 task执行。
>那就看看哪个task 调用了该url:
发现是OrderLeaveTask,payconfirmtask,确实dev 或者beta上时2分钟执行一次
到此可以得到的信息:
1:测试环境调用线上的 url
继续思考:
是否所有的都变了状态? 发现并不多,基本可以排除。
为什么调用了就变了呢? 不是有白名单么?为什么没有生效?
> 发现是白名单加载缓存的代码有问题:
for (int i = 0; i < rs.size(); i++) { str = rs.get(i); try { AccessRule ar = (AccessRule) Class.forName(str[1].trim()).newInstance(); ar.init(str[0], str[2]); newRules.put(str[0].trim(), ar); } catch (Exception e) { // 如果出现单条规则解析失败,则继续沿用老规则。 AccessRule rule = RULES.get(str[0]); if (rule != null) { newRules.put(str[0], rule); } log.error("规则'" + str[0] + "'初始化失败!请确认配置是否正确!继续使用原规则!", e); } RULES = newRules; //这一行有问题,在加载完毕之前,规则有缺漏。 }
改为:
for (int i = 0; i < rs.size(); i++) { str = rs.get(i); try { AccessRule ar = (AccessRule) Class.forName(str[1].trim()).newInstance(); ar.init(str[0], str[2]); newRules.put(str[0].trim(), ar); } catch (Exception e) { // 如果出现单条规则解析失败,则继续沿用老规则。 AccessRule rule = RULES.get(str[0]); if (rule != null) { newRules.put(str[0], rule); } log.error("规则'" + str[0] + "'初始化失败!请确认配置是否正确!继续使用原规则!", e); } } RULES = newRules;
这个bug 反映出来的多堵墙均失效:
1: 代码中直接多处使用 hms.qunar.com
2: beta环境没有设置host
3: 白名单加载问题
4: 状态迁移没有做状态的前置判断
posted on 2013-03-29 03:21 NanguoCoffee 阅读(768) 评论(0) 编辑 收藏 举报