Bug 5819 - Violation of synchronization rules in AbstractSchemaRepository 14/38914/1
authorAlexis de Talhouët <adetalhouet@inocybe.com>
Fri, 29 Apr 2016 11:54:00 +0000 (07:54 -0400)
committerRobert Varga <rovarga@cisco.com>
Mon, 16 May 2016 08:12:06 +0000 (10:12 +0200)
As noted by @GuardedBy annotation, access to sources field need to be
performed while holding the object monitor. Refactor getSchemaSource()
to create a copy under lock and then release it for further processing.

Change-Id: I65fddf5830e657c3601c85fd976f12e3c8bb3ff6
Signed-off-by: Alexis de Talhouët <adetalhouet@inocybe.com>
Signed-off-by: Robert Varga <nite@hq.sk>
(cherry picked from commit 36bdb3a032d4924b36dc86d782e58043954adadc)

yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/repo/util/AbstractSchemaRepository.java

index bb6d1d4eb86ec71752ba472a68ae4631b69fcef2..2413c6fc9679891a49d3a80ab25119b7aadf619c 100644 (file)
@@ -87,13 +87,18 @@ public abstract class AbstractSchemaRepository implements SchemaRepository, Sche
 
     @Override
     public <T extends SchemaSourceRepresentation> CheckedFuture<T, SchemaSourceException> getSchemaSource(final SourceIdentifier id, final Class<T> representation) {
-        final ListMultimap<Class<? extends SchemaSourceRepresentation>, AbstractSchemaSourceRegistration<?>> srcs = sources.get(id);
-        if (srcs == null) {
-            return Futures.<T, SchemaSourceException>immediateFailedCheckedFuture(new MissingSchemaSourceException("No providers registered for source" + id, id));
+        final ArrayList<AbstractSchemaSourceRegistration<?>> sortedSchemaSourceRegistrations;
+
+        synchronized (this) {
+            final ListMultimap<Class<? extends SchemaSourceRepresentation>, AbstractSchemaSourceRegistration<?>> srcs = sources.get(id);
+            if (srcs == null) {
+                return Futures.<T, SchemaSourceException>immediateFailedCheckedFuture(new MissingSchemaSourceException("No providers registered for source" + id, id));
+            }
+
+            sortedSchemaSourceRegistrations = Lists.newArrayList(srcs.get(representation));
         }
 
         // TODO, remove and make sources keep sorted multimap (e.g. ArrayListMultimap with SortedLists)
-        final ArrayList<AbstractSchemaSourceRegistration<?>> sortedSchemaSourceRegistrations = Lists.newArrayList(srcs.get(representation));
         Collections.sort(sortedSchemaSourceRegistrations, SchemaProviderCostComparator.INSTANCE);
 
         final Iterator<AbstractSchemaSourceRegistration<?>> regs = sortedSchemaSourceRegistrations.iterator();