by synchronized. sometime, get list service will wrong
Description
I have two plug-in p1 and p2. it install without any issue. but when i restart server i see below error (end of description): both plug in use Activator Incremental2PackActivator p1 have a service implement IModelFactory and start before p2 by debug i see a issue relate synchronized.
consider some block code: 1. class DynamicServiceHolder, in constructor DynamicServiceHolder
if (serviceTracker.getTrackingCount() == -1)
serviceTracker.open();
2. class DynamicServiceHolder, in function getServices
when server start. Incremental2PackActivator run in two thread, one for plug-in p1 and one for p2.
when p1 run into block 1. it will run to line t.trackInitial() in class ServiceTracker at same time, p2 run in to block 1. it will run over serviceTracker.open(); because serviceTracker already open by p1. p2 will run to block 2. inside ServiceTracker have some lock control. so p2 will don't wait p1 for load service by finish t.trackInitial() so p2 with get a empty list or a list miss some service.
00:57:37.781 Incremental2PackActivator.start: vn.hsv.editor.currencyRate 1.0.0 starting... [17]
00:57:37.790 Incremental2PackActivator.start: vn.hsv.editor.currencyRate 1.0.0 ready. [17]
00:57:37.890===========> WebEnv.initWeb: startup [17]
java.lang.ClassCastException: org.adempiere.model.GenericPO cannot be cast to org.compiere.model.X_AD_Package_Imp
at org.adempiere.plugin.utils.Incremental2PackActivator.installPackage(Incremental2PackActivator.java:99)
at org.adempiere.plugin.utils.Incremental2PackActivator.access$4(Incremental2PackActivator.java:89)
at org.adempiere.plugin.utils.Incremental2PackActivator$3.stateChange(Incremental2PackActivator.java:271)
at org.compiere.Adempiere.fireServerStateChanged(Adempiere.java:733)
at org.compiere.Adempiere.startup(Adempiere.java:592)
at org.compiere.util.WebEnv.initWeb(WebEnv.java:170)
at org.compiere.util.WebEnv.initWeb(WebEnv.java:129)
at org.compiere.web.AdempiereMonitor.init(AdempiereMonitor.java:1113)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:626)
at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:405)
at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346)
at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1379)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1341)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772)
at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:517)
at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68)
at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41)
at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188)
at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499)
Environment
None
Attachments
7
13 Nov 2019, 01:28 PM
13 Nov 2019, 01:02 PM
11 Nov 2019, 09:03 AM
31 Oct 2019, 10:08 AM
24 Oct 2019, 12:07 PM
23 Oct 2019, 02:40 AM
22 Aug 2017, 03:53 PM
Activity
Show:
Heng Sin Low November 13, 2019 at 1:47 PM
yes, looks good now.
Diego Ruiz November 13, 2019 at 1:29 PM
You’re right @Heng Sin Low, I missed that one. Could you check if the IDEMPIERE-3043ModifiedDR2.patch is the right way to do it?
Thanks,
Diego Ruiz
Heng Sin Low November 13, 2019 at 1:09 PM
Hi @Diego Ruiz,
That's still not quite right. For synchronized to work correctly, you must synchronized both the read and write method. That's the frameworkEvent(FrameworkEvent event) that write/change the isFrameworkStarted method needs to be synchronized as well.
Regards, Low
Diego Ruiz November 13, 2019 at 1:04 PM
Thanks @Heng Sin Low ,
I modified the patch to follow a similar approach like in EventManager.
I have two plug-in
p1 and p2. it install without any issue.
but when i restart server i see below error (end of description):
both plug in use Activator Incremental2PackActivator
p1 have a service implement IModelFactory and start before p2
by debug i see a issue relate synchronized.
consider some block code:
1. class DynamicServiceHolder, in constructor DynamicServiceHolder
if (serviceTracker.getTrackingCount() == -1) serviceTracker.open();
2. class DynamicServiceHolder, in function getServices
ServiceReference<T>[] objects = serviceTracker.getServiceReferences();
when server start. Incremental2PackActivator run in two thread, one for plug-in p1 and one for p2.
when p1 run into block 1. it will run to line t.trackInitial() in class ServiceTracker
at same time, p2 run in to block 1. it will run over serviceTracker.open(); because serviceTracker already open by p1.
p2 will run to block 2. inside ServiceTracker have some lock control. so p2 will don't wait p1 for load service by finish t.trackInitial()
so p2 with get a empty list or a list miss some service.
00:57:37.781 Incremental2PackActivator.start: vn.hsv.editor.currencyRate 1.0.0 starting... [17] 00:57:37.790 Incremental2PackActivator.start: vn.hsv.editor.currencyRate 1.0.0 ready. [17] 00:57:37.890===========> WebEnv.initWeb: startup [17] java.lang.ClassCastException: org.adempiere.model.GenericPO cannot be cast to org.compiere.model.X_AD_Package_Imp at org.adempiere.plugin.utils.Incremental2PackActivator.installPackage(Incremental2PackActivator.java:99) at org.adempiere.plugin.utils.Incremental2PackActivator.access$4(Incremental2PackActivator.java:89) at org.adempiere.plugin.utils.Incremental2PackActivator$3.stateChange(Incremental2PackActivator.java:271) at org.compiere.Adempiere.fireServerStateChanged(Adempiere.java:733) at org.compiere.Adempiere.startup(Adempiere.java:592) at org.compiere.util.WebEnv.initWeb(WebEnv.java:170) at org.compiere.util.WebEnv.initWeb(WebEnv.java:129) at org.compiere.web.AdempiereMonitor.init(AdempiereMonitor.java:1113) at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:626) at org.eclipse.jetty.servlet.ServletHolder.initialize(ServletHolder.java:405) at org.eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.java:875) at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:346) at org.eclipse.jetty.webapp.WebAppContext.startWebapp(WebAppContext.java:1379) at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1341) at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:772) at org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:259) at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:517) at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:68) at org.eclipse.jetty.deploy.bindings.StandardStarter.processBinding(StandardStarter.java:41) at org.eclipse.jetty.deploy.AppLifeCycle.runBindings(AppLifeCycle.java:188) at org.eclipse.jetty.deploy.DeploymentManager.requestAppGoal(DeploymentManager.java:499)