[YANGTOOLS-794] Get OF Topology in XML hangs controller in Nitrogen Created: 05/Jul/17  Updated: 10/Apr/22  Resolved: 26/Jul/17

Status: Resolved
Project: yangtools
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug
Reporter: Luis Gomez Assignee: Unassigned
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

Operating System: All
Platform: All


Attachments: Text File thread_dump.txt    
External issue ID: 8803

 Description   

This could be K4 related, to reproduce:

1) Install latest master K4 controller from nexus:
https://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/org/opendaylight/integration/karaf/0.7.0-SNAPSHOT/

2) Install feature: odl-openflowplugin-flow-services-rest

3) Start mininet 1 switch: sudo mn --controller=remote,ip=192.168.0.1 --topo linear,1

4) Do GET http://192.168.0.1:8181/restconf/operational/network-topology:network-topology/ using HTTP headers: Accept=application/xml, Content-Type=application/xml

Controller hangs, only soultion is restart controller.



 Comments   
Comment by Tomas Slusny [ 07/Jul/17 ]

It works for JSON, but hangs for XML, so I do not think that this issue is OpenFlowPlugin related at all. Maybe it is restconf related?

Comment by Robert Varga [ 11/Jul/17 ]

We need karaf.log and probably a thread dump.

Also, what does 'controller hangs' mean?

Comment by Luis Gomez [ 12/Jul/17 ]

I just tried this, the REST request hangs and I can perform other REST requests but the controller goes crazy in CPU even when I cancel the original request.

There is nothing out of normal in karaf log and I attach the thread dump.

Comment by Luis Gomez [ 12/Jul/17 ]

Attachment thread_dump.txt has been added with description: Thread dump

Comment by Robert Varga [ 12/Jul/17 ]

"qtp181445460-221" #221 prio=5 os_prio=0 tid=0x00007f18241d3000 nid=0x175c runnable [0x00007f17b1ee6000]
java.lang.Thread.State: RUNNABLE
at java.lang.String.intern(Native Method)
at com.sun.org.apache.xerces.internal.util.SymbolTable$Entry.<init>(SymbolTable.java:448)
at com.sun.org.apache.xerces.internal.util.SymbolTable.addSymbol0(SymbolTable.java:195)
at com.sun.org.apache.xerces.internal.util.SymbolTable.addSymbol(SymbolTable.java:176)
at com.sun.xml.internal.stream.writers.XMLStreamWriterImpl$NamespaceContextImpl.getNamespaceURI(XMLStreamWriterImpl.java:2051)
at org.opendaylight.yangtools.yang.data.codec.xml.RandomPrefix.alreadyUsedPrefix(RandomPrefix.java:66)
at org.opendaylight.yangtools.yang.data.codec.xml.RandomPrefix.encodePrefix(RandomPrefix.java:55)
at org.opendaylight.yangtools.yang.data.codec.xml.RandomPrefixInstanceIdentifierSerializer.prefixForNamespace(RandomPrefixInstanceIdentifierSerializer.java:34)
at org.opendaylight.yangtools.yang.data.util.AbstractNamespaceCodec.appendQName(AbstractNamespaceCodec.java:45)
at org.opendaylight.yangtools.yang.data.util.AbstractStringInstanceIdentifierCodec.serialize(AbstractStringInstanceIdentifierCodec.java:51)
at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamWriterUtils.writeInstanceIdentifier(SchemaAwareXMLStreamWriterUtils.java:41)
at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamWriterUtils.write(XMLStreamWriterUtils.java:149)
at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamWriterUtils.writeValue(XMLStreamWriterUtils.java:103)
at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamWriterUtils.writeValue(XMLStreamWriterUtils.java:79)
at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamNormalizedNodeStreamWriter.writeValue(SchemaAwareXMLStreamNormalizedNodeStreamWriter.java:51)
at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamNormalizedNodeStreamWriter.writeValue(SchemaAwareXMLStreamNormalizedNodeStreamWriter.java:32)
at org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter.writeElement(XMLStreamNormalizedNodeStreamWriter.java:179)
at org.opendaylight.yangtools.yang.data.codec.xml.SchemaAwareXMLStreamNormalizedNodeStreamWriter.leafNode(SchemaAwareXMLStreamNormalizedNodeStreamWriter.java:90)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessAsSimpleNode(NormalizedNodeWriter.java:145)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:101)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.writeChildren(NormalizedNodeWriter.java:169)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:223)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:97)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.writeChildren(NormalizedNodeWriter.java:169)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter$OrderedNormalizedNodeWriter.writeMapEntryNode(NormalizedNodeWriter.java:283)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:208)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:97)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.writeChildren(NormalizedNodeWriter.java:169)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:238)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:97)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.writeChildren(NormalizedNodeWriter.java:169)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter$OrderedNormalizedNodeWriter.writeMapEntryNode(NormalizedNodeWriter.java:283)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:208)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:97)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.writeChildren(NormalizedNodeWriter.java:169)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:238)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:97)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.writeChildren(NormalizedNodeWriter.java:169)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.wasProcessedAsCompositeNode(NormalizedNodeWriter.java:195)
at org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter.write(NormalizedNodeWriter.java:97)
at org.opendaylight.netconf.sal.rest.impl.RestconfDelegatingNormalizedNodeWriter.write(RestconfDelegatingNormalizedNodeWriter.java:37)
at org.opendaylight.netconf.sal.rest.impl.RestconfDelegatingNormalizedNodeWriter.write(RestconfDelegatingNormalizedNodeWriter.java:19)
at org.opendaylight.netconf.sal.rest.impl.NormalizedNodeXmlBodyWriter.writeNormalizedNode(NormalizedNodeXmlBodyWriter.java:127)
at org.opendaylight.netconf.sal.rest.impl.NormalizedNodeXmlBodyWriter.writeTo(NormalizedNodeXmlBodyWriter.java:104)
at org.opendaylight.netconf.sal.rest.impl.NormalizedNodeXmlBodyWriter.writeTo(NormalizedNodeXmlBodyWriter.java:52)
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306)
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1479)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)

