[ 
https://issues.apache.org/jira/browse/SLING-12367?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Robert Munteanu reassigned SLING-12367:
---------------------------------------

    Assignee: Robert Munteanu

> Add MBeans Registration Upon OakSlingRepository Construction
> ------------------------------------------------------------
>
>                 Key: SLING-12367
>                 URL: https://issues.apache.org/jira/browse/SLING-12367
>             Project: Sling
>          Issue Type: Improvement
>    Affects Versions: JCR Oak Server 1.4.0
>            Reporter: Herman Ciechanowiec
>            Assignee: Robert Munteanu
>            Priority: Major
>              Labels: Sling-13-Release-Notes
>             Fix For: JCR Oak Server 1.4.4
>
>
> *1. Summary*
>    By default, Apache Sling uses `OakSlingRepository` for repository 
> construction. `OakSlingRepository` is, in turn, backed by `Oak`, which 
> delivers some important MBeans (e.g., query statistics). However, due to the 
> current specifics of the `OakSlingRepository` implementation, those MBeans 
> aren’t registered in the MBean service registry (MBean Server). Therefore, 
> those MBeans aren’t recognized by Apache Sling as MBeans, and their MBean 
> features remain unavailable to the user. The proposed fix is to introduce the 
> missing MBeans registration.
> The problem is related to Apache Sling JCR Oak Repository Server 
> (`org.apache.sling.jcr.oak.server`).
> *2. Default Apache Sling Repository Construction*
>    Apache Sling uses Java Content Repository (JCR) for persistence. 
> Connections to that persistence layer are performed via 
> `javax.jcr.Repository` implementations.
>    There are several ways `javax.jcr.Repository` can be implemented and 
> constructed. By default, in Apache Sling 12, an instance of 
> `javax.jcr.Repository` is implemented and constructed in 
> [`org.apache.sling.jcr.oak.server.internal.OakSlingRepositoryManager#acquireRepository()`
>  
> method](https://github.com/apache/sling-org-apache-sling-jcr-oak-server/blob/0dcb90452e0cc27db3501a21a99d7de1f72c2425/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManager.java#L131-L168)
>  from the `org.apache.sling.jcr.oak.server` bundle. To construct the 
> `javax.jcr.Repository`, the mentioned method utilizes 
> `org.apache.jackrabbit.oak.Oak` from `org.apache.jackrabbit:oak-core`.
> *3. Whiteboard in Oak Repository*
>    During `javax.jcr.Repository` construction, 
> `org.apache.jackrabbit.oak.Oak#with(Whiteboard)` [can be provided with a 
> `org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard`](https://github.com/apache/jackrabbit-oak/blob/541815b62fd955d76f7069e87b9412bd7eba4daf/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java#L566-L591)
>  from `org.apache.jackrabbit:oak-core-spi`.
>    The `org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard` provided to the 
> `org.apache.jackrabbit.oak.Oak` during `javax.jcr.Repository` construction is 
> later used inside the `org.apache.jackrabbit.oak.Oak`, among others, to 
> perform registration of services relevant for the repository 
> (repository-specific services). Importantly, 
> `org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard` is just an interface 
> and doesn’t enforce any platform-specific logic for service registration. For 
> instance, the `org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard` 
> implementation just keeps services in the application memory, while the 
> implementation provided via `org.apache.jackrabbit.oak.osgi.OsgiWhiteboard` 
> performs registration of repository-specific services inside the OSGi service 
> registry.
> *4. MBeans in Oak Repository*
>    Some repository-specific services registered inside the 
> `org.apache.jackrabbit.oak.Oak` via the 
> `org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard` provided during 
> `javax.jcr.Repository` construction are MBeans. In general, those MBeans 
> provide crucial monitoring information on the state of the repository. 
> Specifically, at least the following MBeans are supposed to be registered:
>        org.apache.jackrabbit.oak:name=Oak Query Statistics 
> (Extended),type=QueryStats
>        org.apache.jackrabbit.oak:name=Oak Query Statistics,type=QueryStat
>        org.apache.jackrabbit.oak:name=Oak Repository 
> Statistics,type=RepositoryStats
>        org.apache.jackrabbit.oak:name=async,type=IndexStats
>        org.apache.jackrabbit.oak:name=async,type=PropertyIndexAsyncReindex
>        org.apache.jackrabbit.oak:name=nodeCounter,type=NodeCounter
>        org.apache.jackrabbit.oak:name=repository 
> manager,type=RepositoryManagement
>        org.apache.jackrabbit.oak:name=settings,type=QueryEngineSettings
>    In order to be recognized by the application as MBeans, 
> repository-specific services that are MBeans [must be registered in the MBean 
> service registry (MBean 
> Server)](https://www.oracle.com/technical-resources/articles/javase/jmx.html).
>  Otherwise, they will not expose their MBean features and will remain idle in 
> this regard. Importantly, there are no limitations that forbid the 
> registration of the same repository-specific service in separate and isolated 
> service registries simultaneously. On the contrary, if a given 
> repository-specific service is polymorphic and is supposed to be registered 
> in separate and isolated service registries simultaneously, such registration 
> might even be strongly advised. For instance, a given repository-specific 
> service might be constructed as both an MBean service and an OSGi service, 
> which aren’t the same and which provide different functionalities; hence it 
> must be registered in both the MBean service registry (MBean Server) and the 
> OSGi service registry. `org.apache.jackrabbit.oak.Oak` recognizes this 
> polymorphic nature of some repository-specific services and by default uses a 
> custom `org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard` implementation 
> that [registers repository-specific services both in the in-memory service 
> registry (`org.apache.jackrabbit.oak.spi.whiteboard.DefaultWhiteboard`) and 
> additionally - in the case of services that are also MBeans - in the MBean 
> service registry (MBean 
> Server)](https://github.com/apache/jackrabbit-oak/blob/541815b62fd955d76f7069e87b9412bd7eba4daf/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java#L281-L359).
> *5. Whiteboard in Default Apache Sling Repository Construction*
>    During `javax.jcr.Repository` construction performed by 
> `org.apache.sling.jcr.oak.server.internal.OakSlingRepositoryManager#acquireRepository()`,
>  the `org.apache.jackrabbit.oak.Oak` [is constructed with an instance of 
> `org.apache.jackrabbit.oak.osgi.OsgiWhiteboard`](https://github.com/apache/sling-org-apache-sling-jcr-oak-server/blob/0dcb90452e0cc27db3501a21a99d7de1f72c2425/src/main/java/org/apache/sling/jcr/oak/server/internal/OakSlingRepositoryManager.java#L133).
>  That instance is an implementation of 
> `org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard` that registers 
> repository-specific services exclusively in the OSGi service registry. It 
> means that repository-specific services registered inside 
> `org.apache.jackrabbit.oak.Oak` that are both OSGi services and MBeans are 
> registered exclusively in the OSGi service registry and are not registered in 
> the MBean service registry (MBean Server). Therefore, those services do not 
> expose their MBean features and remain idle in this regard. Because of this, 
> the Apache Sling user does not receive crucial monitoring information on the 
> state of the repository delivered by those MBean features. For instance, they 
> do not have access to Oak Query Statistics, which complicates query 
> improvements.
> *6. Difference in Proprietary Apache Sling Variations*
>    The problem of lacking MBean features delivered by repository-specific 
> services isn’t present in at least some proprietary variations of Apache 
> Sling. The reason for this is that those proprietary variations don’t rely on 
> `org.apache.sling.jcr.oak.server.internal.OakSlingRepositoryManager` used by 
> vanilla Apache Sling for `javax.jcr.Repository` construction but use custom 
> implementations. At least some of those implementations are performed 
> correctly so that repository-specific services that are both MBeans and OSGi 
> services are registered in both the MBean service registry (MBean Server) and 
> the OSGi service registry respectively. Thanks to this, users of such Apache 
> Sling variations do not lack MBean features of repository-specific services.
> *7. Proposed Fix*
>    It is proposed to fix the problem of lacking MBean features delivered by 
> repository-specific services by registering the services that are MBeans not 
> only in the OSGi service registry, as is already implemented, but 
> additionally in the MBean service registry (MBean Server). To achieve this, 
> the fix wraps `org.apache.jackrabbit.oak.osgi.OsgiWhiteboard` currently used 
> in the 
> `org.apache.sling.jcr.oak.server.internal.OakSlingRepositoryManager#acquireRepository()`
>  in the decorating class 
> `org.apache.sling.jcr.oak.server.internal.WithMBeanRegistration`. The 
> decorator passes all method calls to the wrapped object and additionally, 
> when registration and unregistration methods are called, registers and 
> unregisters respectively repository-specific services that are MBeans in the 
> MBean service registry (MBean Server). The logic of the implementation is a 
> remake of the logic [provided by 
> `org.apache.jackrabbit.oak.Oak`](https://github.com/apache/jackrabbit-oak/blob/541815b62fd955d76f7069e87b9412bd7eba4daf/oak-core/src/main/java/org/apache/jackrabbit/oak/Oak.java#L281-L359)
>  and discussed above.
> *8. Verification of the Fix*
>    The proposed fix is verified in the integration and unit tests provided 
> along with the fix. Additionally, it was verified on a vanilla Apache Sling 
> 12 instance. However, note that by default, vanilla Apache Sling 12 doesn’t 
> provide a user interface to directly interact with or see the state of the 
> MBean service registry nor to see the statistics provided by the MBean 
> features from repository-specific services. For such interaction, additional 
> tooling should be installed, like [Adobe Granite JMX 
> Support](https://mvnrepository.com/artifact/com.adobe.granite/com.adobe.granite.jmx)
>  (`com.adobe.granite:com.adobe.granite.jmx`, 
> http://localhost:8080/system/console/jmx) or 
> [Jolokia](https://mvnrepository.com/artifact/org.jolokia/jolokia-osgi) 
> (`org.jolokia:jolokia-osgi`, http://localhost:8080/jolokia/list).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to