On 03/07/2020 17:02, Chris Tomlinson wrote:
Hi Andy,

On Jul 3, 2020, at 8:41 AM, Andy Seaborne <[email protected]> wrote:



On 02/07/2020 21:55, Chris Tomlinson wrote:
grep -v "ThriftConvert WARN visit: Unrecognized: <RDF_StreamRow >" catalina.out


Is there any signature as to when they occur?  Two PUTs overlapping, certain 
usage by your clients (which probably isn't visible in the logs)?  earlier 
connections broken? high load on the server? Time of day? Anything else that 
looks like a characteristic?

Our issue <https://github.com/buda-base/buda-base/issues/30> has a bit of a 
discussion on the first occurrence on 30 April which might shed some light. The one 
thing in common in the two occurrences is that in both cases  the graph that was  
being PUT was the ontologySchema but there were changes to that graph between 30 
April and 30 Jun so it was not the same graph as far as content. Also there were not 
overlapping puts in the first case.

This is ignorable:

30-Apr-2020 12:46:56.941 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Unable to determine string representation of value of type [org.apache.jena.tdb.transaction.DatasetGraphTxn]
 java.lang.UnsupportedOperationException: Transactional.begin(TxnType
at org.apache.jena.sparql.core.TransactionalNotSupported.begin(TransactionalNotSupported.java:66) at org.apache.jena.tdb.store.DatasetGraphTDB.begin(DatasetGraphTDB.java:265)

because the later log shows its part of the Tomcat shutdown report.

BTW Fuseki does not participate deeply in a clean web shutdown so TDB does not release its ThreadLocals on shutdown and they are involved in transactions.

Other than that, I'm lost.

Strange things happen, possible one, possibly two cases, with no obvious cause.

Using RDFConnectionRemote will change the situation (no thrift used), but the Thrift error seems to be a symptom, not a reason.

PersonUIShapes.ttl has been sent many times without problems.

    Andy


No unusual load - in fact lightly loaded is the typical situation except during 
the daily migration of legacy data which sometimes may have a lot of changed 
graphs to PUT. We haven’t seen the WARNings happen at that time.

Since we’ve only had 2 occurrences of the issue it’s a bit hard to establish a 
pattern.

Thanks,
Chris


    Andy


On 03/07/2020 00:13, Chris Tomlinson wrote:
On Jul 2, 2020, at 17:44, Andy Seaborne <[email protected]> wrote:



On 02/07/2020 21:55, Chris Tomlinson wrote:
 From what I can see, it (WARN) isn't database related.
No it seems to me to be related to getting the payload off the wire.

I think you said the same payload had been sent before.
??
Yes a copy/clone of the same payload, i.e., the serialization of the given 
graph, has been sent many times w/o issue.

...

Even the concurrency looks OK because it locally writes a buffer so the HTTP 
length is available.

(in case of corruption, not repeat, is happening)

So it seems to me that there may be an opportunity for some sort of 
robustification in RDFConnection. There is evidently a loop somewhere that 
doesn't terminate, retrying the parsing repeatedly or something like that. The 
payload is finite so there wold appear to be a test that repeatedly fails but 
doesn't make progress in consuming the payload.

RDFConnection (client-side) is sending, not parsing.
I'm referring to the Fuseki receiving end of the connection, where the WARNing 
is being logged.
The WARN says that an empty <RDF_StreamRow > was seen.

There is no information about the stalled transactions although not finishing 
the write would explain this:

30-Jun-2020 16:21:30.778

java.io.BufferedInputStream.read(BufferedInputStream.java:345)
org.apache.thrift.transport.TIOStreamTransport.read(TIOStreamTransport.java:127)

so it's waiting for input. What's the proxy/reverse-proxy setup?
None. For the client on the same ec2 instance, obviously none; and for the 
client on a second ec2 instance, we have nothing between our two internal ec2's
In the current situation, the two precipitating PUTs are from a client on the 
same ec2 instance.
The code writes the payload to a ByteArrayOutputStream and sends those bytes. 
That's how it gets the length for the HTTP header.

https://github.com/apache/jena/blob/master/jena-rdfconnection/src/main/java/org/apache/jena/rdfconnection/RDFConnectionRemote.java#L615

(run Fuseki with "verbose" to see the headers ... but it is quite verbose)

It sent something so the RDF->Thrift->bytes had finished and then it sent bytes.
As I tried to clarify, my remarks were w.r.t. the Fuseki/receiving end where 
the issue is getting logged. Not the sending/client end.
Chris
Anyway - you have the source code ... :-)

    Andy


Reply via email to