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]