]> source.dussan.org Git - sonarqube.git/commitdiff
Fix SemaphoreDaoTest when db and test timezones are different
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Fri, 16 May 2014 21:47:27 +0000 (23:47 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Fri, 16 May 2014 21:47:55 +0000 (23:47 +0200)
sonar-core/src/main/java/org/sonar/core/persistence/SemaphoreDao.java
sonar-core/src/test/java/org/sonar/core/persistence/SemaphoreDaoTest.java

index e995a5ed5066db93a288e2729bdbdcd74a9ed529..00fbcad50129b799bb79ab550ef39003b698f45a 100644 (file)
@@ -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;
     }
index f0091927667ee498e2315e32e05ff9836d11a40f..5ffbc499c6e3c567540991f9ad820f0f2118423b 100644 (file)
@@ -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();
           }
         }