Looks like RandomPrefix incorrectly processes the result of NamespaceContext.getNamespaceURI().

Comment by Luis Gomez [ 12/Jul/17 ]

In case it helps, here is the json output for the request that fais in XML:

{
"network-topology": {
"topology": [
{
"topology-id": "flow:1",
"node": [
{
"node-id": "openflow:1",
"opendaylight-topology-inventory:inventory-node-ref": "/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']",
"termination-point": [

{ "tp-id": "openflow:1:LOCAL", "opendaylight-topology-inventory:inventory-node-connector-ref": "/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:LOCAL']" }

,

{ "tp-id": "openflow:1:1", "opendaylight-topology-inventory:inventory-node-connector-ref": "/opendaylight-inventory:nodes/opendaylight-inventory:node[opendaylight-inventory:id='openflow:1']/opendaylight-inventory:node-connector[opendaylight-inventory:id='openflow:1:1']" }

]
}
]
}
]
}
}

Comment by Robert Varga [ 12/Jul/17 ]

This also may have to do with RESTCONF's use of namespace repairing. It should not be needing that, I think.

Maybe we should be checking the XMLWriter instance configuration?

Comment by Peter Kajsa [ 19/Jul/17 ]

after performed investigation I have suspicios that maybe this loop (https://github.com/opendaylight/yangtools/blob/master/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/codec/xml/RandomPrefix.java#L54) runs infinitely, but I am not sure yet...

Comment by Robert Varga [ 25/Jul/17 ]

master: https://git.opendaylight.org/gerrit/60736

This looks like a bug in JDK, as the return value does not seem to conform to javadoc (which states that for unbound prefixes an empty string should be returned).

Comment by Robert Varga [ 25/Jul/17 ]

In fact javax.xml.bind.DatatypeConverterImpl in jdk-1.8.0.131 on line 403 says:

uri = nsc.getNamespaceURI(prefix);
// uri can never be null according to javadoc,
// but some users reported that there are implementations that return null.
if (uri == null || uri.length() == 0) // crap. the NamespaceContext interface is broken.
// error: unbound prefix

{ throw new IllegalArgumentException("prefix " + prefix + " is not bound to a namespace"); }
Generated at Wed Feb 07 20:54:20 UTC 2024 using Jira 8.20.10#820010-sha1:ace47f9899e9ee25d7157d59aa17ab06aee30d3d.