Симптомы проявляются в случае, если в полнотексте попытаться выполнить в стандартном ftsField
из главного окна приложения поиск по одному слову, заключенному в кавычки (“документация”, “регистрация” и т.п.)
Со стороны пользователя картина следующая:
- ищем по фразе
"настройка системы"
, получаем результат порядка 110-120 экземпляров сущностей за 2-3 сек; - ищем по
настройка
, затраченное время примерно то же, выдача ожидаемо больше за счет словоформ - порядка 160 экземпляров; - теперь ищем первый раз по
"настройка"
, ждем результата примерно раз в 5 дольше, а выдача ожидаемо меньше (без словоформ);
Далее если попытаться еще раз искать по одному слову в кавычках или новой ключевой фразе, то будет или сообщение “OutOfMemoryError: Java heap space” или стандартное сообщение Cuba: “Внутренняя ошибка, обратитесь к администратору”.
На стороне сервера при этом видим примерно следующее:
- ищем по фразе
"настройка системы"
- при первом запуске полнотекста Tomcat с приложением отъедает дополнительно примерно +100 МБ; - ищем по
настройка
- похоже, что при запросе по новой фразе память освобождается, а затем снова потребляются примерно те же 100-110 МБ, а в итоге общее потребление остается стабильным; - теперь ищем первый раз по
"настройка"
- при таком запросе потребление Tomcat с приложением сразу растет минимум на +600 Мб! - пытаемся поискать по фразе
"настройка системы"
- видим, что память не высвобождается, потребление Tomcat с приложением переваливает за 1,5 Гб и получаем OutOfMemoryError: Java heap space.
Попробовали под одним пользователем поиграться выполнением запросов с разными ключевыми словами и понаблюдать за использованием памяти на сервере…
Получается, что до тех пор, пока мы не использовали в поиске одно ключевое слово, заключенное в кавычки - полнотекст потребляет на старте 100-110 МБ, а далее память освобождается и снова потребляется при новом запросе, но общее потребление стабильно.
Как только мы пытаемся провести поиск по одному ключевому слову, заключенному в кавычки - дополнительно потребляется от 600 Мб (даже если результатов поиска Значительно меньше, чем по запросу с 2-3 словами в кавычках).
Далее, при любых новых запросах эти 600 Мб уже не освобождаются.
Из дополнительной информации:
- Пока приложение было на 6.10.х проблемы не замечали. Возможно именно не замечали, хотя, маловероятно, т.к. за несколько месяцев эксплуатации это бы всплыло.
- Проявилась проблема после миграции на 7.0.6, буквально через 2 дня.
- FTS используем “как есть” - подключили компонент, добавили на главный экран, убрали лишние сущности из fts.xml.
- Полное сообщение из лога при “java.lang.OutOfMemoryError”:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3236) ~[na:1.8.0_131]
at java.lang.StringCoding.safeTrim(StringCoding.java:79) ~[na:1.8.0_131]
at java.lang.StringCoding.encode(StringCoding.java:365) ~[na:1.8.0_131]
at java.lang.String.getBytes(String.java:941) ~[na:1.8.0_131]
at com.vaadin.server.communication.UIInitHandler.commitJsonResponse(UIInitHandler.java:107) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:100) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1577) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:425) ~[vaadin-server-8.6.4-11-cuba.jar:8.6.4-11-cuba]
at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:329) ~[cuba-web-7.0.6.jar:7.0.6]
at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:215) ~[cuba-web-7.0.6.jar:7.0.6]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) ~[servlet-api.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73) ~[spring-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:108) ~[cuba-web-7.0.6.jar:7.0.6]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-websocket.jar:8.0.50]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
at com.haulmont.cuba.web.sys.singleapp.SingleAppWebContextLoader$SetClassLoaderFilter.doFilter(SingleAppWebContextLoader.java:269) ~[cuba-web-7.0.6.jar:7.0.6]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:94) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) ~[catalina.jar:8.0.50]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) ~[catalina.jar:8.0.50]
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) ~[catalina.jar:8.0.50]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) ~[catalina.jar:8.0.50]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:502) ~[catalina.jar:8.0.50]
2019-06-06 11:34:28.538 WARN [http-apr-80-exec-2] com.haulmont.cuba.web.sys.CubaApplicationServlet - Too long request processing [20626 ms]: ip=xx.xx.xx.xx, url=/appname/UIDL/