Uploaded image for project: 'PUBLIC - Liferay Portal Community Edition'
  1. PUBLIC - Liferay Portal Community Edition
  2. LPS-82793

Saving portlet configuration IFrame intermittently causes PortletException

    Description

    This bug is most likely caused by a race condition, so it can be hard to reproduce. Here we have two ways it was reproduced.

    Steps to reproduce

    Approach #1

    These steps are simpler, work on some setups and were the ones which revealed the bugs.

    1. Navigate to http://localhost:8080/web/guest/search
    2. Enter the configuration screen for the Modified Facet portlet
    3. Make a change to one of the label text fields
    4. Click Save
    5. Repeat steps 3-4 multiple times until the exception below occurs

    Approach #2

    The steps are longer and more cumbersome but have a higher change of reproducing the bug. Note that the page (or at least the portlet in the page) should be new: the bug cannot be reproduced if the portlet was already configured.

    1. Create a new page (let us say http://localhost:8080/web/guest/example).
    2. Add Modified Facet Portlet to the page.
    3. Open http://localhost:8080/web/guest/example in many different tabs (e.g. 10 tabs).
    4. At each tab
      1. Enter the configuration screen for the Modified Facet portlet
      2. Make a change to one of the label text fields
      3. Do NOT click Save
    5. Click "Save" at each tab as quick as possible.

    Screencast

    multiple-save-config.mkv
     

    Results

    When the exception occurs, the configuration IFrame behaves oddly where it encompasses the top level page so that you can navigate around portal within the IFrame itself. See attached .gif for an example.
    I was also able to reproduce this with the Type Facet configuration IFrame when making changes to the Type Parameter Name field
    I was not able to reproduce this with any other components' portlets, it only occured with search portlets.


     

    2018-06-21 22:41:19.212 ERROR [http-nio-8080-exec-10][PortletServlet:112] javax.portlet.PortletException: org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.liferay.portal.model.impl.PortletPreferencesImpl] with identifier [36232]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.liferay.portal.model.impl.PortletPreferencesImpl#36232]
    javax.portlet.PortletException: org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.liferay.portal.model.impl.PortletPreferencesImpl] with identifier [36232]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.liferay.portal.model.impl.PortletPreferencesImpl#36232]
    	at com.liferay.portal.kernel.portlet.LiferayPortlet.callActionMethod(LiferayPortlet.java:212)
    	at com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.callActionMethod(MVCPortlet.java:418)
    	at com.liferay.portal.kernel.portlet.LiferayPortlet.processAction(LiferayPortlet.java:97)
    	at com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet.processAction(MVCPortlet.java:260)
    	at com.liferay.portlet.configuration.web.internal.portlet.PortletConfigurationPortlet.processAction(PortletConfigurationPortlet.java:391)
    	at com.liferay.portlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:77)
    	at com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:50)
    	at com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:108)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    	at org.eclipse.equinox.http.servlet.internal.registration.EndpointRegistration.service(EndpointRegistration.java:153)
    	at org.eclipse.equinox.http.servlet.internal.servlet.ResponseStateHandler.processRequest(ResponseStateHandler.java:62)
    	at org.eclipse.equinox.http.servlet.internal.context.DispatchTargets.doDispatch(DispatchTargets.java:118)
    	at org.eclipse.equinox.http.servlet.internal.servlet.RequestDispatcherAdaptor.include(RequestDispatcherAdaptor.java:48)
    	at com.liferay.portlet.internal.InvokerPortletImpl.invoke(InvokerPortletImpl.java:606)
    	at com.liferay.portlet.internal.InvokerPortletImpl.invokeAction(InvokerPortletImpl.java:652)
    	at com.liferay.portlet.internal.InvokerPortletImpl.processAction(InvokerPortletImpl.java:341)
    	at com.liferay.portal.monitoring.internal.portlet.MonitoringInvokerPortlet.processAction(MonitoringInvokerPortlet.java:208)
    	at com.liferay.portlet.internal.PortletContainerImpl._processAction(PortletContainerImpl.java:485)
    	at com.liferay.portlet.internal.PortletContainerImpl.lambda$processAction$0(PortletContainerImpl.java:144)
    	at com.liferay.portlet.internal.PortletContainerImpl._preserveGroupIds(PortletContainerImpl.java:390)
    	at com.liferay.portlet.internal.PortletContainerImpl.processAction(PortletContainerImpl.java:137)
    	at com.liferay.portlet.SecurityPortletContainerWrapper.processAction(SecurityPortletContainerWrapper.java:97)
    	at com.liferay.portlet.RestrictPortletContainerWrapper.processAction(RestrictPortletContainerWrapper.java:78)
    	at com.liferay.portal.kernel.portlet.PortletContainerUtil.processAction(PortletContainerUtil.java:115)
    	at com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:345)
    	at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:173)
    	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
    	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
    	at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:172)
    	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
    	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    	at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:605)
    	at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:582)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.secure.BaseAuthFilter.processFilter(BaseAuthFilter.java:340)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:181)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:100)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712)
    	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459)
    	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:384)
    	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312)
    	at com.liferay.friendly.url.internal.servlet.FriendlyURLServlet.service(FriendlyURLServlet.java:355)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    	at com.liferay.portal.servlet.ServletAdapter.service(ServletAdapter.java:98)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:119)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:343)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.i18n.I18nFilter.processFilter(I18nFilter.java:362)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.secure.BaseAuthFilter.processFilter(BaseAuthFilter.java:340)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.etag.ETagFilter.processFilter(ETagFilter.java:86)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.processFilter(AutoLoginFilter.java:261)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:88)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:263)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:144)
    	at com.liferay.portal.monitoring.internal.servlet.filter.MonitoringFilter.processFilter(MonitoringFilter.java:181)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
    	at org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:176)
    	at org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:145)
    	at org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:92)
    	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:389)
    	at com.liferay.portal.servlet.filters.urlrewrite.UrlRewriteFilter.processFilter(UrlRewriteFilter.java:65)
    	at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:49)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:207)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:112)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:168)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:188)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:96)
    	at com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:100)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)
    	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
    	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
    	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
    	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    	at java.lang.Thread.run(Thread.java:748)
    Caused by: org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Object of class [com.liferay.portal.model.impl.PortletPreferencesImpl] with identifier [36232]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.liferay.portal.model.impl.PortletPreferencesImpl#36232]
    	at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:698)
    	at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:800)
    	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:670)
    	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:757)
    	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:726)
    	at com.liferay.portal.spring.transaction.DefaultTransactionExecutor._commit(DefaultTransactionExecutor.java:128)
    	at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.commit(DefaultTransactionExecutor.java:36)
    	at com.liferay.portal.spring.transaction.DefaultTransactionExecutor.execute(DefaultTransactionExecutor.java:62)
    	at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:58)
    	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:135)
    	at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:56)
    	at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:135)
    	at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:145)
    	at com.sun.proxy.$Proxy165.updatePreferences(Unknown Source)
    	at com.liferay.portal.kernel.service.PortletPreferencesLocalServiceUtil.updatePreferences(PortletPreferencesLocalServiceUtil.java:425)
    	at com.liferay.portlet.PortletPreferencesImpl.store(PortletPreferencesImpl.java:176)
    	at com.liferay.portal.kernel.settings.PortletPreferencesSettings.store(PortletPreferencesSettings.java:113)
    	at com.liferay.portal.kernel.portlet.SettingsConfigurationAction.processAction(SettingsConfigurationAction.java:163)
    	at com.liferay.portlet.configuration.web.internal.portlet.PortletConfigurationPortlet.editConfiguration(PortletConfigurationPortlet.java:184)
    	at sun.reflect.GeneratedMethodAccessor1551.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at com.liferay.portal.kernel.portlet.LiferayPortlet.callActionMethod(LiferayPortlet.java:194)
    	... 145 more
    Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.liferay.portal.model.impl.PortletPreferencesImpl#36232]
    	at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:1950)
    	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2595)
    	at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2495)
    	at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:2822)
    	at org.hibernate.action.EntityUpdateAction.execute(EntityUpdateAction.java:113)
    	at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265)
    	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
    	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    	at com.liferay.portal.dao.orm.hibernate.event.NestableFlushEventListener.onFlush(NestableFlushEventListener.java:61)
    	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
    	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
    	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
    	at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:662)
    	... 165 more
    

    From the network monitor, there also appears to be a request that gets canceled.

    Reproduced on:
    Tomcat 9.0.6 + MySQL 5.7.22 + Chrome & Firefox
    portal master Git SHA: 072ca165c4686caf0127d7fd792e13c4ef65d643

      Attachments

      1. modifiedconfig.gif
        694 kB
        Joshua Chong
      2. multiple-save-config.mkv
        1.68 MB
        Adam Brandizzi
      3. multiple-save-config-asset-publisher.mkv
        1.24 MB
        Adam Brandizzi
      4. Screen Shot 2018-06-22 at 11.56.36 AM.png
        272 kB
        Brian Lee

        Issue Links

          Activity

            People

            Assignee:
            support-lep@liferay.com SE Support
            Reporter:
            joshua.chong Joshua Chong
            Participants of an Issue:
            Recent user:
            Sophia Zhang
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

              Dates

              Created:
              Updated:
              Days since last comment:
              37 weeks, 3 days ago

                Packages

                Version Package