Stephen Allen created JENA-321:
----------------------------------
Summary: Update notification events are fired on a per Graph basis
instead of GraphStore
Key: JENA-321
URL: https://issues.apache.org/jira/browse/JENA-321
Project: Apache Jena
Issue Type: Improvement
Components: ARQ
Reporter: Stephen Allen
Priority: Minor
Before every update operation starts, UpdateEngineMain attempts to fire
notification events to listeners
that an update is about to occur. Unfortunately, it tries to fire an event for
each named graph in the system. Because TDB represents named graphs as quads,
the only way to get a list of all the named
graphs to fire an event for is to perform an entire table scan, project just
the graph part of the quad and then perform a distinct operation.
There are a few problems with this approach:
# This is pretty dang inefficient, as the entire database is scanned on every
update query
# With a large number of named graphs, you have to fire a lot of events, which
is also inefficient
# If you have a lot of named graphs, the distinct operation has to store every
graph name in an in-memory hashset
A user appears to have run into issue 3). The underlying cause seems to be a
mismatch in the design of the graph notification. This needs to be redesigned
to fire a single event for the entire graphstore.
Relevant code in DatasetGraphTDB.java (line 262).
14:08:23 WARN Fuseki :: [1] RC = 500 : Java heap space
java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(HashMap.java:462)
at java.util.HashMap.addEntry(HashMap.java:755)
at java.util.HashMap.put(HashMap.java:385)
at java.util.HashSet.add(HashSet.java:200)
at org.openjena.atlas.iterator.FilterUnique.accept(FilterUnique.java:35)
at org.openjena.atlas.iterator.Iter$3.hasNext(Iter.java:187)
at org.openjena.atlas.iterator.Iter.hasNext(Iter.java:825)
at org.openjena.atlas.iterator.Iter$4.hasNext(Iter.java:295)
at
com.hp.hpl.jena.sparql.modify.GraphStoreUtils.actionAll(GraphStoreUtils.java:43)
at
com.hp.hpl.jena.sparql.modify.GraphStoreUtils.sendToAll(GraphStoreUtils.java:33)
at
com.hp.hpl.jena.sparql.modify.GraphStoreBasic.startRequest(GraphStoreBasic.java:53)
at
com.hp.hpl.jena.sparql.modify.UpdateEngineMain.execute(UpdateEngineMain.java:37)
at
com.hp.hpl.jena.sparql.modify.UpdateProcessorBase.execute(UpdateProcessorBase.java:56)
at com.hp.hpl.jena.update.UpdateAction.execute$(UpdateAction.java:330)
at com.hp.hpl.jena.update.UpdateAction.execute(UpdateAction.java:323)
at com.hp.hpl.jena.update.UpdateAction.execute(UpdateAction.java:303)
at com.hp.hpl.jena.update.UpdateAction.execute(UpdateAction.java:255)
at
org.apache.jena.fuseki.servlets.SPARQL_Update.execute(SPARQL_Update.java:235)
at
org.apache.jena.fuseki.servlets.SPARQL_Update.executeForm(SPARQL_Update.java:226)
at
org.apache.jena.fuseki.servlets.SPARQL_Update.perform(SPARQL_Update.java:122)
at
org.apache.jena.fuseki.servlets.SPARQL_ServletBase.doCommon(SPARQL_ServletBase.java:97)
at
org.apache.jena.fuseki.servlets.SPARQL_Update.doPost(SPARQL_Update.java:78)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:547)
at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:480)
at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225)
at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:941)
at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:409)
at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:875)
at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
14:08:23 INFO Fuseki :: [1] 500 Java heap space
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira