From 8d4d91a51ca7502a4dfd606d1c68c0ef8f2d785a Mon Sep 17 00:00:00 2001 From: Robert Munteanu Date: Tue, 29 Nov 2016 14:03:38 +0200 Subject: [PATCH] OAK-5179 - MultiplexingNodeStoreService does not register an OSGi service for oak.api.Descriptors Register the descriptors once the NodeStore instance has been registered. Also make sure to tolerate NodeStore instances being bound before the component is activated ( which is the norm ). --- .../multiplex/MultiplexingNodeStoreService.java | 47 +++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStoreService.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStoreService.java index 4d63797..7e9777d 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStoreService.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/multiplex/MultiplexingNodeStoreService.java @@ -23,11 +23,15 @@ import org.apache.felix.scr.annotations.Deactivate; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.ReferenceCardinality; import org.apache.felix.scr.annotations.ReferencePolicy; +import org.apache.jackrabbit.commons.SimpleValueFactory; +import org.apache.jackrabbit.oak.api.Descriptors; import org.apache.jackrabbit.oak.commons.PropertiesUtil; +import org.apache.jackrabbit.oak.plugins.identifier.ClusterRepositoryInfo; import org.apache.jackrabbit.oak.spi.mount.Mount; import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider; import org.apache.jackrabbit.oak.spi.state.NodeStore; import org.apache.jackrabbit.oak.spi.state.NodeStoreProvider; +import org.apache.jackrabbit.oak.util.GenericDescriptors; import org.osgi.framework.Constants; import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; @@ -67,6 +71,10 @@ public class MultiplexingNodeStoreService { private ServiceRegistration nsReg; + private ServiceRegistration descriptorsReg; + + private NodeStore nodeStore; + @Activate protected void activate(ComponentContext context) { this.context = context; @@ -127,12 +135,31 @@ public class MultiplexingNodeStoreService { LOG.info("Registering the multiplexing node store"); + nodeStore = builder.build(); + nsReg = context.getBundleContext().registerService( new String[]{ NodeStore.class.getName() }, - builder.build(), + nodeStore, props); + + registerDescriptors(); + } + + private void registerDescriptors() { + + // ensure a clusterId is initialized + // and expose it as 'oak.clusterid' repository descriptor + GenericDescriptors clusterIdDesc = new GenericDescriptors(); + clusterIdDesc.put(ClusterRepositoryInfo.OAK_CLUSTERID_REPOSITORY_DESCRIPTOR_KEY, + new SimpleValueFactory().createValue( + ClusterRepositoryInfo.getOrCreateId(nodeStore)), true, false); + descriptorsReg = context.getBundleContext().registerService( + Descriptors.class.getName(), + clusterIdDesc, + new Hashtable() + ); } private boolean isGlobalNodeStore(NodeStoreWithProps ns) { @@ -156,12 +183,25 @@ public class MultiplexingNodeStoreService { LOG.info("Unregistering the multiplexing node store"); nsReg.unregister(); nsReg = null; + + unregisterDescriptors(); } } + private void unregisterDescriptors() { + if ( descriptorsReg != null ) { + descriptorsReg.unregister(); + descriptorsReg = null; + } + } protected void bindNodeStore(NodeStoreProvider ns, Map config) { NodeStoreWithProps newNs = new NodeStoreWithProps(ns, config); nodeStores.add(newNs); + + if ( context == null ) { + LOG.info("bindNodeStore: context is null, delaying reconfiguration"); + return; + } unregisterMultiplexingNodeStore(); registerMultiplexingNodeStore(); @@ -174,6 +214,11 @@ public class MultiplexingNodeStoreService { it.remove(); } } + + if ( context == null ) { + LOG.info("unbindNodeStore: context is null, delaying reconfiguration"); + return; + } unregisterMultiplexingNodeStore(); registerMultiplexingNodeStore(); -- 2.10.2