fix(admin rpc): fix transaction issues on thumbnails regeneration

This commit is contained in:
Gauthier Roebroeck 2020-01-18 07:54:43 +08:00
parent 1d5500d560
commit af8e3ea433
2 changed files with 12 additions and 17 deletions

View file

@ -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<Book>) {
@Transactional
fun generateThumbnails(books: List<Book>) {
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)})" }
}
}

View file

@ -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")
}