X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=netconf%2Fnetconf-topology-singleton%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Ftopology%2Fsingleton%2Fimpl%2Futils%2FNetconfTopologyUtils.java;h=a7eb35de687265b349abc8355cc1281e87bee712;hb=1e174be6002940e17aee31d15f8914273d30f25c;hp=474619ee24d05d9ce4125ba3aaa99c532761c453;hpb=91f932fd6ef4d5e3db81af8c739ace55d7c5c90e;p=netconf.git diff --git a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java index 474619ee24..a7eb35de68 100644 --- a/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java +++ b/netconf/netconf-topology-singleton/src/main/java/org/opendaylight/netconf/topology/singleton/impl/utils/NetconfTopologyUtils.java @@ -9,11 +9,13 @@ package org.opendaylight.netconf.topology.singleton.impl.utils; import com.google.common.base.Strings; +import com.google.common.util.concurrent.Uninterruptibles; import java.io.File; import java.math.BigDecimal; import java.net.InetSocketAddress; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.opendaylight.netconf.api.DocumentedException; import org.opendaylight.netconf.sal.connect.netconf.NetconfDevice; import org.opendaylight.netconf.sal.connect.netconf.NetconfStateSchemasResolverImpl; @@ -73,12 +75,6 @@ public final class NetconfTopologyUtils { public static final SharedSchemaRepository DEFAULT_SCHEMA_REPOSITORY = new SharedSchemaRepository(DEFAULT_SCHEMA_REPOSITORY_NAME); - - // The default FilesystemSchemaSourceCache, which stores cached files in cache/schema. - public static final FilesystemSchemaSourceCache DEFAULT_CACHE = - new FilesystemSchemaSourceCache<>(DEFAULT_SCHEMA_REPOSITORY, YangTextSchemaSource.class, - new File(QUALIFIED_DEFAULT_CACHE_DIRECTORY)); - public static final InMemorySchemaSourceCache DEFAULT_AST_CACHE = InMemorySchemaSourceCache.createSoftCache(DEFAULT_SCHEMA_REPOSITORY, ASTSchemaSource.class); @@ -102,10 +98,33 @@ public final class NetconfTopologyUtils { SCHEMA_RESOURCES_DTO_MAP.put(DEFAULT_CACHE_DIRECTORY, new NetconfDevice.SchemaResourcesDTO(DEFAULT_SCHEMA_REPOSITORY, DEFAULT_SCHEMA_REPOSITORY, DEFAULT_SCHEMA_CONTEXT_FACTORY, new NetconfStateSchemasResolverImpl())); - DEFAULT_SCHEMA_REPOSITORY.registerSchemaSourceListener(DEFAULT_CACHE); DEFAULT_SCHEMA_REPOSITORY.registerSchemaSourceListener(DEFAULT_AST_CACHE); DEFAULT_SCHEMA_REPOSITORY.registerSchemaSourceListener( TextToASTTransformer.create(DEFAULT_SCHEMA_REPOSITORY, DEFAULT_SCHEMA_REPOSITORY)); + + /* + * Create the default FilesystemSchemaSourceCache, which stores cached files + * in cache/schema. Try up to 3 times - we've seen intermittent failures on jenkins where + * FilesystemSchemaSourceCache throws an IAE due to mkdirs failure. The theory is that there's a race + * creating the dir and it already exists when mkdirs is called (mkdirs returns false in this case). In this + * scenario, a retry should succeed. + */ + int tries = 1; + while (true) { + try { + FilesystemSchemaSourceCache defaultCache = + new FilesystemSchemaSourceCache<>(DEFAULT_SCHEMA_REPOSITORY, YangTextSchemaSource.class, + new File(QUALIFIED_DEFAULT_CACHE_DIRECTORY)); + DEFAULT_SCHEMA_REPOSITORY.registerSchemaSourceListener(defaultCache); + break; + } catch (IllegalArgumentException e) { + if (tries++ >= 3) { + LOG.error("Error creating default schema cache", e); + break; + } + Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); + } + } } private NetconfTopologyUtils() { @@ -208,9 +227,8 @@ public final class NetconfTopologyUtils { } public static NodeId getNodeId(final InstanceIdentifier.PathArgument pathArgument) { - if (pathArgument instanceof InstanceIdentifier.IdentifiableItem) { - - final Identifier key = ((InstanceIdentifier.IdentifiableItem) pathArgument).getKey(); + if (pathArgument instanceof InstanceIdentifier.IdentifiableItem) { + final Identifier key = ((InstanceIdentifier.IdentifiableItem) pathArgument).getKey(); if (key instanceof NodeKey) { return ((NodeKey) key).getNodeId(); } @@ -232,8 +250,8 @@ public final class NetconfTopologyUtils { return createTopologyListPath(topologyId).child(Node.class); } - public static DocumentedException createMasterIsDownException(final RemoteDeviceId id) { - return new DocumentedException(id + ":Master is down. Please try again.", + public static DocumentedException createMasterIsDownException(final RemoteDeviceId id, final Exception cause) { + return new DocumentedException(id + ":Master is down. Please try again.", cause, DocumentedException.ErrorType.APPLICATION, DocumentedException.ErrorTag.OPERATION_FAILED, DocumentedException.ErrorSeverity.WARNING); }