Description of problem: HttpManagementService-threads consumes high cpu on "org.jboss.as.jpa.hibernate4.management.QueryName.displayable()". Thread dump looks like: ~~~ "HttpManagementService-threads - 4223" prio=10 tid=0x00007f1d040f8800 nid=0x7596 runnable [0x00007f1ca5b03000] java.lang.Thread.State: RUNNABLE at java.util.regex.Pattern$Start.match(Pattern.java:3408) at java.util.regex.Matcher.search(Matcher.java:1199) at java.util.regex.Matcher.find(Matcher.java:592) at java.util.regex.Matcher.replaceAll(Matcher.java:907) at java.lang.String.replace(String.java:2180) at org.jboss.as.jpa.hibernate4.management.QueryName.displayable(QueryName.java:191) at org.jboss.as.jpa.hibernate4.management.QueryName.<init>(QueryName.java:120) at org.jboss.as.jpa.hibernate4.management.QueryName.queryName(QueryName.java:110) at org.jboss.as.jpa.hibernate4.management.HibernateStatisticsResource.getQueryNames(HibernateStatisticsResource.java:345) at org.jboss.as.jpa.hibernate4.management.HibernateStatisticsResource.hasQuery(HibernateStatisticsResource.java:332) at org.jboss.as.jpa.hibernate4.management.HibernateStatisticsResource.getChild(HibernateStatisticsResource.java:96) at org.jboss.as.controller.OperationContextImpl.getAuthorizationResource(OperationContextImpl.java:1169) at org.jboss.as.controller.OperationContextImpl.getBasicAuthorizationResponse(OperationContextImpl.java:1126) at org.jboss.as.controller.OperationContextImpl.authorize(OperationContextImpl.java:1049) at org.jboss.as.controller.OperationContextImpl.authorize(OperationContextImpl.java:845) at org.jboss.as.controller.operations.global.ReadResourceHandler.doExecuteInternal(ReadResourceHandler.java:265) at org.jboss.as.controller.operations.global.ReadResourceHandler.doExecute(ReadResourceHandler.java:142) at org.jboss.as.controller.operations.global.GlobalOperationHandlers$AbstractMultiTargetHandler.execute(GlobalOperationHandlers.java:249) at org.jboss.as.controller.AbstractOperationContext.executeStep(AbstractOperationContext.java:601) at org.jboss.as.controller.AbstractOperationContext.doCompleteStep(AbstractOperationContext.java:479) at org.jboss.as.controller.AbstractOperationContext.completeStepInternal(AbstractOperationContext.java:283) at org.jboss.as.controller.AbstractOperationContext.executeOperation(AbstractOperationContext.java:278) at org.jboss.as.controller.ModelControllerImpl.internalExecute(ModelControllerImpl.java:231) at org.jboss.as.controller.ModelControllerImpl.execute(ModelControllerImpl.java:137) at org.jboss.as.controller.ModelControllerImpl$3.execute(ModelControllerImpl.java:437) at org.jboss.as.controller.ModelControllerImpl$3.execute(ModelControllerImpl.java:427) at org.jboss.as.domain.http.server.DomainApiHandler.processRequest(DomainApiHandler.java:325) at org.jboss.as.domain.http.server.DomainApiHandler.doHandle(DomainApiHandler.java:229) at org.jboss.as.domain.http.server.DomainApiHandler.handle(DomainApiHandler.java:236) at org.jboss.as.domain.http.server.security.SubjectAssociationHandler$1.run(SubjectAssociationHandler.java:69) at org.jboss.as.domain.http.server.security.SubjectAssociationHandler$1.run(SubjectAssociationHandler.java:65) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:415) at org.jboss.as.controller.AccessAuditContext.doAs(AccessAuditContext.java:94) at org.jboss.as.domain.http.server.security.SubjectAssociationHandler.handleRequest(SubjectAssociationHandler.java:65) at org.jboss.as.domain.http.server.security.SubjectAssociationHandler.handle(SubjectAssociationHandler.java:59) at org.jboss.com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:78) at org.jboss.sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:69) at org.jboss.com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:81) at org.jboss.sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:710) at org.jboss.com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:78) at org.jboss.as.domain.http.server.RealmReadinessFilter.doFilter(RealmReadinessFilter.java:47) at org.jboss.as.domain.http.server.DmrFailureReadinessFilter.doFilter(DmrFailureReadinessFilter.java:45) at org.jboss.com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:81) at org.jboss.sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:682) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744) at org.jboss.threads.JBossThread.run(JBossThread.java:122) ~~~ It appears that many "String.replace()" are called in order to escape SQL query. * jpa/hibernate4/src/main/java/org/jboss/as/jpa/hibernate4/management/QueryName.java ~~~ 154 /** 155 * transform a Hibernate HQL query into something that can be displayed/used for management operations 156 * 157 * @param query 158 * @return 159 */ 160 private String displayable(String query) { 161 if (query == null || 162 query.length() == 0) { 163 return query; 164 } 165 // handle two character transforms first 166 query = query.replace(SQL_NE, NOT_EQUAL__); 167 query = query.replace(NE_BANG, BANG_NOT_EQUAL__); 168 query = query.replace(NE_HAT, HAT_NOT_EQUAL__); 169 query = query.replace(LE, LESS_THAN_EQUAL__); 170 query = query.replace(GE, GREATER_THAN_EQUAL__); 171 query = query.replace(CONCAT, CONCAT__); 172 query = query.replace(LT, LESS_THAN__); 173 query = query.replace(EQ, EQUAL__); 174 query = query.replace(GT, GREATER__); 175 query = query.replace(OPEN, LEFT_PAREN__); 176 query = query.replace(CLOSE, RIGHT_PAREN__); 177 query = query.replace(OPEN_BRACKET, LEFT_BRACKET__); 178 query = query.replace(CLOSE_BRACKET, RIGHT_BRACKET__); 179 query = query.replace(PLUS, PLUS__); 180 query = query.replace(MINUS, MINUS__); 181 query = query.replace(STAR, STAR__); 182 query = query.replace(DIV, DIVIDE__); 183 query = query.replace(MOD, MODULUS__); 184 query = query.replace(COLON, COLON__); 185 query = query.replace(PARAM, PARAM__); 186 query = query.replace(COMMA, COMMA__); 187 query = query.replace(SPACE, SPACE__); 188 query = query.replace(TAB, TAB__); 189 query = query.replace(NEWLINE, NEWLINE__); 190 query = query.replace(LINEFEED, LINEFEED__); 191 query = query.replace(QUOTE, QUOTE__); 192 query = query.replace(DQUOTE, DQUOTE__); 193 query = query.replace(TICK, TICK__); 194 query = query.replace(OPEN_BRACE, OPEN_BRACE__); 195 query = query.replace(CLOSE_BRACE, CLOSE_BRACE__); 196 query = query.replace(HAT, HAT__); 197 query = query.replace(AMPERSAND, AMPERSAND__); 198 return query; 199 } ~~~ The above logic caused high cpu issue and the customer faced JBoss slowdown.
Verified in EAP 6.3.1.CR1.