From af8e3ea433944922eafb8ecc1490d332e27d6c0d Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Sat, 18 Jan 2020 07:54:43 +0800 Subject: [PATCH] fix(admin rpc): fix transaction issues on thumbnails regeneration --- .../application/service/AsyncOrchestrator.kt | 19 +++++-------------- .../komga/interfaces/rest/AdminController.kt | 10 +++++++--- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/application/service/AsyncOrchestrator.kt b/komga/src/main/kotlin/org/gotson/komga/application/service/AsyncOrchestrator.kt index 59da836c081..e0e4ba4168d 100644 --- a/komga/src/main/kotlin/org/gotson/komga/application/service/AsyncOrchestrator.kt +++ b/komga/src/main/kotlin/org/gotson/komga/application/service/AsyncOrchestrator.kt @@ -46,21 +46,12 @@ class AsyncOrchestrator( } @Async("regenerateThumbnailsTaskExecutor") - fun regenerateAllThumbnails() { - logger.info { "Regenerate thumbnail for all books" } - generateThumbnails(bookRepository.findAll()) - } - - @Async("regenerateThumbnailsTaskExecutor") - fun regenerateMissingThumbnails() { - logger.info { "Regenerate missing thumbnails" } - generateThumbnails(bookRepository.findAllByMediaThumbnailIsNull()) - } - - private fun generateThumbnails(books: List) { + @Transactional + fun generateThumbnails(books: List) { + val loadedBooks = bookRepository.findAllById(books.map { it.id }) var sumOfTasksTime = 0L measureTimeMillis { - sumOfTasksTime = books + sumOfTasksTime = loadedBooks .map { bookLifecycle.regenerateThumbnailAndPersist(it) } .map { try { @@ -71,7 +62,7 @@ class AsyncOrchestrator( } .sum() }.also { - logger.info { "Generated ${books.size} thumbnails in ${DurationFormatUtils.formatDurationHMS(it)} (virtual: ${DurationFormatUtils.formatDurationHMS(sumOfTasksTime)})" } + logger.info { "Generated ${loadedBooks.size} thumbnails in ${DurationFormatUtils.formatDurationHMS(it)} (virtual: ${DurationFormatUtils.formatDurationHMS(sumOfTasksTime)})" } } } diff --git a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/AdminController.kt b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/AdminController.kt index 0fdb0fef268..84b6f152970 100644 --- a/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/AdminController.kt +++ b/komga/src/main/kotlin/org/gotson/komga/interfaces/rest/AdminController.kt @@ -2,6 +2,7 @@ package org.gotson.komga.interfaces.rest import mu.KotlinLogging import org.gotson.komga.application.service.AsyncOrchestrator +import org.gotson.komga.domain.persistence.BookRepository import org.springframework.http.HttpStatus import org.springframework.security.access.prepost.PreAuthorize import org.springframework.web.bind.annotation.PostMapping @@ -17,14 +18,16 @@ private val logger = KotlinLogging.logger {} @RequestMapping("api/v1/admin") @PreAuthorize("hasRole('ROLE_ADMIN')") class AdminController( - private val asyncOrchestrator: AsyncOrchestrator + private val asyncOrchestrator: AsyncOrchestrator, + private val bookRepository: BookRepository ) { @PostMapping("rpc/thumbnails/regenerate/all") @ResponseStatus(HttpStatus.ACCEPTED) fun regenerateAllThumbnails() { try { - asyncOrchestrator.regenerateAllThumbnails() + logger.info { "Regenerate thumbnail for all books" } + asyncOrchestrator.generateThumbnails(bookRepository.findAll()) } catch (e: RejectedExecutionException) { throw ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE, "Thumbnail regeneration task is already running") } @@ -34,7 +37,8 @@ class AdminController( @ResponseStatus(HttpStatus.ACCEPTED) fun regenerateMissingThumbnails() { try { - asyncOrchestrator.regenerateMissingThumbnails() + logger.info { "Regenerate missing thumbnails" } + asyncOrchestrator.generateThumbnails(bookRepository.findAllByMediaThumbnailIsNull()) } catch (e: RejectedExecutionException) { throw ResponseStatusException(HttpStatus.SERVICE_UNAVAILABLE, "Thumbnail regeneration task is already running") }