Uploaded image for project: 'OptaPlanner'
  1. OptaPlanner
  2. PLANNER-2105

Painting time buckets by dragging a stub causes ObjectOptimisticLockingFailureException

    XMLWordPrintable

Details

    • Bug
    • Resolution: Done
    • Minor
    • None
    • None
    • None

    Description

      It seems that dragging an employee stub over the time bucket canvas leads to multiple concurrent request to the server, which sometimes crash:

      org.springframework.orm.ObjectOptimisticLockingFailureException: Object of class [org.optaweb.employeerostering.domain.rotation.TimeBucket] with identifier [117]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [org.optaweb.employeerostering.domain.rotation.TimeBucket#117]
      org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:337)
      org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
      org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:528)
      org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:61)
      org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:242)
      org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:153)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      com.sun.proxy.$Proxy166.saveAndFlush(Unknown Source)
      org.optaweb.employeerostering.service.rotation.RotationService.updateTimeBucket(RotationService.java:197)
      org.optaweb.employeerostering.service.rotation.RotationService$$FastClassBySpringCGLIB$$c68b0e57.invoke(<generated>)
      org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
      org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
      org.optaweb.employeerostering.service.rotation.RotationService$$EnhancerBySpringCGLIB$$fa3e30ad.updateTimeBucket(<generated>)
      org.optaweb.employeerostering.service.rotation.RotationController.updateTimeBucket(RotationController.java:88)
      org.optaweb.employeerostering.service.rotation.RotationController$$FastClassBySpringCGLIB$$3ce760ba.invoke(<generated>)
      org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:120)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
      org.optaweb.employeerostering.service.rotation.RotationController$$EnhancerBySpringCGLIB$$11302bbb.updateTimeBucket(<generated>)
      sun.reflect.GeneratedMethodAccessor278.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      java.lang.reflect.Method.invoke(Method.java:498)
      org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
      org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
      org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
      org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
      org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
      org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
      org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
      org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
      org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
      org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:663)
      org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
      org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
      org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
      org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
      org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
      org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
      org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
      org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
      org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
      org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
      org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
      org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
      java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      java.lang.Thread.run(Thread.java:748)
      
      Caused By
      
      org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [org.optaweb.employeerostering.domain.rotation.TimeBucket#117]
      org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2540)
      org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3375)
      org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3249)
      org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3650)
      org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:146)
      org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604)
      org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:478)
      org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:356)
      org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
      org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1472)
      org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1458)
      sun.reflect.GeneratedMethodAccessor271.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      java.lang.reflect.Method.invoke(Method.java:498)
      org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
      com.sun.proxy.$Proxy136.flush(Unknown Source)
      sun.reflect.GeneratedMethodAccessor271.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      java.lang.reflect.Method.invoke(Method.java:498)
      org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:314)
      com.sun.proxy.$Proxy136.flush(Unknown Source)
      org.springframework.data.jpa.repository.support.SimpleJpaRepository.flush(SimpleJpaRepository.java:601)
      org.springframework.data.jpa.repository.support.SimpleJpaRepository.saveAndFlush(SimpleJpaRepository.java:570)
      sun.reflect.GeneratedMethodAccessor279.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      java.lang.reflect.Method.invoke(Method.java:498)
      org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:371)
      org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:204)
      org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:657)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:621)
      org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:605)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
      org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:178)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
      com.sun.proxy.$Proxy166.saveAndFlush(Unknown Source)
      org.optaweb.employeerostering.service.rotation.RotationService.updateTimeBucket(RotationService.java:197)
      org.optaweb.employeerostering.service.rotation.RotationService$$FastClassBySpringCGLIB$$c68b0e57.invoke(<generated>)
      org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366)
      org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
      org.optaweb.employeerostering.service.rotation.RotationService$$EnhancerBySpringCGLIB$$fa3e30ad.updateTimeBucket(<generated>)
      org.optaweb.employeerostering.service.rotation.RotationController.updateTimeBucket(RotationController.java:88)
      org.optaweb.employeerostering.service.rotation.RotationController$$FastClassBySpringCGLIB$$3ce760ba.invoke(<generated>)
      org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:771)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:120)
      org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
      org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:749)
      org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:691)
      org.optaweb.employeerostering.service.rotation.RotationController$$EnhancerBySpringCGLIB$$11302bbb.updateTimeBucket(<generated>)
      sun.reflect.GeneratedMethodAccessor278.invoke(Unknown Source)
      sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      java.lang.reflect.Method.invoke(Method.java:498)
      org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
      org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
      org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
      org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
      org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
      org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
      org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
      org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
      org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
      org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:920)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:663)
      org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
      org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
      org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
      org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
      org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
      org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
      org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
      org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
      org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
      org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
      org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
      org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
      org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
      org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
      org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
      org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
      java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
      java.lang.Thread.run(Thread.java:748)
      

      Attachments

        Activity

          People

            cchianel Christopher Chianelli
            jlocker Jiří Locker
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: