From ec19feb67c12ff3b3e7e9c48060cd0535791ab73 Mon Sep 17 00:00:00 2001 From: Sebastian Becker Date: Wed, 1 Dec 2021 12:43:32 +0100 Subject: [PATCH] Add test to reproduce / cover concurrency issue described by #10 Signed-off-by: Sebastian Becker --- .../service/persistence/ConcurrencyIT.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 castor-service/src/test/java/io/carbynestack/castor/service/persistence/ConcurrencyIT.java diff --git a/castor-service/src/test/java/io/carbynestack/castor/service/persistence/ConcurrencyIT.java b/castor-service/src/test/java/io/carbynestack/castor/service/persistence/ConcurrencyIT.java new file mode 100644 index 0000000..d1c486f --- /dev/null +++ b/castor-service/src/test/java/io/carbynestack/castor/service/persistence/ConcurrencyIT.java @@ -0,0 +1,81 @@ +package io.carbynestack.castor.service.persistence; + +import static org.junit.Assert.assertEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; + +import io.carbynestack.castor.common.entities.Reservation; +import io.carbynestack.castor.common.entities.ReservationElement; +import io.carbynestack.castor.common.entities.TupleType; +import io.carbynestack.castor.service.CastorServiceApplication; +import io.carbynestack.castor.service.persistence.cache.ReservationCachingService; +import io.carbynestack.castor.service.persistence.markerstore.TupleChunkMetaDataStorageService; +import io.carbynestack.castor.service.testconfig.PersistenceTestEnvironment; +import io.carbynestack.castor.service.testconfig.ReusableMinioContainer; +import io.carbynestack.castor.service.testconfig.ReusablePostgreSQLContainer; +import io.carbynestack.castor.service.testconfig.ReusableRedisContainer; +import io.vavr.control.Try; +import java.util.Collections; +import java.util.UUID; +import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest( + webEnvironment = RANDOM_PORT, + classes = {CastorServiceApplication.class}) +@ActiveProfiles("test") +public class ConcurrencyIT { + @ClassRule + public static ReusableRedisContainer reusableRedisContainer = + ReusableRedisContainer.getInstance(); + + @ClassRule + public static ReusableMinioContainer reusableMinioContainer = + ReusableMinioContainer.getInstance(); + + @ClassRule + public static ReusablePostgreSQLContainer reusablePostgreSQLContainer = + ReusablePostgreSQLContainer.getInstance(); + + @Autowired private PersistenceTestEnvironment testEnvironment; + @Autowired private ReservationCachingService reservationCachingService; + @Autowired private TupleChunkMetaDataStorageService tupleChunkMetaDataStorageService; + + private final TupleType testTupleType = TupleType.MULTIPLICATION_TRIPLE_GFP; + private final UUID testChunkId = UUID.fromString("d1ea9d52-2b1d-42f0-85eb-e36caa6a623c"); + private final long tuplesInChunk = 100; + private final long tuplesToReserve = 3; + + @Before + public void setUp() { + testEnvironment.clearAllData(); + tupleChunkMetaDataStorageService.keepTupleChunkData(testChunkId, testTupleType, tuplesInChunk); + tupleChunkMetaDataStorageService.activateTupleChunk(testChunkId); + } + + @Test + public void + givenSubsequentReservationIsProcessedFirst_whenMasterSharesReservationOnParallelRequests_thenSucceedAsExpected() { + Reservation firstReservation = + new Reservation( + "1636913e-87b7-4331-97d7-4b14a1552604", + testTupleType, + Collections.singletonList(new ReservationElement(testChunkId, tuplesToReserve, 0))); + Reservation secondReservation = + new Reservation( + "9b77009e-313e-4aa9-b0d0-da0235329139", + testTupleType, + Collections.singletonList( + new ReservationElement(testChunkId, tuplesToReserve, tuplesToReserve))); + reservationCachingService.keepReservation(secondReservation); + assertEquals( + Try.success(null), + Try.run(() -> reservationCachingService.keepReservation(firstReservation))); + } +}