This is an automated email from the ASF dual-hosted git repository.

mariofusco pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-kie-drools.git


The following commit(s) were added to refs/heads/main by this push:
     new 1cd5aae0b9 [incubator-kie-drools-6339] Rule fires again after 
restoring session and calling fireAllRules (#6341)
1cd5aae0b9 is described below

commit 1cd5aae0b923e688a838a51d794ad4740d975f50
Author: Toshiya Kobayashi <[email protected]>
AuthorDate: Mon May 19 21:52:07 2025 +0900

    [incubator-kie-drools-6339] Rule fires again after restoring session and 
calling fireAllRules (#6341)
---
 .../org/drools/core/phreak/PropagationEntry.java   | 10 +++++
 .../core/ReliableSessionInitializer.java           |  4 +-
 .../test/ReliabilityUpdateInDrlTest.java           | 51 ++++++++++++++++++++++
 3 files changed, 63 insertions(+), 2 deletions(-)

diff --git 
a/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java 
b/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
index 0fb0c8f619..283a2b4cb8 100644
--- a/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
+++ b/drools-core/src/main/java/org/drools/core/phreak/PropagationEntry.java
@@ -106,6 +106,10 @@ public interface PropagationEntry {
         public PropagationEntry getSplitForPartition(int partitionNr) {
             throw new UnsupportedOperationException();
         }
+
+        public InternalFactHandle getHandle() {
+            throw new UnsupportedOperationException( "This method is not 
supported for this type of PropagationEntry" );
+        }
     }
 
     abstract class AbstractPartitionedPropagationEntry extends 
AbstractPropagationEntry {
@@ -295,6 +299,7 @@ public interface PropagationEntry {
             return "Insert of " + handle.getObject();
         }
 
+        @Override
         public InternalFactHandle getHandle() {
             return handle;
         }
@@ -358,6 +363,11 @@ public interface PropagationEntry {
             return new PartitionedUpdate( handle, context, objectTypeConf, 
partitionNr );
         }
 
+        @Override
+        public InternalFactHandle getHandle() {
+            return handle;
+        }
+
         @Override
         public String toString() {
             return "Update of " + handle.getObject();
diff --git 
a/drools-reliability/drools-reliability-core/src/main/java/org/drools/reliability/core/ReliableSessionInitializer.java
 
b/drools-reliability/drools-reliability-core/src/main/java/org/drools/reliability/core/ReliableSessionInitializer.java
index 049fd4f66b..8aa2416a73 100644
--- 
a/drools-reliability/drools-reliability-core/src/main/java/org/drools/reliability/core/ReliableSessionInitializer.java
+++ 
b/drools-reliability/drools-reliability-core/src/main/java/org/drools/reliability/core/ReliableSessionInitializer.java
@@ -85,8 +85,8 @@ public class ReliableSessionInitializer {
         }
 
         private void onWorkingMemoryAction(InternalWorkingMemory session, 
PropagationEntry entry) {
-            if (entry instanceof PropagationEntry.Insert) {
-                InternalFactHandle fh = ((PropagationEntry.Insert) 
entry).getHandle();
+            if (entry instanceof PropagationEntry.Insert || entry instanceof 
PropagationEntry.Update) {
+                InternalFactHandle fh = 
((PropagationEntry.AbstractPropagationEntry) entry).getHandle();
                 if (fh.isValid()) {
                     WorkingMemoryEntryPoint ep = fh.getEntryPoint(session);
                     ((SimpleReliableObjectStore) 
ep.getObjectStore()).putIntoPersistedStorage(fh, true);
diff --git 
a/drools-reliability/drools-reliability-tests/src/test/java/org/drools/reliability/test/ReliabilityUpdateInDrlTest.java
 
b/drools-reliability/drools-reliability-tests/src/test/java/org/drools/reliability/test/ReliabilityUpdateInDrlTest.java
index a62033ad2f..8f1a95431c 100644
--- 
a/drools-reliability/drools-reliability-tests/src/test/java/org/drools/reliability/test/ReliabilityUpdateInDrlTest.java
+++ 
b/drools-reliability/drools-reliability-tests/src/test/java/org/drools/reliability/test/ReliabilityUpdateInDrlTest.java
@@ -259,5 +259,56 @@ class ReliabilityUpdateInDrlTest extends 
ReliabilityTestBasics {
         assertThat(getResults(session2)).isEmpty();
     }
 
+    @ParameterizedTest
+    @MethodSource("strategyProviderStoresOnlyWithExplicitSafepoints")
+    void 
insertFireUpdateFailoverFire_shouldNotFireTheSameRuleTwice(PersistedSessionOption.PersistenceStrategy
 persistenceStrategy, PersistedSessionOption.SafepointStrategy 
safepointStrategy) {
+        String rule = "import " + Person.class.getCanonicalName() + ";\n" +
+                """
+                        global java.util.List results;
+                        
+                        rule R1
+                        when
+                            $p : Person( age < 50 )
+                        then
+                            results.add("R1");
+                        end
+                        
+                        rule R2
+                        when
+                            $a : Integer()
+                            $p : Person( age == $a )
+                        then
+                            results.add("R2");
+                        
+                            modify($p) {
+                                setAge($a + 1)
+                            }
+                        
+                            delete($a);
+                        end
+                        """;
+        createSession(rule, persistenceStrategy, safepointStrategy);
+
+        insert(new Person("John",32));
+
+        assertThat(fireAllRules()).isEqualTo(1);
+        assertThat(getResults()).containsExactly("R1");
+
+        failover();
+
+        restoreSession(rule, persistenceStrategy,safepointStrategy);
+        clearResults();
+
+        insert(32);
+
+        assertThat(fireAllRules()).isEqualTo(2);
+        assertThat(getResults()).containsExactly("R2", "R1");
+
+        failover();
+
+        restoreSession(rule, persistenceStrategy,safepointStrategy);
+
+        assertThat(fireAllRules()).isZero();
+    }
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to