Hi,
I seem to have a concurrency problem and I have a hard time fixing it. Our BaseX db is a very modest database, for testing we load a 138Kb file. We use JMeter to do performance testing on our Web Application deployment of BaseX 7.3. Randomly GET and PUT commands are sent to BaseX. When we use only one thread (simulated user) everything is fine, when we increase the number of threads we quickly end up with a corrupted database – two threads is generally slower to crash than three threads, with three threads it crashes fast.
Here are some stacktraces I get:
[INFO] Started Jetty Server
BaseX 7.3 [Server]
Server was started.
Improper use? Potential bug? Your feedback is welcome:
Contact: basex-talk@mailman.uni-konstanz.de
Version: BaseX 7.3
Java: Sun Microsystems Inc., 1.6.0_22
OS: Linux, amd64
Stack Trace:
java.lang.ArrayIndexOutOfBoundsException: 27
org.basex.util.list.ByteList.add(ByteList.java:39)
org.basex.util.Compress.push(Compress.java:72)
org.basex.util.Compress.pack(Compress.java:52)
org.basex.data.DiskData.index(DiskData.java:387)
org.basex.data.Data.attr(Data.java:1051)
org.basex.data.Data.insert(Data.java:835)
org.basex.query.up.primitives.InsertInto.apply(InsertInto.java:32)
org.basex.query.up.NodeUpdates.makePrimitivesEffective(NodeUpdates.java:216)
org.basex.query.up.DatabaseUpdates.apply(DatabaseUpdates.java:152)
org.basex.query.up.ContextModifier.apply(ContextModifier.java:66)
org.basex.query.up.Updates.apply(Updates.java:183)
org.basex.query.QueryContext.update(QueryContext.java:276)
org.basex.http.restxq.RestXqResponse.create(RestXqResponse.java:76)
org.basex.http.restxq.RestXqModule.process(RestXqModule.java:97)
org.basex.http.restxq.RestXqServlet.run(RestXqServlet.java:28)
org.basex.http.BaseXServlet.service(BaseXServlet.java:38)
javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565)
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479)
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225)
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031)
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965)
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
org.eclipse.jetty.server.Server.handle(Server.java:348)
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452)
org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:894)
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:948)
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:851)
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235)
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:620)
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
java.lang.Thread.run(Thread.java:679)
I am also getting:
[INFO] Started Jetty Server
BaseX 7.3 [Server]
Server was started.
Improper use? Potential bug? Your feedback is welcome:
Contact: basex-talk@mailman.uni-konstanz.de
Version: BaseX 7.3
Java: Sun Microsystems Inc., 1.6.0_22
OS: Linux, amd64
Stack Trace:
java.lang.ArrayIndexOutOfBoundsException: 22
org.basex.util.Compress.pull(Compress.java:132)
org.basex.util.Compress.unpack(Compress.java:109)
org.basex.data.DiskData.txt(DiskData.java:262)
org.basex.data.DiskData.text(DiskData.java:229)
org.basex.data.Data.atom(Data.java:208)
org.basex.query.value.node.DBNode.string(DBNode.java:115)
org.basex.query.value.node.ANode.string(ANode.java:50)
org.basex.query.value.item.Str.eq(Str.java:80)
org.basex.query.value.node.ANode.eq(ANode.java:61)
org.basex.query.expr.CmpV$OpV$5.eval(CmpV.java:84)
org.basex.query.expr.CmpG.eval(CmpG.java:258)
org.basex.query.expr.CmpG.item(CmpG.java:213)
org.basex.query.expr.CmpG.item(CmpG.java:25)
org.basex.query.expr.ParseExpr.ebv(ParseExpr.java:81)
org.basex.query.expr.ParseExpr.test(ParseExpr.java:94)
org.basex.query.expr.Preds.preds(Preds.java:129)
org.basex.query.path.IterStep$1.next(IterStep.java:48)
org.basex.query.path.IterStep$1.next(IterStep.java:32)
org.basex.query.path.IterPath$1.next(IterPath.java:67)
org.basex.query.path.IterPath$1.next(IterPath.java:39)
org.basex.query.iter.Iter.value(Iter.java:64)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.flwor.Let$1.next(Let.java:85)
org.basex.query.flwor.FLWR$1.next(FLWR.java:63)
org.basex.query.iter.Iter.value(Iter.java:64)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.expr.If.value(If.java:89)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.value.item.FuncItem.invValue(FuncItem.java:106)
org.basex.query.func.FNFunc.foldLeft(FNFunc.java:196)
org.basex.query.func.FNFunc.iter(FNFunc.java:39)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.BaseFuncCall.value(BaseFuncCall.java:56)
org.basex.query.func.BaseFuncCall.iter(BaseFuncCall.java:69)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.flwor.FLWR$1.next(FLWR.java:67)
org.basex.query.iter.Iter.value(Iter.java:64)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.expr.If.value(If.java:89)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.value.item.FuncItem.invValue(FuncItem.java:106)
org.basex.query.func.FNFunc.foldLeft(FNFunc.java:196)
org.basex.query.func.FNFunc.iter(FNFunc.java:39)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.BaseFuncCall.value(BaseFuncCall.java:56)
org.basex.query.func.BaseFuncCall.iter(BaseFuncCall.java:69)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.flwor.FLWR$1.next(FLWR.java:67)
org.basex.query.iter.Iter.value(Iter.java:64)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.expr.If.value(If.java:89)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.value.item.FuncItem.invValue(FuncItem.java:106)
org.basex.query.func.FNFunc.foldLeft(FNFunc.java:196)
org.basex.query.func.FNFunc.iter(FNFunc.java:39)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.BaseFuncCall.value(BaseFuncCall.java:56)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.flwor.Let$1.next(Let.java:85)
org.basex.query.flwor.FLWR$1.next(FLWR.java:63)
org.basex.query.iter.Iter.value(Iter.java:64)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.BaseFuncCall.value(BaseFuncCall.java:56)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.flwor.Let$1.next(Let.java:85)
org.basex.query.flwor.GFLWOR.iter(GFLWOR.java:329)
org.basex.query.flwor.GFLWOR.iter(GFLWOR.java:304)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.expr.Constr.add(Constr.java:65)
org.basex.query.expr.CElem.item(CElem.java:84)
org.basex.query.expr.CElem.item(CElem.java:21)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:69)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.TailFuncCall.value(TailFuncCall.java:47)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.expr.If.value(If.java:89)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.TailFuncCall.value(TailFuncCall.java:47)
org.basex.query.func.TailFuncCall.iter(TailFuncCall.java:55)
org.basex.query.QueryContext.iter(QueryContext.java:292)
org.basex.query.flwor.FLWR$1.next(FLWR.java:67)
org.basex.query.flwor.FLWR$1.next(FLWR.java:59)
org.basex.query.iter.Iter.value(Iter.java:64)
org.basex.query.expr.ParseExpr.value(ParseExpr.java:72)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.UserFunc.value(UserFunc.java:154)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.query.func.BaseFuncCall.value(BaseFuncCall.java:56)
org.basex.query.QueryContext.value(QueryContext.java:303)
org.basex.http.restxq.RestXqResponse.create(RestXqResponse.java:75)
org.basex.http.restxq.RestXqModule.process(RestXqModule.java:97)
org.basex.http.restxq.RestXqServlet.run(RestXqServlet.java:28)
org.basex.http.BaseXServlet.service(BaseXServlet.java:38)
javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565)
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479)
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225)
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031)
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965)
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
org.eclipse.jetty.server.Server.handle(Server.java:348)
org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452)
org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:884)
org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:938)
org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:620)
org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
java.lang.Thread.run(Thread.java:679)
and also this:
14:52:02,452 - WARN - qtp384018721-20 - oup.nl.mms.plib.server.rest.AbstractEntityResource # HTTP response is not OK: code 500, ETag: empty, content:
org.apache.http.conn.EofSensorInputStream@4acfed14
Improper use? Potential bug? Your feedback is welcome:
Contact: basex-talk@mailman.uni-konstanz.de
Version: BaseX 7.3
Java: Sun Microsystems Inc., 1.6.0_22
OS: Linux, amd64
Stack Trace:
java.lang.ArrayIndexOutOfBoundsException
2012-08-27 14:52:02.959:WARN:oejs.ServletHandler:/basex/restxq/plib/platforms/
java.lang.ArrayIndexOutOfBoundsException: 0
at org.basex.util.Util.message(Util.java:166)
at org.basex.util.TokenBuilder.addExt(TokenBuilder.java:327)
at org.basex.util.TokenBuilder.addExt(TokenBuilder.java:345)
at org.basex.util.Util.inf(Util.java:218)
at org.basex.util.Util.info(Util.java:207)
at org.basex.http.BaseXServlet.service(BaseXServlet.java:53)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:565)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:479)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:225)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1031)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:406)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:186)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:965)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:250)
at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:149)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:111)
at org.eclipse.jetty.server.Server.handle(Server.java:348)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:452)
at org.eclipse.jetty.server.AbstractHttpConnection.headerComplete(AbstractHttpConnection.java:884)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.headerComplete(AbstractHttpConnection.java:938)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:630)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:230)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:77)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:620)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:46)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:603)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:538)
at java.lang.Thread.run(Thread.java:679)
What I did to try to fix it:
1 ---
Set org.basex.mode to “server”. I set it in the “override.xml” file and later also set it in the .war file’s web.xml. It seems to be running in “server” mode now. The INFO command output looks like:
==============================
General Information
Version: 7.3
Used Memory: 27080 KB
Main Options
DBPATH: /home/dm218/NetBeansProjects/trunk/plib/plib-server/target/basex/data
DEBUG: true
EVENTPORT: 1985
HOST: localhost
HTTPPATH: /home/dm218/NetBeansProjects/trunk/plib/plib-server/target/basex/http
HTTPPORT: 8984
KEEPALIVE: 600
LANG: English
LANGKEYS: false
NONPROXYHOSTS:
PARALLEL: 8
PORT: 1984
PROXYHOST:
PROXYPORT: 80
REPOPATH: /home/dm218/NetBeansProjects/trunk/plib/plib-server/target/basex/repo
SERVERHOST:
SERVERPORT: 1984
STOPPORT: 8985
TIMEOUT: 30
Options
ADDARCHIVES: true
ADDRAW: false
ATTRINDEX: true
AUTOFLUSH: true
BINDINGS:
CACHEQUERY: false
CASESENS: false
CATFILE:
CHOP: true
COMPPLAN: true
CREATEFILTER: *.xml
DIACRITICS: false
DOTCOMPACT: false
DOTDISPLAY: true
DOTPLAN: false
DOTTY: dotty
DTD: false
EXPORTER:
FORCECREATE: false
FTINDEX: false
HTMLOPT: html=false,omit-xml-declaration=false,method=xml,nons=false,nobogons=false,nodefaults=false,nocolons=false,norestart=false,ignorable=false,emptybogons=false,any=false,norootbogons=false,nocdata=false,lexical=false,encoding=utf-8
INTPARSE: true
LANGUAGE: en
LSERROR: 0
MAINMEM: false
MAXCATS: 100
MAXHITS: -1
MAXLEN: 96
MAXSTAT: 30
PARSER: xml
PARSEROPT: encoding=UTF-8,flat=false,format=verbose,header=false,jsonml=false,lines=true,separator=comma
QUERYINFO: false
QUERYPATH:
RUNS: 1
SERIALIZE: true
SERIALIZER:
SKIPCORRUPT: false
STEMMING: false
STOPWORDS:
TAILCALLS: 42
TEXTINDEX: true
UPDINDEX: false
WRITEBACK: false
XMLPLAN: false
XQUERY3: true
==============================
2 ---
I also tried using 7.4-SNAPSHOT (downloaded this morning) but it shows the same behaviour. It reports (I’m copying this by hand from another PC):
==========================
Unexpected error: org.basex.util.Util: java.lang.RunTimeException: Data Access out of bounds:
- Pre value: 7290
- #used blocks: 31
- #total blocks: 31
- Access 30 (31 > 30)
==========================
Some more remarks:
- I would much appreciate a wiki-per-version, e.g. a 7.3 wiki, a 7.4 wiki, etc. The adaptations for a new version are slightly confusing – BaseX changes a lot (new options, renames, what option to put in what config file, etc.). Also for people using an older version this can be handy.
- the mailing list search service on the basex.org website (links from the “Open Source” page) crashes.
- (7.4) I am confused about the org.basex.restxqpath vs. org.basex.webpath settings, I put them both in and then it seemed to work. (Perhaps db:system() is also inconsistent wrt these settings.) RESTXQPATH is not mentioned in the OPTIONS list.
- (7.4) perhaps I missed it and the math:uuid() function was deprecated already, but I found that I needed to adapt my .xqm script for 7.4 because math:uuid() was renamed to random:uuid(). It seemed a little abrupt to me, but as I said, perhaps it missed the deprecation. I also used db:system() and had to adapt that too because org.basex.httppath no longer exists.
I suspect I missed some configuration option or something like that and will appreciate any help!
Thanks,
Huib Verweij.
------------------------------------------------------------------------------------------------------------ Disclaimer: If you are not the intended recipient of this email, please notify the sender and delete it. Any unauthorized copying, disclosure or distribution of this email or its attachment(s) is forbidden. Thales Nederland BV will not accept liability for any damage caused by this email or its attachment(s). Thales Nederland BV is seated in Hengelo and is registered at the Chamber of Commerce under number 06061578. ------------------------------------------------------------------------------------------------------------