aboutsummaryrefslogtreecommitdiffstats
path: root/sonar-core
diff options
context:
space:
mode:
authorJulien HENRY <julien.henry@sonarsource.com>2013-02-12 12:53:09 +0100
committerJulien HENRY <julien.henry@sonarsource.com>2013-02-12 12:54:00 +0100
commit7409259127e9d3ab1aa4c7c471f1dbf54c1aa563 (patch)
tree7915be4137b04b8069cccf43c989dbf2ebcf9118 /sonar-core
parent8c005424a08ef47bd7693e3848c452ee68a3b828 (diff)
downloadsonarqube-7409259127e9d3ab1aa4c7c471f1dbf54c1aa563.tar.gz
sonarqube-7409259127e9d3ab1aa4c7c471f1dbf54c1aa563.zip
SONAR-4053 Try to fix thread lock issue with SemaphoreUpdater
Diffstat (limited to 'sonar-core')
-rw-r--r--sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreDao.java16
-rw-r--r--sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreUpdater.java14
2 files changed, 14 insertions, 16 deletions
diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreDao.java b/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreDao.java
index c2465fa81b7..8f256fe9d3a 100644
--- a/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreDao.java
+++ b/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreDao.java
@@ -38,20 +38,20 @@ public class SemaphoreDao {
this.mybatis = mybatis;
}
- public synchronized Semaphores.Semaphore acquire(String name, int maxAgeInSeconds) {
+ public Semaphores.Semaphore acquire(String name, int maxAgeInSeconds) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Semaphore name must not be empty");
Preconditions.checkArgument(maxAgeInSeconds >= 0, "Semaphore max age must be positive: " + maxAgeInSeconds);
SqlSession session = mybatis.openSession();
try {
SemaphoreMapper mapper = session.getMapper(SemaphoreMapper.class);
- SemaphoreDto semaphore = selectSemaphore(name, session);
Date now = mapper.now();
- if (semaphore != null) {
+ SemaphoreDto semaphore = createDto(name, now, session);
+ if (semaphore == null) {
+ semaphore = selectSemaphore(name, session);
boolean isAcquired = acquireIfOutdated(name, maxAgeInSeconds, session, mapper);
return createLock(semaphore, session, isAcquired);
} else {
- semaphore = createDto(name, now, session);
return createLock(semaphore, session, true);
}
} finally {
@@ -59,18 +59,18 @@ public class SemaphoreDao {
}
}
- public synchronized Semaphores.Semaphore acquire(String name) {
+ public Semaphores.Semaphore acquire(String name) {
Preconditions.checkArgument(!Strings.isNullOrEmpty(name), "Semaphore name must not be empty");
SqlSession session = mybatis.openSession();
try {
SemaphoreMapper mapper = session.getMapper(SemaphoreMapper.class);
- SemaphoreDto semaphore = selectSemaphore(name, session);
Date now = mapper.now();
- if (semaphore != null) {
+ SemaphoreDto semaphore = createDto(name, now, session);
+ if (semaphore == null) {
+ semaphore = selectSemaphore(name, session);
return createLock(semaphore, session, false);
} else {
- semaphore = createDto(name, now, session);
return createLock(semaphore, session, true);
}
} finally {
diff --git a/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreUpdater.java b/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreUpdater.java
index 9001f88d706..771529c3ddd 100644
--- a/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreUpdater.java
+++ b/sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreUpdater.java
@@ -27,7 +27,6 @@ import org.sonar.api.utils.Semaphores;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
/**
@@ -37,30 +36,29 @@ public class SemaphoreUpdater {
private static final Logger LOG = LoggerFactory.getLogger(SemaphoreUpdater.class);
- private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
-
private SemaphoreDao dao;
- private Map<String, ScheduledFuture<?>> handlers = Maps.newHashMap();
+ private Map<String, ScheduledExecutorService> handlers = Maps.newHashMap();
public SemaphoreUpdater(SemaphoreDao dao) {
this.dao = dao;
}
public void scheduleForUpdate(final Semaphores.Semaphore semaphore, int updatePeriodInSeconds) {
- final Runnable updater = new Runnable() {
+ ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+ Runnable updater = new Runnable() {
public void run() {
LOG.debug("Updating semaphore " + semaphore.getName());
dao.update(semaphore);
}
};
- final ScheduledFuture<?> updateHandle = scheduler.scheduleWithFixedDelay(updater, updatePeriodInSeconds, updatePeriodInSeconds, TimeUnit.SECONDS);
- handlers.put(semaphore.getName(), updateHandle);
+ scheduler.scheduleWithFixedDelay(updater, updatePeriodInSeconds, updatePeriodInSeconds, TimeUnit.SECONDS);
+ handlers.put(semaphore.getName(), scheduler);
}
public void stopUpdate(final String name) {
if (handlers.containsKey(name)) {
- handlers.get(name).cancel(false);
+ handlers.get(name).shutdownNow();
}
}
}