From c20a133b4d43489eadf8bdc6647568a6d9f60ef5 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Fri, 16 May 2014 23:47:27 +0200 Subject: [PATCH] Fix SemaphoreDaoTest when db and test timezones are different --- .../sonar/core/persistence/SemaphoreDao.java | 28 ++++++++++++------- .../core/persistence/SemaphoreDaoTest.java | 2 +- 2 files changed, 19 insertions(+), 11 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 e995a5ed506..00fbcad5012 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 @@ -25,6 +25,7 @@ import org.apache.commons.lang.time.DateUtils; import org.apache.ibatis.session.SqlSession; import org.sonar.api.utils.Semaphores; +import javax.annotation.CheckForNull; import java.util.Date; /** @@ -46,15 +47,16 @@ public class SemaphoreDao { SqlSession session = mybatis.openSession(false); try { SemaphoreMapper mapper = session.getMapper(SemaphoreMapper.class); - Date now = mapper.now(); - SemaphoreDto semaphore = createDto(name, now, session); + Date dbNow = mapper.now(); + SemaphoreDto semaphore = tryToInsert(name, dbNow, session); + boolean isAcquired; if (semaphore == null) { semaphore = selectSemaphore(name, session); - boolean isAcquired = acquireIfOutdated(name, maxAgeInSeconds, session, mapper); - return createLock(semaphore, session, isAcquired); + isAcquired = acquireIfOutdated(name, maxAgeInSeconds, session, mapper); } else { - return createLock(semaphore, session, true); + isAcquired = true; } + return createLock(semaphore, session, isAcquired); } finally { MyBatis.closeQuietly(session); } @@ -67,7 +69,7 @@ public class SemaphoreDao { try { SemaphoreMapper mapper = session.getMapper(SemaphoreMapper.class); Date now = mapper.now(); - SemaphoreDto semaphore = createDto(name, now, session); + SemaphoreDto semaphore = tryToInsert(name, now, session); if (semaphore == null) { semaphore = selectSemaphore(name, session); return createLock(semaphore, session, false); @@ -104,23 +106,29 @@ public class SemaphoreDao { } private boolean acquireIfOutdated(String name, int maxAgeInSeconds, SqlSession session, SemaphoreMapper mapper) { - Date updatedBefore = DateUtils.addSeconds(mapper.now(), -maxAgeInSeconds); + Date dbNow = mapper.now(); + Date updatedBefore = DateUtils.addSeconds(dbNow, -maxAgeInSeconds); boolean ok = mapper.acquire(name, updatedBefore) == 1; session.commit(); return ok; } - private SemaphoreDto createDto(String name, Date lockedAt, SqlSession session) { + /** + * Insert the semaphore and commit. Rollback and return null if the semaphore already exists in db (whatever + * the lock date) + */ + @CheckForNull + private SemaphoreDto tryToInsert(String name, Date lockedNow, SqlSession session) { try { SemaphoreMapper mapper = session.getMapper(SemaphoreMapper.class); SemaphoreDto semaphore = new SemaphoreDto() .setName(name) - .setLockedAt(lockedAt); + .setLockedAt(lockedNow); mapper.initialize(semaphore); session.commit(); return semaphore; } catch (Exception e) { - // probably because of the semaphore already exists + // probably because of the semaphore already exists in db session.rollback(); return null; } diff --git a/sonar-core/src/test/java/org/sonar/core/persistence/SemaphoreDaoTest.java b/sonar-core/src/test/java/org/sonar/core/persistence/SemaphoreDaoTest.java index f0091927667..5ffbc499c6e 100644 --- a/sonar-core/src/test/java/org/sonar/core/persistence/SemaphoreDaoTest.java +++ b/sonar-core/src/test/java/org/sonar/core/persistence/SemaphoreDaoTest.java @@ -280,7 +280,7 @@ public class SemaphoreDaoTest extends AbstractDaoTestCase { try { barrier.await(); for (int i = 0; i < 100; i++) { - if (dao.acquire("my-lock", 60 * 5).isLocked()) { + if (dao.acquire("my-lock", 60 * 60 * 24).isLocked()) { locks.incrementAndGet(); } } -- 2.39.5