Changes in 12cR1.3.0.9

The following changes were made in Oracle NoSQL Database 12cR1.3.0.9.

New Features

  1. Modified the administrative CLI to save its command line history to a file so that it is available after restart. If you want to disable this feature, the following Java property should be set while running runadmin:

    java -Doracle.kv.shell.jline.disable=true -jar KVHOME/kvstore.jar runadmin -host <hostname> -port <portname>
    

    The CLI attempts to save the history in a KVHOME/.jlineoracle.kv.impl.admin.client.CommandShell.history file, which is created and opened automatically. The default history saved is 500 lines. If the history file cannot be opened, it will fail silently and the CLI will run without saved history.

    The default history file path can be overridden by setting the oracle.kv.shell.history.file=path Java property.

    The default number of lines to save to the file can be modified by setting the oracle.kv.shell.history.size=int_value Java property. [#22690]

  2. Modified the admin CLI aggregate command to provide subcommands for tables and key/value entries. The aggregate table subcommand performs simple data aggregation operations on numeric fields of a table, while the aggregate kv subcommand performs aggregation operations on keys. [#23258]

Bug and Performance Fixes

  1. Modified the implementation of index iterators to use weak references so that the garbage collector can remove the resources associated with unused index iterators. [#23306]

  2. Improved the handling of metadata propagation and other internal operations. [#23355], [#23368], [#23385]

  3. Modified the external tables integration to distribute the concurrent processing load more evenly across processes. [#23363]

  4. Fixed a problem where a failure during a partition migration performed during a topology redistribution for a store that has indexes resulted in SecondaryIntegrityExceptions being thrown when the migration was restarted. [#23392]

  5. Removed the FieldRange.setEndDate method, in favor of the existing setEnd method. [#23399]

  6. Modified schema evolution to prevent changes that could resurrect an old field using a different type. Such a change would cause old data to become unreadable by the current table. This fix prevents resurrection of a field name unless it exactly matches the previous definition. [#23403]

  7. Fixed a problem with handling network timeouts that could result in FaultException being thrown from KVStore operations instead of RequestTimeout when a timeout occurs. Here's a sample stack trace: [#23411]

    Caused by: oracle.kv.FaultException: Problem during unmarshalling (12.1.2.1.24)
    Fault class name: java.rmi.UnmarshalException
        at oracle.kv.impl.api.RequestDispatcherImpl.faultIfWrite(RequestDispatcherImpl.java:968)
        at oracle.kv.impl.api.RequestDispatcherImpl.handleRemoteException(RequestDispatcherImpl.java:883)
        at oracle.kv.impl.api.RequestDispatcherImpl.handleDispatchException(RequestDispatcherImpl.java:736)
        at oracle.kv.impl.api.RequestDispatcherImpl.execute(RequestDispatcherImpl.java:572)
        at oracle.kv.impl.api.RequestDispatcherImpl.execute(RequestDispatcherImpl.java:1031)
        at oracle.kv.impl.api.KVStoreImpl.executeRequest(KVStoreImpl.java:1251)
        at oracle.kv.impl.api.KVStoreImpl.putIfVersion(KVStoreImpl.java:990)
        at oracle.kv.impl.api.KVStoreImpl.putIfVersion(KVStoreImpl.java:968)
        [...]
        ... 41 more
    Caused by: java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
        java.net.SocketException: Socket closed
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:228)
        at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:161)
        at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:194)
        at java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:148)
        at com.sun.proxy.$Proxy21.execute(Unknown Source)
        at oracle.kv.impl.api.RequestHandlerAPI.execute(RequestHandlerAPI.java:94)
        at oracle.kv.impl.api.RequestDispatcherImpl.execute(RequestDispatcherImpl.java:560)
        ... 46 more
    Caused by: java.net.SocketException: Socket closed
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:121)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at java.io.ObjectOutputStream$BlockDataOutputStream.flush(ObjectOutputStream.java:1822)
        at java.io.ObjectOutputStream.flush(ObjectOutputStream.java:718)
        at sun.rmi.transport.StreamRemoteCall.releaseOutputStream(StreamRemoteCall.java:114)
        at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:212)
        ... 52 more
  8. Modified table iteration to optimize performance when all matching entries fall within a single shard. [#23412]

  9. Fixed an issue where the index scan iterator would fail to return records from a shard if there was a record that compared equal to a record from another shard. This situation occurred when there was more than one shard in a store and there were equivalent index entries for a given index in both shards. The symptom was index iteration returning fewer rows than expected. [#23421]

  10. Added several interfaces to the table package:

    • List<String>IndexKey.getFields() to return the fields used to define the index.

    • List<String>PrimaryKey.getFields() to return the fields used to define the primary key.

    • List<String>RecordValue.getFields() to return the fields used to define the record, in declaration order.

    • Map<String, FieldValue> MapValue.getFields() to return an immutable view of the map.

    The related javadoc was also updated to indicate that the lists and maps returned from these, and similar interfaces, are immutable. [#23433]

  11. The data Command Line Interface (CLI) has a method to input table rows from a file with a JSON representation. This input method had an issue where a blank line could cause an infinite loop in the input path. This has been fixed in a way that will result in silently skipping blank lines as well as comment lines (those whose first non-whitespace character is "#"). [#23449]

  12. Fixed handling of null values in indexed fields and in IndexKey. Previously, a null value in an indexed field could cause a server side exception. During a put, null values in indexed fields will result in no index entries for indexes in which that field participates. Further, null values are not allowed in IndexKey instances. IllegalArgumentException is thrown if an attempt is made to set a null value in an IndexKey. [#23588]

  13. Modified the Admin Service to listen on all interfaces on a host. This change permits deployment of KVStore in heterogeneous network environments, where a hostname may be resolved to different IP addresses to make the best possible use of the available network hardware. [#23524]