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.BtreeStats
com.sleepycat.je.CommitToken
com.sleepycat.je.DatabaseEntry
com.sleepycat.je.DatabaseException
com.sleepycat.je.DatabaseExistsException
com.sleepycat.je.DatabaseNotFoundException
com.sleepycat.je.DatabaseStats
com.sleepycat.je.DeadlockException
com.sleepycat.je.DeleteConstraintException
com.sleepycat.je.DuplicateDataException
com.sleepycat.je.EnvironmentFailureException
com.sleepycat.je.EnvironmentLockedException
com.sleepycat.je.EnvironmentNotFoundException
com.sleepycat.je.EnvironmentStats
com.sleepycat.je.ForeignConstraintException
com.sleepycat.je.LockConflictException
com.sleepycat.je.LockNotAvailableException
com.sleepycat.je.LockNotGrantedException
com.sleepycat.je.LockStats
com.sleepycat.je.LockTimeoutException
com.sleepycat.je.LogWriteException
com.sleepycat.je.OperationFailureException
com.sleepycat.je.PreloadStats
com.sleepycat.je.PreloadStatus
com.sleepycat.je.RunRecoveryException
com.sleepycat.je.SecondaryConstraintException
com.sleepycat.je.SecondaryIntegrityException
com.sleepycat.je.SecondaryReferenceException
com.sleepycat.je.SequenceExistsException
com.sleepycat.je.SequenceIntegrityException
com.sleepycat.je.SequenceNotFoundException
com.sleepycat.je.SequenceOverflowException
com.sleepycat.je.SequenceStats
com.sleepycat.je.ThreadInterruptedException
com.sleepycat.je.TransactionStats
com.sleepycat.je.TransactionStats.Active
com.sleepycat.je.TransactionTimeoutException
com.sleepycat.je.UniqueConstraintException
com.sleepycat.je.VersionMismatchException
com.sleepycat.je.XAFailureException
com.sleepycat.je.jca.ra.JEException
com.sleepycat.je.rep.DatabasePreemptedException
com.sleepycat.je.rep.GroupShutdownException
com.sleepycat.je.rep.InsufficientAcksException
com.sleepycat.je.rep.InsufficientLogException
com.sleepycat.je.rep.InsufficientReplicasException
com.sleepycat.je.rep.LockPreemptedException
com.sleepycat.je.rep.LogOverwriteException
com.sleepycat.je.rep.MasterStateException
com.sleepycat.je.rep.MemberNotFoundException
com.sleepycat.je.rep.ReplicaConsistencyException
com.sleepycat.je.rep.ReplicaWriteException
com.sleepycat.je.rep.ReplicatedEnvironmentStats
com.sleepycat.je.rep.RestartRequiredException
com.sleepycat.je.rep.RollbackException
com.sleepycat.je.rep.RollbackProhibitedException
com.sleepycat.je.rep.StateChangeException
com.sleepycat.je.rep.UnknownMasterException
com.sleepycat.je.util.LogVerificationException
com.sleepycat.persist.IndexNotAvailableException
com.sleepycat.persist.StoreExistsException
com.sleepycat.persist.StoreNotFoundException
com.sleepycat.persist.evolve.DeletedClassException
com.sleepycat.persist.evolve.IncompatibleClassException
NullPointerException
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_COLD
EVICT_LN
EVICT_BIN
The CacheMode
is configurable using new database and
environment properties:
DatabaseConfig.setCacheMode, getCacheMode
EnvironmentConfig.setCacheMode, getCacheMode
Note 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.
DatabaseExistsException
DatabasePreemptedException
DeleteConstraintException
DuplicateDataException
EnvironmentNotFoundException
ForeignConstraintException
LockConflictException
LockNotAvailableException
LockPreemptedException
LockTimeoutException
LogOverwriteException
LogWriteException
SecondaryConstraintException
SecondaryIntegrityException
SecondaryReferenceException
SequenceExistsException
SequenceIntegrityException
SequenceNotFoundException
SequenceOverflowException
ThreadInterruptedException
TransactionTimeoutException
UniqueConstraintException
VersionMismatchException
XAFailureException
DatabaseException
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_TIMEOUT
EnvironmentConfig.TXN_TIMEOUT
EnvironmentConfig.LOG_FSYNC_TIMEOUT
EnvironmentConfig.ENV_BACKGROUND_SLEEP_INTERVAL
EnvironmentConfig.COMPRESSOR_WAKEUP_INTERVAL
EnvironmentConfig.COMPRESSOR_LOCK_TIMEOUT
EnvironmentConfig.CHECKPOINTER_WAKEUP_INTERVAL
EnvironmentConfig.CLEANER_LOCK_TIMEOUT
In 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_MIGRATION
EnvironmentConfig.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.Thanks to Lukasz Antoniak for reporting this bug accurately and clearly on OTN. [#16819](PersistCatalog.java:357) at com.sleepycat.persist.impl.Store. (Store.java:180) at com.sleepycat.persist.EntityStore. (EntityStore.java:165)
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)