Changes in 20.3.26

The following changes were made in Oracle NoSQL Database Release 20.3.26 Enterprise Edition.

Bug and Performance Fixes

  1. Fixed a deadlock issue related to SSLDataChannel. The issue will produce stack traces similar to the following in a thread dump:
    "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)
    	......
    [KVSTORE-1021]
  2. 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:
       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)
        ......
    
    [KVSTORE-1022]
  3. Fixed a bug where, in rare cases, operations may return with the following error:
    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
    [KVSTORE-880]
  4. 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]

  5. 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]

  6. 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]

  7. 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:
    declare $userid integer;
    update teams t
    add t.info.teams[1].userids $userid
    where id = 1
    returning *
    [KVSTORE-963]
  8. 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]

  9. 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.
    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:
    ...
    [KVSTORE-942]
  10. 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]

  11. 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]

  12. 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]

  13. 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]

  14. 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]

  15. 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

  1. 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]