From 36501e2784dcc34b046f0e54d42eb0f0b22caa24 Mon Sep 17 00:00:00 2001 From: Michael Breu <Michael.Breu@arctis.at> Date: Thu, 20 Jun 2024 09:40:22 +0200 Subject: [PATCH] Finally correct version --- .../jpa/PersistenceAuditEventRepository.java | 6 + .../gitsearch/service/AuditEventService.java | 6 +- .../service/AuditEventServiceIT.java | 111 +++++++----------- 3 files changed, 52 insertions(+), 71 deletions(-) diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java index 316fb96ba..31526909b 100644 --- a/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java +++ b/src/main/java/at/ac/uibk/gitsearch/repository/jpa/PersistenceAuditEventRepository.java @@ -19,5 +19,11 @@ public interface PersistenceAuditEventRepository extends JpaRepository<Persisten List<PersistentAuditEvent> findTop1000ByAuditEventDateBefore(Instant before); + /** + * + * Unsafe due to https://hibernate.atlassian.net/browse/HHH-5529. + * May be solved when migrating to hibernate > 6.0.0.Beta2 + */ + int deleteByAuditEventDateBefore(Instant before); } diff --git a/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java b/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java index 9047b5306..51f140789 100644 --- a/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java +++ b/src/main/java/at/ac/uibk/gitsearch/service/AuditEventService.java @@ -17,7 +17,6 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.support.TransactionTemplate; @@ -32,7 +31,6 @@ import tech.jhipster.config.JHipsterProperties; @Transactional public class AuditEventService { - @SuppressWarnings("unused") private static final Logger LOGGER = LoggerFactory.getLogger(AuditEventService.class); private final JHipsterProperties jHipsterProperties; @@ -61,6 +59,7 @@ public class AuditEventService { * This is scheduled to get fired at 11:00 (pm) UTC. */ @Scheduled(cron = "0 0 23 * * ?") + @Transactional(propagation = Propagation.REQUIRES_NEW) public int removeOldAuditEvents() { final TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager); isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); @@ -81,10 +80,11 @@ public class AuditEventService { return !auditEventDeleteCandidates.isEmpty(); }); } + LOGGER.info("Cleaned Up {} outdated audit events", count.intValue()); return count.intValue(); } - @Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_UNCOMMITTED) + @Transactional(propagation = Propagation.REQUIRES_NEW) public int removeOldAuditEvents2() { Instant deleteBefore = Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS); return this.persistenceAuditEventRepository.deleteByAuditEventDateBefore(deleteBefore); diff --git a/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java b/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java index c309423af..21ed73eeb 100644 --- a/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java +++ b/src/test/java/at/ac/uibk/gitsearch/service/AuditEventServiceIT.java @@ -12,8 +12,9 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import org.junit.Assert; -import org.junit.jupiter.api.*; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -21,9 +22,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionCallback; import org.springframework.transaction.support.TransactionTemplate; import tech.jhipster.config.JHipsterProperties; @@ -61,15 +60,7 @@ public class AuditEventServiceIT { @BeforeEach @Timeout(value = 5, unit = TimeUnit.MINUTES) - public void init() { - persistenceAuditEventRepository.deleteAll(); - currentAuditLogs = persistenceAuditEventRepository.findAll().size(); - log.info("There where already {} AuditEvents", currentAuditLogs); - final List<PersistentAuditEvent> auditEventDeleteCandidates = persistenceAuditEventRepository.findTop1000ByAuditEventDateBefore( - Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS) - ); - Assert.assertTrue("There are already outdated Elements?", auditEventDeleteCandidates.size() == 0); - + public void writevariousLogs() { log.info("Preparing {} outdated AuditEvents", MAX_OUTDATEDVALUES); auditEventsOld = new ArrayList<>(); for (int i = 1; i <= MAX_OUTDATEDVALUES; i++) { @@ -80,7 +71,8 @@ public class AuditEventServiceIT { auditEventOld.setPrincipal("test-user-old"); auditEventOld.setAuditEventType("test-type"); - auditEventOld.getData().put("someDate", "someValue" + i); + auditEventOld.getData().put("someData", "someValue" + i); + auditEventOld.getData().put("someExtraData", "secondValue" + 2 * i); auditEventsOld.add(auditEventOld); } log.info("Prepared {} outdated AuditEvents", MAX_OUTDATEDVALUES); @@ -95,80 +87,63 @@ public class AuditEventServiceIT { auditEventNew.setAuditEventDate(Instant.now()); auditEventNew.setPrincipal("test-user-new"); auditEventNew.setAuditEventType("test-type"); + + TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager); + isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + + isolatedTransactionTemplate.executeWithoutResult(status -> { + persistenceAuditEventRepository.deleteAll(); + currentAuditLogs = persistenceAuditEventRepository.findAll().size(); + persistenceAuditEventRepository.saveAll(auditEventsOld); + persistenceAuditEventRepository.save(auditEventWithinRetention); + persistenceAuditEventRepository.save(auditEventNew); + persistenceAuditEventRepository.flush(); + assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2); + log.info("Saved {} outdated AuditEvents into database", auditEventsOld.size()); + }); } @Test - @Disabled // currently not working @Timeout(value = 5, unit = TimeUnit.MINUTES) @DirtiesContext public void verifyOldAuditEventsAreDeleted() { - TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager); - isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); - - auditEventsOld.forEach(auditEventOld -> persistenceAuditEventRepository.save(auditEventOld)); - persistenceAuditEventRepository.save(auditEventWithinRetention); - persistenceAuditEventRepository.save(auditEventNew); - - persistenceAuditEventRepository.flush(); - assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2); - isolatedTransactionTemplate.execute( - new TransactionCallback<Boolean>() { - @Override - public Boolean doInTransaction(TransactionStatus status) { - log.info("Saved {} outdated AuditEvents", MAX_OUTDATEDVALUES); - assertThat(persistenceAuditEventRepository.findAll().size()).isGreaterThan(MAX_OUTDATEDVALUES); - - log.info("Removing outdated AuditEvents"); - int count = auditEventService.removeOldAuditEvents(); - // persistenceAuditEventRepository.flush(); - - log.info("Removed {} outdated AuditEvents", count); - return true; - } - } - ); + log.info("Removing outdated AuditEvents"); + int deleted = auditEventService.removeOldAuditEvents(); + assertThat(deleted).isEqualTo(MAX_OUTDATEDVALUES); + log.info("Removed {} outdated AuditEvents", deleted); - assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2); - assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty(); - assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty(); - assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty(); + TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager); + isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + isolatedTransactionTemplate.executeWithoutResult(status -> { + assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty(); + }); } @Test - // @Disabled // currently not working + // @Disabled // currently not working @Timeout(value = 5, unit = TimeUnit.MINUTES) @DirtiesContext public void verifyOldAuditEventsAreDeleted2() { - persistenceAuditEventRepository.deleteAll(); - persistenceAuditEventRepository.saveAll(auditEventsOld); - - Assertions.assertTrue( - auditEventsOld - .stream() - .map(PersistentAuditEvent::getAuditEventDate) - .allMatch(d -> d.isBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS))) - ); - - Assertions.assertTrue( - persistenceAuditEventRepository - .findAll() - .stream() - .map(PersistentAuditEvent::getAuditEventDate) - .allMatch(d -> d.isBefore(Instant.now().minus(jHipsterProperties.getAuditEvents().getRetentionPeriod(), ChronoUnit.DAYS))) - ); - persistenceAuditEventRepository.save(auditEventWithinRetention); persistenceAuditEventRepository.save(auditEventNew); assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + auditEventsOld.size() + 2); - this.auditEventService.removeOldAuditEvents2(); + int deleted = this.auditEventService.removeOldAuditEvents2(); + assertThat(deleted).isEqualTo(MAX_OUTDATEDVALUES); - assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2); - assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty(); - assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty(); - assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty(); + TransactionTemplate isolatedTransactionTemplate = new TransactionTemplate(platformTransactionManager); + isolatedTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + isolatedTransactionTemplate.executeWithoutResult(status -> { + assertThat(persistenceAuditEventRepository.findAll().size()).isEqualTo(currentAuditLogs + 2); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-old")).isEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-retention")).isNotEmpty(); + assertThat(persistenceAuditEventRepository.findByPrincipal("test-user-new")).isNotEmpty(); + }); } } -- GitLab