From f5066a8aa70f606db37a2bdbbef07164da247a64 Mon Sep 17 00:00:00 2001
From: Robert Munteanu <rombert@apache.org>
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    | 46 +++++++++++++++++++++-
 1 file changed, 45 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..e37be42 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,30 @@ 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<String, Object>()
+        );
     }
 
     private boolean isGlobalNodeStore(NodeStoreWithProps ns) {
@@ -156,13 +182,26 @@ 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<String, ?> config) {
         NodeStoreWithProps newNs = new NodeStoreWithProps(ns, config);
         nodeStores.add(newNs);
 
+        if (context == null) {
+            LOG.info("bindNodeStore: context is null, delaying reconfiguration");
+            return;
+        }
+
         unregisterMultiplexingNodeStore();
         registerMultiplexingNodeStore();
     }
@@ -175,6 +214,11 @@ public class MultiplexingNodeStoreService {
             }
         }
 
+        if (context == null) {
+            LOG.info("unbindNodeStore: context is null, delaying reconfiguration");
+            return;
+        }
+
         unregisterMultiplexingNodeStore();
         registerMultiplexingNodeStore();
     }
-- 
2.10.2

