You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ml...@apache.org on 2022/12/22 11:14:25 UTC

[ofbiz-framework] branch trunk updated: Fixed: RuntimeData and RecurrenceInfo not cleaned after job purge (OFBIZ-12679)

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

mleila pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new b80e411bb8 Fixed: RuntimeData and RecurrenceInfo not cleaned after job purge (OFBIZ-12679)
b80e411bb8 is described below

commit b80e411bb827134e995bdaeb7857feb07c6beb28
Author: MLeila <ml...@apache.org>
AuthorDate: Thu Dec 22 12:14:17 2022 +0100

    Fixed: RuntimeData and RecurrenceInfo not cleaned after job purge
    (OFBIZ-12679)
    
    Add jobSandbox related runtimeDataId and recurrenceInfoId fields when
    searching for jobs to purge so that the PurgeJob can retrieve and clean
    job related entities (JobUtil.removeJob)
    Also add a test that validate the complete purge
    
    Thanks: Gaƫtan Chaboussie for report and corrective patch
---
 .../ofbiz/service/test/ServicePurgeTest.groovy     | 38 ++++++++++++++++++++
 .../org/apache/ofbiz/service/job/JobManager.java   | 42 +++++++++++++---------
 .../org/apache/ofbiz/service/job/JobServices.java  | 25 ++-----------
 framework/service/testdef/servicetests.xml         |  4 +++
 4 files changed, 70 insertions(+), 39 deletions(-)

diff --git a/framework/service/src/main/groovy/org/apache/ofbiz/service/test/ServicePurgeTest.groovy b/framework/service/src/main/groovy/org/apache/ofbiz/service/test/ServicePurgeTest.groovy
new file mode 100644
index 0000000000..1537fe2d4f
--- /dev/null
+++ b/framework/service/src/main/groovy/org/apache/ofbiz/service/test/ServicePurgeTest.groovy
@@ -0,0 +1,38 @@
+package org.apache.ofbiz.service
+
+import org.apache.ofbiz.base.util.UtilDateTime
+import org.apache.ofbiz.entity.GenericValue
+import org.apache.ofbiz.entity.util.EntityQuery
+import org.apache.ofbiz.service.config.ServiceConfigUtil
+import org.apache.ofbiz.testtools.GroovyScriptTestCase
+
+class ServicePurgeTest extends GroovyScriptTestCase {
+
+// ./gradlew 'ofbiz -t component=service -t suitename=servicetests -t case=service-purge-test' --debug-jvm
+
+    void testRuntimeDataIsCleanedAfterServicePurge() {
+        GenericValue sysUserLogin = delegator.findOne('UserLogin', true, 'userLoginId', 'system')
+        String jobId = delegator.getNextSeqId('JobSandbox')
+
+        def createRuntimeResult = dispatcher.runSync('createRuntimeData', [
+                runtimeInfo: 'This is a runtimeInfo',
+                userLogin  : sysUserLogin
+        ])
+        String runtimeDataId = createRuntimeResult.runtimeDataId
+
+        dispatcher.runSync('createJobSandbox', [
+                userLogin     : sysUserLogin,
+                poolId        : ServiceConfigUtil.getServiceEngine().getThreadPool().getSendToPool(),
+                jobId         : jobId,
+                runtimeDataId : runtimeDataId,
+                statusId      : 'SERVICE_FINISHED',
+                serviceName   : 'sendMail',
+                finishDateTime: UtilDateTime.addDaysToTimestamp(UtilDateTime.nowTimestamp(), -10)
+        ])
+
+        dispatcher.runSync('purgeOldJobs', [userLogin: sysUserLogin])
+
+        assert EntityQuery.use(delegator).from('JobSandbox').where('jobId', jobId).queryCount() == 0
+        assert EntityQuery.use(delegator).from('RuntimeData').where('runtimeDataId', runtimeDataId).queryCount() == 0
+    }
+}
diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java b/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java
index 3016474812..ce82e0bcfd 100644
--- a/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java
+++ b/framework/service/src/main/java/org/apache/ofbiz/service/job/JobManager.java
@@ -253,16 +253,6 @@ public final class JobManager {
                 Debug.logWarning(e, "Unable to get purge job days: ", MODULE);
                 return Collections.emptyList();
             }
