问题排查:订单状态到“可结算”后,还能状态变更

排查思路:

搜索源代码关键字:客人已离店
>查询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编辑  收藏  举报

导航