diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2013-02-12 12:53:09 +0100 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2013-02-12 12:54:00 +0100 |
commit | 7409259127e9d3ab1aa4c7c471f1dbf54c1aa563 (patch) | |
tree | 7915be4137b04b8069cccf43c989dbf2ebcf9118 /sonar-core | |
parent | 8c005424a08ef47bd7693e3848c452ee68a3b828 (diff) | |
download | sonarqube-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.java | 16 | ||||
-rw-r--r-- | sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreUpdater.java | 14 |
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(); } } } |