From e2baf24cea9231e2f63b8215d55b91e96073730f Mon Sep 17 00:00:00 2001 From: Francisco Javier Tirado Sarti Date: Tue, 1 Oct 2024 12:28:21 +0200 Subject: [PATCH] [JBPM-10242] Disable linear search on condition Setting org.jbpm.ejb.timer.disable.linear.search and org.jbpm.ejb.timer.disable.linear.remove to true --- .../services/ejb/timer/EJBTimerScheduler.java | 66 +++++++------------ .../ejb/timer/EJBTimerSchedulerTest.java | 8 --- 2 files changed, 25 insertions(+), 49 deletions(-) diff --git a/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EJBTimerScheduler.java b/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EJBTimerScheduler.java index ab3fea23f4..ae2e19c21c 100644 --- a/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EJBTimerScheduler.java +++ b/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/main/java/org/jbpm/services/ejb/timer/EJBTimerScheduler.java @@ -247,8 +247,8 @@ private Serializable removeTransientFields(Serializable info) { return info; } - private boolean performLinearSearch() { - return Boolean.getBoolean("org.jbpm.ejb.timer.linear.search"); + private boolean disableLinearSearch(String suffix) { + return Boolean.getBoolean("org.jbpm.ejb.timer.disable.linear." + suffix); } @@ -260,13 +260,7 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) { } if (ejbTimer != null) { - try { - ejbTimer.cancel(); - return true; - } catch (Exception e) { - logger.warn("Timer cancel error for handle {}", ejbHandle.getUuid(), e); - return false; - } + return cancelTimer(ejbTimer, ejbHandle); } // small speed improvement using the ejb serializable info handler @@ -274,13 +268,7 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) { if (timerJobInstance != null) { Object ejbTimerHandle = timerJobInstance.getTimerInfo(); if(ejbTimerHandle instanceof TimerHandle) { - try { - ((TimerHandle) ejbTimerHandle).getTimer().cancel(); - } catch (Throwable e) { - logger.warn("Timer cancel error for handle {}", ejbTimerHandle, e); - return false; - } - return true; + return cancelTimer(((TimerHandle) ejbTimerHandle).getTimer(), ejbTimerHandle); } else { logger.warn("No TimerHandle found for {}: {}", ejbHandle, ejbTimerHandle); } @@ -288,24 +276,18 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) { logger.warn("No timerJobInstance available for {}", ejbHandle); } - if (performLinearSearch()) { + if (disableLinearSearch("remove")) { + logger.warn("Skipping linear search to delete uuid {}", ejbHandle.getUuid()); + } else { for (Timer timer : timerService.getTimers()) { try { Serializable info = timer.getInfo(); if (info instanceof EjbTimerJob) { EjbTimerJob job = (EjbTimerJob) info; - EjbGlobalJobHandle handle = (EjbGlobalJobHandle) job.getTimerJobInstance().getJobHandle(); if (handle.getUuid().equals(ejbHandle.getUuid())) { logger.info("Job handle {} does match timer and is going to be canceled", jobHandle); - - try { - timer.cancel(); - } catch (Throwable e) { - logger.warn("Timer cancel error for handle {}", handle, e); - return false; - } - return true; + return cancelTimer(timer, ejbHandle); } } } catch (NoSuchObjectLocalException e) { @@ -313,14 +295,19 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) { } } logger.info("Job handle {} does not match any timer on {} scheduler service", jobHandle, this); - return false; - } else { - logger.warn("Skipping linear search to delete uuid {}", ejbHandle.getUuid()); - return false; } - } - + return false; + } + private boolean cancelTimer(Timer timer, Object ejbTimerHandle) { + try { + timer.cancel(); + return true; + } catch (Exception ex) { + logger.warn("Timer cancel error for handle {}", ejbTimerHandle, ex); + return false; + } + } public TimerJobInstance getTimerByName(String jobName) { if (useLocalCache) { @@ -329,33 +316,30 @@ public TimerJobInstance getTimerByName(String jobName) { return localCache.get(jobName); } } - TimerJobInstance found = null; - if (performLinearSearch()) { + if (disableLinearSearch("search")) { + logger.warn("Skipping linear search to find uuid {}", jobName); + } else { for (Timer timer : timerService.getTimers()) { try { Serializable info = timer.getInfo(); if (info instanceof EjbTimerJob) { EjbTimerJob job = (EjbTimerJob) info; - EjbGlobalJobHandle handle = (EjbGlobalJobHandle) job.getTimerJobInstance().getJobHandle(); - if (handle.getUuid().equals(jobName)) { - found = handle.getTimerJobInstance(); + TimerJobInstance found = handle.getTimerJobInstance(); if (useLocalCache) { localCache.putIfAbsent(jobName, found); } logger.debug("Job {} does match timer and is going to be returned {}", jobName, found); - break; + return found; } } } catch (NoSuchObjectLocalException e) { logger.debug("Timer info for {} was not found ", timer); } } - } else { - logger.warn("Skipping linear search to find uuid {}", jobName); } - return found; + return null; } public void evictCache(JobHandle jobHandle) { diff --git a/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/test/java/org/jbpm/services/ejb/timer/EJBTimerSchedulerTest.java b/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/test/java/org/jbpm/services/ejb/timer/EJBTimerSchedulerTest.java index c470532b4e..8356362503 100644 --- a/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/test/java/org/jbpm/services/ejb/timer/EJBTimerSchedulerTest.java +++ b/jbpm-services/jbpm-services-ejb/jbpm-services-ejb-timer/src/test/java/org/jbpm/services/ejb/timer/EJBTimerSchedulerTest.java @@ -28,7 +28,6 @@ import org.drools.core.time.impl.TimerJobInstance; import org.jbpm.persistence.timer.GlobalJpaTimerJobInstance; -import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -42,8 +41,6 @@ public class EJBTimerSchedulerTest { @Before public void setup() { - - System.setProperty("org.jbpm.ejb.timer.linear.search", "true"); TimerService timerService = mock(TimerService.class); when(timerService.getTimers()).thenReturn(timers); @@ -61,11 +58,6 @@ public void setup() { scheduler.timerService = timerService; } - @After - public void cleanup() { - System.clearProperty("org.jbpm.ejb.timer.linear.search"); - } - @Test public void testEjbTimerSchedulerTestOnTimerLoop() { // first call to go over list of timers should not add anything to the cache as there is no matching timers