Products
Berkeley DB
Changes since Release 2.0.83 are described here. A full list of all changes since JE 1.7.1 is also available below.
It recommended that all users move to this release. Also see the documentation and Release Notes included in your download package or on our website.
com.sleepycat.je.DatabaseException: fetchTarget of 0x300/0x0 IN=12630615 state=0
java.lang.ClassCastException: com.sleepycat.je.log.FileHeader
at com.sleepycat.je.tree.IN.fetchTarget(IN.java:936)
at com.sleepycat.je.dbi.CursorImpl.lockLN(CursorImpl.java:2195)
at com.sleepycat.je.dbi.CursorImpl.fetchCurrent(CursorImpl.java:2119)
at com.sleepycat.je.dbi.CursorImpl.getCurrentAlreadyLatched(CursorImpl.java:1204)
at com.sleepycat.je.dbi.CursorImpl.getNextWithKeyChangeStatus(CursorImpl.java:1350)
at com.sleepycat.je.dbi.CursorImpl.getNext(CursorImpl.java:1279)
at com.sleepycat.je.dbi.CursorImpl.getNextNoDup(CursorImpl.java:1467)
at com.sleepycat.je.Cursor.searchInternal(Cursor.java:1216)
at com.sleepycat.je.Cursor.searchAllowPhantoms(Cursor.java:1046)
at com.sleepycat.je.Cursor.search(Cursor.java:929)
at com.sleepycat.je.Cursor.getSearchKeyRange(Cursor.java:535)
or
java.lang.ArrayIndexOutOfBoundsException: 128
at com.sleepycat.je.tree.IN.fetchTarget(IN.java:897)
at com.sleepycat.je.dbi.CursorImpl.lockLN(CursorImpl.java:2195)
at com.sleepycat.je.dbi.CursorImpl.fetchCurrent(CursorImpl.java:2119)
at com.sleepycat.je.dbi.CursorImpl.getCurrentAlreadyLatched(CursorImpl.java:1204)
at com.sleepycat.je.dbi.CursorImpl.getNextWithKeyChangeStatus(CursorImpl.java:1350)
at com.sleepycat.je.dbi.CursorImpl.getNext(CursorImpl.java:1279)
at com.sleepycat.je.dbi.CursorImpl.getNextNoDup(CursorImpl.java:1467)
at com.sleepycat.je.Cursor.searchInternal(Cursor.java:1216)
at com.sleepycat.je.Cursor.searchAllowPhantoms(Cursor.java:1046)
at com.sleepycat.je.Cursor.search(Cursor.java:929)
at com.sleepycat.je.Cursor.getSearchKeyRange(Cursor.java:535)
or
com.sleepycat.je.DatabaseException: fetchTarget of null lsn IN=749358 state=0 NULL_LSN without KnownDeleted
Stacktrace: com.sleepycat.je.DatabaseException: fetchTarget of null lsn IN=749358 state=0 NULL_LSN without KnownDeleted at com.sleepycat.je.tree.IN.fetchTarget(IN.java:902)
at com.sleepycat.je.dbi.CursorImpl.lockLN(CursorImpl.java:2195)
at com.sleepycat.je.dbi.CursorImpl.fetchCurrent(CursorImpl.java:2119)
at com.sleepycat.je.dbi.CursorImpl.getCurrentAlreadyLatched(CursorImpl.java:1204)
at com.sleepycat.je.dbi.CursorImpl.getNextWithKeyChangeStatus(CursorImpl.java:1350)
at com.sleepycat.je.dbi.CursorImpl.getNext(CursorImpl.java:1279)
at com.sleepycat.je.dbi.CursorImpl.getNextNoDup(CursorImpl.java:1467)
at com.sleepycat.je.Cursor.searchInternal(Cursor.java:1216)
at com.sleepycat.je.Cursor.searchAllowPhantoms(Cursor.java:1046)
at com.sleepycat.je.Cursor.search(Cursor.java:929)
at com.sleepycat.je.Cursor.getSearchKeyRange(Cursor.java:535)
[#13363](2.0.90)
If you have such an application you may want to try adding the following two configuration parameters to your je.properties file:
je.evictor.lruOnly=false je.evictor.nodesPerScan=100
je.evictor.lruOnly is a new setting added in 2.0.83. It changes the eviction algorithm, which is the way in which JE decides to remove records from the cache.
The default eviction algorithm is LRU (least recently used) and the default setting for the lruOnly parameter is true. With the default algorithm, only the LRU of a Btree node is taken into account when choosing the next Btree node to be evicted.
When lruOnly is set to false, the eviction algorithm is instead primarily based on the level of the node in the Btree. The lowest level nodes (the leaf nodes) are always evicted first, even if higher level nodes are less recently used. In addition, dirty nodes are evicted after non-dirty nodes.
Setting lruOnly to false benefits random access applications because it keeps higher level Btree nodes in the tree for as long as possible. For a random key, this increases the likelihood that the relevant Btree internal nodes will be in the cache.
We recommend that you also change je.evictor.nodesPerScan when you set lruOnly to false. This setting controls the number of Btree nodes that are considered, or sampled, each time a node is evicted. A setting of 100 often produces good results, but this may vary from application to application. The larger the nodesPerScan, the more accurate the algorithm. However, setting it too high is detrimental; the need to consider larger numbers of nodes for each eviction may delay the completion of a given database operation, which will impacts the response time of the application thread. (2.0.83)
All changes from JE 2.0.42, 2.0.54, 2.0.83 and 2.0.90 are listed here.
JE_HOME/examples/jca/HOWTO-jboss.txt
and
JE_HOME/examples/jca/HOWTO-sjsas.txt.
(2.0.42)
JE_HOME/examples/jmx/README.txt
(2.0.42)
com.sleepycat.je.recovery.RecoveryManager.traceAndThrowException(RecoveryManager.java:2125) com.sleepycat.je.recovery.RecoveryManager.redoLNs(RecoveryManager.java:1002) com.sleepycat.je.recovery.RecoveryManager.buildTree(RecoveryManager.java:539) com.sleepycat.je.recovery.RecoveryManager.recover(RecoveryManager.java:155)
By default, JE 2.0.83 will ignore cleaner information that is potentially invalid because of this bug. This will reduce cleaner performance to some degree, for an initial time period after upgrading to the new release. It is possible to avoid the performance penalty by setting je.cleaner.rmwFix to false if you are SURE that the RMW bug does not apply to your application. To determine this, use the following rules. The rules should be applied to all use of your application using JE release 2.0.42 and 2.0.54.
java.lang.NullPointerException
at com.sleepycat.je.cleaner.UtilizationProfile.getObsoleteDetail(UtilizationProfile.java:579)
at com.sleepycat.je.cleaner.Cleaner.processFile(Cleaner.java:508)
at com.sleepycat.je.cleaner.Cleaner.doClean(Cleaner.java:345)
at com.sleepycat.je.cleaner.Cleaner.onWakeup(Cleaner.java:248)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:183)
at java.lang.Thread.run(Unknown Source)
The error was benign, and the log cleaner would retry and recover. [#12931](2.0.83)
java.lang.ClassCastException: com.sleepycat.je.tree.DIN
at com.sleepycat.je.cleaner.Cleaner.handleNoMigrationLogging(Cleaner.java:858)
at com.sleepycat.je.tree.BIN.logInternal (BIN.java:914)
...
The error was not persistent, and closing and re-opening the environment would be successful. [#12978](2.0.83)
com.sleepycat.je.DatabaseException: attempt to fetch a deleted entry:...
at com.sleepycat.je.tree.IN.fetchTarget(IN.java:898)
at com.sleepycat.je.tree.DBIN.matchLNByNodeId(DBIN.java:217)
at com.sleepycat.je.tree.DIN.matchLNByNodeId(DIN.java:273)
at com.sleepycat.je.tree.Tree.searchDupTreeByNodeId (Tree.java:960)
at com.sleepycat.je.tree.Tree.getParentBINForChildLN (Tree.java:916)
at com.sleepycat.je.recovery.RecoveryManager.redo (RecoveryManager.java:1575)
at com.sleepycat.je.recovery.RecoveryManager.redoLNs (RecoveryManager.java:969)
[#13034](2.0.83)
Caused by: java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Buffer.java:398)
at java.nio.HeapByteBuffer.get(HeapByteBuffer.java:117)
at com.sleepycat.je.log.LogUtils.readIntMSB(LogUtils.java:139)
at com.sleepycat.je.tree.FileSummaryLN.getFileNumber(FileSummaryLN.java:149)
at com.sleepycat.je.log.INFileReader.processEntry(INFileReader.java:347)
at com.sleepycat.je.log.FileReader.readLogEntry(FileReader.java:478)
at com.sleepycat.je.log.FileReader.readNextEntry(FileReader.java:252)
at com.sleepycat.je.recovery.RecoveryManager.readINsAndTrackIds(RecoveryManager.java:573)
[#13061](2.0.83)
IN=... state=0 com.sleepycat.je.DatabaseException:
java.nio.BufferUnderflowException
at com.sleepycat.je.tree.IN.fetchTargetInternal(IN.java:943)
at com.sleepycat.je.tree.IN.fetchTarget(IN.java:901)
[#13126](2.0.83)
java.lang.NullPointerException
at com.sleepycat.je.dbi.CursorImpl.checkEnv(CursorImpl.java:2263)
at com.sleepycat.je.Cursor.checkEnv(Cursor.java:1744)
at com.sleepycat.je.Cursor.checkState(Cursor.java:1734)
at com.sleepycat.je.Cursor.close(Cursor.java:233)
at com.sleepycat.je.Database.get(Database.java:425)
The error was not persistent and would disappear if the environment was closed and reopened. [#13191](2.0.83)
com.sleepycat.je.DatabaseException: fetchTarget of 0x300/0x0 IN=12630615 state=0
java.lang.ClassCastException: com.sleepycat.je.log.FileHeader
at com.sleepycat.je.tree.IN.fetchTarget(IN.java:936)
at com.sleepycat.je.dbi.CursorImpl.lockLN(CursorImpl.java:2195)
at com.sleepycat.je.dbi.CursorImpl.fetchCurrent(CursorImpl.java:2119)
at com.sleepycat.je.dbi.CursorImpl.getCurrentAlreadyLatched(CursorImpl.java:1204)
at com.sleepycat.je.dbi.CursorImpl.getNextWithKeyChangeStatus(CursorImpl.java:1350)
at com.sleepycat.je.dbi.CursorImpl.getNext(CursorImpl.java:1279)
at com.sleepycat.je.dbi.CursorImpl.getNextNoDup(CursorImpl.java:1467)
at com.sleepycat.je.Cursor.searchInternal(Cursor.java:1216)
at com.sleepycat.je.Cursor.searchAllowPhantoms(Cursor.java:1046)
at com.sleepycat.je.Cursor.search(Cursor.java:929)
at com.sleepycat.je.Cursor.getSearchKeyRange(Cursor.java:535)
or
java.lang.ArrayIndexOutOfBoundsException: 128
at com.sleepycat.je.tree.IN.fetchTarget(IN.java:897)
at com.sleepycat.je.dbi.CursorImpl.lockLN(CursorImpl.java:2195)
at com.sleepycat.je.dbi.CursorImpl.fetchCurrent(CursorImpl.java:2119)
at com.sleepycat.je.dbi.CursorImpl.getCurrentAlreadyLatched(CursorImpl.java:1204)
at com.sleepycat.je.dbi.CursorImpl.getNextWithKeyChangeStatus(CursorImpl.java:1350)
at com.sleepycat.je.dbi.CursorImpl.getNext(CursorImpl.java:1279)
at com.sleepycat.je.dbi.CursorImpl.getNextNoDup(CursorImpl.java:1467)
at com.sleepycat.je.Cursor.searchInternal(Cursor.java:1216)
at com.sleepycat.je.Cursor.searchAllowPhantoms(Cursor.java:1046)
at com.sleepycat.je.Cursor.search(Cursor.java:929)
at com.sleepycat.je.Cursor.getSearchKeyRange(Cursor.java:535)
or
com.sleepycat.je.DatabaseException: fetchTarget of null lsn IN=749358 state=0 NULL_LSN without KnownDeleted
Stacktrace: com.sleepycat.je.DatabaseException: fetchTarget of null lsn IN=749358 state=0 NULL_LSN without KnownDeleted at com.sleepycat.je.tree.IN.fetchTarget(IN.java:902)
at com.sleepycat.je.dbi.CursorImpl.lockLN(CursorImpl.java:2195)
at com.sleepycat.je.dbi.CursorImpl.fetchCurrent(CursorImpl.java:2119)
at com.sleepycat.je.dbi.CursorImpl.getCurrentAlreadyLatched(CursorImpl.java:1204)
at com.sleepycat.je.dbi.CursorImpl.getNextWithKeyChangeStatus(CursorImpl.java:1350)
at com.sleepycat.je.dbi.CursorImpl.getNext(CursorImpl.java:1279)
at com.sleepycat.je.dbi.CursorImpl.getNextNoDup(CursorImpl.java:1467)
at com.sleepycat.je.Cursor.searchInternal(Cursor.java:1216)
at com.sleepycat.je.Cursor.searchAllowPhantoms(Cursor.java:1046)
at com.sleepycat.je.Cursor.search(Cursor.java:929)
at com.sleepycat.je.Cursor.getSearchKeyRange(Cursor.java:535)
[#13363](2.0.90)
The choice between compact vs. non-compact checkpoints is now available to the application-issued checkpoints through CheckpointConfig.setMinimizeRecoveryTime(). [#12950](2.0.83)
If you have such an application you may want to try adding the following two configuration parameters to your je.properties file:
je.evictor.lruOnly=false je.evictor.nodesPerScan=100
je.evictor.lruOnly is a new setting added in 2.0.83. It changes the eviction algorithm, which is the way in which JE decides to remove records from the cache.
The default eviction algorithm is LRU (least recently used) and the default setting for the lruOnly parameter is true. With the default algorithm, only the LRU of a Btree node is taken into account when choosing the next Btree node to be evicted.
When lruOnly is set to false, the eviction algorithm is instead primarily based on the level of the node in the Btree. The lowest level nodes (the leaf nodes) are always evicted first, even if higher level nodes are less recently used. In addition, dirty nodes are evicted after non-dirty nodes.
Setting lruOnly to false benefits random access applications because it keeps higher level Btree nodes in the tree for as long as possible. For a random key, this increases the likelihood that the relevant Btree internal nodes will be in the cache.
We recommend that you also change je.evictor.nodesPerScan when you set lruOnly to false. This setting controls the number of Btree nodes that are considered, or sampled, each time a node is evicted. A setting of 100 often produces good results, but this may vary from application to application. The larger the nodesPerScan, the more accurate the algorithm. However, setting it too high is detrimental; the need to consider larger numbers of nodes for each eviction may delay the completion of a given database operation, which will impacts the response time of the application thread. (2.0.83)