jam2in / arcus-java-client

Arcus Java client
Apache License 2.0
0 stars 0 forks source link

asyncGetAttr 수행 시의 오류 메세지 발생. #14

Closed jhpark816 closed 8 years ago

jhpark816 commented 8 years ago

asyncGetAttr 수행 시, cache server는 정상 response string을 던지지만 java client는 아래와 같은 메세지를 출력합니다.

2016-08-17 11:12:27.359 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.360 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.360 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.361 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.362 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.362 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.365 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.365 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.366 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.367 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.367 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.368 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.369 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.370 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.370 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.371 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.372 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.372 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.374 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.375 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.376 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
2016-08-17 11:12:27.377 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR type=kv
2016-08-17 11:12:27.377 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR flags=0
2016-08-17 11:12:27.378 ERROR net.spy.memcached.protocol.ascii.GetAttrOperationImpl:  Unexpected operation status : ATTR expiretime=0
...
jhpark816 commented 8 years ago

GetAttrOperationImpl 클래스의 handleLine() 메소드 코드가 잘못되어 있네요... 해당 line이 "ATTR"로 시작하는 지를 검사하기 전에 matchStatus()를 먼저 호출하여 발생하는 문제입니다.

    @Override
    public void handleLine(String line) {
        OperationStatus status = matchStatus(line, END, NOT_FOUND,
                ATTR_ERROR_NOT_FOUND);

        if (line.startsWith("ATTR ")) {
            getLogger().debug("Got line %s", line);

            String[] stuff = line.split(" ");

            assert stuff.length == 2;
            assert stuff[0].equals("ATTR");

            cb.gotAttribute(key, stuff[1]);
        } else if (status.isSuccess()) {
            getLogger().debug(status);
            getCallback().receivedStatus(status);
            transitionState(OperationState.COMPLETE);
        } else {
            getLogger().debug(status);
            getCallback().receivedStatus(status);
            transitionState(OperationState.COMPLETE);
        }
    }

참고로, matchStatus() 메소드의 코드는 아래와 같은 데, replication 버전에서 match되는 status가 없으면 "Unexpected operation status" 메세지를 기록하도록 변경되었습니다.

    protected final OperationStatus matchStatus(String line,
            OperationStatus... statii) {
        OperationStatus rv=null;
        for(OperationStatus status : statii) {
            if(line.equals(status.getMessage())) {
                rv=status;
            }
        }
        if(rv == null) {
            rv=new OperationStatus(false, line);
            /* ENABLE_REPLICATION if */
            getLogger().error("Unexpected operation status : %s", line);
            /* ENABLE_REPLICATION end */
        }
        return rv;
    }

결국, 위의 메세지를 기록하지 않도록 한 기존 java client에서는 matchStatus() 호출 시점이 잘못 되어도 별 다른 메세지를 볼 수 없었으나, 새로운 코드에서는 matchStatus()의 호출 시점이 정확해야 합니다..

matchStatus()를 호출하는 모두 코드에서 그 위치가 맞는 지를 확인하고 수정해 주기 바랍니다.

whchoi83 commented 8 years ago

다른 matchStatus 를 호출하는 곳은 문제가 없습니다. GetAttrOperationImple.java 코드만 실수가 있는 것으로 보입니다.

matchStatus 호출하는 위치 이외에도 if 조건문을 보시면. else if 와 else 의 코드 내용이 동일합니다. 따로 나뉘어 있을 필요가 없어보입니다.

함께 수정하도록 하겠습니다.

whchoi83 commented 8 years ago

merge 완료했고, 본 issue 는 close 하겠습니다.