3.1.4 - 2023-07-17

Bug fixes

  • Fixed a bug where errors in the setup of the rhino-stats collection caused a memory leak. (#751399)

3.1.3 - 2023-02-02

Bug fixes

  • Fixed issue with rhino-export -R producing an invalid export when writing to a destination path containing multiple path segements. (#474399)

  • Fixed a memory leak when direct stats connections between cluster nodes, used for reporting local stats to the session-controlling node, are closed after a stats session ends. (#500827)

  • Fixed a bug in rhino-stats where identifiers set with the -I option were not quoted in CSV output despite containing commas. (#441687)

3.1.2 - 2022-12-09

Bug fixes

  • Fixed MemDB retained size accounting when the key for a deleted but not yet GC’d entry is reused. (#337944)

  • Added more restrictive permissions for temporary files. (#412308)

  • Fixed the parsing of a configured SNMP notification target to allow the - character in the middle of the hostname. (#423328)

Improvements

  • The LDAP login module now uses TLS by default. (#412311)

Dependencies

  • Updated com.fasterxml.jackson artifacts to 2.14.1.

  • Updated org.apache.common:commons-text to 1.10.0.

3.1.1 - 2022-08-05

Bug fixes

  • Fixed incorrect handling of a partial send failure, for the last message to send from the transmit queue, in Savanna scattercast. (#219477)

  • Fixed installer to save Cassandra contact points in the correct format when run with the -d option so subsequent installs don’t produce a corrupt config_variables file. (#220404)

  • Fixed generate-keystores.sh to log correct path names.

Improvements

  • Disabled XML entity resolution for unrecognized DTDs to avoid XML injection via remote entity resolution. (#207670)

  • Removed preconfigured SNMPv3 keys from the default configuration to reduce opportunities for unauthorised access. For new installs these keys must be set via the setsnmpuserdetails rhino-console command before enabling the SNMPv3 engine. By default only the v1 and v2c engines are enabled, this behaviour is unchanged.

  • Added a -N command-line option to rhino-console that disables output of the interactive mode input prompt. This can be useful in improving the readability of the output log when interactive mode is being used but console input is not a user terminal.

  • Removed the two unnecessary PrivilegedActionExceptions that wrapped the actual exception thrown when a command in a script file run by rhino-console failed.

  • Changed rhino-console to generate timestamped console history files and added some recovery behaviour into the console when errors occur updating a history file saved in the old format. The change to using timestamped history means that any non-timestamped commands present in an existing history file will be ignored. If you would like to copy an existing command history from a previous Rhino installation into an installation containing this change with the expectation of retaining the history, any timestamp can be added to each command in the history file so that jline will recognise them. This can be easily achieved using a shell command such as the following, which just prefixes a zero timestamp to every line in the history file. (Timestamps prefix each command as a Unix longint timestamp followed by a colon).

$ sed -ie 's/^/0:/g' rhino-console.history

Dependencies

  • Updated io.netty artifacts to 4.1.70 Final.

  • Updated org.postgresql:postgresql to 42.4.0.

3.1.0 - 2022-04-05

SNMP Static OIDs

Rhino 3.1 introduces a new model for defining SNMP static OIDs for SLEE components and their stats parameter set types. Its primary goal is to ensure stability of OIDs and MIBs between releases of Rhino-based products to eliminate the need for remapping OIDs during product upgrades. This alleviates operational concerns regarding solution monitoring stability after version upgrades and simplifies the overall upgrade process. The new model also aims to simplify exposed SNMP statistics where possible.

The static OID model is the preferred model for all new product development. The legacy OID model remains present and supported in Rhino for continued support of pre-existing products where necessary.

Dependencies

All third-party libraries used by Rhino have been updated to the latest available version, including:

  • Log4j2 to 2.17.1

  • Cassandra Datastax Java Driver to 4.13.0 (see the next section for important configuration information)

  • Derby database to 10.15.2

  • Oracle JDBC driver to (ojdbc10) 19.12.0.0

  • Postgres JDBC driver to 42.2.23

  • JLine, used in rhino-console, to 3.21.0

Significant changes to installation and configuration

  • Added several new username and password prompts during Rhino installation to allow easier separation of authentication credentials. Removed support for the DEFAULT_PASSWORD property during Rhino installation. Properties files from old automated installs should be regenerated to take into account changes to the installation script. Added minimum length password check during Rhino installation. (RHI-6244)

  • The DataStax Java Driver used by Rhino for Cassandra connectivity has been updated to version 4.13. Due to changes within the driver itself when moving to the 4.x series, the way the driver is configured has radically changed. This has required similarly significant changes to how Cassandra persistence instances are configured within Rhino. Details of how a Cassandra persistence instance is now configured is provided in the Rhino Administration and Deployment Guide. If a Cassandra persistence instance configuration exported from a previous version of Rhino is imported into this version, the import process will make a best-effort attempt to migrate the configuration to the new format. It is strongly encouraged, however, to manually review the configuration after import to determine correctness.
    Due to terminology changes in the new version of the DataStax driver, the identity of some Rhino alarms raised for connectivity issues to Cassandra in the key/value store and session ownership store have also changed. Where an alarm previously referred to a database "host", it now refers to a database "node" instead. For example, the rhino.cassandra-kv-store.no-hosts-available alarm has been renamed to rhino.cassandra-kv-store.no-nodes-available.
    For a full list of alarms raised by Rhino, see the Rhino Administration and Deployment Guide. (RHI-6671)

  • The JMXR Adaptor m-let has been updated to support binding to specific local network IP addresses and/or address ranges. It has a new constructor parameter in the mlet configuration file to support this, with new questions asked during the installation and new configuration properties in the config_variables file to reflect this change. (RHI-6764)

  • Removed the embedded version of Rhino Element Manager from the Rhino SDK. The standalone Rhino Element Manager package should be used instead.
    Removed OpenNMS example configuration files from Rhino production install package. (RHI-6831)

Bug fixes

  • Fixed a NullPointerException that could happen during convergence if a service that had been detected as needing a convergence check was uninstalled before the check actually occurred. (RHI-6330)

  • Fixed a NullPointerException that occurred when trying to create a resource adaptor entity of a resource adaptor that uses Rhino-extension usage parameter sets without specifying any of them as the root usage parameter set type. (RHI-6354)

  • Fixed a race condition in Session Ownership Activity end that could cause an UnrecognizedActivityHandleException if the activity became unreferenced while outstanding requests were still in progress. (RHI-6355)

  • Fixed the XML export of resource adaptors that define usage parameter sets using the Rhino-extension mechanism rather than the SLEE-defined mechanism. Ant tasks for recreating usage parameter sets for resource adaptor entities of these resource adaptors will no longer be generated as it’s not valid to create usage parameter sets using management operations when using the Rhino-extension mechanism. (RHI-6364)

  • Fixed a bug where long declarative config transactions could race with convergence to write the logging config file. (RHI-6367)

  • Fixed a bug which corrupted internal state and broke stats parameter sets when a profile table of a profile specification that defined a usage parameters interface was renamed. (RHI-6387)

  • Fixed a pessimistic lock ordering issue that could cause deadlock lock timeouts when profile queries using unindexed profile attributes were run concurrently. (RHI-6434)

  • The generate-system-report.sh script no longer copies the rhino-client.keystore file from production installs. (RHI-6465)

  • Fixed a generated code compile error that occurred when deploying a service containing an SBB that used a @PassByReference with permanent scope annotation on a CMP field whose type was storable via a clone() operation, e.g. various supported cloneable types just as java.util.Date and java.util.Bitset, or an array of a primitive, enum, or other immutable type. (RHI-6562)

  • Fixed an exception in the rhino-console listActiveAlarms command when an alarm was cleared while the command was executing. (RHI-6563)

  • Fixed an IllegalStateException that could occur in the external database storage thread if Rhino’s management or profile database was connected to multiple external database instances that needed resyncing at the same time. (RHI-6595)

  • File based configuration updates will now be atomic when supported by the execution environment. This removes the chance that empty or missing configuration files may occur during configuration updates. (RHI-6601)

  • Improved error handling when an invalid BulkStreamHandle is received by cluster state replication logic. (RHI-6602)

  • The deployment work directory for the Activity Context Naming Facility support classes will now be cleaned up before use on node restart if it already exists. This fixes a problem where Rhino may use a jar from a previous deployment rather than the current one, if the management database had been reinitialised without deleting the work directories. (RHI-6612)

  • MIBs exported from Rhino will no longer contain illegal (i.e. non-alphanumeric) characters in object identifiers generated from parameter set type counter names. These names will now be sanitised during the export in the same way that other names, e.g. parameter set type names, are sanitised. (RHI-6619)

  • SNMP MIB export will no longer generate MIB filenames that are too long for the filesystem. The new system property snmp.filename.max-length can be used in Rhino to change the maximum filename length if the default (255 characters) is not suitable. (RHI-6622)

  • Fixed incorrect MBean operation permissions on ResourceManagementMBean resource adaptor entity desired state mutator methods that allowed any user with read permission to change the desired state of a resource adaptor entity, more so without that activity being recorded in the management audit log. (RHI-6637)

  • Fixed a bug in actual state convergence after a declarative config state import that could cause reactivation of an originally active service to happen too early and thus fail when the service depended on a resource adaptor entity link name binding that needed to be moved to a different resource adaptor entity as a result of the import. The service activation could have potentially failed on any node other than the one with the lowest node ID. (RHI-6647)

  • Fixed a bug in declarative config import while verifying resource adaptor entity config properties whereby a resource adaptor was not able to access its usage parameter sets during the relevant callbacks. (RHI-6655)

  • Fixed an assertion error that led to corrupted internal state and possible convergence failures if key/value store replication was enabled and a resource adaptor entity of a resource adaptor not implementing ReplicatingResourceAdaptor was created using mixed or all activity replication. (RHI-6656)

  • Fix a bug in declarative import that ignored the deactivateAndReactivate resource adaptor entity reconfiguration action for any resource adaptor entity whose configuration properties did not actually change as a result of the import. This prevented the same resource adaptor entities from reaching convergence if they’d previously had their configuration properties updated by another declarative import using the doNotDeactivate reconfiguration action, were active, and did not support activate reconfiguration. (RHI-6662)

  • Fixed an AccessControlException in netty if /etc/os-release did not exist. (RHI-6669)

  • Fixed a race condition which could cause a SessionOwnershipActivity to rarely return an incorrect value from queryInProgress(). (RHI-6685)

  • Fixed a memory leak in the key/value store that occurred if a non-transactionally started activity was removed in its first generational update (for example, if no SBB processed any events fired on an activity during its lifetime) or if an activity remove transaction completed committing before a previous update transaction to the same activity completed committing. Also added a garbage collector into the key/value store that will clean up this kind of leaked state if it happens in other unknown circumstances. New configuration options for this garbage collector have been added in rhino-config.xml. (RHI-6724)

  • Fixed a spinning convergence issue that occurred if a logging configuration without a log level assigned to it was created for a resource adaptor entity. (RHI-6771)

  • Fixed a NullPointerException when importing a declarative configuration bundle that referenced a service with an install level of INSTALLED. (RHI-6802)

  • Removed -XX:CMSTriggerInterval option from Rhino defaults as it causes heap fragmentation (RHI-6830).

Improvements

  • Any action taken during a declarative state import which modifies the persistent state of a component will now be recorded in the management audit log as part of the import transaction. Each action is logged using an MBean operation that would effect an equivalent change. (RHI-6030)

  • A resource adaptor stats interface (i.e. using the Rhino-extension stats API rather than SLEE-defined usage) may now be described in code using the usage annotations in com.opencloud.rhino.facilities.usage as an alternative to deployment descriptor entries. (RHI-6356)

  • Added a new getActiveTransactions housekeeping command and associated rhino-console command as a more generic version of the existing getLongRunningTransactions operation. (RHI-6390)

  • Added a -maxpathlen option to the rhino-console exportmibs command which can be used to limit the length of the absolute path names generated for each of the exported MIB files. Limiting path name lengths is necessary for some SNMP tools (such as snmpwalk) to work correctly. (RHI-6443)

  • Added platform cluster topology stats which reports on the number of each type of node in the cluster (booting, event router, or quorum node) along with the quantity of event router nodes in each possible SLEE state (stopped, running, etc). (RHI-6609)

  • Added a command line option -S to rhino-console, which causes it to print out the completion status of each command when running in interactive mode. (RHI-6616)

  • Improved error behaviour and status reporting for rhino-console commands GetActivityInfo, GetSbbDiagnostics, RemoveSbb, and RemoveActivity. These commands will no longer fail if the targeted activity or SBB does not exist. (RHI-6681)

  • FLS statistics in GC logging are now enabled by default. (RHI-6713)

  • Added a --timeout option to stop-rhino.sh. This option specifies a maximum period to wait for a graceful shutdown to complete before terminating the node. (RHI-6722)

  • Unexpected arguments passed to stop-rhino.sh are now detected and rejected if they are found. (RHI-6742)

  • Added a maximum time interval between activity handler garbage collector cleanup checks so that cleanups will still occur in a lightly-loaded system that doesn’t generate much activity state churn. (RHI-6755)

  • Some exception messages reported to a management client when trying to do something to a resource adaptor entity that can’t currently be done due to its desired and/or actual state have been improved to make it clearer what the problem is. (RHI-6772)

  • After importing a declarative configuration that creates resource adaptor entity link name bindings and activates a service that depends on those bindings, the convergence task executor now recognises that dependency and won’t attempt to activate the service until the link names have been bound. This prevents a short-lived alarm from being raised if convergence attempts to activate the service first without the needed link name bindings being present. (RHI-6804)

  • Additional logging appenders, such as a syslog appender, can now be added (and removed again) from the management audit log (log key rhino.management.audit) and license audit log (log key rhino.license.auditor.log). (RHI-6809)

  • Added lockdowndeployableunits rhino-console command and associated PlatformRestrictionsConfigManagementMBean disableDeployableUnitModification() and isDeployableUnitModificationDisabled() MBean methods. This command disables modifications to Rhino’s deployment binaries. Once the lockdown has been activated, it cannot be reversed unless Rhino’s deployment state is cleared via a reinitialization of the management database. (RHI-6766)

  • The option for specifying a port for insecure (non-SSL) connections to the mlet has been removed. All connections must now use SSL. (RHI-6764)

Other changes

  • Added Microsoft to the list of officially supported JDK vendors. (RHI-6623)

  • Added Eclipse Foundation to list of unofficially supported JDK vendors. (RHI-6705)

3.0.0.17 - 2022-03-04

Bug fixes

  • Fixed an issue where replicated SLEE timers did not have globally unique timer identifiers, meaning a replicated timer failed over to another node could be confused in an SBB with a timer locally created on that node. (RHI-6761)

3.0.0.16 - 2021-12-20

Log4j 2 CVE-2021-44228

Updated Log4j 2 dependency to v2.17.0 in response to recent CVEs.

For background, please refer to: https://nvd.nist.gov/vuln/detail/CVE-2021-44228

Rhino and Rhino Element Manager (REM) versions 2.6.0.x, 2.6.1.x, 2.6.2.x, 2.7.0.x, and 3.0.0.x all depend on Log4j 2.

These releases all ship with default log patterns which include the use of %m{nolookups}. While originally included in the defaults for performance reasons, the inclusion of %m{nolookups} is also described as a "temporary mitigation" in some relevant security commentary, for example https://www.lunasec.io/docs/blog/log4j-zero-day/

As far as Rhino is concerned, internal testing has determined that even when the default logging configuration is modified to remove the %m{nolookups} pattern, no external lookups are possible via JNDI remote classloading.

Rhino uses JNDI to implement JSLEE specification requirements, and as such provides its own custom implementation of InitialContextFactory by specifying the java.naming.factory.initial setting in an embedded jndi.properties file. The JNDI contexts provided by this factory do not provide an LDAP lookup facility.

As a consequence of the custom JNDI contexts provided, Rhino is not thought to be vulnerable to any exploits of this nature.

Unlike Rhino, REM does not use a custom InitialContextFactory and will therefore be vulnerable if {nolookups} is removed from the default logging pattern.

Note that in addition to CVE-2021-44228, there are other CVEs fixed by updating to Log4j v2.17.0.

Accordingly, all releases of Rhino and REM that include Log4j 2 are being released with this updated Log4j dependency.

All releases prior to 2.6.0.x do not use Log4j 2, and therefore do not contain this vulnerability.

3.0.0.14 - 2021-11-11

Bug fixes

  • Improved error handling when an invalid BulkStreamHandle is received. (RHI-6602)

  • Fixed a memory leak in the key/value store that occurred if a non-transactionally started activity was removed in its first generational update (for example, if no SBB processed any events fired on an activity during its lifetime) or if an activity remove transaction completed committing before a previous update transaction to the same activity completed committing. Also added a garbage collector into the key/value store that will clean up this kind of leaked state if it happens in other unknown circumstances. New configuration options for this garbage collector have been added in rhino-config.xml. (RHI-6724)

Improvements

  • Add support for --timeout option to stop-rhino.sh. This option specifies a maximum period to wait for a graceful shutdown to complete before terminating the node. (RHI-6722)

  • Added Microsoft to the list of officially supported JDK vendors. (RHI-6623)

  • Added Eclipse Foundation to list of unofficially supported JDK vendors. (RHI-6705)

3.0.0.13 - 2021-09-07

Bug fixes

  • Fixed race condition which could cause SessionOwnershipActivity to rarely return an incorrect value from queryInProgress().

3.0.0.12 - 2021-08-18

Bug fixes

  • Fixed a NullPointerException that could happen during convergence if a service that had been detected as needing a convergence check was uninstalled before the check actually occurred. (RHI-6330)

  • The deployment work directory for the Activity Context Naming Facility support classes will now be cleaned up before use on node restart if it already exists. This fixes a problem where Rhino may use a jar from a previous deployment rather than the current one, if the management database had been reinitialised without deleting the work directories. (RHI-6612)

  • Fixed incorrect MBean operation permissions on ResourceManagementMBean resource adaptor entity desired state mutator methods that allowed any user with read permission to change the desired state of a resource adaptor entity, more so without that activity being recorded in the management audit log. (RHI-6637)

  • Fixed a bug where system property placeholders in SNMP fields would not be substituted. (RHI-6644)

  • Fixed a bug in actual state convergence after a declarative config state import that could cause activation of a service to happen too early and thus fail. This would happen when the service depended on a resource adaptor entity link name binding bound to a resource adaptor entity that needed to be created as a result of the import. The service activation could have potentially failed on any node other than the one with the lowest node ID. (RHI-6647)

  • Fixed a bug in declarative config import while verifying resource adaptor entity config properties whereby a resource adaptor was not able to access its usage parameter sets during the relevant callbacks. (RHI-6655)

  • Fixed an AccessControlException related to use of the Netty library where the /etc/os-release is not present. (RHI-6669)

3.0.0.11 - 2021-06-29

Bug fixes

  • Fixed a bug in convergence stats querying where getting the age of the oldest convergence task would throw an NPE if the task was completed concurrently. (RHI-6454)

  • Startup flags for start-rhino.sh such as -p and -s are now preserved for restart cycles (ie. when using the -k option) if the node was requested to activate the primary component but this failed for unexpected reasons causing the node to die. This means that the node will reattempt to activate the primary component on its next restart rather than forget it was asked to do so. (RHI-6468)

  • Fixed a bug in convergence scheduling which would add another convergence execution task for every recheck while not converged. (RHI-6596)

  • Added a system property ldap.casesensitive in LDAP login module to allow case-insensitive search. This property defaults to true to match prior behaviour. (RHI-6606)

  • Fixed a defect in the LDAP login module when groups without members caused authentication attempts to fall-back to a file based authentication (RHI-6607)

Improvements

  • Added platform cluster topology stats which reports on the number of each type of node in the cluster (booting, event router, or quorum node) along with the quantity of event router nodes in each possible SLEE state (stopped, running, etc). (RHI-6609)

  • Added statistics monitoring support for service links underneath the Services root parameter set. (Service links were previously only supported underneath the SLEE-Usage root parameter set.) (RHI-6573)

3.0.0.10 - 2021-06-03

Bug fixes

  • Fixed another issue where connections to the LDAP server are left open indefinitely, in this case only after an authentication failure while using search mode. (RHI-6585)

Improvements

  • Updated start-rhino.sh to exit with the return code of the Rhino process. (RHI-6597)

3.0.0.9 - 2021-05-03

Bug fixes

  • Fixed a pessimistic lock ordering issue that could cause deadlock lock timeouts when profile queries using unindexed profile attributes were run concurrently. (RHI-6434)

  • Fixed exception in the listActiveAlarms command when an alarm is cleared while the command is executing. (RHI-6563)

Improvements

  • Added a Life Time sample statistic to the Activities parameter set type. (RHI-6556)

  • Added statistics for garbage collection duration, interval and period, and for memory pool collection count and collected bytes. (RHI-6569)

3.0.0.7 - 2021-03-24

Bug fixes

  • Fixed a stack recursion bug that occurred if an SBB used an SbbLocalObject to invoke a method on itself from within sbbLoad(). (RHI-6379)

  • Ensure rhino.sh shutdown does not block if a shutdown is attempted while Rhino is starting up or already shutting down. (RHI-6439)

  • Fixed rhino-export functionality when handling unicode. (RHI-6463)

  • Fixed an issue where connections opened by Rhino to the authentication LDAP server are left open indefinitely. (RHI-6464)

3.0.0.6 - 2021-02-04

Bug fixes

  • Fixed a race condition in Session Ownership Activity end that could cause an UnrecognizedActivityHandleException if the activity became unreferenced while outstanding requests were still in progress. (RHI-6355)

  • Fixed a concurrency issue in profile table queries operating on non-indexed profile attributes that could lead to SBB transaction failure due to a javax.slee.NoSuchObjectLocalException being thrown mid-query if a profile had been concurrently removed by another transaction. (RHI-6429)

Improvements

  • Added "Red Hat, Inc." to the list of supported JVM vendors. Red Hat and CentOS JDK builds after 11.0.8 have this as the vendor string. Added a link to the Rhino compatibility guide from the warning message and alarm message about unsupported Java versions. (RHI-6389)

  • Include list of profile CMP field names in error messages for declarative imports that contain invalid field names. Declarative imports use CMP field names which are not otherwise visible to the user, so this helps troubleshoot problems with such imports. (RHI-6366)

3.0.0.5 - 2020-11-27

Bug fixes

  • Fixed an issue that could cause resource adaptor entity callbacks to be made out of FSM sequence. For example, an raInactive() callback could be made without the resource adaptor entity having previously received raActive() and raStopping() callbacks. (RHI-6302)

  • Added more validation logic to assess the supplied resource adaptor entity config properties when creating a resource adaptor entity or updating its config properties using ResourceManagementMBean. (RHI-6309)

  • Fixed NPEs that could occur when a resource adaptor entity or namespace was removed when the SLEE in the namespace was concurrently transitioning from the STOPPING to the STOPPED state. (RHI-6319)

  • Fixed a concurrency issue in internal resource adaptor entity state management that could cause an SBB to receive a javax.slee.UnrecognizedActivityException when trying to obtain an activity context for a legitimate activity. (RHI-6321)

  • Fixed encoding/decoding of declarative configuration so that both import and export paths use UTF-8 consistently. (RHI-6346)

Improvements

  • Added new management operations to ConfigManagementMBean to report on convergence completion status and to generate a full convergence report. Added a new management operation to NodeHousekeepingMBean to return a report of the default and per-node desired states of all stateful entities in the current namespace. Added corresponding rhino-console commands: isconverged, reportconvergencestatus, and listdesiredstates. (RHI-6180)

  • Replicated MemDB instances can no longer be configured with stripe counts greater than one due to the potential for corrupted state after node failures. (RHI-6318)

  • A default-sbb-tracer-levels element is now valid for service declarations in a declarative import config fragment. It allows tracer configs to be specified which will be automatically applied to all SBBs in the service during import, except where any of those SBBs define their own configuration for the same tracer(s). (RHI-6320)

  • XML exports from Rhino now include a task invocation to wait for convergence after every existing task that sets service or resource adaptor entity desired state. This ensures that each desired state change is fully applied before the next Ant task runs and prevents the import process from potentially failing due to lock timeouts caused by conflicts between further desired state updates and concurrent convergence-driven operations within Rhino. (RHI-6328)

  • Updated bundled Oracle JDBC driver to version 19.7. (RHI-6289)

  • Added new config import option to control resource adaptor entity deactivation and reactivation when configuration properties changes require a resource adaptor entity to be deactivated. Defaults to storing the new configuration but not deactivating the resource adaptor entity. (RHI-6290)

3.0.0.3 - 2020-10-05

Rhino 3.0.0 introduces two major new features: support for Java 11 and declarative configuration.

Java 11

Rhino 3.0.0 depends on and requires Java 11, with both Open JDK and Oracle JDK variants of Java tested and supported.

Due to the significant changes between the previously supported Java 8, and the more modern Java 11, this is expected to be disruptive for customers with custom developed applications deployed into Rhino. To assist with the version upshift, we have compiled notes based on our own experiences in updating applications. These can be found in the Rhino JDK11 Deployable Unit Migration Guide.

Rhino Declarative Configuration

Rhino 3.0 introduces a fundamental change to the way Rhino SLEE component configuration is handled. A new declarative configuration system decouples the configuration of components and their actual activation state from their declared desired state. This applies to Services, Resource Adaptor Entities, and the activation state of the SLEE. This allows the platform to be given an intended configuration, with Rhino asynchronously making the required component state transitions to achieve the new configuration. The goal of these changes is to both make component state easier to manage and to facilitate more flexible and reliable integration with cloud-based solutions and modern configuration management approaches.

With these changes comes the deprecation of the symmetric activation state mode. This is replaced by a combined model where the SLEE, Services, and Resource Adaptor Entities may each concurrently have both 'default' and 'per-node' desired state. Per-node state is optional and can be created (and removed) as required as a node-specific override to the cluster-wide default state.

Complementing the new configuration system, a new declarative import/export format has been introduced (see importdeclarativeconfig/exportdeclarativeconfig in rhino-console) which can be used to atomically make changes to the desired configuration of Services, Resource Adaptor Entities, SLEE activation state, and Profiles, with changes not being applied in the event that any of the changes would fail, for example due to profile validation errors.

New Ant tasks have been added for the management of desired state (SetServiceDesiredStateTask, SetRAEntityDesiredStateTask, WaitTilConvergedTask) and these have been integrated into the imperative-style configuration exports produced by the exportall rhino-console command. Older exports should continue to work assuming the included deployable units are also still compatible with Java 11.

It should be noted that the new declarative configuration functionality covers the management of Service configuration and activation state, Resource Adaptor Entity configuration and activation state, SLEE activation state, and Profile Tables and Profiles. The remainder of the platform state, in the form of deployable units, service bindings, core platform configuration and the like is not covered by these changes. REM has not been updated with explicit handling of the new declarative functionality. Management applications built against pre-3.0 versions of Rhino should continue to function as the superseded imperative state management APIs have been updated to ensure backwards compatibility where possible.

Please see the Declarative Configuration section of the Rhino Administration Guide for more complete information regarding the concepts, terminology, and management examples using the new declarative configuration functionality. A quick listing of the new declarative configuration commands can be found in rhino-console under help declarative.

Bug fixes

  • Rhino now raises an alarm upon node restart if no valid platform license is installed. (RHI-5647)

  • Fixed a memdb state referencing issue that in rare circumstances could have led to invalid state being accessed. (RHI-5858)

  • Fixed JMX API compliance bug in LoggingManagementMBean. The getLoggingProperties method now returns Map<String,String>. (RHI-5891)

  • Fixed an issue where the SAS facility would throw a NullPointerException if getting the trail for an activity failed because the activity was not known to Rhino. (RHI-5893)

  • Fixed a database concurrency exception that occurred when committing a user transaction if that transaction had at some point attempted to create a profile already created by a concurrent user transaction. (RHI-6011)

  • A component that is shadowing other components can no longer be uninstalled from the SLEE until the shadows are removed. (RHI-6026)

  • rhino-console commands which manipulate profile attributes can now include commas in array entries by double-escaping the comma character. e.g. "[Entry1, Entry2\\, with comma, Entry3]". Ant tasks for manipulating profile attributes can also now include commas in array entries, but require a single escape slash instead of double. e.g. "[Entry1, Entry2\, with comma, Entry3]". (RHI-6095)

  • Fixed a lack of namespacing bug with lock manager stats parameter sets for replicating resource adaptor entity activity handlers. This resulted in replicating resource adaptor entities with the same name in different namespaces to share the same lock manager stats parameter set, which generally was fine until one of the resource adaptor entities was removed. This caused the shared stats parameter set to be removed, which meant that the resource adaptor entities in other namespaces could no longer be removed without error, and that led to classloader leaks. (RHI-6167)

  • Fixed an issue with scattercast management operations that would cause a java.lang.AssertionError: Scattercast Management command initiated while another is executing after processing multiple scattercast management requests on different nodes. (RHI-6178)

  • Fixed non-unique referencing of deployable units across namespaces during node start component redeployment which could have caused dependent components to be redeployed earlier than they should have been when deployable units with the same URL were deployed into multiple namespaces. (RHI-6187)

  • Fixed an event router race condition that could cause an event scheduled for processing to be erroneously delivered if its associated activity was suspended for delivery concurrently with the processing of that event. (RHI-6188)

  • Fix two bugs when creating a SessionOwnershipActivity. The invoking SAS trail was not propagating to the newly created SessionOwnershipActivity. A race could occur between the create, attach, and querying the Session Ownership Store and a Session Ownership event being delivered. This could result in the first Session Ownership event being delivered without invoking the attached SBB entity. (RHI-6211)

  • Fixed unpredictable file handle usage during deployment operations caused by missing file manager close after internal javac compilation. The related file handles would historically be leaked until garbage collected. (RHI-6220)

  • Fixed a heap leak that occurred when the logging configuration was updated frequently. (RHI-6229)

  • Fixed a memory leak that occurred whenever a stats parameter set was deregistered within Rhino, for example when a service was undeployed. (RHI-6230)

  • Fixed a thread leak when removing a user-defined namespace where the SLEE was not in the STOPPED state. (RHI-6250)

  • Fixed a thread leak when replicated resource adaptor entities are removed from the SLEE. (RHI-6252)

  • Fixed a bug that prevented resource adaptor entity raInactive() callbacks being made at the appropriate time when the SLEE was in the STOPPING state. (RHI-6260)

  • Fixed a NullPointerException when adding a service binding to an unverified copied service component. (RHI-6268)

  • Fixed an untended retention of some OCBB state when idle OCBB persistent state objects were stored in their object pool. (RHI-6293)

Improvements

  • Added basic exit code handling for rhino-console.

    rhino-console will now return with a non-zero exit code if there were usage errors or errors during command execution.

    To restore the exit code behaviour from previous Rhino versions (where failed command execution did not return with an error code), uncomment the rhino.console.legacy-exit-codes=true line in client/etc/rhino-console.properties.

    See rhino-console --help for full list of exit codes. (RHI-3202)

  • The session ownership store now has a configurable cap on the maximum number of outstanding requests that can be queued for processing. A request is immediately failed if queuing it would exceed the queue capacity limit. (RHI-5898)

  • Added new flushconfiguration rhino-console command and associated RhinoHousekeeping flushConfiguration() MBean method.

    This command blocks until all currently unpersisted changes to configuration have been persisted to the management database.

    This is not required during normal use as changes are usually persisted almost immediately, but is instead intended automated environments where guarantees regarding configuration persistence are desired. (RHI-5956)

  • Profile attributes of type (or subtype of) java.util.Map now appear by default in exported profile data as structured key/value pairs rather than a single object blob. A new annotation @com.opencloud.rhino.cmp.codecs.ProfileMapCodec has been added which can be used to customise how map keys and values are exported and imported if their respective types are not automatically supported by Rhino. (RHI-5990)

  • Increased from 500 to 1500 the maximum number of profiles that a Rhino export will allow in a profile table before requiring the user explicitly select between a JMX or snapshot export. (RHI-6111)

  • Added housekeeping operations to report on the current status of key/value stores and the session ownership store in terms of whether or not all relevant keyspace and table updates have been successfully propagated to the backend Cassandra database(s). (RHI-6143)

  • Added a new transaction ID field to the management audit log. This reports a transaction ID when a user-managed transaction is in effect so that management operations connected to that user transaction are more easily identifiable. (RHI-6198)

  • Session Ownership Activities will now implicitly end in the SLEE if they are unreferenced by SBB entities, SLEE facilities, etc (ie. in the same way that Null Activities can implicitly end). An SBB must attach to a Session Ownership Activity or create a reference to it elsewhere, for example by using the Activity Context Naming Facility to bind it to a name if it wishes to keep the activity alive. Session Ownership Activities can of course still be ended explicitly by using the endActivity() method. (RHI-6200)

  • New node shutdown and reboot management APIs have added to the SleeManagamentMBean. In difference to the pre-existing APIs, these new operations do not affect a node’s existing desired state, ie. a node that restarts after such a shutdown will (attempt to) return to exactly the same state it had prior to shutdown. The new restart operations also function correctly with user-defined namespaces (whereby the pre-existing implementation did not). The slee.sh, rhino.sh, and other similar node management scripts have been updated to default to the new shutdown/restart behaviour. The pre-existing behaviour can still be obtained however, if necessary, using the -legacy-mode command-line option as detailed in each script’s usage help message. (RHI-6204)

  • Updated the RhinoConnection interface to extend java.io.Closeable. This allows consumers of this interface to use try-with-resources to ensure that the connection is closed when they have finished using it. (RHI-6222)

  • Tweaked internal javac compilation to use UnsharedNameTable instead of SharedNameTable. This eliminates heap retention via SoftReferences and provides more reliable heap behaviour during deployment operations. In the unlikely event this causes compilation problems in untested JVMs, the use of SharedNameTable can be reverted to using the undocumented internal 'com.opencloud.util.javac.sharednametable=true' system property. (RHI-6258)

New Features

  • Defined new PartitioningFacility and PartitionedActivityHandle interfaces, and extensions to the ReplicatedStorageFacility, that allow a resource adaptor to group related activity state together when it’s stored in the Cassandra key/value store. (RHI-5888)

  • Profile table create and remove are now also supported within user-managed transactions. (RHI-5906)

  • Added waittilconverged rhino-console command and Ant task that pauses further command/task execution until Rhino reaches convergence between desired and actual states. (RHI-5942)

  • Added a new boolean system property rhino.slee_restricted_lifecycle which can be used to restrict some of the flexibility offered with the new declarative state changes when using legacy APIs for SLEE state management. Specifically it restricts the SLEE start/stop operations such that they consider current actual state as well as desired state when determining whether or not the operation is valid in the current state. For example, when this option is enabled, a SLEE with a desired state of stopped can only be started if its current actual state is also stopped. Without this option enabled (the default), the operation only looks at current desired state when determining validity. (RHI-6008)

  • Added exportdeclarativeconfig and importdeclarativeconfig commands to rhino-console for managing declarative configurations. A declarative export is also possible using the new -d option with the existing rhino-export command-line tool. (RHI-6110)

Other Changes

  • The free-memory watchdog has been removed from Rhino due to the occasional spurious reporting of heap stats by the JVM. (RHI-6070)

  • Windows .bat scripts have been removed. Windows support is now provided via WSL. (RHI-6156)