Library Version 11.2.4.0, Release 4.0.117
(JE 4.0.92) var/db/bdb_userNode fetchTarget of 0x3151/0x44b2638 parent IN=729921304 IN class=com.sleepycat.je.tree.DBIN lastFullVersion=0x3189/0x13616b0 parent.getDirty()=false state=0 LOG_FILE_NOT_FOUND: Log file missing, log is likely invalid. Environment is invalid and must be closed. at com.sleepycat.je.tree.IN.fetchTarget(IN.java:1241) at com.sleepycat.je.tree.BIN.fetchTarget(BIN.java:1300) ...Thanks to "helg" on OTN for reporting this and working with us to diagnose the problem. [#17252]
PreloadStatus.EXCEEDED_TIME to be
incorrectly returned from the Database.preload() method. [#18577]
EnvironmentConfig.CLEANER_LAZY_MIGRATION to
provide finer control over log cleaner, checkpointing and eviction
behavior.  See the javadoc for details.  [#18650]
Exception in thread "main" com.sleepycat.je.EnvironmentFailureException:
(JE 4.0.92) last LSN=0x424/0xe4fc1 LOG_INTEGRITY: Log information is incorrect,
problem is likely persistent. Environment is invalid and must be closed.
    at com.sleepycat.je.recovery.RecoveryManager.traceAndThrowException(RecoveryManager.java:3052)
    at com.sleepycat.je.recovery.RecoveryManager.readINs(RecoveryManager.java:867)
    at com.sleepycat.je.recovery.RecoveryManager.buildINs(RecoveryManager.java:621)
    at com.sleepycat.je.recovery.RecoveryManager.buildTree(RecoveryManager.java:513)
    at com.sleepycat.je.recovery.RecoveryManager.recover(RecoveryManager.java:175)
    at com.sleepycat.je.dbi.EnvironmentImpl.finishInit(EnvironmentImpl.java:529)
    at com.sleepycat.je.dbi.DbEnvPool.getEnvironment(DbEnvPool.java:204)
    at com.sleepycat.je.Environment.makeEnvironmentImpl(Environment.java:230)
    at com.sleepycat.je.Environment.(Environment.java:212)
    at com.sleepycat.je.Environment.(Environment.java:166)
    ...
Caused by: com.sleepycat.je.EnvironmentFailureException: (JE 4.0.92)
fetchTarget of 0x89/0x4c2e29 parent IN=4883580 IN
class=com.sleepycat.je.tree.DIN lastFullVersion=0x424/0xdcec4
parent.getDirty()=false state=0 LOG_FILE_NOT_FOUND: Log file missing, log is
likely invalid. Environment is invalid and must be closed.
    at com.sleepycat.je.tree.IN.fetchTarget(IN.java:1241)
    at com.sleepycat.je.tree.DIN.fetchTarget(DIN.java:520)
    at com.sleepycat.je.tree.IN.findParent(IN.java:2704)
    at com.sleepycat.je.tree.Tree.getParentINForChildIN(Tree.java:879)
    at com.sleepycat.je.recovery.RecoveryManager.replayINDelete(RecoveryManager.java:1770)
    at com.sleepycat.je.recovery.RecoveryManager.replayOneIN(RecoveryManager.java:945)
    at com.sleepycat.je.recovery.RecoveryManager.readINs(RecoveryManager.java:846)
    ... 11 more
Caused by: java.io.FileNotFoundException: 00000089.jdb (The system cannot find
the file specified)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.(Unknown Source)
    at java.io.RandomAccessFile.(Unknown Source)
    at com.sleepycat.je.log.FileManager$1.(FileManager.java:993)
    at com.sleepycat.je.log.FileManager.openFileHandle(FileManager.java:992)
    at com.sleepycat.je.log.FileManager.getFileHandle(FileManager.java:888)
    at com.sleepycat.je.log.LogManager.getLogSource(LogManager.java:1073)
    at com.sleepycat.je.log.LogManager.getLogEntry(LogManager.java:779)
    at com.sleepycat.je.log.LogManager.getLogEntryAllowInvisibleAtRecovery(LogManager.java:743)
    at com.sleepycat.je.tree.IN.fetchTarget(IN.java:1225)
    ... 17 more
     
The bug only occurred under the following conditions:
No data loss occurs as a result of this bug. By using a version of JE with the bug fix, such environments can be opened and used normally. Thanks to OTN user justindthomas for reporting the problem and working with us to diagnose and fix it. [#18663]
IllegalStateException when a DPL
Converter mutation is used for class evolution, and Replicas are
upgraded first (as prescribed) in a replication group. [#18690]
Environment.removeDatabase or
Environment.truncateDatabase is called, and the program crashes or
exits before any other information is written to disk.  For example, if the
Environment is closed normally after the removal/truncation, or a scheduled
checkpoint occurs, then the bug will not occur. [#18696]
All public JE exception and statistics classes should be serializable. Some were not, and have been fixed. The following classes are now certified to be serializable. [#18738]
com.sleepycat.je.BtreeStatscom.sleepycat.je.CommitTokencom.sleepycat.je.DatabaseEntrycom.sleepycat.je.DatabaseExceptioncom.sleepycat.je.DatabaseExistsExceptioncom.sleepycat.je.DatabaseNotFoundExceptioncom.sleepycat.je.DatabaseStatscom.sleepycat.je.DeadlockExceptioncom.sleepycat.je.DeleteConstraintExceptioncom.sleepycat.je.DuplicateDataExceptioncom.sleepycat.je.EnvironmentFailureExceptioncom.sleepycat.je.EnvironmentLockedExceptioncom.sleepycat.je.EnvironmentNotFoundExceptioncom.sleepycat.je.EnvironmentStatscom.sleepycat.je.ForeignConstraintExceptioncom.sleepycat.je.LockConflictExceptioncom.sleepycat.je.LockNotAvailableExceptioncom.sleepycat.je.LockNotGrantedExceptioncom.sleepycat.je.LockStatscom.sleepycat.je.LockTimeoutExceptioncom.sleepycat.je.LogWriteExceptioncom.sleepycat.je.OperationFailureExceptioncom.sleepycat.je.PreloadStatscom.sleepycat.je.PreloadStatuscom.sleepycat.je.RunRecoveryExceptioncom.sleepycat.je.SecondaryConstraintExceptioncom.sleepycat.je.SecondaryIntegrityExceptioncom.sleepycat.je.SecondaryReferenceExceptioncom.sleepycat.je.SequenceExistsExceptioncom.sleepycat.je.SequenceIntegrityExceptioncom.sleepycat.je.SequenceNotFoundExceptioncom.sleepycat.je.SequenceOverflowExceptioncom.sleepycat.je.SequenceStatscom.sleepycat.je.ThreadInterruptedExceptioncom.sleepycat.je.TransactionStatscom.sleepycat.je.TransactionStats.Activecom.sleepycat.je.TransactionTimeoutExceptioncom.sleepycat.je.UniqueConstraintExceptioncom.sleepycat.je.VersionMismatchExceptioncom.sleepycat.je.XAFailureExceptioncom.sleepycat.je.jca.ra.JEExceptioncom.sleepycat.je.rep.DatabasePreemptedExceptioncom.sleepycat.je.rep.GroupShutdownExceptioncom.sleepycat.je.rep.InsufficientAcksExceptioncom.sleepycat.je.rep.InsufficientLogExceptioncom.sleepycat.je.rep.InsufficientReplicasExceptioncom.sleepycat.je.rep.LockPreemptedExceptioncom.sleepycat.je.rep.LogOverwriteExceptioncom.sleepycat.je.rep.MasterStateExceptioncom.sleepycat.je.rep.MemberNotFoundExceptioncom.sleepycat.je.rep.ReplicaConsistencyExceptioncom.sleepycat.je.rep.ReplicaWriteExceptioncom.sleepycat.je.rep.ReplicatedEnvironmentStatscom.sleepycat.je.rep.RestartRequiredExceptioncom.sleepycat.je.rep.RollbackExceptioncom.sleepycat.je.rep.RollbackProhibitedExceptioncom.sleepycat.je.rep.StateChangeExceptioncom.sleepycat.je.rep.UnknownMasterExceptioncom.sleepycat.je.util.LogVerificationExceptioncom.sleepycat.persist.IndexNotAvailableExceptioncom.sleepycat.persist.StoreExistsExceptioncom.sleepycat.persist.StoreNotFoundExceptioncom.sleepycat.persist.evolve.DeletedClassExceptioncom.sleepycat.persist.evolve.IncompatibleClassExceptionNullPointerException under certain
circumstances when key prefixing is enabled. This was originally reported on the
OTN Forum. [#18773]
   java.lang.Thread.State: RUNNABLE
        at java.util.HashMap.put(HashMap.java:374)
        at java.util.HashSet.add(HashSet.java:200)
        at com.sleepycat.je.dbi.EnvironmentImpl.registerExceptionListenerUser(EnvironmentImpl.java:730)
        at com.sleepycat.je.utilint.DaemonThread.(DaemonThread.java:60)
        at com.sleepycat.je.cleaner.FileProcessor.(FileProcessor.java:110)
        at com.sleepycat.je.cleaner.Cleaner.doClean(Cleaner.java:461)
        at com.sleepycat.je.dbi.EnvironmentImpl.invokeCleaner(EnvironmentImpl.java:1879)
        at com.sleepycat.je.Environment.cleanLog(Environment.java:1559)
   
java.io.FileNotFoundException: ... (The system cannot find the file specified)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.(Unknown Source)
    at java.io.RandomAccessFile.(Unknown Source)
    at com.sleepycat.je.log.FileManager$1.(FileManager.java:998)
    at com.sleepycat.je.log.FileManager.openFileHandle(FileManager.java:998)
    at com.sleepycat.je.log.FileManager.getFileHandle(FileManager.java:893)
    at com.sleepycat.je.rep.stream.FeederReader$SwitchWindow.fillNext(FeederReader.java:523)
    at com.sleepycat.je.log.FileReader.readData(FileReader.java:758)
    at com.sleepycat.je.log.FileReader.readNextEntryAllowExceptions(FileReader.java:259)
    at com.sleepycat.je.log.FileReader.readNextEntry(FileReader.java:230)
    at com.sleepycat.je.rep.stream.FeederReader.scanForwards(FeederReader.java:284)
    at com.sleepycat.je.rep.stream.MasterFeederSource.getWireRecord(MasterFeederSource.java:62)
    at com.sleepycat.je.rep.impl.node.Feeder$OutputThread.run(Feeder.java:659)
   
java.lang.ArrayIndexOutOfBoundsException at java.util.zip.Adler32.update(Adler32.java:47) at com.sleepycat.je.log.ChecksumValidator.update(ChecksumValidator.java:59) at com.sleepycat.je.log.ChecksumValidator.update(ChecksumValidator.java:55) at com.sleepycat.je.log.LogManager.getLogEntryFromLogSource(LogManager.java:928) ...Thanks to Jean-Christophe on OTN for reporting this bug.
java.lang.IllegalArgumentException: Can not set java.lang.Integer field com.sleepycat.persist.test.EvolveClasses$RenameSecField.new_secKey2 to java.lang.String at java.lang.reflect.Field.set(Field.java:657) at com.sleepycat.persist.impl.ReflectionAccessor$ObjectAccess.read(ReflectionAccessor.java:422) at com.sleepycat.persist.impl.ReflectionAccessor.readSecKeyFields(ReflectionAccessor.java:253) at com.sleepycat.persist.impl.ComplexFormat$EvolveReader.readObject(ComplexFormat.java:2127) at com.sleepycat.persist.impl.PersistEntityBinding.readEntity(PersistEntityBinding.java:115) at com.sleepycat.persist.impl.PersistEntityBinding.entryToObjectInternal(PersistEntityBinding.java:83) at com.sleepycat.persist.impl.PersistEntityBinding.entryToObject(PersistEntityBinding.java:64) at com.sleepycat.persist.PrimaryIndex.get(PrimaryIndex.java:597) at com.sleepycat.persist.PrimaryIndex.get(PrimaryIndex.java:584) ...This has been fixed. [#18961]
Cursor.getNextDup or
EntityCursor.nextDup to advance to a following key under certain
rare conditions.  This also has a side effect of causing
Database.delete to delete duplicate records for the following key
under the same conditions.  The conditions that lead to the bug are:
MANY_TO_XXX relationship is used.Cursor.getNextDup or EntityCursor.nextDup is
    called when positioned on the last record for key A, or
    Database.delete is called for key A.  In this case, the
    record(s) with key B will mistakenly be returned or deleted.CacheMode.EVICT_BIN.  The bug did not cause data loss, but
did prevent recovery and opening of the Environment.  Heavy eviction during a
checkpoint increases the likelihood that the problem will manifest itself.
[#19422]
com.sleepycat.je.rep.util.DbGroupAdmin -dumpGroup or
through the JMX MBean dumpReplicationState() operation.  The
LocalCBVLSN field is an indicator of the progress a replicated node
has made in executing replicated operations.
Users can monitor the LocalCBVLSN values for group members as a way of gauging if the group is executing at an even pace. The values need not be identical, because they are only update periodically, but a large or growing discrepancy indicates that some group members are lagging.[#18430]
com.sleepycat.je.CacheMode enumeration values
have been added which can help to improve cache memory usage and
reduce Java GC costs for some applications:
MAKE_COLDEVICT_LNEVICT_BINThe CacheMode is configurable using new database and
environment properties:
DatabaseConfig.setCacheMode, getCacheModeEnvironmentConfig.setCacheMode, getCacheModeNote that the MAKE_COLD mode has been enhanced since its
introduction in JE 3.3.  In JE 4.0, this mode will perform explicit eviction
when the JE cache is full, and blocking between threads may be reduced.
See the CacheMode Javadoc for more information.  [#18410]
com.sleepycat.je.EnvironmentStats to support the
new CacheMode functionality and to make it easier to
understand caching behavior. [#18512]
nCachedBINs and nCachedUpperINs show the proportion
  types of btree nodes in cache.
nBINsFetch, nBINsFetchMiss, nUpperINsFetch, nUpperINsFetchMiss
 provide a more detailed look at cache hit/miss ratio
nBINsEvictedCACHEMODE, nBINsEvictedCRITICAL, nBINsEvictedMANUAL,
nBINsEvictedEVICTORTHREAD, nUpperINsEvictedCACHEMODE,
nUpperINsEvictedCRITICAL, nUpperINsEvictedMANUAL,
nUpperINsEvictedEVICTORTHREAD provide some guidance about the
effectiveness of different CacheModes.
com.sleepycat.je.rep.ReplicationConfig.REPLICA_TIMEOUT
and com.sleepycat.je.rep.ReplicationConfig.FEEDER_TIMEOUT
have been defined to permit application level control of connection
timeouts. (4.0.100)
Database.count() to return incorrect
values when an environment is opened read-only. [#18180]
Database.preload() which would cause a latch on a
database root node to be held in the face of the cache filling or preload
taking too much time. [#18396]
-XX:+UseCompressedOops JVM option. [#18462]
je.cleaner.threads set to a value greater than
 1, where the application does not fit in cache, can experience a
 deadlock which shows the following stacktraces. This has been
 fixed. [#18475]
"Cleaner-1": at com.sleepycat.je.cleaner.UtilizationProfile.putFileSummary(UtilizationProfile.java:846) - waiting to lock <0xf00db530> (a com.sleepycat.je.cleaner.UtilizationProfile) at com.sleepycat.je.cleaner.UtilizationProfile.flushFileSummary(UtilizationProfile.java:835) at com.sleepycat.je.cleaner.UtilizationTracker.evictMemory(UtilizationTracker.java:95) at com.sleepycat.je.dbi.EnvironmentImpl.specialEviction(EnvironmentImpl.java:2379) at com.sleepycat.je.evictor.PrivateEvictor.startBatch(PrivateEvictor.java:96) at com.sleepycat.je.evictor.Evictor.evictBatch(Evictor.java:306) at com.sleepycat.je.evictor.Evictor.doEvict(Evictor.java:245) - locked <0xf0222028> (a com.sleepycat.je.evictor.PrivateEvictor) at com.sleepycat.je.evictor.Evictor.doCriticalEviction(Evictor.java:273) at com.sleepycat.je.dbi.EnvironmentImpl.criticalEviction(EnvironmentImpl.java:2360) at com.sleepycat.je.cleaner.FileProcessor.processFile(FileProcessor.java:502) ... Cleaner-4: at com.sleepycat.je.evictor.Evictor.doEvict(Evictor.java:229) - waiting to lock <0xf0222028> (a com.sleepycat.je.evictor.PrivateEvictor) at com.sleepycat.je.evictor.Evictor.doCriticalEviction(Evictor.java:273) at com.sleepycat.je.dbi.EnvironmentImpl.criticalEviction(EnvironmentImpl.java:2360) at com.sleepycat.je.dbi.CursorImpl.criticalEviction(CursorImpl.java:295) at com.sleepycat.je.Cursor.beginMoveCursor(Cursor.java:2704) ... at com.sleepycat.je.rep.vlsn.VLSNIndex.getLTEFileNumber(VLSNIndex.java:675) at com.sleepycat.je.rep.impl.node.GlobalCBVLSN.getCleanerBarrierFile(GlobalCBVLSN.java:100) at com.sleepycat.je.rep.impl.node.RepNode.getCleanerBarrierFile(RepNode.java:1287) at com.sleepycat.je.rep.impl.RepImpl.getCleanerBarrierStartFile(RepImpl.java:1156) at com.sleepycat.je.cleaner.UtilizationProfile.getBestFileForCleaning(UtilizationProfile.java:289) - locked <0xf00db530> (a com.sleepycat.je.cleaner.UtilizationProfile) at com.sleepycat.je.cleaner.FileSelector.selectFileForCleaning(FileSelector.java:225) at com.sleepycat.je.cleaner.FileProcessor.doClean(FileProcessor.java:202) - locked <0xf0035cd0> (a com.sleepycat.je.cleaner.FileProcessor) at com.sleepycat.je.cleaner.FileProcessor.onWakeup(FileProcessor.java:140)
"Checkpointer" daemon prio=3 tid=0x08518000 nid=0x1d waiting on condition [0xedca8000]
- parking to wait for  <0xf0211680> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
at com.sleepycat.je.tree.IN.latch(IN.java:332)
          ...
at com.sleepycat.je.evictor.Evictor.doEvict(Evictor.java:245)
- locked <0xf01809c0> (a com.sleepycat.je.evictor.PrivateEvictor)
          ...
at com.sleepycat.je.rep.vlsn.VLSNTracker.flushToDatabase(VLSNTracker.java:366)
- locked <0xf018e510> (a com.sleepycat.je.rep.vlsn.VLSNTracker)
          ...
at com.sleepycat.je.rep.impl.RepImpl.preCheckpointEndFlush(RepImpl.java:656)
at com.sleepycat.je.recovery.Checkpointer.doCheckpoint(Checkpointer.java:490)
DbCacheSize that caused a slight overestimation of
memory used by the Btree.  This utility now prints out detailed memory usage
for each level in the Btree. [#18520]
com.sleepycat.je.EnvironmentFailureException: (JE 4.0.97) Locker: com.sleepycat.je.txn.BasicLocker UNEXPECTED_STATE: Unexpected internal state, may have side effects. at com.sleepycat.je.EnvironmentFailureException.unexpectedState(EnvironmentFailureException.java:376) at com.sleepycat.je.txn.LockManager.lock(LockManager.java:262) at com.sleepycat.je.txn.BasicLocker.lockInternal(BasicLocker.java:134) at com.sleepycat.je.txn.Locker.nonBlockingLock(Locker.java:487) at com.sleepycat.je.tree.MapLN.isEvictable(MapLN.java:174) at com.sleepycat.je.tree.BIN.evictInternal(BIN.java:1004) at com.sleepycat.je.tree.BIN.evictLNs(BIN.java:965) at com.sleepycat.je.evictor.Evictor.evictIN(Evictor.java:820) ...
RefreshException to be thrown
when calling com.sleepycat.persist.EntityStore.getPrimaryIndex.
This occurs only under these conditions:
    NullPointerException to be thrown
when calling com.sleepycat.persist.EntityStore.getPrimaryIndex.
This occurs only under these conditions:
    java.lang.IndexOutOfBoundsException at com.sleepycat.bind.tuple.TupleInput.readBoolean(TupleInput.java:186) at com.sleepycat.je.cleaner.PackedObsoleteInfo.countObsoleteInfo(PackedObsoleteInfo.java:60) at com.sleepycat.je.log.LogManager.serialLogInternal(LogManager.java:671) at com.sleepycat.je.log.SyncedLogManager.serialLog(SyncedLogManager.java:40) at com.sleepycat.je.log.LogManager.multiLog(LogManager.java:388) at com.sleepycat.je.recovery.Checkpointer.logSiblings(Checkpointer.java:1285)[#18567] (4.0.102)
Under exceptional circumstances, a simple majority of nodes may become unavailable for some period of time. With only a minority of nodes available, the overall availability of the group can be adversely affected.
To deal with this exceptional circumstance, especially if the
situation is likely to persist for an unacceptably long period of
time, a mechanism has been added by which you can modify the way in
which the number of electable nodes, and consequently the quorum
requirements for elections and commit acknowledgments, is
calculated. See ReplicationMutableConfig.ELECTABLE_GROUP_SIZE_OVERRIDE
and Replication Guide appendix, Managing
a Failure of the Majority [#18022]
getGroupName() to
com.sleepycat.je.rep.util.ReplicationGroupAdmin, which
returns the group
name. ReplicationGroupAdmin.getMasterSocket() was
inadvertently public and has been made private. [#17841]
com.sleepycat.je.rep.ReplicatedEnvironmentStats:
getProtocolAvgReadNanos()were intended to provide throughput information for a replicated JE environment, but required some computation from the user. They have been replaced with methods that present throughput in a more forthright manner:
getProtocolAvgWriteNanos()
getProtocolReadNanos()
getProtocolWriteNanos()
getProtocolBytesReadRate()[#17913]
getProtocolBytesWriteRate()
getProtocolMessageReadRate()
getProtocolMessageWriteRate()
com.sleepycat.je.rep.ReplicationConfig.TXN_ROLLBACK_LIMIT
and the
new com.sleepycat.je.rep.RollbackProhibitedException. [#17926]
Several new classes and methods, and a bug fix were added to make it easier to track replication group changes when using the com.sleepycat.je.rep.monitor package.
com.sleepycat.je.rep.monitor.GroupChangeEvent was being
generated whenever an electable node joined a replication group. Instead, this
event should only be generated when the replication group composition changes.
The class com.sleepycat.je.rep.monitor.GroupChangeEvent
now defines a new enumeration: GroupChangeType and a new
method GroupChangeEvent.getChangeType(). Together these
changes make it possible to identify the type of structural change
(whether a node was added or removed) and the affected node.
The class
com.sleepycat.je.rep.monitor.MonitorChangeListener now
defines two new notify methods:
MonitorChangeListener.notify(JoinGroupEvent) and
MonitorChangeListener.notify(LeaveGroupEvent). These new
methods, along with the new events:
com.sleepycat.je.rep.monitor.JoinGroupEvent and
com.sleepycat.je.rep.monitor.LeaveGroupEvent, permit the
listener to track the dynamic state of electable nodes as they join
and leave the replication group. You will need to supply
implementations for the new notify methods if you have an existing
class that implements the MonitorChangeListener
interface.
This problem was originally reported here on the OTN forum. [#18006]
com.sleepycat.je.util.ConsoleHandler.level
and com.sleepycat.je.util.FileHandler.level through the
standard java.util.logging configuration file or MBean, but the
java.util.logging API does not directly support setting handler
levels. JE now accepts the properties
com.sleepycat.je.util.ConsoleHandler.level and
com.sleepycat.je.util.FileHandler.level as properties to
the je.properties file or the EnvironmentConfig.setConfigParam()
method to support programmatic setting of these values. See the Logging
chapter for more information. [#18017]
Database.preload(PreloadConfig) no longer throws
NullPointerException if null is passed for an argument.  Instead,
it uses a default PreloadConfig. [#17784] (4.0.72)
java.rmi.UnmarshalException: Error unmarshaling return; nested
exception is java.lang.ClassNotFoundException:
com.sleepycat.je.DatabaseNotFoundException ....
instead of a proper message explaining the problem. This has been fixed. [#17913]
java.util.concurrent.locks.ReentrantReadWriteLock taken
during construction of a ThreadLocal. The ThreadLocal is
only used during stats collection, and the implementation now makes
initialization lazy and conditional. [#17944]
Database.close when the
EnvironmentConfig.ENV_IS_LOCKING property is set to
false.  This caused
Environment.truncateDatabase, removeDatabase
and renameDatabase to throw
LockTimeoutException when the database is opened and
closed prior to performing the truncate, remove or rename
operation. It also caused a resource/memory leak (a single lock was
not released by Database.close) that could impact
applications that frequently open and close databases. Again, this
only impacts applications that have explicitly set
EnvironmentConfig.ENV_IS_LOCKING to false. [#17985]
PreloadStats.getNLNsLoaded to return a
non-zero number, even when PreloadConfig.setLoadLNs(false) was
specified.  Note that no LNs were loaded -- only the returned stat was
incorrect.  [#18021]
Replica unexpected exception com.sleepycat.je.EnvironmentFailureException: ... com.sleepycat.je.EnvironmentFailureException: (JE 4.0.80) node4(3):/tmp/scaleDir4/env Rep stream not sequential. Current VLSN: 94,338,473 next log entry VLSN: 94,338,515 UNEXPECTED_STATE: Unexpected internal state, may have side effects. at com.sleepycat.je.rep.impl.node.Replay.replayEntry(Replay.java:342) at com.sleepycat.je.rep.impl.node.Replica.doRunReplicaLoopInternalWork(Replica.java:433) at com.sleepycat.je.rep.impl.node.Replica.runReplicaLoopInternal(Replica.java:353) at com.sleepycat.je.rep.impl.node.Replica.runReplicaLoop(Replica.java:295) at com.sleepycat.je.rep.impl.node.RepNode.run(RepNode.java:914)[#18212]
EnvironmentStats.getCleanerBacklog stat is incorrect,
  which could lead the application to unnecessarily increase the number of
  cleaner threads.EnvironmentConfig.CLEANER_MAX_BATCH_FILES is set to a
  non-zero value, log cleaning is disabled when the number of deleted files in
  the backlog reaches this limit.DbCacheSize now supports -measure to measure the
actual amount of cache size used, without the use of -data.  When
-data is not specified, -measure will cause only the
keys and internal nodes to be kept in cache.  This allows measuring the amount
of memory necessary to hold the internal nodes for a data set, without
allocating enough memory to hold the entire data set, including leaf nodes.
[#18036]
The change is forward compatible in that JE files created with release 3.3 and earlier can be read when opened with JE 4.0.117. The change is not backward compatible in that files created with JE 4.0 cannot be read by earlier releases. Note that if an existing environment is opened read/write, a new log file is written by JE 4.0 and the environment can no longer be read by earlier releases.
Changes in API and exception handling create a binary incompatibility between JE 4.0 and JE 3.X. Users are advised to recompile their applications when moving to JE 4.0.
The com.sleepycat.je.util.LogVerificationInputStream
class enables log verification programmatically as files are being
copied.  The com.sleepycat.je.util.DbVerifyLog class is a
simple command line utility for inclusion in backup scripts. [#16476]
DatabaseEntry.setPartial is used to suppress
return of the data item and the READ_UNCOMMITTED isolation mode is
used.  See "Using Partial DatabaseEntry Parameters"in the Cursor javadoc for
more information.  [#16859]
EnvironmentConfig.setNodeName(String nodeName) and
EnvironmentConfig.getNodeName() methods have been added
to match those same methods in ReplicationConfig.
Setting the EnvironmentConfig node name will cause
java.util.logging messages and thread names to include the
user-specified name. This was previously only true for replicated
environments, and has been extended to work for non-replicated
environments, as a debugging aid when using multiple environments in
the same JVM. The feature was originally requested on the OTN
forum.  [#17629] (4.0.70)
close() method may now be called repeatedly on
Database, Cursor, Environment,
JoinCursor, and EntityStore instances, and
abort() may be called repeatedly on Transaction
instances. Whereas they used to throw an exception if close() or
abort() was called multiple times, they now return silently on
subsequent calls. [#16214]
XAEnvironment.getXATransaction() has been removed from
the Javadoc.  This is an internal entrypoint and should not be used by
general users.  getXATransaction()'s behavior has been
changed so that it will no longer return a Transaction
instance for a transaction which is prepared, but not yet committed or
rolled back.  The only user operations which can be performed on
prepared, but not yet committed/rolled-back transactions are
XAEnvironment.commit() or rollback().
[#16375]
DatabaseConfig.setUseExistingConfig and
DatabaseConfig.getUseExistingConfig methods.  This allows
a user application to open a Database readonly and determine its existing
DatabaseConfig (e.g. whether the database has sorted duplicates or not).
[#16504]
DeadlockException or
LockNotGrantedException is explicitly caught, and the use of
these exceptions is not changed as described below. Also, if an instance of
DatabaseException is being created directly by the application,
this must be changed as described below.
DatabaseException is now a runtime exception rather than a
        checked exception.  In other words, it now extends
        RuntimeException rather than Exception.
        Since all other JE exceptions extend DatabaseException,
        all JE exceptions are now runtime exceptions.  This change allows
        catching and handling JE exceptions at the level of the call chain most
        appropriate for a given situation, without having to declare
        DatabaseException in the throws clause of every method or
        wrap it in a runtime exception.  In some cases JE exceptions should be
        handled by the immediate caller of a JE method, but in other cases
        should be handled at a higher level.  Using runtime exceptions makes it
        easier for applications to make the appropriate choice.  No application
        changes are required, although many users may wish to remove
        DatabaseException from the throws clause of methods where
        it is no longer needed, or remove the use of runtime exception
        wrappers.
        [#16704]
    OperationFailureException) or environment failures (base
        class EnvironmentFailureException).  For both types of
        failures, the general approach for handling the exception has been
        defined in the javadoc for these base classes.  To support handling all
        exceptions in a general way, the Transaction.isValid and
        Environment.isValid methods have been added.
        [#16704]
    RunRecoveryException has been deprecated and replaced by
        EnvironmentFailureException; however, application code
        that catches RunRecoveryException need not be changed
        immediately.  EnvironmentFailureException extends
        RunRecoveryException, so existing code that catches
        RunRecoveryException will now catch
        EnvironmentFailureException.  However, please be aware
        that EnvironmentFailureException is now thrown for more
        error cases than RunRecoveryException was in JE 3.3 and
        earlier.  Applications are strongly encouraged to use the new approach
        for handling EnvironmentFailureException, which is
        described in the javadoc for this class.
        [#16704]
    DatabaseException class is now abstract.  This ensures
        that a specific exception, having well defined rules for handling it,
        is always thrown.  Applications that are throwing
        DatabaseException directly must be changed to throw a
        different exception, and not a JE exception.  Although JE exceptions
        have public constructors, these are excluded from the javadoc and
        marked as Internal Use Only.  JE exceptions should only be created and
        thrown by JE.
        [#16704]
    LockConflictException
        are available.  Now, LockConflictException should be
        caught to handle lock conflicts in a general manner, instead of
        catching DeadlockException.  New exceptions are now thrown
        as follows:
            LockTimeoutException is now thrown when a lock
            timeout occurs, rather than DeadlockException.TransactionTimeoutException is now thrown when a
            transaction timeout occurs, rather than
            DeadlockException.LockNotAvailableException is now thrown when a
            lock conflict occurs for a no-wait transaction, rather than
            LockNotGrantedException.LockConflictException.  DeadlockException is
        also now a subclass of LockConflictException, but is not
        currently thrown by JE because true deadlock detection is not used in
        JE.  Currently, lock timeouts are used instead.  When true deadlock
        detection is added to JE in the future, DeadlockException
        will be thrown. LockNotGrantedException has been
        deprecated and replaced by LockNotAvailableException.
        Unless EnvironmentConfig.LOCK_OLD_LOCK_EXCEPTIONS is set
        to true (which enables the old exception behavior) the following
        changes must be made to JE applications that upgrade from JE 3.3 or
        earlier.
            DeadlockException must be
            replaced with LockConflictException or one of its
            non-deprecated subclasses (LockTimeoutException,
            TransactionTimeoutException, or
            LockNotAvailableException).  It is strongly
            recommended to replace it with LockConflictException,
            since catching this exception will catch true deadlocks in the
            future and other types of lock conflicts.  All lock conflicts all
            typically handled in the same way, which is normally to abort and
            retry the transaction.LockNotGrantedException must be
            replaced with LockNotAvailableException.
            LockNotGrantedException has been deprecated because it
            misleadingly extends DeadlockException.com.sleepycat.je.LockConflictException (for the base API)
        and com.sleepycat.persist.EntityIndex (for the DPL).
        [#14573]
    SecondaryConstraintException, or one of its more specific
        subclasses, rather than by catching DatabaseException.
        Please see the javadoc for the following new exceptions.  Note that
        some new exceptions were added for replication support.
        DatabaseExistsExceptionDatabasePreemptedExceptionDeleteConstraintExceptionDuplicateDataExceptionEnvironmentNotFoundExceptionForeignConstraintExceptionLockConflictExceptionLockNotAvailableExceptionLockPreemptedExceptionLockTimeoutExceptionLogOverwriteExceptionLogWriteExceptionSecondaryConstraintExceptionSecondaryIntegrityExceptionSecondaryReferenceExceptionSequenceExistsExceptionSequenceIntegrityExceptionSequenceNotFoundExceptionSequenceOverflowExceptionThreadInterruptedExceptionTransactionTimeoutExceptionUniqueConstraintExceptionVersionMismatchExceptionXAFailureExceptionDatabaseException javadoc for an overview of all JE
exceptions.
Environment.getLockStats() method and LockStats
class are deprecated.  All of the lock stats may be obtained using
Environment.getStats().  The same get methods which exist on
LockStats are now present on EnvironmentStats.
[#16792]
Database.compareKeys(DatabaseEntry, DatabaseEntry) and
Database.compareDuplicates(DatabaseEntry, DatabaseEntry) methods
which may be used for comparing two DatabaseEntry instances
using either the btree comparator or the duplicate comparator.
[#16816]
com.sleepycat.je.ForeignKeyDeleteAction,
com.sleepycat.je.LockMode, and
com.sleepycat.je.OperationStatus classes have been changed from
classes to Java enums.  This is a compatible change and does not require a
recompilation unless you use LockMode.DIRTY_READ.
LockMode.DIRTY_READ was previously deprecated and has now been
removed from the code base. Use of the LockMode.DIRTY_READ field
in class files compiled with earlier versions of JE will cause
java.lang.NoSuchFieldError to be thrown at runtime.
In addition, the following previously deprecated methods, classes, and constants have been removed:
com.sleepycat.collections.StoredCollections.dirtyReadCollection,
com.sleepycat.collections.StoredCollections.dirtyReadList,
com.sleepycat.collections.StoredCollections.dirtyReadMap,
com.sleepycat.collections.StoredCollections.dirtyReadSet,
com.sleepycat.collections.StoredCollections.dirtyReadSortedMap,
com.sleepycat.collections.StoredCollections.dirtyReadSortedSet,
com.sleepycat.collections.StoredContainer.isDirtyReadAllowed,
com.sleepycat.collections.StoredContainer.isDirtyRead,
com.sleepycat.je.CursorConfig.DIRTY_READ,
com.sleepycat.je.CursorConfig.setDirtyRead,
com.sleepycat.je.CursorConfig.getDirtyRead,
com.sleepycat.je.TransactionConfig.setDirtyRead,
com.sleepycat.je.TransactionConfig.getDirtyRead,
[#16984]
SecondaryCursor.dupSecondary() method has been deprecated
and replaced by SecondaryCursor.dup().  The
SecondaryDatabase.openSecondaryCursor() method has been deprecated
and replaced by SecondaryDatabase.openCursor().  The
SecondaryDatabase.getSecondaryConfig() method has been deprecated
and replaced by SecondaryDatabase.getConfig().  The
SecondaryDatabase.openSecondaryCursor() method has been deprecated
and replaced by SecondaryDatabase.openCursor().  The
cloneConfig() methods for
DatabaseConfig,
EvolveConfig, and
StoreConfig have been deprecated and replaced by
clone().  The
clone() methods for
CheckpointConfig,
CursorConfig,
EnvironmentConfig,
JoinConfig,
PreloadConfig,
SecondaryConfig,
SequenceConfig,
StatsConfig,
TransactionConfig, and
VerifyConfig have been added. [#16985]
public void setFoo() methods in
com.sleepycat.je.*Config have been changed to return
this instead of void.  This allows multiple set
calls to be placed on one line, similar to StringBuffer calls.
For example, it is now possible to do the following:
EnvironmentConfig envConf = new EnvironmentConfig();
envConf.setAllowCreate(true).setTransactional(true);
This will require users to recompile their code.  [#17021]
StoreConfig EvolveConfig
now return this rather than having a void
return type.  This change requires that applications using the DPL be
recompiled.  [#17021] (4.0.70)
TransactionConfig and EnvironmentConfig
  for TxnNoSync, TxnWriteNoSync, and
  TxnSync.  TransactionConfig no longer
  allows setting more than one of TxnNoSync,
  TxnWriteNoSync, or TxnSync to
  true.  An IllegalArgumentException will be
  thrown if the settings of these configuration parameters are
  conflicting. [#17705]
Durability, as a single consistent way to specify
durability for both standalone and replicated environments. Accordingly, the
methods: setTxnNoSync, getTxnNoSync, setTxnWriteNoSync,
getTxnWriteNoSync in EnvironmentMutableConfig and methods 
setNoSync, getNoSync, setWriteNoSync, getWriteNoSync in
TransactionConfig are deprecated, the methods setDurability,
getDurability should be used in their place.  A new
Transaction method, commit(Durability) has also been
provided for use in both standalone and replicated environments.
je.log.useNIO and je.log.directNIO
parameters.  If EnvironmentConfig.LOG_USE_NIO or
EnvironmentConfig.LOG_DIRECT_NIO is used by the
application, a deprecation warning will result.  If these parameters
are set, they will have no effect on JE, and no warning (other than
the deprecation warning) will be given to the user.
To display all logging output to the console, set com.sleepycat.je.util.ConsoleHandler.level = ALL as a java.util.logging property. By default, JE records logging output of level INFO or higher is recorded in <envdir>/je.info. To change the level of output displayed in the file, set com.sleepycat.je.util.FileHandler.level to the desired level. The logging output is particularly helpful in a replicated application. An example of the output can be found here.
Environment configuration properties now
allow specifying a time unit. In the past, values could only be
expressed as microseconds. For these properties, the default unit has
always been microseconds and that has not changed.
For more information about specifying units with configuration
properties, see the Time Duration Properties section of the
EnvironmentConfig class.
 These properties are:
    EnvironmentConfig.LOCK_TIMEOUTEnvironmentConfig.TXN_TIMEOUTEnvironmentConfig.LOG_FSYNC_TIMEOUTEnvironmentConfig.ENV_BACKGROUND_SLEEP_INTERVALEnvironmentConfig.COMPRESSOR_WAKEUP_INTERVALEnvironmentConfig.COMPRESSOR_LOCK_TIMEOUTEnvironmentConfig.CHECKPOINTER_WAKEUP_INTERVALEnvironmentConfig.CLEANER_LOCK_TIMEOUTIn addition, the following new methods have been added to allow specifying a unit along with a time duration. The equivalent older methods, without a unit argument, have been deprecated. The new methods are:
EnvironmentConfig.setLockTimeout(long,TimeUnit)EnvironmentConfig.getLockTimeout(TimeUnit)EnvironmentConfig.setTxnTimeout(long,TimeUnit)EnvironmentConfig.getTxnTimeout(TimeUnit)Transaction.setLockTimeout(long,TimeUnit)Transaction.getLockTimeout(TimeUnit)Transaction.setTxnTimeout(long,TimeUnit)Transaction.getTxnTimeout(TimeUnit)Transaction.  This includes
Database.openCursor, EntityIndex.entities,
EntityIndex.keys, and
StoredContainer.storedIterator.  Before, a null
Transaction was prohibited in a replicated environment
unless read-uncommitted isolation was configured.  Note that a null
transaction has always been allowed (and still is) in a non-replicated
environment.  [#16513] (4.0.70) Transaction.commit and
CurrentTransaction.commitTransaction family of methods no longer
throw LockPreemptedException.  Note that
LockPreemptedException is only applicable in replicated
environments.  [#16513] (4.0.70)
IllegalArgumentException is now thrown if
LockMode.RMW is passed to the Database.get and
Database.getSearchBoth methods, and a null Transaction is
also passed.  Without a transaction it is not possible to use these methods to
perform a read-modify-write operation that initially acquires a write
lock, so the combination of parameters does not make sense.
[#16513] (4.0.70)
Database.preload(PreloadConfig) no longer throws
NullPointerException if null is passed for an argument.  Instead,
it uses a default PreloadConfig. [#17784] (4.0.72)
com.sleepycat.je.Transaction.commit() throws
an exception because the transaction has open cursors, a follow-on
call to Transaction.abort() could fail with the following
stack trace:
    Transaction 3 has been closed. java.lang.IllegalStateException: Transaction 3 has been closed.
        at com.sleepycat.je.txn.Txn.checkState(Txn.java:1580)
        at com.sleepycat.je.txn.Txn.abortInternal(Txn.java:819)
        at com.sleepycat.je.txn.Txn.abort(Txn.java:805)
        at com.sleepycat.je.Transaction.abort(Transaction.java:90)
        at com.sleepycat.je.txn.TxnEndTest.testTxnClose(TxnEndTest.java:
This was a bug and has been fixed so the call to abort() will complete
successfully. [#16214]
Database instances obviating the need
to use separate Database handles in high-concurrency environments.
Previously, this practice was recommended, but is no longer necessary.
[#16346]
In JE, when the durability specified for a transaction dictates
force-writing to disk (for example, a commitSync() call),
it calls fsync().  On modern disk drives an
fsync() will take on the order of several
milliseconds. This is a
relatively long time compared to the time required to do a
write() call, which only moves data to the operating
system's file cache.
 JE's group commit mechanism seeks to reduce the number of fsyncs
required by issuing one fsync for batches of multiple transaction commits.
For
example, if a thread T1 requires an fsync(), and JE
determines that no fsync() is in progress, it will
execute that fsync() immediately.  If, while T1 is
executing the fsync(), some other thread(s) require an
fsync(s), JE will block those threads until T1 finishes.  When T1's
fsync() completes, a new fsync() executes
on behalf of the blocked thread(s).
The past JE group commit implementation assumed that the underlying platform
(OS + file system combination) allow IO operations like
seek(), read() and write() to
execute concurrently with an fsync() call (on the same
file, but using different file descriptors).  On Solaris and Windows
this is true.  Hence, on these platforms, a thread which is performing
an fsync() does not block another thread performing a
concurrent write().  But, on several Linux file systems,
ext3 in particular, an exclusive mutex on the inode is grabbed during
any IO operation.  So a write() call on a file
(inode) will be blocked by an fsync() operation on the
same file (inode).  This negates any performance improvement which
might be achieved by group commit.
The JE group commit code has been improved to batch
write() and fsync() calls, rather than just
fsync() calls.  Just before a write() call
is executed, JE checks if an fsync() is in progress and
if so, the write call is queued in a (new) Write Queue.  Once the
fsync() completes, all pending writes in the Write Queue
are executed.
This change in behavior is enabled by default and may be disabled by
setting the je.log.useWriteQueue configuration parameter
to false.  The size of the Write Queue (i.e. the amount of
data it can queue until any currently-executing IO operations complete)
can be controlled with the je.log.writeQueueSize parameter.
The default for je.log.writeQueueSize is 1MB with a minimum
value of 4KB and a maximum value of 32MB. The Write Queue does not use
cache space controlled by the je.maxMemory parameter.  [#16440]
 Environment is fully closed.
This report was originally mentioned in this forum
post.  [#16453] LockType and LockUpgrade. This was
discovered by a user whose use of reflection caused a change in the
class loading order. [#16496]
DbPrintLog utility would sometimes display
negative numbers for the size of the key/data bytes when using the
-S option has been fixed.  A -SC option has also
been added which prints the summary information in CSV format. [#17196]
EnvironmentConfig.CLEANER_FOREGROUND_PROACTIVE_MIGRATIONEnvironmentConfig.CLEANER_BACKGROUND_PROACTIVE_MIGRATION(JE 4.0.60)... LOG_FILE_NOT_FOUND: Log file missing, log is likely invalid. Environment is invalid and must be closed. at com.sleepycat.je.tree.ChildReference. fetchTarget(ChildReference.java:147) at com.sleepycat.je.tree.DIN.getDupCountLN(DIN.java:155) at com.sleepycat.je.dbi.CursorImpl.lockDupCountLN(CursorImpl.java:2596) at com.sleepycat.je.tree.Tree.insertDuplicate(Tree.java:2705) at com.sleepycat.je.tree.Tree.insert(Tree.java:2652) at com.sleepycat.je.dbi.CursorImpl.put(CursorImpl.java:1076) at com.sleepycat.je.Cursor.putAllowPhantoms(Cursor.java:1769) at com.sleepycat.je.Cursor.putNoNotify(Cursor.java:1726) at com.sleepycat.je.Cursor.putNotify(Cursor.java:1659) at com.sleepycat.je.Cursor.putLN(Cursor.java:1609) at com.sleepycat.je.DbInternal.putLN(DbInternal.java:125) at com.sleepycat.je.rep.impl.node.Replay.applyLN(Replay.java:738) at com.sleepycat.je.rep.impl.node.Replay.replayEntry(Replay.java:483) at com.sleepycat.je.rep.impl.node.Replica.doRunReplicaLoopInternalWork(Replica.java:414) at com.sleepycat.je.rep.impl.node.Replica.runReplicaLoopInternal(Replica.java:341) at com.sleepycat.je.rep.impl.node.Replica.runReplicaLoop(Replica.java:283) at com.sleepycat.je.rep.impl.node.RepNode.run(RepNode.java:886)The problem would only occur in a fairly tight timing window, and has been fixed. [#17879] (4.0.70)
(JE 4.0.60) ... GroupCBVLSN: 231,655 is outside VLSN range: first=231,700 last=583,909 sync=583,909 txnEnd=583,909 UNEXPECTED_STATE_FATAL: Unexpected internal state, unable to continue. Environment is invalid and must be closed. Problem seen replaying entry ... at com.sleepycat.je.EnvironmentFailureException.unexpectedState(EnvironmentFailureException.java:392) at com.sleepycat.je.rep.impl.node.GlobalCBVLSN.recalculate(GlobalCBVLSN.java:179) at com.sleepycat.je.rep.impl.node.RepNode.recalculateGlobalCBVLSN(RepNode.java:650) at com.sleepycat.je.rep.impl.node.Replay.replayEntry(Replay.java:444) at com.sleepycat.je.rep.impl.node.Replica.doRunReplicaLoopInternalWork(Replica.java:414) at com.sleepycat.je.rep.impl.node.Replica.runReplicaLoopInternal(Replica.java:341) at com.sleepycat.je.rep.impl.node.Replica.runReplicaLoop(Replica.java:283) at com.sleepycat.je.rep.impl.node.RepNode.run(RepNode.java:886)This has been fixed. [#17885] (4.0.70)
Database.preload(PreloadConfig) no longer throws
NullPointerException if null is passed for an argument.  Instead,
it uses a default PreloadConfig. [#17784] (4.0.72)
Persistent class has non-persistent superclass: java.lang.Enum was
reported.
Thanks to Lowell for reporting
this problem on OTN.
[#15623]
No default constructor was reported.
[#16279]
EntityModel.registerClass method may be
    called to register the subclass before opening the entity store.EntityStore.getSubclassIndex method may be called to
    implicitly register the subclass after opening the entity store.Failure to register the entity subclass will result in an
IllegalArgumentException the first time an attempt is made to
store an instance of the subclass.  An exception will not occur if instances of
the subclass have previously been stored, which allows existing applications to
run unmodified in most cases.
This behavioral change was made to increase reliability. In several cases, registering an entity subclass has been necessary as a workaround, as described here, for example. The requirement to register the subclass will ensure that such errors do not occur in deployed applications. [#16399]
To go along with this change, the EntityStore.truncateClass
method now removes all secondary databases rather than truncating them, so that
they will be auto-populated if they are accessed again.  The primary database
is truncated, as before. [#16399]
com.sleepycat.collections.TransactionRunner.handleException method
has been added to allow overriding the default transaction retry policy.  See
the javadoc for this method for more information.  [#16574]
java.lang.NullPointerException
    at com.sleepycat.persist.impl.ComplexFormat.checkSecKeyMetadata(ComplexFormat.java:1143)
    at com.sleepycat.persist.impl.ComplexFormat.evolveFieldList(ComplexFormat.java:1428)
    at com.sleepycat.persist.impl.ComplexFormat.evolveAllFields(ComplexFormat.java:1245)
    at com.sleepycat.persist.impl.ComplexFormat.evolve(ComplexFormat.java:1019)
    at com.sleepycat.persist.impl.Evolver.evolveFormatInternal(Evolver.java:440)
    at com.sleepycat.persist.impl.Evolver.evolveFormat(Evolver.java:248)
    at com.sleepycat.persist.impl.PersistCatalog.(PersistCatalog.java:357)
    at com.sleepycat.persist.impl.Store.(Store.java:180)
    at com.sleepycat.persist.EntityStore.(EntityStore.java:165)
   
java.lang.AssertionError
    at com.sleepycat.persist.impl.ComplexFormat.evolveFieldList(ComplexFormat.java:1327)
    at com.sleepycat.persist.impl.ComplexFormat.evolveAllFields(ComplexFormat.java:1245)
    at com.sleepycat.persist.impl.ComplexFormat.evolve(ComplexFormat.java:1019)
    at com.sleepycat.persist.impl.Evolver.evolveFormatInternal(Evolver.java:440)
    at com.sleepycat.persist.impl.Evolver.evolveFormat(Evolver.java:248)
    at com.sleepycat.persist.impl.PersistCatalog.(PersistCatalog.java:357)
    at com.sleepycat.persist.impl.Store.(Store.java:180)
    at com.sleepycat.persist.EntityStore.(EntityStore.java:165)
   
Thanks to Lukasz Antoniak for reporting
this bug accurately and clearly on OTN. [#16819]
READ_UNCOMMITTED isolation mode is used.  See
EntityIndex.keys for more information. [#16859]
Key field object may not be null was reported.
Thanks to Erick for reporting
this problem on OTN.
[#17011]
A bug was also fixed that prevented enum values from being inserted before existing values in an enum declaration. Now, new values may be inserted before existing values in the declaration, as well as appended to the end of the declaration. However, note that renaming and deletion of enum values is not supported. [#17140]
Comparable) for secondary keys defined as
ONE_TO_MANY or MANY_TO_MANY.  An example stack trace
is below.
java.lang.IllegalArgumentException: Key class is not a simple type or a composite key class (composite keys must include @KeyField annotations): java.util.Set at com.sleepycat.persist.impl.PersistKeyBinding.[#17207](PersistKeyBinding.java:38) at com.sleepycat.persist.impl.Store.getKeyBinding(Store.java:1294) at com.sleepycat.persist.impl.Store.setBtreeComparator(Store.java:1312) at com.sleepycat.persist.impl.Store.getSecondaryConfig(Store.java:1115) at com.sleepycat.persist.impl.Store.openSecondaryIndex(Store.java:666) at com.sleepycat.persist.impl.Store.openSecondaryIndexes(Store.java:636) at com.sleepycat.persist.impl.Store.getPrimaryIndex(Store.java:384) at com.sleepycat.persist.EntityStore.getPrimaryIndex(EntityStore.java:259) 
StoredCollection.removeAll.  This
method no longer iterates over all records in the stored collection.  Thanks to
ambber on OTN for suggesting and testing this improvement.  [#17727]
com.sleepycat.persist.evolve package.  [#16655]
(4.0.70)
InvocationTargetException to be
displayed (masking the real exception) when invoking a utility with the je.jar
file in this way:
java -jar je.jar <UtilityName>[#16649]
lib/je-android.M.N.P.jar file.  Rather than requiring the Android
application developer to modify and recompile the JE sources so that references
to javax.transaction.xa.* classes are removed, the jar file
can be simply included in the project's libs directory.  The
JE and Android directions reflect these
changes. (4.0.70)