The problem was that entries were removed that are still needed, due to a bug elsewhere (LobStorageMap I think). That caused getMaxBlockKey to be called with r == null.
I understand existing databases, where the entries are already missing, will still result in an exception, if with this bug fixed. So a new database (or a backup of an old database) is needed. Regards, Thomas On Thu, Oct 1, 2015 at 9:36 AM, Václav Haisman <[email protected]> wrote: > Dne čtvrtek 1. října 2015 8:32:37 UTC+2 Thomas Mueller napsal(a): > > Hi, >> >> I believe this is now fixed in the trunk, see >> https://github.com/h2database/h2database/commit/b8a04500a5aec9a951011cddd43b660fb1ca7746 >> > I do not think this fixes the issue. The recursive getMaxBlockKey(r) > still gets called with r == null, AFAICS. > > >> Regards, >> Thomas >> >> >> On Wed, Sep 30, 2015 at 1:34 PM, Václav Haisman <[email protected]> >> wrote: >> >>> Hi. >>> >>> We are experiencing occasional errors with this stack trace: >>> >>> Caused by: org.h2.jdbc.JdbcSQLException: General error: >>> "java.lang.NullPointerException" [50000-189] >>> at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) >>> at org.h2.message.DbException.get(DbException.java:168) >>> at org.h2.message.DbException.convert(DbException.java:295) >>> at org.h2.engine.Database.openDatabase(Database.java:300) >>> at org.h2.engine.Database.<init>(Database.java:263) >>> at org.h2.engine.Engine.openSession(Engine.java:65) >>> at org.h2.engine.Engine.openSession(Engine.java:175) >>> at org.h2.engine.Engine.createSessionAndValidate(Engine.java:153) >>> at org.h2.engine.Engine.createSession(Engine.java:136) >>> at org.h2.engine.Engine.createSession(Engine.java:28) >>> at >>> org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:349) >>> at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:107) >>> at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:91) >>> at org.h2.Driver.connect(Driver.java:72) >>> at >>> org.apache.commons.dbcp.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:38) >>> at >>> org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) >>> at >>> org.apache.commons.dbcp.BasicDataSource.validateConnectionFactory(BasicDataSource.java:1556) >>> at >>> org.apache.commons.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1545) >>> ... 68 more >>> Caused by: java.lang.NullPointerException >>> >>> at java.nio.ByteBuffer.wrap(Unknown Source) >>> at org.h2.mvstore.StreamStore.getMaxBlockKey(StreamStore.java:249) >>> at org.h2.mvstore.StreamStore.getMaxBlockKey(StreamStore.java:269) >>> at org.h2.store.LobStorageMap.init(LobStorageMap.java:114) >>> at org.h2.engine.Database.open(Database.java:767) >>> at org.h2.engine.Database.openDatabase(Database.java:269) >>> ... 82 more >>> >>> I have attached a debugger and looked around in getMaxBlockKey(): >>> >>> public long getMaxBlockKey(byte[] id) { >>> long maxKey = -1; >>> ByteBuffer idBuffer = ByteBuffer.wrap(id); >>> while (idBuffer.hasRemaining()) { >>> switch (idBuffer.get()) { >>> case 0: >>> // in-place: 0, len (int), data >>> int len = DataUtils.readVarInt(idBuffer); >>> idBuffer.position(idBuffer.position() + len); >>> break; >>> case 1: >>> // block: 1, len (int), blockId (long) >>> DataUtils.readVarInt(idBuffer); >>> long k = DataUtils.readVarLong(idBuffer); >>> maxKey = Math.max(maxKey, k); >>> break; >>> case 2: >>> // indirect: 2, total len (long), blockId (long) >>> DataUtils.readVarLong(idBuffer); >>> long k2 = DataUtils.readVarLong(idBuffer); >>> // recurse >>> byte[] r = map.get(k2); >>> maxKey = Math.max(maxKey, getMaxBlockKey(r)); >>> break; >>> default: >>> throw DataUtils.newIllegalArgumentException( >>> "Unsupported id {0}", Arrays.toString(id)); >>> } >>> } >>> return maxKey; >>> } >>> >>> It appears that the id argument is null in the recursive call from the >>> case 2 branch. >>> >>> Is this a known issue? Should I report elsewhere than this group? >>> >>> -- >>> VH >>> >>> -- >>> You received this message because you are subscribed to the Google >>> Groups "H2 Database" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to [email protected]. >>> To post to this group, send email to [email protected]. >>> Visit this group at http://groups.google.com/group/h2-database. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> > > -- > You received this message because you are subscribed to the Google Groups > "H2 Database" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/h2-database. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "H2 Database" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/h2-database. For more options, visit https://groups.google.com/d/optout.
