Thanks Christian,
I haven't been able to reproduce the bug with your SSCE.
Nevertheless I spent some time in tracing the operations with the actual data I'm currently storing into the DB and a sequence of db:add/db:replace close enough to actual app flow.
I attach the query script which should be rather self explaining.
You may run the script changing always $f with $f + 1 starting (from 0).
By uncommenting the different configurations of the variable $input you can see how the misbehaviour depends somehow on the data because only $d8 is causing the crash. I stared at the diffs from $d8 to the other but there really isn't any significant difference so now it's very hard for me to understand.

Thank you in advance for all support that you can provide as usual.
Regards,
Marco.

On 26/07/19 18:41, Christian Grün wrote:
Hi Marco,

Back in February, a user reported a database inconsistency [1] – which
happened, too, if a database was nearly empty – and we managed to
build a little text case to get this reproduced [2]. After that, 9.2
was released. Maybe this fix introduced another irregularity for this
special case?

Maybe we can get this reproduced by taking the script from issue 1662
and modify it a little? That would be great.

Sorry to the inconvenience,
Christian

PS: You can safely ignore the "Creating database..." output. It may
just indicate that an XML document is parsed, and that an internal
main-memory database instance is created, possibly for your users.xml
file in the data directory.

[1] 
https://www.mail-archive.com/basex-talk@mailman.uni-konstanz.de/msg11459.html
[2] https://github.com/BaseXdb/basex/issues/1662



On Fri, Jul 26, 2019 at 4:29 PM Marco Lettere <m.lett...@gmail.com> wrote:
Hi all,

starting with 9.2.1 we experience a strange error with a RESTXQ API  of
ours that we have been using for years.

The typical pattern is lookup a document update it and store it back.

We have done this milions of time and also all the tests work neatly.

But when using it from inside the web application, at around the tenth
operation we get the DB corrupted with the stack trace [1]. This seems
to happen only when the database is nearly empty and, for sure, it
doesn't appear on 8.x series.

It feels like some concurrency flaw is introduced somewhere but it's
hard to say because the API is eight years in age and it never changed
significantly.

I know it's hard without an SSCE... but while working to insulate this
byzantine behaviour (I've been trying for days now) maybe someone in the
list has a clue or is able to interpret the stack trace?

Thanks and have a nice weekend,

Marco.


[1]

Improper use? Potential bug? Your feedback is welcome:
Contact: basex-talk@mailman.uni-konstanz.de
Version: BaseX 9.3 beta
Java: Ubuntu, 13
OS: Linux, amd64
Stack Trace:
java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1
      at org.basex.io.random.TableDiskAccess.fpre(TableDiskAccess.java:507)
      at org.basex.io.random.TableDiskAccess.cursor(TableDiskAccess.java:468)
      at org.basex.io.random.TableDiskAccess.read1(TableDiskAccess.java:156)
      at org.basex.data.Data.kind(Data.java:304)
      at org.basex.query.value.node.DBNode.<init>(DBNode.java:50)
      at org.basex.query.value.seq.DBNodeSeq.get(DBNodeSeq.java:139)
      at org.basex.query.value.seq.DBNodeSeq.get(DBNodeSeq.java:164)
      at org.basex.query.func.db.DbOpen.value(DbOpen.java:19)
      at org.basex.query.func.StandardFunc.optimize(StandardFunc.java:82)
      at org.basex.query.expr.Arr.inline(Arr.java:69)
      at org.basex.query.expr.path.Path.inline(Path.java:962)
      at org.basex.query.expr.gflwor.ForLet.inline(ForLet.java:66)
      at org.basex.query.expr.gflwor.GFLWOR.inline(GFLWOR.java:804)
      at org.basex.query.expr.gflwor.GFLWOR.inlineLets(GFLWOR.java:339)
      at org.basex.query.expr.gflwor.GFLWOR.optimize(GFLWOR.java:106)
      at org.basex.query.expr.gflwor.GFLWOR.inline(GFLWOR.java:785)
      at org.basex.query.expr.Try.inline(Try.java:106)
      at org.basex.query.expr.gflwor.GFLWOR.inline(GFLWOR.java:816)
      at org.basex.query.expr.gflwor.GFLWOR.inlineLets(GFLWOR.java:339)
      at org.basex.query.expr.gflwor.GFLWOR.optimize(GFLWOR.java:106)
      at org.basex.query.func.StaticFunc.inline(StaticFunc.java:294)
      at org.basex.query.func.StaticFuncCall.compile(StaticFuncCall.java:67)
      at org.basex.query.scope.MainModule.comp(MainModule.java:81)
      at org.basex.query.QueryCompiler.compile(QueryCompiler.java:114)
      at org.basex.query.QueryCompiler.compile(QueryCompiler.java:105)
      at org.basex.query.QueryContext.compile(QueryContext.java:312)
      at org.basex.query.QueryContext.iter(QueryContext.java:331)
      at
org.basex.http.restxq.RestXqResponse.serialize(RestXqResponse.java:73)
      at org.basex.http.web.WebResponse.create(WebResponse.java:63)
      at org.basex.http.restxq.RestXqServlet.run(RestXqServlet.java:53)
      at org.basex.http.BaseXServlet.service(BaseXServlet.java:65)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
      at
org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:865)
      at
org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:542)
      at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:146)
      at
org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
      at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
      at
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:257)
      at
org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1700)
      at
org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:255)
      at
org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1345)
      at
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:203)
      at
org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:480)
      at
org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1667)
      at
org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:201)
      at
org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1247)
      at
org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:144)
      at
org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
      at org.eclipse.jetty.server.Server.handle(Server.java:505)
      at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:370)
      at
org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:267)
      at
org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:305)
      at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103)
      at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117)
      at
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:333)
      at
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:310)
      at
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:168)
      at
org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:126)
      at
org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:366)
      at
org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:698)
      at
org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:804)
      at java.base/java.lang.Thread.run(Thread.java:835)


<<attachment: bug.xq.zip>>

Reply via email to