서론
로컬에서 테스트를 할 필요가 있었습니다.
평소와 다름없이.. Application Run 버튼을 눌렀습니다.
하지만 이게 무슨 일이죠...
아래처럼 오류 메시지가 반복되고, 결국에는 Application run failed로 연결됩니다.
(hostName과 port 번호는 보안상 이슈로 다른 것으로 바꾸었습니다.)
[INFO] org.apache.zookeeper.ClientCnxn : Opening socket connection to server 10.123.12.12/<unresolved>:8888. Will not attempt to authenticate using SASL (unknown error)
[WARN] org.apache.zookeeper.ClientCnxn : Session 0x0 for server 10.123.12.12/<unresolved>:8888, unexpected error, closing socket connection and attempting reconnect
java.nio.channels.UnresolvedAddressException: null
at java.base/sun.nio.ch.Net.checkAddress(Net.java:139)
at java.base/sun.nio.ch.SocketChannelImpl.checkRemote(SocketChannelImpl.java:727)
at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:741)
at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:277)
at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287)
at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1064)
오류 분석
오류를 자세히 들여다보겠습니다.10.123.12.12/<unresolved>:8888
를 주목해주세요.
[INFO] org.apache.zookeeper.ClientCnxn : Opening socket connection to server 10.123.12.12/<unresolved>:8888. Will not attempt to authenticate using SASL (unknown error)
[WARN] org.apache.zookeeper.ClientCnxn : Session 0x0 for server 10.123.12.12/<unresolved>:8888, unexpected error, closing socket connection and attempting reconnect
java.nio.channels.UnresolvedAddressException: null
at java.base/sun.nio.ch.Net.checkAddress(Net.java:139)
at java.base/sun.nio.ch.SocketChannelImpl.checkRemote(SocketChannelImpl.java:727)
at java.base/sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:741)
at org.apache.zookeeper.ClientCnxnSocketNIO.registerAndConnect(ClientCnxnSocketNIO.java:277)
at org.apache.zookeeper.ClientCnxnSocketNIO.connect(ClientCnxnSocketNIO.java:287)
at org.apache.zookeeper.ClientCnxn$SendThread.startConnect(ClientCnxn.java:1021)
at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1064)
보이시나요?
정상적이라면 10.123.12.12/10.123.12.12:8888
로 되어 socket 연결이 될텐데,
UnresolvedAddressException예외가 발생하다니 희한한 일입니다...
저는 주로 2개의 프로젝트를 사용합니다.
이 오류는 프로젝트1 에서는 발생하지 않습니다. 즉, 프로젝트2 에서만 발생하는 오류였습니다.
시행착오
바로 원인과 해결법을 공유하면 되긴 하나, 그동안 삽질한 시간이 아까워서 시행착오를 공유합니다. 가볍게 읽어주세요.
- File > Invalidate Caches (실패)
- Build Clean (실패)
- 그래도 안 되네? 프로젝트를 삭제하고, Clone을 다시 받아보자! (실패)
- Clone 다시 받을 때 나도 모르는 캐시가 존재해서 설정이 똑같이 된 건가?.. 아래와 같이 시도해보자! (실패)
- 기존 로컬 프로젝트 삭제
- 노트북 다시 시작
- Clone 다시 도전
- 이쯤 되니, 모든 것을 의심하기 시작했습니다.
- 다 같이 안 되는 건가. 팀 내에 공유하기 (실패 - 나만 안되네)
- boosdtrap.yml 파일에 오타가 있나 눈을 의심 (실패)
- etc......
해결
잘 동작하는 프로젝트1과 프로젝트2의 Zookeeper를 연결 할 때의 설정 차이를 분석했습니다.
java version이 프로젝트2는 14였고, 프로젝트1은 13이었습니다.

Intellij File > Project Structure
자바 버전을 13으로 변경하니, 오류 없이 잘 동작하는 것을 확인할 수 있었습니다.

Zookeeper
Zookeeper 버전을 확인해보겠습니다. 로그를 보니 3.4.13을 쓰고 있습니다.
[INFO] org.apache.zookeeper.ZooKeeper : Client environment:zookeeper.version=3.4.13,
해당 이슈는 Zookeeper Version 3.5.x 에서 수정되었습니다.
하지만 3.4.x 버전에서는 이슈에 대한 해결법이 release가 안 되었습니다.
나중에 프로젝트를 Java version 14로 적용해야 하는 상황이 온다면, Zookeeper 버전이 3.5.x 이상인지 확인할 필요가 있어 보입니다.
원인
도대체 어떤 차이가 있길래 호환성 문제가 발생한 것일까요?
Java 13과 Java 14의 UnresolvedAddressException
예외가 던져지는 상황을 역추적해보았습니다.
앞서 공유해드렸던 오류 10.123.12.12/<unresolved>:8888
기억나시나요?10.123.12.12/ 10.123.12.12:8888
로 맵핑이 되어야 합니다. 이 원인은 toString() 메소드에 숨어있었습니다.
Java Version 13
/src/java.base/share/classes/java/net/InetSocketAddress.java
파일입니다.
@Override
public String toString() {
if (isUnresolved()) {
return hostname + ":" + port;
} else {
return addr.toString() + ":" + port;
}
}
Java Version 14
/src/java.base/java/net/InetSocketAddress.java
파일입니다.
@Override
public String toString() {
String formatted;
if (isUnresolved()) {
formatted = hostname + "/<unresolved>";
} else {
formatted = addr.toString();
if (addr instanceof Inet6Address) {
int i = formatted.lastIndexOf("/");
formatted = formatted.substring(0, i + 1)
+ "[" + formatted.substring(i + 1) + "]";
}
}
return formatted + ":" + port;
}
isUnresolve() 일 때, Java 13의 경우 hostname + ":" + port
로 리턴해주지만,
Java14의 경우 hostname + "/<unresolved>
로 string으로 리턴해버립니다. 그래서 문제가 발생하는 것이었습니다.
이 이슈는 ZooKeeper - Version 3.5.0 에서 Bug786번으로 해결되었습니다.
그래서 ZooKeeper 버전을 올리면 Java14에서도 정상적으로 동작합니다.
관심 있으신 분들은 링크들어가셔서 더 살펴보시기 바랍니다.

결론
후에 비슷한 이슈를 겪고, 헤매는 분들이 있을까봐 공유합니다.
해결하면 이렇게 간단한 것을,,, 며칠 먼 길을 돌아서 왔습니다.
같은 이슈를 겪고 계시다면, 도움이 되었으면 좋겠습니다. 읽어주셔서 감사합니다.
참조
java documentation: https://bugs.openjdk.java.net/browse/JDK-8225499
zookeeper documentation: https://issues.apache.org/jira/browse/ZOOKEEPER-786
same issue: https://github.com/apache/dubbo/issues/6755
'Error' 카테고리의 다른 글
.sh 스크립트 실행시 Permission Denied 해결하기 (0) | 2021.07.26 |
---|---|
no applicable action for [springProfile], current ElementPath is [[configuratio (0) | 2021.07.26 |