Skip to content

Commit

Permalink
[JBPM-10242] Always skipping linear search
Browse files Browse the repository at this point in the history
Unless explicilty stated with property org.jbpm.ejb.timer.linear.search
  • Loading branch information
fjtirado committed Sep 30, 2024
1 parent fc488fb commit d79847f
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ else if (ejbTimerJob.getTimerJobInstance().getTrigger().hasNextFireTime() != nul
// because of the transaction, so we need to do this here.
tx = timerJobInstance -> {
logger.warn("Execution of time failed Interval Trigger failed. Skipping {}", timerJobInstance);
if (removeJob(timerJobInstance.getJobHandle(), timer, true)) {
if (removeJob(timerJobInstance.getJobHandle(), timer)) {
internalSchedule(timerJobInstance);
} else {
logger.debug("Interval trigger {} was removed before rescheduling", timerJobInstance);
Expand Down Expand Up @@ -247,11 +247,12 @@ private Serializable removeTransientFields(Serializable info) {
return info;
}

public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) {
return removeJob(jobHandle, ejbTimer, false);
private boolean performLinearSearch() {
return Boolean.getBoolean("org.jbpm.ejb.timer.linear.search");
}


public boolean removeJob(JobHandle jobHandle, Timer ejbTimer, boolean searchIfFailed) {
public boolean removeJob(JobHandle jobHandle, Timer ejbTimer) {
EjbGlobalJobHandle ejbHandle = (EjbGlobalJobHandle) jobHandle;
if (useLocalCache) {
boolean removedFromCache = localCache.remove(ejbHandle.getUuid()) != null;
Expand All @@ -263,10 +264,8 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer, boolean searchIfFa
ejbTimer.cancel();
return true;
} catch (Exception e) {
logger.warn("Timer cancel error for handle {}", ejbHandle, e);
if (!searchIfFailed) {
return false;
}
logger.warn("Timer cancel error for handle {}", ejbHandle.getUuid(), e);
return false;
}
}

Expand All @@ -289,36 +288,36 @@ public boolean removeJob(JobHandle jobHandle, Timer ejbTimer, boolean searchIfFa
logger.warn("No timerJobInstance available for {}", ejbHandle);
}

if (!searchIfFailed) {
logger.warn("Timer not found for {} and {}, skipping list search", ejbHandle, ejbTimer);
if (performLinearSearch()) {
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;
}
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer {} has already expired or was canceled ", timer);
}
}
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;
}

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;
}
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer {} has already expired or was canceled ", timer);
}
}
logger.info("Job handle {} does not match any timer on {} scheduler service", jobHandle, this);
return false;
}


Expand All @@ -330,33 +329,34 @@ public TimerJobInstance getTimerByName(String jobName) {
return localCache.get(jobName);
}
}
TimerJobInstance found = null;

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();
if (useLocalCache) {
localCache.putIfAbsent(jobName, found);
}
logger.debug("Job {} does match timer and is going to be returned {}", jobName, found);

break;
}
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer info for {} was not found ", timer);
TimerJobInstance found = null;
if (performLinearSearch()) {
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();
if (useLocalCache) {
localCache.putIfAbsent(jobName, found);
}
logger.debug("Job {} does match timer and is going to be returned {}", jobName, found);
break;
}
}
} catch (NoSuchObjectLocalException e) {
logger.debug("Timer info for {} was not found ", timer);
}
}
}

return found;
}
} else {
logger.warn("Skipping linear search to find uuid {}", jobName);
}
return found;
}

public void evictCache(JobHandle jobHandle) {
String jobName = ((EjbGlobalJobHandle) jobHandle).getUuid();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

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;

Expand All @@ -41,6 +42,8 @@ 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);

Expand All @@ -58,6 +61,11 @@ 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
Expand Down

0 comments on commit d79847f

Please sign in to comment.