Skip to content
Snippets Groups Projects

Fix duplcate request bug

3 files
+ 53
37
Compare changes
  • Side-by-side
  • Inline

Files

@@ -19,6 +19,7 @@ package nl.tudelft.queue.service;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.ReentrantLock;
import java.util.stream.Collectors;
@@ -57,6 +58,7 @@ import reactor.core.publisher.Mono;
@Service
public class RequestService {
@Autowired
private RequestRepository rr;
@@ -109,7 +111,8 @@ public class RequestService {
@Autowired
private PermissionService permissionService;
private static final ReentrantLock lock = new ReentrantLock();
private static final ReentrantLock requestTakingLock = new ReentrantLock();
private static final Set<Long> currentlyEnqueuing = ConcurrentHashMap.newKeySet();
/**
* Creates a request in the request database based on the person that posted the request and the
@@ -132,39 +135,44 @@ public class RequestService {
throw new AccessDeniedException("Request not allowed");
}
if (request instanceof LabRequest) {
var labRequest = (LabRequest) request;
/*
* TODO in the future, delegate to another service layer component,
* and let it generate a link for the respective online mode.
* This is for the far future, when more online modes need to be supported.
*/
if (labRequest.getTimeSlot() != null && !labRequest.getTimeSlot().canTakeSlot()) {
throw new AccessDeniedException("Time slot is not available");
}
if (((LabRequest) request).getOnlineMode() == OnlineMode.JITSI) {
labRequest.setJitsiRoom(js.createJitsiRoomName(labRequest));
}
if (((LabRequest) request).getSession().getEnableExperimental()) {
((LabRequest) request).setQuestionId(qApi.addQuestion(new QuestionCreateDTO()
.edition(new EditionIdDTO()
.id(mCache.getOrThrow(dto.getModule()).getEdition().getId()))
.question(((LabRequest) request).getQuestion())).block());
try {
if (!currentlyEnqueuing.add(personId))
return;
if (request instanceof LabRequest labRequest) {
/*
* TODO in the future, delegate to another service layer component,
* and let it generate a link for the respective online mode.
* This is for the far future, when more online modes need to be supported.
*/
if (labRequest.getTimeSlot() != null && !labRequest.getTimeSlot().canTakeSlot()) {
throw new AccessDeniedException("Time slot is not available");
}
if (((LabRequest) request).getOnlineMode() == OnlineMode.JITSI) {
labRequest.setJitsiRoom(js.createJitsiRoomName(labRequest));
}
if (((LabRequest) request).getSession().getEnableExperimental()) {
((LabRequest) request).setQuestionId(qApi.addQuestion(new QuestionCreateDTO()
.edition(new EditionIdDTO()
.id(mCache.getOrThrow(dto.getModule()).getEdition().getId()))
.question(((LabRequest) request).getQuestion())).block());
}
}
}
request = rr.save(request);
var event = rer.applyAndSave(new RequestCreatedEvent(request));
request = rr.save(request);
var event = rer.applyAndSave(new RequestCreatedEvent(request));
if (request instanceof SelectionRequest) {
((SelectionRequest) request).getSession().getRequests().add((SelectionRequest) request);
checkFcfsSelection((SelectionRequest) request);
}
if (request instanceof SelectionRequest) {
((SelectionRequest) request).getSession().getRequests().add((SelectionRequest) request);
checkFcfsSelection((SelectionRequest) request);
}
if (sendEvent) {
wss.sendRequestCreated(event);
if (sendEvent) {
wss.sendRequestCreated(event);
}
} finally {
currentlyEnqueuing.remove(personId);
}
}
@@ -343,7 +351,7 @@ public class RequestService {
@Transactional(Transactional.TxType.REQUIRES_NEW)
public Optional<LabRequest> takeNextRequestFromTimeSlot(Person assistant,
ClosableTimeSlot timeSlot) {
lock.lock();
requestTakingLock.lock();
try {
// If the person is already working on a request, no new event should be created.
@@ -362,7 +370,7 @@ public class RequestService {
return request;
} finally {
lock.unlock();
requestTakingLock.unlock();
}
}
@@ -379,11 +387,11 @@ public class RequestService {
*/
public Optional<LabRequest> takeNextRequest(Person assistant, Lab lab,
RequestTableFilterDTO filter) {
lock.lock();
requestTakingLock.lock();
try {
return getNextRequest(assistant, lab, filter);
} finally {
lock.unlock();
requestTakingLock.unlock();
}
}
@@ -415,7 +423,7 @@ public class RequestService {
*/
@Transactional(Transactional.TxType.REQUIRES_NEW)
public LabRequest pickRequest(Person assistant, LabRequest request) {
lock.lock();
requestTakingLock.lock();
try {
Optional<LabRequest> oldRequests = lrr.findCurrentlyProcessingRequest(assistant,
request.getSession());
@@ -427,7 +435,7 @@ public class RequestService {
return request;
} finally {
lock.unlock();
requestTakingLock.unlock();
}
}
Loading