Changes in 22.2.12

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

New Features

  1. The Rep Node parameter 'enableErasure' now defaults to true, meaning that Obsolete Data Erasure is now enabled by default.

    When 'enableErasure' is set to true, this enables the erasure feature for the underlying BDB JE storage layer. Erasure periodically wipes the obsolete data from the storage layer, by zeroing out corresponding records. Obsolete data is data that is no longer returned in queries or scans because it has been replaced or expired, but still exists in the database. Note that only table and key/value data is erased. Table metadata is not subject to erasure.

    The Rep Node parameter 'erasurePeriod' specifies the duration for one complete erasure pass over data. Erasure is throttled based on this value, to minimize its impact on performance. By default, it is set to "6 DAYS".

    [KVSTORE-1483]

Bug and Performance Fixes

  1. Fixed a bug that in some cases could cause the XRegion Service to block for up to one hour before processing the next request to create or delete a table.

    [KVSTORE-1595]

  2. Fixed a bug that could cause elasticity operations to fail in some cases where partitions were moved back and forth between two shards.

    [KVSTORE-1547]

  3. Fixed a bug that a multi-region table would not be initialized correctly in some cases when the table was dropped and recreated in a remote region.

    [KVSTORE-1535]

  4. Added 95% and 99% percentile latency values to the XRegion Service statistics.

    [KVSTORE-1404]

  5. Fixed a bug in multi-region tables that, in some cases with high load, caused requests to create, alter and drop multi-region tables to become blocked inside the XRegion Service.

    [KVSTORE-1559]

  6. Fixed a bug in multi-region tables that stream operations from remote regions could in some cases be lost when the XRegion Service writes them to the local region.

    [KVSTORE-1542]

  7. Discovered that a bug fixed in the 21.1 release, but not previously reported, could have user-visible consequences. Prior to that release, checkpointing a multi-region table might cause some data to be lost during replication. In other words, some writes from one region might not be replicated to remote regions.

    [KVSTORE-772]

  8. Discovered that a bug fixed in the 21.1 release, but not previously reported, can have user-visible consequences. Prior to that release, checkpointing a multi-region table might cause a deadlock in data replication. If the issue is encountered, writes made to a multi-region table in one region may stop replication to remote regions, and network connections from remote regions might drop due to inactivity.

    [KVSTORE-1525]

  9. Fixed a problem that could cause a thread deadlock in the direct Java driver for applications that perform queries. The problem was seen in the httpproxy, which uses the direct Java driver for queries, but is not specific to it. The result was that the application would hang.
    Using the jstack utility to create a thread dump for the application showed two characteristic stack traces, which represent the two sides of the deadlock:
    "nioEventLoopGroup-3-11" #70 prio=10 os_prio=0 cpu=66.97ms elapsed=5790.89s tid=0x00007f6fdc017800 nid=0x9e in Object.wait()  [0x00007f6fecbf3000]
       java.lang.Thread.State: RUNNABLE
    	at oracle.kv.impl.api.table.FieldDefImpl.<clinit>(FieldDefImpl.java:90)
    	at oracle.kv.impl.query.types.TypeManager.<clinit>(TypeManager.java:378)
    	at oracle.kv.impl.query.compiler.FuncAndOr.<init>(FuncAndOr.java:38)
    	at oracle.kv.impl.query.compiler.FunctionLib.<init>(FunctionLib.java:169)
    	at oracle.kv.impl.query.compiler.CompilerAPI.<clinit>(CompilerAPI.java:41)
    	at oracle.nosql.proxy.sc.TableUtils.getCallbackInfo(TableUtils.java:567)
    	at oracle.nosql.proxy.DataService.handlePrepare(DataService.java:2032)
    	at oracle.nosql.proxy.DataService$$Lambda$354/0x0000000800551840.handle(Unknown Source)
    	at oracle.nosql.proxy.DataService.handleRequestWithContext(DataService.java:664)
    	at oracle.nosql.proxy.DataService.handleRequestInternal(DataService.java:451)
    	at oracle.nosql.proxy.DataService.handleRequest(DataService.java:424)
    	at oracle.nosql.proxy.DataService.handleRequest(DataService.java:399)
    	at oracle.nosql.proxy.DataService.handleRequest(DataService.java:355)
    And:
    "nioEventLoopGroup-3-9" #66 prio=10 os_prio=0 cpu=124.03ms elapsed=5791.14s tid=0x00007f6fdc015800 nid=0x98 in Object.wait()  [0x00007f7163aef000]
       java.lang.Thread.State: RUNNABLE
    	at oracle.kv.impl.api.table.FieldDefSerialization.readTimestamp(FieldDefSerialization.java:433)
    	at oracle.kv.impl.api.table.FieldDefSerialization.readFieldDef(FieldDefSerialization.java:346)
    	at oracle.kv.impl.api.table.FieldDefSerialization.readFieldDef(FieldDefSerialization.java:261)
    	at oracle.kv.impl.api.table.FieldDefSerialization.readRecord(FieldDefSerialization.java:380)
    	at oracle.kv.impl.api.table.FieldDefSerialization.readFieldDef(FieldDefSerialization.java:348)
    	at oracle.kv.impl.api.table.FieldDefSerialization.readFieldDef(FieldDefSerialization.java:261)
    	at oracle.kv.impl.query.runtime.PlanIter.deserializeFieldDef(PlanIter.java:1184)
    	at oracle.kv.impl.query.runtime.ReceiveIter.<init>(ReceiveIter.java:367)
    	at oracle.kv.impl.query.runtime.PlanIter.deserializeIter(PlanIter.java:876)
    	at oracle.kv.impl.api.query.PreparedStatementImpl.<init>(PreparedStatementImpl.java:550)
    	at oracle.nosql.proxy.DataServiceHandler.deserializePreparedQuery(DataServiceHandler.java:810)
    	at oracle.nosql.proxy.DataService.deserializePreparedQuery(DataService.java:2181)
    	at oracle.nosql.proxy.DataService.handleQuery(DataService.java:1661)
    	at oracle.nosql.proxy.DataService$$Lambda$353/0x0000000800552440.handle(Unknown Source)
    	at oracle.nosql.proxy.DataService.handleRequestWithContext(DataService.java:664)
    	at oracle.nosql.proxy.DataService.handleRequestInternal(DataService.java:451)
    	at oracle.nosql.proxy.DataService.handleRequest(DataService.java:424)

    [KVSTORE-1484]

  10. Fixed a bug where using Ctrl+C or Ctrl+D to terminate paginated output of a query running in the SQL shell would cause a NullPointerException.

    [KVSTORE-1521]

  11. Fixed an issue that prevented a storage node from starting when using Java 8 after calling the securityconfig merge-trust utility to merge a security configuration with Java keystores in PKCS12 format into a configuration with Java keystores in JKS format. The start command would fail with following message:
    Failed to start SNA: Error contructing RMISocketPolicy using transport class for transport client

    [KVSTORE-1594]

  12. Fixed a bug that the table description wrongly showed that JSON MRCounter fields were nullable. Users always need to set values for JSON MRCounters.

    [KVSTORE-1456]

  13. Fixed a bug that caused creating a child table that included a JSON MRCounter to fail with the following error message:
    Error: Error found when creating the table: Only multi-region tables support MR_counters.

    [KVSTORE-1458]

  14. Modified the implementation of KVStore.executeSync to reduce its thread usage by having it use async network operations.

    [KVSTORE-1072]

Utility Changes

  1. Added the "show ddl <table>" command to the SQL shell. The new command returns the DDL of a table and its indexes, if any.

    [KVSTORE-1479]

  2. The deprecated import/export utility and its related jar files (kvtool.jar, kvmigrator.jar, migrator.jar) have been removed and are no longer available. The old utility has been replaced by the standalone migrator utility, which is an independent download. It is available on the general Oracle NoSQL Database download page.

    [KVSTORE-1493]

  3. Fixed a regression that was discovered affecting query processing for a small number of Hive query types. Prior to fixing this regression, each query's state was always reset when the job properties were configured. Although this addressed an issue with Big Data SQL query processing, because Hive and Big Data SQL employ different code paths, it has recently been observed that resetting the query state when the job properties are configured can result in incorrect results for some Hive queries. To address this issue, the state from the most recent query is now reset at the beginning of query processing for the next query. This addresses both the old issue with Big Data SQL query processing and this new issue with Hive.

    [KVSTORE-372]

  4. Version.fromByteArray() will now throw IllegalArgumentException if the byte[] argument is invalid. It would previously throw FaultException.

    [KVSTORE-1599]