서비스를 운영 중에, 갑자기 모든 검색이 불가능한 이슈가 발생했고, 해당 상황을 조사하는 내용을 정리하고자 한다.
Kibana 접근 불가 확인Elasticsearch 7.x 버전은 기본 라이센스의 만료 정책이 따로 존재하지 않는다.
Data 노드 전체 ShutdownKibana 및 내장 API를 사용할 수 없어 확인이 불가능
Data 노드가 모두Shutdown되면서인증정보 샤드가 이탈한 상태이기 때문에 Kibana에서는 라이센스 오류가 발생
Data 노드로 검색을 시도 하였고, 예외 발생으로 모든 Data 노드 다운Data 노드의 최초 에러 로그에서 Lucene core의 StackOverFlow 예외 로그 확인Lucene GraphTokenStreamFiniteStrings#articulationPointsRecurse 부분에서 확인GraphTokenStreamFiniteStrings.java 클래스 명에서 synonym_graph관련 토큰 처리일지 추측정확한 값을 알 수는 없지만 대략
Segment에 검색을 시도하는 토큰의 길이가 약 4,000자를 넘을 경우StackOverFlow가 발생 할 수 있다고 안내
해외 자료에서 우리와 비슷한 사례가 있었고 lucene 9.7.0버전 이후부터 release 처리하겠다고 안내되어있다.
Limit the recursion depth on token graph for preventing StackOverflow
그렇다면 어떤 처리가 되어있을까? 예외가 발생한 lucene-core 8.8.2와 lucene-core 9.7.0의 코드 차이를 확인해 보았다.
lucene-core 8.8.2(Left) ::: lucene-core 9.7.0(Right)

9.7.0에서는 MAX_RECURSION_LEVEL=1000; 변수 생성 코드가 존재
lucene-core 8.8.2(Left) ::: lucene-core 9.7.0(Right)

9.7.0에서는 MAX_RECURSION_LEVEL값을 비교처리하는 로직이 존재
예상했던 긴 문자열이 왔어도, 처리가 가능하거나, 일부 내용을 잘라서
정상처리
를 하리라 예상했는데, 실제 코드에서는IllegalArgumentException 예외를 발생시키고 종료된다.
즉, 정상처리로 인한 서비스가 지속되려면 검색을 시도하기전에 조건처리가 되어야 한다