BookLore icon indicating copy to clipboard operation
BookLore copied to clipboard

Duplicate key error

Open fabiopbx opened this issue 9 months ago • 1 comments

Hello, so I decided to throw my entire library of books at it and it was doing well until it crashed, seems it hit a possible duplicate book (likely correct) but the thing is that it fails silently and crashes thus stops processing the rest of the files.

Not sure how the whole schema for this is being done, but I guess either skip the dupe and tell the user or somehow add it and mark it as dupe would be a better experience :)

looking at the logs this is what it gives:

Error while processing file Wizard at large - Terry Brooks.epub, error: could not execute batch [(conn=465) Duplicate entry '600-143' for key 'PRIMARY'] [insert into book_metadata_category_mapping (book_id,category_id) values (?,?)]; SQL [insert into book_metadata_category_mapping (book_id,category_id) values (?,?)]; constraint [PRIMARY]
tests_booklore.1.d4jfvlv9dszt@node02    | Exception in thread "" org.springframework.transaction.UnexpectedRollbackException: Transaction silently rolled back because it has been marked as rollback-only
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:804)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:758)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:698)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:416)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at com.adityachandel.booklore.service.fileprocessor.EpubProcessor$$SpringCGLIB$$0.processFile(<generated>)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at com.adityachandel.booklore.service.LibraryProcessingService.processLibraryFile(LibraryProcessingService.java:139)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at com.adityachandel.booklore.service.LibraryProcessingService.processLibraryFiles(LibraryProcessingService.java:125)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at com.adityachandel.booklore.service.LibraryProcessingService.rescanLibrary(LibraryProcessingService.java:106)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:727)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at com.adityachandel.booklore.service.LibraryProcessingService$$SpringCGLIB$$0.rescanLibrary(<generated>)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at com.adityachandel.booklore.service.LibraryService.lambda$rescanLibrary$9(LibraryService.java:182)
tests_booklore.1.d4jfvlv9dszt@node02    | 	at java.base/java.lang.VirtualThread.run(Unknown Source)

Regards Fabio Rodrigues

fabiopbx avatar Mar 14 '25 08:03 fabiopbx

@fabiopbx It seems like a concurrency issue. I’ll try to reproduce the problem.

acx10 avatar Mar 18 '25 09:03 acx10

Can I look into this @adityachandelgit ?

pratikscfr avatar Jul 05 '25 18:07 pratikscfr

Hello, got a similiar issue when updating the database. Unfortunately, if one file fails, the remaining files are not processed anymore. Here is the stacktrace:`

2025-08-19T06:57:22.657Z WARN 1 --- [booklore-api] [ virtual-107] org.hibernate.orm.jdbc.error : (conn=9) Duplicate entry 'BOOK.epub-2' for key 'unique_file_library' booklore_server | Exception in thread "" org.springframework.dao.DataIntegrityViolationException: could not execute batch [(conn=9) Duplicate entry 'BOOK.epub-2' for key 'unique_file_library'] [update book set added_on=?,book_type=?,current_hash=?,deleted=?,deleted_at=?,file_name=?,file_size_kb=?,file_sub_path=?,library_id=?,library_path_id=?,metadata_match_score=?,similar_books_json=? where id=?]; SQL [update book set added_on=?,book_type=?,current_hash=?,deleted=?,deleted_at=?,file_name=?,file_size_kb=?,file_sub_path=?,library_id=?,library_path_id=?,metadata_match_score=?,similar_books_json=? where id=?]; constraint [unique_file_library] booklore_server | at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:294) booklore_server | at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:256) booklore_server | at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:241) booklore_server | at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566) booklore_server | at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:795) booklore_server | at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:758) booklore_server | at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:698) booklore_server | at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:416) booklore_server | at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) booklore_server | at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) booklore_server | at com.adityachandel.booklore.service.fileprocessor.EpubProcessor$$SpringCGLIB$$0.processFile() booklore_server | at com.adityachandel.booklore.service.library.FileAsBookProcessor.processLibraryFile(FileAsBookProcessor.java:52) booklore_server | at com.adityachandel.booklore.service.library.FileAsBookProcessor.processLibraryFiles(FileAsBookProcessor.java:34) booklore_server | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) booklore_server | at java.base/java.lang.reflect.Method.invoke(Unknown Source) booklore_server | at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) booklore_server | at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) booklore_server | at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) booklore_server | at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) booklore_server | at com.adityachandel.booklore.service.library.FileAsBookProcessor$$SpringCGLIB$$0.processLibraryFiles() booklore_server | at com.adityachandel.booklore.service.library.LibraryProcessingService.rescanLibrary(LibraryProcessingService.java:66) booklore_server | at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) booklore_server | at java.base/java.lang.reflect.Method.invoke(Unknown Source) booklore_server | at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:196) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) booklore_server | at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:380) booklore_server | at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) booklore_server | at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) booklore_server | at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:728) booklore_server | at com.adityachandel.booklore.service.library.LibraryProcessingService$$SpringCGLIB$$0.rescanLibrary() booklore_server | at com.adityachandel.booklore.service.library.LibraryService.lambda$rescanLibrary$9(LibraryService.java:178) booklore_server | at java.base/java.lang.VirtualThread.run(Unknown Source) booklore_server | Caused by: org.hibernate.exception.ConstraintViolationException: could not execute batch [(conn=9) Duplicate entry 'BOOK.epub-2' for key 'unique_file_library'] [update book set added_on=?,book_type=?,current_hash=?,deleted=?,deleted_at=?,file_name=?,file_size_kb=?,file_sub_path=?,library_id=?,library_path_id=?,metadata_match_score=?,similar_books_json=? where id=?] booklore_server | at org.hibernate.dialect.MariaDBDialect.lambda$buildSQLExceptionConversionDelegate$1(MariaDBDialect.java:374) booklore_server | at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:34) booklore_server | at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:115) booklore_server | at org.hibernate.engine.jdbc.batch.internal.BatchImpl.lambda$performExecution$1(BatchImpl.java:278) booklore_server | at org.hibernate.engine.jdbc.mutation.internal.PreparedStatementGroupSingleTable.forEachStatement(PreparedStatementGroupSingleTable.java:63) booklore_server | at org.hibernate.engine.jdbc.batch.internal.BatchImpl.performExecution(BatchImpl.java:253) booklore_server | at org.hibernate.engine.jdbc.batch.internal.BatchImpl.execute(BatchImpl.java:232) booklore_server | at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.executeBatch(JdbcCoordinatorImpl.java:191) booklore_server | at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:676) booklore_server | at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:513) booklore_server | at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:378) booklore_server | at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) booklore_server | at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:140) booklore_server | at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1443) booklore_server | at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:488) booklore_server | at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2321) booklore_server | at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2029) booklore_server | at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:394) booklore_server | at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:167) booklore_server | at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commitNoRollbackOnly(JdbcResourceLocalTransactionCoordinatorImpl.java:249) booklore_server | at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:243) booklore_server | at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:90) booklore_server | at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) booklore_server | ... 33 more booklore_server | Caused by: java.sql.BatchUpdateException: (conn=9) Duplicate entry 'BOOK.epub-2' for key 'unique_file_library' booklore_server | at org.mariadb.jdbc.export.ExceptionFactory.createBatchUpdate(ExceptionFactory.java:221) booklore_server | at org.mariadb.jdbc.client.impl.StandardClient.executePipeline(StandardClient.java:1144) booklore_server | at org.mariadb.jdbc.ClientPreparedStatement.executeBatchPipeline(ClientPreparedStatement.java:160) booklore_server | at org.mariadb.jdbc.ClientPreparedStatement.executeInternalPreparedBatch(ClientPreparedStatement.java:140) booklore_server | at org.mariadb.jdbc.BasePreparedStatement.executeBatchInternal(BasePreparedStatement.java:1694) booklore_server | at org.mariadb.jdbc.BasePreparedStatement.executeBatch(BasePreparedStatement.java:1680) booklore_server | at com.zaxxer.hikari.pool.ProxyStatement.executeBatch(ProxyStatement.java:128) booklore_server | at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeBatch(HikariProxyPreparedStatement.java) booklore_server | at org.hibernate.engine.jdbc.batch.internal.BatchImpl.lambda$performExecution$1(BatchImpl.java:264) booklore_server | ... 52 more booklore_server | Caused by: java.sql.SQLIntegrityConstraintViolationException: (conn=9) Duplicate entry 'BOOK.epub-2' for key 'unique_file_library' booklore_server | at org.mariadb.jdbc.export.ExceptionFactory.createException(ExceptionFactory.java:297) booklore_server | at org.mariadb.jdbc.export.ExceptionFactory.create(ExceptionFactory.java:378) booklore_server | at org.mariadb.jdbc.message.ClientMessage.readPacket(ClientMessage.java:187) booklore_server | at org.mariadb.jdbc.client.impl.StandardClient.readPacket(StandardClient.java:1379) booklore_server | at org.mariadb.jdbc.client.impl.StandardClient.readResults(StandardClient.java:1318) booklore_server | at org.mariadb.jdbc.client.impl.StandardClient.readResponse(StandardClient.java:1237) booklore_server | at org.mariadb.jdbc.client.impl.StandardClient.executePipeline(StandardClient.java:1077) booklore_server | ... 59 more `

alman-joe avatar Aug 19 '25 07:08 alman-joe

Already fixed

acx10 avatar Sep 26 '25 03:09 acx10