From: Robert Varga Date: Sun, 11 May 2014 20:29:29 +0000 (+0200) Subject: BUG-981: improve waitForSchema() reliability X-Git-Tag: release/helium~569 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=45cb621d8fe559f9ef8db5b3e2bbf581f556fba3;p=yangtools.git BUG-981: improve waitForSchema() reliability SchemaLock.waitForSchema() should not check presence of codecs, but rather only look at available definitions. Rework it such that it is more useful. Change-Id: I0e6240dad78d1e4987b3c7e8b4171b0e117e4792 Signed-off-by: Robert Varga --- diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/LazyGeneratedCodecRegistry.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/LazyGeneratedCodecRegistry.java index 28027f0259..a6bf376298 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/LazyGeneratedCodecRegistry.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/LazyGeneratedCodecRegistry.java @@ -1374,32 +1374,7 @@ class LazyGeneratedCodecRegistry implements // } - public boolean isCodecAvailable(final Class cls) { - // FIXME: enforce type? - // Preconditions.checkArgument(DataContainer.class.isAssignableFrom(cls)); - - if (containerCodecs.containsKey(cls)) { - return true; - } - if (identifierCodecs.containsKey(cls)) { - return true; - } - if (choiceCodecs.containsKey(cls)) { - return true; - } - if (caseCodecs.containsKey(cls)) { - return true; - } - if (augmentableCodecs.containsKey(cls)) { - return true; - } - if (augmentationCodecs.containsKey(cls)) { - return true; - } - return false; - } - - public static final Type referencedType(final Class augmentableType) { + private static final Type referencedType(final Class augmentableType) { return new ReferencedTypeImpl(augmentableType.getPackage().getName(), augmentableType.getSimpleName()); } } diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java index 8ac4a9441a..e6dc334e3e 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/RuntimeGeneratedMappingServiceImpl.java @@ -71,6 +71,7 @@ import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMappingService, SchemaContextListener, @@ -268,14 +269,15 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap @Override public void waitForSchema(final Class cls) { - if (!registry.isCodecAvailable(cls)) { - final Type ref = Types.typeForClass(cls); + final ListenableFuture f = getSchemaDefinition(cls); + if (f != null) { try { - getSchemaWithRetry(ref); + f.get(); } catch (InterruptedException | ExecutionException e) { LOG.warn("Waiting for schema for class {} failed", cls, e); throw new IllegalStateException(String.format("Failed to get schema for %s", cls), e); } + LOG.info("Schema for {} became available, thread unblocked", cls); } } @@ -365,21 +367,18 @@ public class RuntimeGeneratedMappingServiceImpl implements BindingIndependentMap return serviceRef; } - private void getSchemaWithRetry(final Type type) throws InterruptedException, ExecutionException { - final SettableFuture f; - + private ListenableFuture getSchemaDefinition(final Class cls) { + final Type type = Types.typeForClass(cls); synchronized (this) { if (typeToDefinition.containsKey(type)) { - return; + return null; } - LOG.info("Thread blocked waiting for schema for: {}", type.getFullyQualifiedName()); - f = SettableFuture.create(); + LOG.info("Thread is going to wait for schema for: {}", type.getFullyQualifiedName()); + final SettableFuture f = SettableFuture.create(); promisedTypes.put(type, f); + return f; } - - f.get(); - LOG.info("Schema for {} became available, thread unblocked", type.getFullyQualifiedName()); } @GuardedBy("this") diff --git a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/SchemaLock.java b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/SchemaLock.java index be0bb45cfb..4633a22caa 100644 --- a/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/SchemaLock.java +++ b/code-generator/binding-generator-impl/src/main/java/org/opendaylight/yangtools/sal/binding/generator/impl/SchemaLock.java @@ -1,7 +1,12 @@ +/** + * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ package org.opendaylight.yangtools.sal.binding.generator.impl; -public interface SchemaLock { - - public void waitForSchema(Class cls); - +interface SchemaLock { + void waitForSchema(Class cls); }