Reduce SchemaContext updates on shutdown
[controller.git] / opendaylight / md-sal / sal-dom-broker / src / main / java / org / opendaylight / controller / sal / dom / broker / GlobalBundleScanningSchemaServiceImpl.java
index c4418c7911a79b6d786c7a47a638e87ceffa59bc..34c11ddc9240c3f3305ff62814d7cd59101b3985 100644 (file)
@@ -8,27 +8,25 @@
 package org.opendaylight.controller.sal.dom.broker;
 
 import static com.google.common.base.Preconditions.checkState;
-
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
-
+import com.google.common.collect.Iterables;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
-
 import org.opendaylight.controller.sal.core.api.model.SchemaService;
-import org.opendaylight.controller.sal.dom.broker.impl.SchemaContextProvider;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.util.ListenerRegistry;
 import org.opendaylight.yangtools.yang.model.api.Module;
 import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
-import org.opendaylight.yangtools.yang.parser.impl.util.URLSchemaContextResolver;
+import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
+import org.opendaylight.yangtools.yang.parser.repo.URLSchemaContextResolver;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
@@ -44,7 +42,7 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi
     private static final Logger LOG = LoggerFactory.getLogger(GlobalBundleScanningSchemaServiceImpl.class);
 
     private final ListenerRegistry<SchemaContextListener> listeners = new ListenerRegistry<>();
-    private final URLSchemaContextResolver contextResolver = new URLSchemaContextResolver();
+    private final URLSchemaContextResolver contextResolver = URLSchemaContextResolver.create("global-bundle");
     private final BundleScanner scanner = new BundleScanner();
     private final BundleContext context;
 
@@ -84,13 +82,20 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi
 
     public void start() {
         checkState(context != null);
+        LOG.debug("start() starting");
 
         listenerTracker = new ServiceTracker<>(context, SchemaContextListener.class, GlobalBundleScanningSchemaServiceImpl.this);
-        bundleTracker = new BundleTracker<>(context, BundleEvent.RESOLVED | BundleEvent.UNRESOLVED, scanner);
+        bundleTracker = new BundleTracker<>(context, Bundle.RESOLVED | Bundle.STARTING |
+                Bundle.STOPPING | Bundle.ACTIVE, scanner);
         bundleTracker.open();
+
+        LOG.debug("BundleTracker.open() complete");
+
         listenerTracker.open();
         starting = false;
         tryToUpdateSchemaContext();
+
+        LOG.debug("start() complete");
     }
 
     @Override
@@ -187,7 +192,8 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi
             }
 
             if (!urls.isEmpty()) {
-                LOG.debug("Loaded {} new URLs, rebuilding schema context", urls.size());
+                LOG.debug("Loaded {} new URLs from bundle {}, attempting to rebuild schema context",
+                        urls.size(), bundle.getSymbolicName());
                 tryToUpdateSchemaContext();
             }
 
@@ -196,7 +202,6 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi
 
         @Override
         public void modifiedBundle(final Bundle bundle, final BundleEvent event, final Iterable<Registration> object) {
-            LOG.debug("Modified bundle {} {} {}", bundle, event, object);
         }
 
         /**
@@ -214,7 +219,15 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi
                     LOG.warn("Failed do unregister URL {}, proceeding", url, e);
                 }
             }
-            tryToUpdateSchemaContext();
+
+            int numUrls = Iterables.size(urls);
+            if(numUrls > 0 ) {
+                if(LOG.isDebugEnabled()) {
+                    LOG.debug("removedBundle: {}, state: {}, # urls: {}", bundle.getSymbolicName(), bundle.getState(), numUrls);
+                }
+
+                tryToUpdateSchemaContext();
+            }
         }
     }
 
@@ -233,8 +246,12 @@ public class GlobalBundleScanningSchemaServiceImpl implements SchemaContextProvi
         if (starting) {
             return;
         }
-        Optional<SchemaContext> schema = contextResolver.tryToUpdateSchemaContext();
+        Optional<SchemaContext> schema = contextResolver.getSchemaContext();
         if(schema.isPresent()) {
+            if(LOG.isDebugEnabled()) {
+                LOG.debug("Got new SchemaContext: # of modules {}", schema.get().getAllModuleIdentifiers().size());
+            }
+
             updateContext(schema.get());
         }
     }