[jboss-jira] [JBoss JIRA] (WFLY-12372) Performance impact of moving from InjectedValue.getValue() reads to MSC Supplier impl get() reads

Richard Opalka (Jira) issues at jboss.org
Mon Sep 2 15:02:00 EDT 2019


     [ https://issues.jboss.org/browse/WFLY-12372?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Richard Opalka resolved WFLY-12372.
-----------------------------------
    Resolution: Done


> Performance impact of moving from InjectedValue.getValue() reads to MSC Supplier impl get() reads
> -------------------------------------------------------------------------------------------------
>
>                 Key: WFLY-12372
>                 URL: https://issues.jboss.org/browse/WFLY-12372
>             Project: WildFly
>          Issue Type: Bug
>          Components: MSC, Server
>    Affects Versions: 17.0.1.Final
>            Reporter: Brian Stansberry
>            Assignee: Richard Opalka
>            Priority: Critical
>             Fix For: 18.0.0.Beta1
>
>
> A byproduct of the move from the deprecated MSC org.jboss.msc.service.Service API to the new org.jboss.msc.Service API is that service wiring is shifted from a service getting refs to dependencies via InjectedValue.getValue() to Supplier.get() calls where the supplier is obtained from a ServiceBuilder.requires(....) call.
> The concurrency characteristics of these two calls are different, which can result in performance changes if the calls are frequent; i.e. are part of high volume user request handling call paths. For example:
> {code}
> org.jboss.msc.service.ServiceRegistrationImpl.getValue()
>    org.jboss.msc.service.ReadableValueImpl.get()	
>   org.jboss.as.weld.interceptors.Jsr299BindingsInterceptor.processInvocation(InterceptorContext)      org.jboss.as.ee.component.interceptors.UserInterceptorFactory$1.processInvocation(InterceptorContext)
>             org.jboss.invocation.InterceptorContext.proceed()
> {code}
> An InjectedValue.getValue() call involves a read of a volatile field, followed by a read of the getValue() method of the service impl, which is typically also a read of a volatile field.  The stack trace above shows how the Supplier.get() call is handled. The issue is the ServiceRegistrationImpl.getValue() call includes a synchronization lock on the ServiceRegistrationImpl value, which means the call is a concurrency chokepoint if it's used by many requests.
> We need to examine the changes we've made related to this MSC API switch and identify and correct cases where this kind of thing has crept in.



--
This message was sent by Atlassian Jira
(v7.13.5#713005)


More information about the jboss-jira mailing list