Closed jhpark816 closed 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()를 호출하는 모두 코드에서 그 위치가 맞는 지를 확인하고 수정해 주기 바랍니다.
다른 matchStatus 를 호출하는 곳은 문제가 없습니다. GetAttrOperationImple.java 코드만 실수가 있는 것으로 보입니다.
matchStatus 호출하는 위치 이외에도 if 조건문을 보시면. else if 와 else 의 코드 내용이 동일합니다. 따로 나뉘어 있을 필요가 없어보입니다.
함께 수정하도록 하겠습니다.
merge 완료했고, 본 issue 는 close 하겠습니다.
asyncGetAttr 수행 시, cache server는 정상 response string을 던지지만 java client는 아래와 같은 메세지를 출력합니다.