Skip to content

Commit

Permalink
Feiler hvis man forsøker å oppdatere en aktivitetsversjon med en lave…
Browse files Browse the repository at this point in the history
…re versjon (#809)
  • Loading branch information
holymaloney authored Aug 6, 2024
1 parent 1d1fa80 commit ab95672
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,16 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import no.nav.common.json.JsonUtils;
import no.nav.veilarbaktivitet.veilarbdbutil.VeilarbAktivitetSqlParameterSource;
import no.nav.veilarbaktivitet.aktivitet.domain.*;
import no.nav.veilarbaktivitet.aktivitet.feil.AktivitetVersjonOutOfOrderException;
import no.nav.veilarbaktivitet.aktivitet.feil.EndringAvUtdatertVersjonException;
import no.nav.veilarbaktivitet.person.Person;
import no.nav.veilarbaktivitet.stilling_fra_nav.CvKanDelesData;
import no.nav.veilarbaktivitet.stilling_fra_nav.KontaktpersonData;
import no.nav.veilarbaktivitet.stilling_fra_nav.StillingFraNavData;
import no.nav.veilarbaktivitet.util.DateUtils;
import no.nav.veilarbaktivitet.util.EnumUtils;
import no.nav.veilarbaktivitet.veilarbdbutil.VeilarbAktivitetSqlParameterSource;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.dao.EmptyResultDataAccessException;
Expand Down Expand Up @@ -156,6 +157,10 @@ public AktivitetData oppdaterAktivitet(AktivitetData aktivitet) {
throw new EndringAvUtdatertVersjonException("Forsøker å oppdatere en utdatert aktivitetsversjon.");
}
long versjon = nesteVersjon();
if (versjon < aktivitet.getVersjon()) {
log.warn("Forsøkte å oppdatere aktivitet id: {} med versjon: {} med ny versjon {} lavere enn forrige versjon ", aktivitet.getId(), aktivitet.getVersjon(), versjon);
throw new AktivitetVersjonOutOfOrderException("Kan ikke oppdatere en aktivitet med en lavere versjon enn forrige");
}
AktivitetData nyAktivitetVersjon = insertAktivitetVersjon(aktivitet, aktivitetId, versjon);
settTilIkkeGjeldendeVersjon(aktivitetId, gjeldendeVersjon);
return nyAktivitetVersjon;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@ package no.nav.veilarbaktivitet.aktivitet.feil
sealed class EndringAvAktivitetException(override val message: String) : RuntimeException(message)
class EndringAvFerdigAktivitetException(message: String) : EndringAvAktivitetException(message)
class EndringAvHistoriskAktivitetException(message: String) : EndringAvAktivitetException(message)
class EndringAvUtdatertVersjonException(message: String) : EndringAvAktivitetException(message)
class EndringAvUtdatertVersjonException(message: String) : EndringAvAktivitetException(message)
class AktivitetVersjonOutOfOrderException(message: String) : EndringAvAktivitetException(message)
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package no.nav.veilarbaktivitet.config

import com.fasterxml.jackson.annotation.JsonInclude
import no.nav.veilarbaktivitet.aktivitet.feil.EndringAvAktivitetException
import no.nav.veilarbaktivitet.aktivitet.feil.EndringAvFerdigAktivitetException
import no.nav.veilarbaktivitet.aktivitet.feil.EndringAvHistoriskAktivitetException
import no.nav.veilarbaktivitet.aktivitet.feil.EndringAvUtdatertVersjonException
import no.nav.veilarbaktivitet.aktivitet.feil.*
import org.springframework.http.HttpStatus
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.ControllerAdvice
Expand All @@ -21,7 +18,7 @@ class HttpExceptionHandler : ResponseEntityExceptionHandler() {
fun handleException(e: EndringAvAktivitetException, request: WebRequest): ResponseEntity<Response> {
val statusKode = when (e) {
is EndringAvFerdigAktivitetException, is EndringAvHistoriskAktivitetException -> HttpStatus.BAD_REQUEST.value()
is EndringAvUtdatertVersjonException -> HttpStatus.CONFLICT.value()
is EndringAvUtdatertVersjonException, is AktivitetVersjonOutOfOrderException -> HttpStatus.CONFLICT.value()
}
return ResponseEntity
.status(statusKode)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
Expand Down Expand Up @@ -182,16 +184,22 @@ void kan_ikke_oppdatere_gammel_versjon() {
@Test
void versjonering_skal_vaere_traadsikker() throws InterruptedException {
// Opprett initiell versjon

// Alle tråder forsøker å oppdatere samme aktivitetsversjon, så kun en kan vinne
transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
final AktivitetData aktivitet = transactionTemplate.execute(transactionStatus -> gitt_at_det_finnes_en_egen_aktivitet());
int antallOppdateringer = 10;
ExecutorService bakgrunnService = Executors.newFixedThreadPool(3);
CountDownLatch latch = new CountDownLatch(antallOppdateringer);
List<AktivitetData> oppdaterteVersjoner = Collections.synchronizedList(new ArrayList<>());
for (int i = 0; i < antallOppdateringer; i++) {
final int counter = i;
bakgrunnService.submit(() -> {
transactionTemplate.executeWithoutResult(action -> {
try {
aktivitetDAO.oppdaterAktivitet(aktivitet.withBeskrivelse("nyBeskrivelse "));
oppdaterteVersjoner.add(
aktivitetDAO.oppdaterAktivitet(aktivitet.withBeskrivelse("Oppdatering nr " + counter))
);
} catch (Exception e) {
log.warn("Feil i tråd.", e);
} finally {
Expand All @@ -201,9 +209,12 @@ void versjonering_skal_vaere_traadsikker() throws InterruptedException {
});
}
latch.await();
// order by versjon desc
List<AktivitetData> aktivitetData = aktivitetDAO.hentAktivitetVersjoner(aktivitet.getId());
// Kun originalversjonen pluss første oppdatering. Resten feiler
assertThat(aktivitetData).hasSize(2);
assertThat(aktivitetData.get(1).getBeskrivelse()).isEqualTo("beskrivelse");
assertThat(aktivitetData.get(0).getBeskrivelse()).startsWith("Oppdatering nr");
// Denne vil feile hvis det er mer enn én gjeldende
AktivitetData nyesteAktivitet = aktivitetDAO.hentAktivitet(aktivitet.getId());
assertThat(nyesteAktivitet).isNotNull();
Expand Down

0 comments on commit ab95672

Please sign in to comment.