Changes in 20.3.26
The following changes were made in Oracle NoSQL Database Release 20.3.26 Enterprise Edition.
Bug and Performance Fixes
- Fixed a deadlock issue related to SSLDataChannel. The issue will
produce stack traces similar to the following in a thread dump:
[KVSTORE-1021]"ReplicaOutputThread" #829 daemon prio=5 os_prio=0 cpu=8695.34ms elapsed=66577.11s tid=0x000055f030c1f800 nid=0x49f2 waiting for monitor entry [0x00007fc720171000] java.lang.Thread.State: BLOCKED (on object monitor) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.run(SSLDataChannel.java:1425) - waiting to lock <0x00000010046df7e0> (a java.nio.HeapByteBuffer) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.access$1100(SSLDataChannel.java:1413) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.flush(SSLDataChannel.java:590) ...... "REPLICA rg15-rn2(2)" #68 daemon prio=5 os_prio=0 cpu=9106.65ms elapsed=68622.76s tid=0x000055f030c55800 nid=0xb24 in Object.wait() [0x00007fc722b93000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(java.base@11.0.8/Native Method) - waiting on at java.lang.Object.wait(java.base@11.0.8/Object.java:328) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelTask.transitToInProgress(SSLDataChannel.java:1335) - waiting to re-lock in wait() <0x00000010046e01b8> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.run(SSLDataChannel.java:1423) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.access$1100(SSLDataChannel.java:1413) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.doWrap(SSLDataChannel.java:910) - locked <0x00000010046df7e0> (a java.nio.HeapByteBuffer) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.handshake(SSLDataChannel.java:847) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.unwrap(SSLDataChannel.java:771) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.read(SSLDataChannel.java:403) ......
- Fixed a livelock issue related to SSLDataChannel. The issue is observed as an
inactive channel with either SSLDataChannel doWrap or doUnwrap. Stack traces
similar to the following will be seen in a thread dump:
[KVSTORE-1022]java.lang.Thread.State: RUNNABLE at java.lang.Object.hashCode(java.base@11.0.6/Native Method) at java.util.concurrent.ConcurrentHashMap.replaceNode(java.base@11.0.6/ConcurrentHashMap.java:1111) at java.util.concurrent.ConcurrentHashMap.remove(java.base@11.0.6/ConcurrentHashMap.java:1102) at com.sleepycat.je.utilint.LoggerUtils.logMsg(LoggerUtils.java:538) at com.sleepycat.je.utilint.LoggerUtils.logMsg(LoggerUtils.java:445) at com.sleepycat.je.rep.utilint.net.DataChannelFactoryBuilder$ChannelInstanceLogger.log(DataChannelFactoryBuilder.java:417) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.run(SSLDataChannel.java:1636) - locked <0x00000000f037cc80> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelWriteTask.access$1400(SSLDataChannel.java:1613) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.doWrap(SSLDataChannel.java:990) ...... java.lang.Thread.State: RUNNABLE at java.lang.Object.notifyAll(java.base@11.0.6/Native Method) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelTask.transitToIdle(SSLDataChannel.java:1513) - locked <0x00000000f039e788> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelReadTask.run(SSLDataChannel.java:1808) at com.sleepycat.je.rep.utilint.net.SSLDataChannel$ChannelReadTask.access$1800(SSLDataChannel.java:1751) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.readChannelForBufUnderflow(SSLDataChannel.java:1168) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.doUnwrap(SSLDataChannel.java:1079) - locked <0x00000000f0386f20> (a java.lang.Object) - locked <0x00000000f0386ea8> (a java.lang.Object) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.handshake(SSLDataChannel.java:930) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.unwrap(SSLDataChannel.java:828) at com.sleepycat.je.rep.utilint.net.SSLDataChannel.read(SSLDataChannel.java:441) ......
- Fixed a bug where, in rare cases, operations may return with the following
error:
[KVSTORE-880]java.lang.IllegalStateException: Expected state BEFORE_READ, was DONE at oracle.kv.impl.async.AbstractResultHandler.checkCallOnResult(AbstractResultHandler.java:71) at oracle.kv.impl.async.AbstractResultHandler.checkCallOnResult(AbstractResultHandler.java:49) at oracle.kv.impl.async.AbstractDelegatingResultHandler.onResult(AbstractDelegatingResultHandler.java:49) at oracle.kv.impl.async.AsyncVersionedRemoteDialogInitiator.onCanRead(AsyncVersionedRemoteDialogInitiator.java:157) at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.doWork(DialogContextImpl.java:1028) at oracle.kv.impl.async.dialog.DialogContextImpl$OnCanReadTask.run(DialogContextImpl.java:1017) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at oracle.kv.impl.async.dialog.nio.NioChannelExecutor.runTasks(NioChannelExecutor.java:1493
- Fixed a scalability problem for the storage nodes that when the storage nodes
have a limited CPU resource and a large number of client connections,
OutOfMemoryError may occur.
[KVSTORE-390]
- Fixed a bug in GROUP BY query based on full table scan that returns unexpected
results with specified size limit. The bug exists only on cloud environment.
[NOSQL-338]
- Fixed a bug that would cause an exception if a query compared a timestamp field
with a bind variable and the timestamp field is indexed. Also allow a timestamp
index to be used by a query that compares a timestamp field with a timestamp
value when the precisions of the timestamp field and the value are different.
[KVSTORE-950]
- Fixed a bug that would cause an exception if a bind variable were used in an ADD
clause of an UPDATE statement. This is when the bind variable is the new element
to add to the target array and there is no position expression. For example:
[KVSTORE-963]declare $userid integer; update teams t add t.info.teams[1].userids $userid where id = 1 returning *
- If a prepared proxy-based query was executed after its table was drooped, an NPE
would be raised. Now, a QueryException is raised.
[KVSTORE-920]
- Fixed a problem where RepNode or MasterRebalanceThread in StorageNode may exit
unexpectely due to uncaught InternalFaultException(s) when transient network
issues occur. In this case, the logging output shows both of them exit because
of SessionAccessException, which is incorrect and has also been fixed.
[KVSTORE-942]2021-02-12 10:16:26.575 UTC SEVERE [sn6] MasterRebalanceThread thread exiting due to exception. oracle.kv.impl.security.SessionAccessException: java.rmi.ConnectIOException: Exception creating connection to: ... 2021-02-12 10:16:26.575 UTC SEVERE [sn6] MasterRebalanceThread thread exiting due to exception. oracle.kv.impl.security.SessionAccessException: java.rmi.ConnectIOException: Exception creating connection to: ...
- Fixed a bug that using UPDATE statement with REMOVE clause to remove an element
from ARRAY(RECORD) or MAP(RECORD) fails with java.lang.IllegalArgumentException:
Error: at (...) Cannot remove fields from records.
[KVSTORE-1200]
- Fixed a problem where a row with an homogenous JSON array of type STRING written
with release 20.2 or earlier releases would fail to deserialize in release 20.3
or later releases . The issue shows up as a row that is not found in the result
of a get() or in results of queries that need to deserialize the row value. The
data remains intact but is not accessible.
[KVSTORE-1347]
- Fixed a problem where a query run on a table with data that was created prior to
release 19.5 and never modified might fail with an error that indicates
"modification time not available." The same error might occur if the
Row.getLastModificationTime() call is made on such a row.
[KVSTORE-1234]
- Fixed a bug where an RN could crash after an upgrade due to use of the wrong
version of serialization code during the upgrade.
[KVSTORE-1361]
- Fixed a bug preventing alterations to a table with a UUID column: rows inserted
before the schema evolution would not deserialize after the schema evolution.
[KVSTORE-1357]
- Fixed a problem where a put operation on a multi-region table that uses the
proxy (httpproxy) would fail with the error "The region id cannot be 0 for
multi-region table" .
[KVSTORE-1331]
API Changes
- Row.getExpirationTime() no longer throws an exception if the underlying Row
metadata is not available. Instead it will return 0 indicating no expiration.
Expiration time is 0 for rows that either do not have a TTL or were written
prior to the introduction of the TTL feature.
[KVSTORE-1234]