import org.apache.ibatis.session.SqlSession;
import org.sonar.api.utils.Semaphores;
+import javax.annotation.CheckForNull;
import java.util.Date;
/**
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);
}
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);
}
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;
}