mitigated client connection update concurrency

This commit is contained in:
anhefti 2022-06-02 16:57:30 +02:00
parent 10727e398c
commit dbbc69e229

View file

@ -328,6 +328,11 @@ public class ClientConnectionDAOImpl implements ClientConnectionDAO {
return Result.tryCatch(() -> { return Result.tryCatch(() -> {
final long millisecondsNow = Utils.getMillisecondsNow(); final long millisecondsNow = Utils.getMillisecondsNow();
// NOTE: we use nanoseconds here to get a better precision to better avoid
// same value of real concurrent calls on distributed systems
// TODO: Better solution for the future would be to count this value and
// isolation is done via DB transaction
final long nanosecondsNow = System.nanoTime();
final ClientConnectionRecord newRecord = new ClientConnectionRecord( final ClientConnectionRecord newRecord = new ClientConnectionRecord(
null, null,
data.institutionId, data.institutionId,
@ -340,7 +345,7 @@ public class ClientConnectionDAOImpl implements ClientConnectionDAO {
BooleanUtils.toInteger(data.vdi, 1, 0, 0), BooleanUtils.toInteger(data.vdi, 1, 0, 0),
data.vdiPairToken, data.vdiPairToken,
millisecondsNow, millisecondsNow,
millisecondsNow, nanosecondsNow,
data.remoteProctoringRoomId, data.remoteProctoringRoomId,
null, null,
Utils.truncateText(data.sebMachineName, 255), Utils.truncateText(data.sebMachineName, 255),
@ -359,7 +364,11 @@ public class ClientConnectionDAOImpl implements ClientConnectionDAO {
public Result<ClientConnection> save(final ClientConnection data) { public Result<ClientConnection> save(final ClientConnection data) {
return Result.tryCatch(() -> { return Result.tryCatch(() -> {
final long millisecondsNow = Utils.getMillisecondsNow(); // NOTE: we use nanoseconds here to get a better precision to better avoid
// same value of real concurrent calls on distributed systems
// TODO: Better solution for the future would be to count this value and
// isolation is done via DB transaction
final long nanosecondsNow = System.nanoTime();
final ClientConnectionRecord updateRecord = new ClientConnectionRecord( final ClientConnectionRecord updateRecord = new ClientConnectionRecord(
data.id, data.id,
null, null,
@ -372,7 +381,7 @@ public class ClientConnectionDAOImpl implements ClientConnectionDAO {
BooleanUtils.toInteger(data.vdi, 1, 0, 0), BooleanUtils.toInteger(data.vdi, 1, 0, 0),
data.vdiPairToken, data.vdiPairToken,
null, null,
millisecondsNow, nanosecondsNow,
null, null,
null, null,
Utils.truncateText(data.sebMachineName, 255), Utils.truncateText(data.sebMachineName, 255),