[JBoss JIRA] (WFLY-6315) session.invalidate() behaviour not conform Servlet specification in HA profile
by Paul Ferraro (JIRA)
[ https://issues.jboss.org/browse/WFLY-6315?page=com.atlassian.jira.plugin.... ]
Paul Ferraro commented on WFLY-6315:
------------------------------------
The implementation of PLINK-525 is also not compatible with distributed sessions. To do this correctly, you'd need a reference to Undertow's SessionManager - and use it to lookup a session by session ID.
You should be able to achieve this using a ServletExtension, however, the DeploymentInfo object only exposes a SessionManagerFactory, not the SessionManager itself. However, you can implement a SessionManagerFactory decorator that caches its generated SessionManager and exposes that instance to your single sign-on implementation.
> session.invalidate() behaviour not conform Servlet specification in HA profile
> ------------------------------------------------------------------------------
>
> Key: WFLY-6315
> URL: https://issues.jboss.org/browse/WFLY-6315
> Project: WildFly
> Issue Type: Bug
> Components: Clustering
> Affects Versions: 10.0.0.Final
> Environment: Wildfly 8.2.1-Final
> JDK 1.8.0_66-b17
> Windows & Linux
> Reporter: Sammy Chu
> Assignee: Paul Ferraro
> Priority: Blocker
> Attachments: session-invalidate-noreplication.war, session-invalidate-noreplication.war, session-invalidate-replication-attribute.war, session-invalidate-replication-attribute.war, session-invalidate-replication-session.war, session-invalidate-replication-session.war
>
>
> We suspected that calling session.invalidate() on an already invalidated session with replication-granularity set to "ATTRIBUTE" will throw a NullPointerException, but from the specification it should throw an IllegalStateException instead.
> Stack trace as below:
> {noformat}
> 13:12:35,554 ERROR [io.undertow.request] (default task-32) UT005023: Exception handling request to /<our system url>: java.lang.NullPointerException
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory$1.invoke(FineSessionFactory.java:103)
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory$1.invoke(FineSessionFactory.java:100)
> at org.jboss.as.clustering.infinispan.invoker.SimpleCacheInvoker.invoke(SimpleCacheInvoker.java:34)
> at org.jboss.as.clustering.infinispan.invoker.RetryingCacheInvoker.invoke(RetryingCacheInvoker.java:87)
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory.remove(FineSessionFactory.java:109)
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory.remove(FineSessionFactory.java:53)
> at org.wildfly.clustering.web.infinispan.session.InfinispanSession.invalidate(InfinispanSession.java:74)
> at org.wildfly.clustering.web.infinispan.session.InfinispanSessionManager$SchedulableSession.invalidate(InfinispanSessionManager.java:359)
> at org.wildfly.clustering.web.undertow.session.DistributableSession.invalidate(DistributableSession.java:140)
> at io.undertow.servlet.spec.HttpSessionImpl.invalidate(HttpSessionImpl.java:199) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> ... // our application code, just calling "session.invalidate()"
> {noformat}
> We also enclosed the simplified samples to reproduce this issue (session-invalidate-noreplication.war, session-invalidate-replication-attribute.war, session-invalidate-replication-session.war). In general they are the same except the replication-granularity (in jboss-web.xml => replication-granularity) settings.
> # session-invalidate-noreplication.war and session-invalidate-replication-session.war works correctly as they are throwing IllegalStateException.
> # session-invalidate-replication-attribute.war is buggy because it throw NullPointerException instead.
> For more information, please refer to https://developer.jboss.org/message/947295
> *Updated in 2016-04-27*
> Test again in Wildfly 8.2.1.Final, Wildfly 10.0.0.Final and Wildfly 10.1.0.Final-SNAPSHOT (master branch), with HA profile (2 nodes in same machine), with my updated WARs, detail as below:
> *Wildfly 8.2.1.Final*:
> * session-invalidate-noreplication.war - throwing IllegalStateException in the index.jsp (line 62), which is expected, detail stacktrace as below:
> {noformat}
> 15:42:56,424 INFO [stdout] (default task-9) {} session.invalidate() throw IllegalStateException, but it is intended!!!
> 15:42:56,424 ERROR [stderr] (default task-9) {} java.lang.IllegalStateException: UT000021: Session already invalidated
> 15:42:56,424 ERROR [stderr] (default task-9) {} at io.undertow.server.session.InMemorySessionManager$SessionImpl.invalidate(InMemorySessionManager.java:415)
> 15:42:56,425 ERROR [stderr] (default task-9) {} at io.undertow.server.session.InMemorySessionManager$SessionImpl.invalidate(InMemorySessionManager.java:404)
> 15:42:56,425 ERROR [stderr] (default task-9) {} at io.undertow.servlet.spec.HttpSessionImpl.invalidate(HttpSessionImpl.java:199)
> 15:42:56,425 ERROR [stderr] (default task-9) {} at org.apache.jsp.index_jsp._jspService(index_jsp.java:62)
> 15:42:56,425 ERROR [stderr] (default task-9) {} at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69)
> 15:42:56,425 ERROR [stderr] (default task-9) {} at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:366)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at com.jboss.test.StoreSessionFilter.doFilter(StoreSessionFilter.java:72)
> 15:42:56,426 ERROR [stderr] (default task-9) {} at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
> 15:42:56,427 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> 15:42:56,428 ERROR [stderr] (default task-9) {} at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199)
> 15:42:56,429 ERROR [stderr] (default task-9) {} at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761)
> 15:42:56,430 ERROR [stderr] (default task-9) {} at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> 15:42:56,430 ERROR [stderr] (default task-9) {} at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> 15:42:56,430 ERROR [stderr] (default task-9) {} at java.lang.Thread.run(Thread.java:745)
> {noformat}
> * session-invalidate-replication-session.war - do *NOT* throw IllegalStateException when invalidating an already invalidated session, which is incorrect. My test just print:
> {noformat}
> 15:38:38,568 ERROR [stderr] (default task-4) {} Should not reach here!!! That means session.invalidate() do NOT throw IllegalStateException
> {noformat}
> * session-invalidate-replication-attribute.war - throwing NullPointerException in the index.jsp (line 62), which is incorrect. Detail stacktrace as below:
> {noformat}
> 15:38:57,894 ERROR [io.undertow.request] (default task-6) {} UT005023: Exception handling request to /session-invalidate-replication-attribute/index.jsp: org.apache.jasper.JasperException: JBWEB004038: An exception occurred processing JSP page /index.jsp at line 7
> 4: <%
> 5: if (request.getParameter("logout") != null) {
> 6: try {
> 7: session.invalidate(); // invalidate the invalidated session
> 8: System.err.println("Should not reach here!!! That means session.invalidate() do NOT throw IllegalStateException");
> 9: } catch (IllegalStateException e) {
> 10: // expected to throw IllegalStateException when invalidate a invalidated session
> Stacktrace:
> at org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:494) [jastow-1.0.0.Final.jar:1.0.0.Final]
> at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:408) [jastow-1.0.0.Final.jar:1.0.0.Final]
> at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:326) [jastow-1.0.0.Final.jar:1.0.0.Final]
> at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:259) [jastow-1.0.0.Final.jar:1.0.0.Final]
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
> at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:130) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at com.jboss.test.StoreSessionFilter.doFilter(StoreSessionFilter.java:72) [classes:]
> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:132) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:85) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:58) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:261) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:248) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:77) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:167) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.server.Connectors.executeRootHandler(Connectors.java:199) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:761) [undertow-core-1.1.8.Final.jar:1.1.8.Final]
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_92]
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_92]
> at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_92]
> Caused by: java.lang.NullPointerException
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory$1.invoke(FineSessionFactory.java:103)
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory$1.invoke(FineSessionFactory.java:100)
> at org.jboss.as.clustering.infinispan.invoker.SimpleCacheInvoker.invoke(SimpleCacheInvoker.java:34)
> at org.jboss.as.clustering.infinispan.invoker.RetryingCacheInvoker.invoke(RetryingCacheInvoker.java:87)
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory.remove(FineSessionFactory.java:109)
> at org.wildfly.clustering.web.infinispan.session.fine.FineSessionFactory.remove(FineSessionFactory.java:53)
> at org.wildfly.clustering.web.infinispan.session.InfinispanSession.invalidate(InfinispanSession.java:74)
> at org.wildfly.clustering.web.infinispan.session.InfinispanSessionManager$SchedulableSession.invalidate(InfinispanSessionManager.java:359)
> at org.wildfly.clustering.web.undertow.session.DistributableSession.invalidate(DistributableSession.java:140)
> at io.undertow.servlet.spec.HttpSessionImpl.invalidate(HttpSessionImpl.java:199) [undertow-servlet-1.1.8.Final.jar:1.1.8.Final]
> at org.apache.jsp.index_jsp._jspService(index_jsp.java:62)
> at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:69) [jastow-1.0.0.Final.jar:1.0.0.Final]
> at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [jboss-servlet-api_3.1_spec-1.0.0.Final.jar:1.0.0.Final]
> at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:366) [jastow-1.0.0.Final.jar:1.0.0.Final]
> ... 34 more
> {noformat}
> *Wildfly-10.0.0.Final:*
> * session-invalidate-noreplication.war - same as Wildfly 8 to throw IllegalStateException which is intended.
> * session-invalidate-replication-session.war - throwing IllegalStateException in the filter!!! (Yes, in the filter, NOT in the index.jsp!!!) which is incorrect. Detail as below:
> {noformat}
> 16:00:28,742 ERROR [org.infinispan.interceptors.InvocationContextInterceptor] (default task-5) {} ISPN000136: Error executing command GetKeyValueCommand, writing keys []: java.lang.IllegalStateException: Transaction DummyTransaction{xid=DummyXid{id=5}, status=3} is not in a valid state to be invoking cache operations on.
> at org.infinispan.interceptors.TxInterceptor.enlist(TxInterceptor.java:394)
> at org.infinispan.interceptors.TxInterceptor.enlistIfNeeded(TxInterceptor.java:350)
> at org.infinispan.interceptors.TxInterceptor.enlistReadAndInvokeNext(TxInterceptor.java:344)
> at org.infinispan.interceptors.TxInterceptor.visitGetKeyValueCommand(TxInterceptor.java:330)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:113)
> at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.statetransfer.StateTransferInterceptor.handleTopologyAffectedCommand(StateTransferInterceptor.java:405)
> at org.infinispan.statetransfer.StateTransferInterceptor.handleDefault(StateTransferInterceptor.java:390)
> at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:107)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:76)
> at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:336)
> at org.infinispan.cache.impl.CacheImpl.get(CacheImpl.java:411)
> at org.infinispan.cache.impl.CacheImpl.get(CacheImpl.java:403)
> at org.infinispan.cache.impl.AbstractDelegatingCache.get(AbstractDelegatingCache.java:286)
> at org.wildfly.clustering.server.registry.CacheRegistry.getEntry(CacheRegistry.java:128)
> at org.wildfly.clustering.web.infinispan.session.InfinispanRouteLocator.locate(InfinispanRouteLocator.java:58)
> at org.wildfly.clustering.web.undertow.session.DistributableSessionIdentifierCodec.encode(DistributableSessionIdentifierCodec.java:48)
> at org.wildfly.extension.undertow.session.CodecSessionConfig.clearSession(CodecSessionConfig.java:51)
> at io.undertow.servlet.spec.ServletContextImpl$ServletContextSessionConfig.clearSession(ServletContextImpl.java:985)
> at org.wildfly.clustering.web.undertow.session.DistributableSession.invalidate(DistributableSession.java:184)
> at io.undertow.servlet.spec.HttpSessionImpl.invalidate(HttpSessionImpl.java:199)
> at com.jboss.test.StoreSessionFilter.doFilter(StoreSessionFilter.java:58)
> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
> at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
> at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
> at io.undertow.jsp.JspFileHandler.handleRequest(JspFileHandler.java:32)
> at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
> at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
> at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
> at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
> at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
> at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
> at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
> at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284)
> at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)
> at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
> at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174)
> at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
> at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at java.lang.Thread.run(Thread.java:745)
> 16:00:28,743 ERROR [com.jboss.test.StoreSessionFilter] (default task-5) {} Transaction DummyTransaction{xid=DummyXid{id=5}, status=3} is not in a valid state to be invoking cache operations on.: java.lang.IllegalStateException: Transaction DummyTransaction{xid=DummyXid{id=5}, status=3} is not in a valid state to be invoking cache operations on.
> at org.infinispan.interceptors.TxInterceptor.enlist(TxInterceptor.java:394)
> at org.infinispan.interceptors.TxInterceptor.enlistIfNeeded(TxInterceptor.java:350)
> at org.infinispan.interceptors.TxInterceptor.enlistReadAndInvokeNext(TxInterceptor.java:344)
> at org.infinispan.interceptors.TxInterceptor.visitGetKeyValueCommand(TxInterceptor.java:330)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.interceptors.base.CommandInterceptor.handleDefault(CommandInterceptor.java:113)
> at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.statetransfer.StateTransferInterceptor.handleTopologyAffectedCommand(StateTransferInterceptor.java:405)
> at org.infinispan.statetransfer.StateTransferInterceptor.handleDefault(StateTransferInterceptor.java:390)
> at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.base.CommandInterceptor.invokeNextInterceptor(CommandInterceptor.java:99)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleAll(InvocationContextInterceptor.java:107)
> at org.infinispan.interceptors.InvocationContextInterceptor.handleDefault(InvocationContextInterceptor.java:76)
> at org.infinispan.commands.AbstractVisitor.visitGetKeyValueCommand(AbstractVisitor.java:85)
> at org.infinispan.commands.read.GetKeyValueCommand.acceptVisitor(GetKeyValueCommand.java:40)
> at org.infinispan.interceptors.InterceptorChain.invoke(InterceptorChain.java:336)
> at org.infinispan.cache.impl.CacheImpl.get(CacheImpl.java:411)
> at org.infinispan.cache.impl.CacheImpl.get(CacheImpl.java:403)
> at org.infinispan.cache.impl.AbstractDelegatingCache.get(AbstractDelegatingCache.java:286)
> at org.wildfly.clustering.server.registry.CacheRegistry.getEntry(CacheRegistry.java:128)
> at org.wildfly.clustering.web.infinispan.session.InfinispanRouteLocator.locate(InfinispanRouteLocator.java:58)
> at org.wildfly.clustering.web.undertow.session.DistributableSessionIdentifierCodec.encode(DistributableSessionIdentifierCodec.java:48)
> at org.wildfly.extension.undertow.session.CodecSessionConfig.clearSession(CodecSessionConfig.java:51)
> at io.undertow.servlet.spec.ServletContextImpl$ServletContextSessionConfig.clearSession(ServletContextImpl.java:985)
> at org.wildfly.clustering.web.undertow.session.DistributableSession.invalidate(DistributableSession.java:184)
> at io.undertow.servlet.spec.HttpSessionImpl.invalidate(HttpSessionImpl.java:199)
> at com.jboss.test.StoreSessionFilter.doFilter(StoreSessionFilter.java:58)
> at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:60)
> at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
> at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
> at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
> at io.undertow.jsp.JspFileHandler.handleRequest(JspFileHandler.java:32)
> at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
> at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
> at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
> at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
> at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
> at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
> at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
> at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
> at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:284)
> at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:263)
> at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
> at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:174)
> at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
> at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:793)
> at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> at java.lang.Thread.run(Thread.java:745)
> 16:00:28,745 ERROR [stderr] (default task-5) {} Should not reach here!!! That means session.invalidate() do NOT throw IllegalStateException
> {noformat}
> * session-invalidate-replication-session.war - same behaviour as session-invalidate-replication-attribute.war as in Wildfly 10.0.0.Final, which throw exception in filter and do NOT throw exception in index.jsp, which is incorrect.
> *Wildfly 10.1.0.Final-SNAPSHOT*:
> those 3 cases behaviour identical as Wildfly 10.0.0.Final.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month
[JBoss JIRA] (ELY-520) If an authenticated mechanism sets a response code return to the client.
by Darran Lofthouse (JIRA)
Darran Lofthouse created ELY-520:
------------------------------------
Summary: If an authenticated mechanism sets a response code return to the client.
Key: ELY-520
URL: https://issues.jboss.org/browse/ELY-520
Project: WildFly Elytron
Issue Type: Enhancement
Components: HTTP
Reporter: Darran Lofthouse
Assignee: Darran Lofthouse
Fix For: 1.1.0.Beta6
This is predominantly for mechanisms that send a redirect but if any response code is set by a mechanism that was successfully authenticated return to the client.
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month
[JBoss JIRA] (DROOLS-1087) KieBase update wrong match for rules containing constraints over the accumulate
by Matteo Mortari (JIRA)
[ https://issues.jboss.org/browse/DROOLS-1087?page=com.atlassian.jira.plugi... ]
Matteo Mortari reopened DROOLS-1087:
------------------------------------
Seems maybe I can actually reopen the issue, I'll try with this comment.
Thank you
Ref: https://issues.jboss.org/browse/DROOLS-1087?focusedCommentId=13200358&pag...
> KieBase update wrong match for rules containing constraints over the accumulate
> -------------------------------------------------------------------------------
>
> Key: DROOLS-1087
> URL: https://issues.jboss.org/browse/DROOLS-1087
> Project: Drools
> Issue Type: Bug
> Components: core engine
> Affects Versions: 6.2.0.Final, 6.3.0.Final, 6.4.0.Beta2, 6.4.0.Final
> Reporter: Matteo Mortari
> Assignee: Mario Fusco
> Attachments: 20160309.DROOLS-1087.zip, 20160503.yetagain1087.zip
>
>
> Ciao, I will attach reproducer with same style as {{org.drools.compiler.integrationtests.IncrementalCompilationTest.testIncrementalCompilation}} / {{testIncrementalCompilationWithRedeclares}}
> h2. Executive summary
> When performing KieBase update, rules containing constraints over the accumulate Event, are firing with wrong matches and/or firing for already seen matches and violating the no-loop.
> h2. Detailed description of the reproducer.
> Assume a KB starting with only these two rules:
> {code}
> declare Measurement
> @role(event)
> end
> rule "color RED seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "red") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color RED in the last 2m "+$mySet);
> end
> rule "color GREEN seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "green") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color GREEN in the last 2m "+$mySet);
> end
> {code}
> and then on upgrade/update, the same rule as above un-touched, but additionally the following rule:
> {code}
> rule "id X seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "x", $colorVal : val) over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen Measurement for id=x in the last 2m "+$mySet);
> end
> {code}
> Where {{Measurement}} just a POJO as per Kie Artifact, basically containing fields: {{String id;String val;}}
> with the following of Measurement insertions, one at each minute:
> {code}
> -> Measurement [id=color, val=red]
> (KB update here)
> -> Measurement [id=x, val=x]
> -> Measurement [id=color, val=green]
> ...
> {code}
> the following problems are highlighted:
> h6. Drools version 6.2.0.Final with Reteoo
> The problem is highlighted after the 2nd Measurment event insertion below, the rules "color GREEN seen in the last 2 minutes" and "id X seen in the last 2 minutes" are firing with wrong matches, because:
> * the rule "color GREEN seen in the last 2 minutes" should fire only for {{Measurement\[id=color, val=green]}} Events, which has not occured, and is matching instead over {{Measurement\[id=color, val=red]}}
> * the rule "id X seen in the last 2 minutes" should fire only for {{Measurement\[id=x, _]}} Events, but is considering also the {{Measurement\[id=color, _]}} event which occured earlier.
> {code}
> 2016-03-09 09:33:20,952 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:33:21,319 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:33:21,321 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,539 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:33:21,743 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen Measurement for id=x in the last 2m [red, x]
> I have seen color GREEN in the last 2m [red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,750 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> <- Measurement [id=color, val=red]
> -> Measurement [id=color, val=green]
> I have seen color GREEN in the last 2m [green]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> <- Measurement [id=x, val=x]
> -> Measurement [id=color, val=blue]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h6. Drools version 6.2.0.Final with Phreak
> NPE
> {code}
> java.lang.NullPointerException
> at org.drools.core.reteoo.NodeTypeEnums.isBetaNode(NodeTypeEnums.java:87)
> at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:252)
> at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
> at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
> at org.drools.core.phreak.RuleExecutor.evaluateNetwork(RuleExecutor.java:92)
> at org.drools.core.common.DefaultAgenda.evaluateEagerList(DefaultAgenda.java:1044)
> at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:996)
> at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262)
> at com.acme.accumulateUpgradeTest.RuleTest.test(RuleTest.java:185)
> {code}
> h6. Drools version 6.3.0.Final with Reteoo
> Not in scope of this JIRA record. I think this release had a bug when running with the setup of this reproducer because if I try I get NPE at {{org.drools.core.RuleBaseConfiguration.configureReteComponentFactory()}}
> h6. Drools version 6.3.0.Final with Phreak
> Same NPE as "6.2.0.Final with Phreak"
> h6. Drools version 6.4.0.Beta2 with Reteoo
> Same problem as "6.2.0.Final with Reteoo"
> h6. Drools version 6.4.0.Beta2 with Phreak
> Better, but I'm not sure why rule "color RED seen in the last 2 minutes" is firing again after the rule-update, it is no-loop and the conditions of the rules are the same as before the rule-update, hence I'm not sure why it fired again.
> {code}
> 2016-03-09 09:45:25,301 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:45:25,696 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:45:25,698 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:45:25,854 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen color RED in the last 2m [red]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:45:26,029 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> -> Measurement [id=color, val=green]
> <- Measurement [id=color, val=red]
> I have seen color GREEN in the last 2m [green]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> -> Measurement [id=color, val=blue]
> <- Measurement [id=x, val=x]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h2. Final note.
> Please notice in the reproducer I've used {{setSourcePath}} to ".txt" because I'm aliging with the Drool's JUnit tests: https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test...
> However changing {{setSourcePath}} to ".drl" would NOT solve the problem, at least for the rule "id X seen in the last 2 minutes".
> Can you kindly advise, please?
> Thank you
> Ciao,
> MM
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month
[JBoss JIRA] (DROOLS-1087) KieBase update wrong match for rules containing constraints over the accumulate
by Matteo Mortari (JIRA)
[ https://issues.jboss.org/browse/DROOLS-1087?page=com.atlassian.jira.plugi... ]
Matteo Mortari updated DROOLS-1087:
-----------------------------------
Affects Version/s: 6.4.0.Final
> KieBase update wrong match for rules containing constraints over the accumulate
> -------------------------------------------------------------------------------
>
> Key: DROOLS-1087
> URL: https://issues.jboss.org/browse/DROOLS-1087
> Project: Drools
> Issue Type: Bug
> Components: core engine
> Affects Versions: 6.2.0.Final, 6.3.0.Final, 6.4.0.Beta2, 6.4.0.Final
> Reporter: Matteo Mortari
> Assignee: Mario Fusco
> Attachments: 20160309.DROOLS-1087.zip, 20160503.yetagain1087.zip
>
>
> Ciao, I will attach reproducer with same style as {{org.drools.compiler.integrationtests.IncrementalCompilationTest.testIncrementalCompilation}} / {{testIncrementalCompilationWithRedeclares}}
> h2. Executive summary
> When performing KieBase update, rules containing constraints over the accumulate Event, are firing with wrong matches and/or firing for already seen matches and violating the no-loop.
> h2. Detailed description of the reproducer.
> Assume a KB starting with only these two rules:
> {code}
> declare Measurement
> @role(event)
> end
> rule "color RED seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "red") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color RED in the last 2m "+$mySet);
> end
> rule "color GREEN seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "green") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color GREEN in the last 2m "+$mySet);
> end
> {code}
> and then on upgrade/update, the same rule as above un-touched, but additionally the following rule:
> {code}
> rule "id X seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "x", $colorVal : val) over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen Measurement for id=x in the last 2m "+$mySet);
> end
> {code}
> Where {{Measurement}} just a POJO as per Kie Artifact, basically containing fields: {{String id;String val;}}
> with the following of Measurement insertions, one at each minute:
> {code}
> -> Measurement [id=color, val=red]
> (KB update here)
> -> Measurement [id=x, val=x]
> -> Measurement [id=color, val=green]
> ...
> {code}
> the following problems are highlighted:
> h6. Drools version 6.2.0.Final with Reteoo
> The problem is highlighted after the 2nd Measurment event insertion below, the rules "color GREEN seen in the last 2 minutes" and "id X seen in the last 2 minutes" are firing with wrong matches, because:
> * the rule "color GREEN seen in the last 2 minutes" should fire only for {{Measurement\[id=color, val=green]}} Events, which has not occured, and is matching instead over {{Measurement\[id=color, val=red]}}
> * the rule "id X seen in the last 2 minutes" should fire only for {{Measurement\[id=x, _]}} Events, but is considering also the {{Measurement\[id=color, _]}} event which occured earlier.
> {code}
> 2016-03-09 09:33:20,952 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:33:21,319 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:33:21,321 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,539 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:33:21,743 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen Measurement for id=x in the last 2m [red, x]
> I have seen color GREEN in the last 2m [red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,750 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> <- Measurement [id=color, val=red]
> -> Measurement [id=color, val=green]
> I have seen color GREEN in the last 2m [green]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> <- Measurement [id=x, val=x]
> -> Measurement [id=color, val=blue]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h6. Drools version 6.2.0.Final with Phreak
> NPE
> {code}
> java.lang.NullPointerException
> at org.drools.core.reteoo.NodeTypeEnums.isBetaNode(NodeTypeEnums.java:87)
> at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:252)
> at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
> at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
> at org.drools.core.phreak.RuleExecutor.evaluateNetwork(RuleExecutor.java:92)
> at org.drools.core.common.DefaultAgenda.evaluateEagerList(DefaultAgenda.java:1044)
> at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:996)
> at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262)
> at com.acme.accumulateUpgradeTest.RuleTest.test(RuleTest.java:185)
> {code}
> h6. Drools version 6.3.0.Final with Reteoo
> Not in scope of this JIRA record. I think this release had a bug when running with the setup of this reproducer because if I try I get NPE at {{org.drools.core.RuleBaseConfiguration.configureReteComponentFactory()}}
> h6. Drools version 6.3.0.Final with Phreak
> Same NPE as "6.2.0.Final with Phreak"
> h6. Drools version 6.4.0.Beta2 with Reteoo
> Same problem as "6.2.0.Final with Reteoo"
> h6. Drools version 6.4.0.Beta2 with Phreak
> Better, but I'm not sure why rule "color RED seen in the last 2 minutes" is firing again after the rule-update, it is no-loop and the conditions of the rules are the same as before the rule-update, hence I'm not sure why it fired again.
> {code}
> 2016-03-09 09:45:25,301 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:45:25,696 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:45:25,698 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:45:25,854 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen color RED in the last 2m [red]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:45:26,029 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> -> Measurement [id=color, val=green]
> <- Measurement [id=color, val=red]
> I have seen color GREEN in the last 2m [green]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> -> Measurement [id=color, val=blue]
> <- Measurement [id=x, val=x]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h2. Final note.
> Please notice in the reproducer I've used {{setSourcePath}} to ".txt" because I'm aliging with the Drool's JUnit tests: https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test...
> However changing {{setSourcePath}} to ".drl" would NOT solve the problem, at least for the rule "id X seen in the last 2 minutes".
> Can you kindly advise, please?
> Thank you
> Ciao,
> MM
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month
[JBoss JIRA] (DROOLS-1087) KieBase update wrong match for rules containing constraints over the accumulate
by Matteo Mortari (JIRA)
[ https://issues.jboss.org/browse/DROOLS-1087?page=com.atlassian.jira.plugi... ]
Matteo Mortari updated DROOLS-1087:
-----------------------------------
Attachment: 20160503.yetagain1087.zip
> KieBase update wrong match for rules containing constraints over the accumulate
> -------------------------------------------------------------------------------
>
> Key: DROOLS-1087
> URL: https://issues.jboss.org/browse/DROOLS-1087
> Project: Drools
> Issue Type: Bug
> Components: core engine
> Affects Versions: 6.2.0.Final, 6.3.0.Final, 6.4.0.Beta2
> Reporter: Matteo Mortari
> Assignee: Mario Fusco
> Attachments: 20160309.DROOLS-1087.zip, 20160503.yetagain1087.zip
>
>
> Ciao, I will attach reproducer with same style as {{org.drools.compiler.integrationtests.IncrementalCompilationTest.testIncrementalCompilation}} / {{testIncrementalCompilationWithRedeclares}}
> h2. Executive summary
> When performing KieBase update, rules containing constraints over the accumulate Event, are firing with wrong matches and/or firing for already seen matches and violating the no-loop.
> h2. Detailed description of the reproducer.
> Assume a KB starting with only these two rules:
> {code}
> declare Measurement
> @role(event)
> end
> rule "color RED seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "red") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color RED in the last 2m "+$mySet);
> end
> rule "color GREEN seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "green") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color GREEN in the last 2m "+$mySet);
> end
> {code}
> and then on upgrade/update, the same rule as above un-touched, but additionally the following rule:
> {code}
> rule "id X seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "x", $colorVal : val) over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen Measurement for id=x in the last 2m "+$mySet);
> end
> {code}
> Where {{Measurement}} just a POJO as per Kie Artifact, basically containing fields: {{String id;String val;}}
> with the following of Measurement insertions, one at each minute:
> {code}
> -> Measurement [id=color, val=red]
> (KB update here)
> -> Measurement [id=x, val=x]
> -> Measurement [id=color, val=green]
> ...
> {code}
> the following problems are highlighted:
> h6. Drools version 6.2.0.Final with Reteoo
> The problem is highlighted after the 2nd Measurment event insertion below, the rules "color GREEN seen in the last 2 minutes" and "id X seen in the last 2 minutes" are firing with wrong matches, because:
> * the rule "color GREEN seen in the last 2 minutes" should fire only for {{Measurement\[id=color, val=green]}} Events, which has not occured, and is matching instead over {{Measurement\[id=color, val=red]}}
> * the rule "id X seen in the last 2 minutes" should fire only for {{Measurement\[id=x, _]}} Events, but is considering also the {{Measurement\[id=color, _]}} event which occured earlier.
> {code}
> 2016-03-09 09:33:20,952 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:33:21,319 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:33:21,321 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,539 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:33:21,743 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen Measurement for id=x in the last 2m [red, x]
> I have seen color GREEN in the last 2m [red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,750 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> <- Measurement [id=color, val=red]
> -> Measurement [id=color, val=green]
> I have seen color GREEN in the last 2m [green]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> <- Measurement [id=x, val=x]
> -> Measurement [id=color, val=blue]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h6. Drools version 6.2.0.Final with Phreak
> NPE
> {code}
> java.lang.NullPointerException
> at org.drools.core.reteoo.NodeTypeEnums.isBetaNode(NodeTypeEnums.java:87)
> at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:252)
> at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
> at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
> at org.drools.core.phreak.RuleExecutor.evaluateNetwork(RuleExecutor.java:92)
> at org.drools.core.common.DefaultAgenda.evaluateEagerList(DefaultAgenda.java:1044)
> at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:996)
> at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262)
> at com.acme.accumulateUpgradeTest.RuleTest.test(RuleTest.java:185)
> {code}
> h6. Drools version 6.3.0.Final with Reteoo
> Not in scope of this JIRA record. I think this release had a bug when running with the setup of this reproducer because if I try I get NPE at {{org.drools.core.RuleBaseConfiguration.configureReteComponentFactory()}}
> h6. Drools version 6.3.0.Final with Phreak
> Same NPE as "6.2.0.Final with Phreak"
> h6. Drools version 6.4.0.Beta2 with Reteoo
> Same problem as "6.2.0.Final with Reteoo"
> h6. Drools version 6.4.0.Beta2 with Phreak
> Better, but I'm not sure why rule "color RED seen in the last 2 minutes" is firing again after the rule-update, it is no-loop and the conditions of the rules are the same as before the rule-update, hence I'm not sure why it fired again.
> {code}
> 2016-03-09 09:45:25,301 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:45:25,696 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:45:25,698 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:45:25,854 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen color RED in the last 2m [red]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:45:26,029 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> -> Measurement [id=color, val=green]
> <- Measurement [id=color, val=red]
> I have seen color GREEN in the last 2m [green]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> -> Measurement [id=color, val=blue]
> <- Measurement [id=x, val=x]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h2. Final note.
> Please notice in the reproducer I've used {{setSourcePath}} to ".txt" because I'm aliging with the Drool's JUnit tests: https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test...
> However changing {{setSourcePath}} to ".drl" would NOT solve the problem, at least for the rule "id X seen in the last 2 minutes".
> Can you kindly advise, please?
> Thank you
> Ciao,
> MM
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month
[JBoss JIRA] (DROOLS-1087) KieBase update wrong match for rules containing constraints over the accumulate
by Matteo Mortari (JIRA)
[ https://issues.jboss.org/browse/DROOLS-1087?page=com.atlassian.jira.plugi... ]
Matteo Mortari commented on DROOLS-1087:
----------------------------------------
Ciao Mario, thanks for the feedback but one case is still not fully explained and still failing on upgrade.
First thing first, thank you for the explanation about how the incremental compilation works based at resource level. I advised the business how to more properly handle incremental versioning of new rules, e.g.: try to maintain unchanged rule in a given file, and provide new one in separate new file; or alternatively, rewrite the rule with additional condition to avoid "unexpected" refires.
There is a case of upgrade with reteoo, as per original description, which is failing on rule upgrade. I'll attach reproducer rewritten to (hopefully) better highlight the problem experienced. I understand reteoo is being deprecated in favor of phreak, so if this case is not supported due to deprecation, at least it can be helpful for posterity :)
In the new reproducer, the rules are as per original description, and dropping the no-loop attributes as you correctly pointed out, was not necessary.
So with the new reproducer, I highlight and comment below the most interesting part:
{code}
ReleaseId releaseId1 = ks.newReleaseId( "org.kie", "test-upgrade", "1.0.0" );
KieModuleModel kieModuleModel = ks.newKieModuleModel();
kieModuleModel.newKieBaseModel( "KBase1 ")
.setDefault( true )
.setEqualsBehavior( EqualityBehaviorOption.IDENTITY )
.setEventProcessingMode( EventProcessingOption.STREAM );
Resource resourceDRL1 = ks.getResources()
.newReaderResource( new StringReader(drl1) )
.setResourceType( ResourceType.DRL )
.setSourcePath( "drl1.drl" );
createAndDeployJar(ks, kieModuleModel.toXML(), releaseId1, resourceDRL1);
KieContainer kc = ks.newKieContainer( releaseId1 );
KieBase kieBase = kc.getKieBase();
KieSessionConfiguration config = ks.newKieSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );
KieSession ksession = kieBase.newKieSession(config, null);
SessionPseudoClock clock = ksession.getSessionClock();
clock.advanceTime(1, TimeUnit.MINUTES);
ksession.insert( new org.acme.sensors.Measurement("color", "red") );
assertEquals( 1, ksession.fireAllRules() );
{code}
up to here all is fine, on the console is:
{code}
2016-05-03 16:19:31,795 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.kie:test-upgrade:1.0.0]
I have seen color RED in the last 2m [red]
{code}
And this is OK, only Measurement id=color val=red was inserted into the session.
Now introducing the DRL2, for the rule taking care for Measurement id=x:
{code}
ReleaseId releaseId2 = ks.newReleaseId( "org.kie", "test-upgrade", "1.1.0" );
resourceDRL1 = ks.getResources()
.newReaderResource( new StringReader(drl1 + " ") ) // trivial update to force realize indeed Measurement is declared as @role event, maybe another bug report later =)
.setResourceType( ResourceType.DRL )
.setSourcePath( "drl1.drl" );
Resource resourceDRL2 = ks.getResources()
.newReaderResource( new StringReader(drl2) )
.setResourceType( ResourceType.DRL )
.setSourcePath( "drl2.drl" );
createAndDeployJar(ks, kieModuleModel.toXML(), releaseId2, resourceDRL1, resourceDRL2);
kc.updateToVersion( releaseId2 );
final List<String> fired = new ArrayList<String>();
ksession.addEventListener(new DefaultAgendaEventListener() {
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
fired.add(event.getMatch().getRule().getName());
}
});
HashSet<String> controlSet = new HashSet<String>();
ksession.setGlobal("controlSet", controlSet);
clock.advanceTime(1, TimeUnit.MINUTES);
ksession.insert( new org.acme.sensors.Measurement("x", "x") );
ksession.fireAllRules();
assertTrue("because trivial update to drl1, rule for color RED should have fired again, now I understand why and is OK:",
fired.contains("color RED seen in the last 2 minutes"));
assertTrue("and inserted Measurement x x , so also the rule in drl2 should have fired, this is OK:",
fired.contains("id X seen in the last 2 minutes"));
System.err.println("rule which fired: "+fired);
System.err.println("global control set: "+controlSet);
assertTrue("because inserted Measurement x x , the rule in drl2 should have fired, this is OK",
controlSet.contains("x"));
// THIS FAILS:
assertTrue("because inserted ONLY Measurement x x , the rule in drl2 should have fired only for it, not for the color-red",
controlSet.size() == 1);
// THIS FAILS TOO:
assertFalse("but nobody inserted color GREEN, so it should NOT have fired:",
fired.contains("color GREEN seen in the last 2 minutes"));
{code}
and on the console:
{code}
2016-05-03 16:32:38,194 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.kie:test-upgrade:1.1.0]
I have seen Measurement for id=x in the last 2m [red, x]
I have seen color GREEN in the last 2m [red]
I have seen color RED in the last 2m [red]
rule which fired: [id X seen in the last 2 minutes, color GREEN seen in the last 2 minutes, color RED seen in the last 2 minutes]
global control set: [red, x]
{code}
and the assertions as per comments fail.
We can notice that:
* the rule for "color green" is firing for a wrong match (it is matching on val=red)
* the rule for Measurement id=x has matched also for Measurement id=color.
I hope the JUnit assertions highlight better the unexpected behavior, and once again to be noted this is with reteoo, and I submit for completeness, I can understand if this use-case scenario is no longer covered due to the deprecation of this old algo in favor of phreak
> KieBase update wrong match for rules containing constraints over the accumulate
> -------------------------------------------------------------------------------
>
> Key: DROOLS-1087
> URL: https://issues.jboss.org/browse/DROOLS-1087
> Project: Drools
> Issue Type: Bug
> Components: core engine
> Affects Versions: 6.2.0.Final, 6.3.0.Final, 6.4.0.Beta2
> Reporter: Matteo Mortari
> Assignee: Mario Fusco
> Attachments: 20160309.DROOLS-1087.zip
>
>
> Ciao, I will attach reproducer with same style as {{org.drools.compiler.integrationtests.IncrementalCompilationTest.testIncrementalCompilation}} / {{testIncrementalCompilationWithRedeclares}}
> h2. Executive summary
> When performing KieBase update, rules containing constraints over the accumulate Event, are firing with wrong matches and/or firing for already seen matches and violating the no-loop.
> h2. Detailed description of the reproducer.
> Assume a KB starting with only these two rules:
> {code}
> declare Measurement
> @role(event)
> end
> rule "color RED seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "red") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color RED in the last 2m "+$mySet);
> end
> rule "color GREEN seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "color", $colorVal : val, $colorVal == "green") over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen color GREEN in the last 2m "+$mySet);
> end
> {code}
> and then on upgrade/update, the same rule as above un-touched, but additionally the following rule:
> {code}
> rule "id X seen in the last 2 minutes"
> no-loop
> when
> accumulate ( $token: Measurement( id == "x", $colorVal : val) over window:time(2m);
> $mySet : collectSet( $colorVal ),
> $val : count($token) ;
> $val >= 1
> )
> then
> System.out.println("I have seen Measurement for id=x in the last 2m "+$mySet);
> end
> {code}
> Where {{Measurement}} just a POJO as per Kie Artifact, basically containing fields: {{String id;String val;}}
> with the following of Measurement insertions, one at each minute:
> {code}
> -> Measurement [id=color, val=red]
> (KB update here)
> -> Measurement [id=x, val=x]
> -> Measurement [id=color, val=green]
> ...
> {code}
> the following problems are highlighted:
> h6. Drools version 6.2.0.Final with Reteoo
> The problem is highlighted after the 2nd Measurment event insertion below, the rules "color GREEN seen in the last 2 minutes" and "id X seen in the last 2 minutes" are firing with wrong matches, because:
> * the rule "color GREEN seen in the last 2 minutes" should fire only for {{Measurement\[id=color, val=green]}} Events, which has not occured, and is matching instead over {{Measurement\[id=color, val=red]}}
> * the rule "id X seen in the last 2 minutes" should fire only for {{Measurement\[id=x, _]}} Events, but is considering also the {{Measurement\[id=color, _]}} event which occured earlier.
> {code}
> 2016-03-09 09:33:20,952 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,240 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:33:21,319 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:33:21,321 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,539 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:33:21,743 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:33:21,744 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen Measurement for id=x in the last 2m [red, x]
> I have seen color GREEN in the last 2m [red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:33:21,750 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> <- Measurement [id=color, val=red]
> -> Measurement [id=color, val=green]
> I have seen color GREEN in the last 2m [green]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> <- Measurement [id=x, val=x]
> -> Measurement [id=color, val=blue]
> 2016-03-09 09:33:21,752 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h6. Drools version 6.2.0.Final with Phreak
> NPE
> {code}
> java.lang.NullPointerException
> at org.drools.core.reteoo.NodeTypeEnums.isBetaNode(NodeTypeEnums.java:87)
> at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:252)
> at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
> at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
> at org.drools.core.phreak.RuleExecutor.evaluateNetwork(RuleExecutor.java:92)
> at org.drools.core.common.DefaultAgenda.evaluateEagerList(DefaultAgenda.java:1044)
> at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:996)
> at org.drools.core.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1302)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1289)
> at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:1262)
> at com.acme.accumulateUpgradeTest.RuleTest.test(RuleTest.java:185)
> {code}
> h6. Drools version 6.3.0.Final with Reteoo
> Not in scope of this JIRA record. I think this release had a bug when running with the setup of this reproducer because if I try I get NPE at {{org.drools.core.RuleBaseConfiguration.configureReteComponentFactory()}}
> h6. Drools version 6.3.0.Final with Phreak
> Same NPE as "6.2.0.Final with Phreak"
> h6. Drools version 6.4.0.Beta2 with Reteoo
> Same problem as "6.2.0.Final with Reteoo"
> h6. Drools version 6.4.0.Beta2 with Phreak
> Better, but I'm not sure why rule "color RED seen in the last 2 minutes" is firing again after the rule-update, it is no-loop and the conditions of the rules are the same as before the rule-update, hence I'm not sure why it fired again.
> {code}
> 2016-03-09 09:45:25,301 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.0]
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) There should be rules:
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:25,594 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Creating kieSession
> 2016-03-09 09:45:25,696 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Now running data
> 2016-03-09 09:45:25,698 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 60000
> -> Measurement [id=color, val=red]
> I have seen color RED in the last 2m [red]
> 2016-03-09 09:45:25,854 INFO [org.drools.compiler.kie.builder.impl.KieRepositoryImpl] (main) KieModule was added: MemoryKieModule[releaseId=org.test:test:1.0.1]
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Update of KB performed.
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color RED seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule color GREEN seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) kp [Package name=com.acme.accumulateUpgradeTest] rule id X seen in the last 2 minutes
> 2016-03-09 09:45:26,023 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 120000
> -> Measurement [id=x, val=x]
> I have seen color RED in the last 2m [red]
> I have seen Measurement for id=x in the last 2m [x]
> 2016-03-09 09:45:26,029 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 180000
> -> Measurement [id=color, val=green]
> <- Measurement [id=color, val=red]
> I have seen color GREEN in the last 2m [green]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) advance clock @ 240000
> -> Measurement [id=color, val=blue]
> <- Measurement [id=x, val=x]
> 2016-03-09 09:45:26,033 INFO [com.acme.accumulateUpgradeTest.RuleTest] (main) Final checks
> {code}
> h2. Final note.
> Please notice in the reproducer I've used {{setSourcePath}} to ".txt" because I'm aliging with the Drool's JUnit tests: https://github.com/droolsjbpm/drools/blob/master/drools-compiler/src/test...
> However changing {{setSourcePath}} to ".drl" would NOT solve the problem, at least for the rule "id X seen in the last 2 minutes".
> Can you kindly advise, please?
> Thank you
> Ciao,
> MM
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month
[JBoss JIRA] (DROOLS-1155) ClassCastException after deserialization of kiebase
by Mariano Nicolas De Maio (JIRA)
[ https://issues.jboss.org/browse/DROOLS-1155?page=com.atlassian.jira.plugi... ]
Mariano Nicolas De Maio updated DROOLS-1155:
--------------------------------------------
Attachment: issue-repro.tar.gz
Attached [^issue-repro.tar.gz] with the project to reproduce the error
> ClassCastException after deserialization of kiebase
> ---------------------------------------------------
>
> Key: DROOLS-1155
> URL: https://issues.jboss.org/browse/DROOLS-1155
> Project: Drools
> Issue Type: Bug
> Affects Versions: 6.3.0.Final, 7.0.0.Beta1
> Reporter: Mariano Nicolas De Maio
> Assignee: Mark Proctor
> Attachments: issue-repro.tar.gz
>
>
> After the fix for issue DROOLS-1123, I was able to follow deserialize the kie base correctly. However, after deserialization, the kie sessions do not behave in the same way. The attached project has a reproduction case for the difference in behavior
--
This message was sent by Atlassian JIRA
(v6.4.11#64026)
10 years, 1 month