-            List<EntityCondition> purgeCondition = UtilMisc.toList(
-                    EntityCondition.makeCondition("runByInstanceId", INSTANCE_ID),
-                    EntityCondition.makeCondition(UtilMisc.toList(
-                            EntityCondition.makeCondition(UtilMisc.toList(
-                                    EntityCondition.makeCondition("finishDateTime", EntityOperator.NOT_EQUAL, null),
-                                    EntityCondition.makeCondition("finishDateTime", EntityOperator.LESS_THAN, purgeTime))),
-                            EntityCondition.makeCondition(UtilMisc.toList(
-                                    EntityCondition.makeCondition("cancelDateTime", EntityOperator.NOT_EQUAL, null),
-                                    EntityCondition.makeCondition("cancelDateTime", EntityOperator.LESS_THAN, purgeTime)))),
-                            EntityOperator.OR));
             beganTransaction = false;
             try {
                 beganTransaction = TransactionUtil.begin();
@@ -270,12 +260,8 @@ public final class JobManager {
                     Debug.logWarning("Unable to poll JobSandbox for jobs; unable to begin transaction.", MODULE);
                     return Collections.emptyList();
                 }
-                List<GenericValue> jobs = EntityQuery.use(delegator).from("JobSandbox")
-                        .where(purgeCondition)
-                        .select("jobId")
-                        .maxRows(limit)
-                        .queryList();
-                jobs.forEach(jobValue -> poll.add(new PurgeJob(jobValue)));
+                getJobsToPurge(delegator, null, INSTANCE_ID, limit, purgeTime)
+                        .forEach(jobValue -> poll.add(new PurgeJob(jobValue)));
                 TransactionUtil.commit(beganTransaction);
             } catch (Throwable t) {
                 String errMsg = "Exception thrown while polling JobSandbox: ";
@@ -291,6 +277,30 @@ public final class JobManager {
         return poll;
     }
 
+    public static List<GenericValue> getJobsToPurge(Delegator delegator, String poolId, String instanceId, int limit, Timestamp purgeTime)
+            throws GenericEntityException {
+        List<EntityCondition> purgeCondition = UtilMisc.toList(
+                EntityCondition.makeCondition(UtilMisc.toList(
+                                EntityCondition.makeCondition(UtilMisc.toList(
+                                        EntityCondition.makeCondition("finishDateTime", EntityOperator.NOT_EQUAL, null),
+                                        EntityCondition.makeCondition("finishDateTime", EntityOperator.LESS_THAN, purgeTime))),
+                                EntityCondition.makeCondition(UtilMisc.toList(
+                                        EntityCondition.makeCondition("cancelDateTime", EntityOperator.NOT_EQUAL, null),
+                                        EntityCondition.makeCondition("cancelDateTime", EntityOperator.LESS_THAN, purgeTime)))),
+                        EntityOperator.OR));
+        if (UtilValidate.isNotEmpty(instanceId)) {
+            purgeCondition.add(EntityCondition.makeCondition("runByInstanceId", instanceId));
+        }
+        if (UtilValidate.isNotEmpty(poolId)) {
+            purgeCondition.add(EntityCondition.makeCondition("poolId", poolId));
+        }
+        return EntityQuery.use(delegator).from("JobSandbox")
+                .where(purgeCondition)
+                .select("jobId", "runtimeDataId", "recurrenceInfoId")
+                .maxRows(limit)
+                .queryList();
+    }
+
     public synchronized void reloadCrashedJobs() {
         assertIsRunning();
         if (crashedJobsReloaded) {
diff --git a/framework/service/src/main/java/org/apache/ofbiz/service/job/JobServices.java b/framework/service/src/main/java/org/apache/ofbiz/service/job/JobServices.java
index 4a459e8ab8..3b82354a17 100644
--- a/framework/service/src/main/java/org/apache/ofbiz/service/job/JobServices.java
+++ b/framework/service/src/main/java/org/apache/ofbiz/service/job/JobServices.java
@@ -21,7 +21,6 @@ package org.apache.ofbiz.service.job;
 import java.sql.Timestamp;
 import java.time.Duration;
 import java.time.Instant;
-import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.ofbiz.base.config.GenericConfigException;
@@ -32,8 +31,6 @@ import org.apache.ofbiz.base.util.UtilProperties;
 import org.apache.ofbiz.entity.Delegator;
 import org.apache.ofbiz.entity.GenericEntityException;
 import org.apache.ofbiz.entity.GenericValue;
-import org.apache.ofbiz.entity.condition.EntityCondition;
-import org.apache.ofbiz.entity.condition.EntityOperator;
 import org.apache.ofbiz.entity.util.EntityQuery;
 import org.apache.ofbiz.security.Security;
 import org.apache.ofbiz.service.DispatchContext;
@@ -126,27 +123,9 @@ public class JobServices {
         }
         Delegator delegator = dctx.getDelegator();
         Timestamp purgeTime = Timestamp.from(Instant.now().minus(Duration.ofDays(daysToKeep)));
-
-        // create the conditions to query
-        List<EntityCondition> purgeCondition = UtilMisc.toList(
-                EntityCondition.makeCondition("poolId", sendPool),
-                EntityCondition.makeCondition(UtilMisc.toList(
-                        EntityCondition.makeCondition(UtilMisc.toList(
-                                EntityCondition.makeCondition("finishDateTime", EntityOperator.NOT_EQUAL, null),
-                                EntityCondition.makeCondition("finishDateTime", EntityOperator.LESS_THAN, purgeTime))),
-                        EntityCondition.makeCondition(UtilMisc.toList(
-                                EntityCondition.makeCondition("cancelDateTime", EntityOperator.NOT_EQUAL, null),
-                                EntityCondition.makeCondition("cancelDateTime", EntityOperator.LESS_THAN, purgeTime)))),
-                        EntityOperator.OR));
-
-        EntityQuery jobQuery = EntityQuery.use(delegator).from("JobSandbox")
-                .where(purgeCondition)
-                .select("jobId");
-        if (limit != null) {
-            jobQuery.maxRows(limit);
-        }
         try {
-            jobQuery.queryList().forEach(JobUtil::removeJob);
+            JobManager.getJobsToPurge(delegator, sendPool, null, limit, purgeTime)
+                    .forEach(JobUtil::removeJob);
         } catch (GenericEntityException e) {
             Debug.logWarning(e, MODULE);
         }
diff --git a/framework/service/testdef/servicetests.xml b/framework/service/testdef/servicetests.xml
index 630085844e..1dad1a6031 100644
--- a/framework/service/testdef/servicetests.xml
+++ b/framework/service/testdef/servicetests.xml
@@ -83,4 +83,8 @@ under the License.
         <junit-test-suite class-name="org.apache.ofbiz.service.test.ServicePermissionTests"/>
     </test-case>
 
+    <test-case case-name="service-purge-test">
+        <groovy-test-suite name="ServicePurgeTest" location="component://service/src/main/groovy/org/apache/ofbiz/service/test/ServicePurgeTest.groovy"/>
+    </test-case>
+
 </test-suite>