1. Release Notes for 3.7.6

Overview

GemStone/S 64 Bitâ„¢ 3.7.6 is a significant new release of the GemStone/S 64 Bit object server, including a number of new features and feature enhancements and fixing several critical bugs.

This release also adds support for Debian and for installation using APT.

These Release Notes include changes between the previous version of GemStone/S 64 Bit, v3.7.5, and 3.7.6. If you are upgrading from a version prior to 3.7.5, review the release notes for each intermediate release to see the full set of changes.

For details about installing GemStone/S 64 Bit 3.7.6 or upgrading from earlier versions of GemStone/S 64 Bit, see the GemStone/S 64 Bit Installation Guide for v3.7.6 for your platform.

Upgrade

This release includes a new feature, Local passwordless login. This feature is disabled by default, and can be enabled/disabled on the command line. The upgradeImage script has been updated to use this feature, to avoid the security risk of persistently setting SystemUser’s password to the default during upgrade. upgradeImage now requires that you enable passwordless login. For details, see the Installation Guide for v3.7.6.

Supported Platforms

Platforms for Version 3.7.6

GemStone/S 64 Bit version 3.7.6 is supported on the following platforms:

  • Red Hat-compatible Linux 7.9, 8.10, 9.7, and 10.1; Ubuntu 22.04 and 24.04; and Debian 12 and 13, on x86_64.
    GemStone is tested on a mixture of Red Hat, CentOS, and Rocky; these are all considered fully certified platforms. Any reference to Red Hat applies to any Red Hat-compatible distribution.
  • Ubuntu 24.04 on ARM. Linux ARM is for development only, not for production.
  • macOS 15.7.5 (Sequoia) and 13.7.8 (Ventura), on Apple silicon (ARM)
    macOS distributions are for development only, not for production.
    GemStone no longer supports macOS on x86_64.

For more information and detailed requirements for each supported platforms, please refer to the GemStone/S 64 Bit v3.7.6 Installation Guide for that platform.

GemBuilder for Smalltalk (GBS) Versions

The following versions of GBS are supported with GemStone/S 64 Bit version 3.7.6:

GBS/VW version 8.8.1

VisualWorks
9.5

64-bit

VisualWorks
9.4.1

64-bit

VisualWorks
9.3.1

64-bit

VisualWorks
8.3.2

64-bit

VisualWorks
8.3.2

32-bit

  • Windows 11
  • RedHat ES 8.10 and 9.7; Ubuntu 22.04 and 24.04
  • Windows 11
  • RedHat ES 7.9, 8.10, and 9.7; Ubuntu 22.04 and 24.04
  • Windows 11
  • RedHat ES 7.9, 8.10, and 9.7; Ubuntu 22.04 and 24.04
  • Windows 11
  • RedHat ES 7.9, 8.10, and 9.7; Ubuntu 22.04 and 24.04
  • Windows 11
GBS/VA version 5.4.7

VAST Platform
13.0.1

VAST Platform
11.0.1

VA Smalltalk
8.6.3

  • Windows Server 2016 and Windows 11
  • Windows Server 2016 and Windows 11
  • Windows Server 2016 and Windows 11

For more details on GBS and client Smalltalk platforms and requirements, see the GemBuilder for Smalltalk Installation Guide for that version of GBS.

VSD Version

The GemStone/S 64 Bit v3.7.6 distribution includes VSD version 5.6.7. The previous release, v3.7.5, contained VSD v5.6.5. v5.6.6 was not released; v5.6.7 includes a minor feature enhancement, and is built with updated TCL libraries.

VSD 5.6.7 is included with the GemStone distribution, and can also be downloaded as a separate product from https://gemtalksystems.com/vsd.

Updated shared library versions

The version of openssl has been updated from 3.0.19 to 3.5.7.

The version of LZ4 has been updated to 1.10.0.

The version of zlib has been updated from 1.3.1 to 1.3.2.

Note that GemStone/S 64 bit and VSD now use the same version of LZ4 and zlib.

The version of tcllib has been changed from 1.19 to 1.21.

Changes in this Release

Local passwordless login

The historic GemStone upgrade process requires that you set the repository’s SystemUser password to the default. This is a security hole.

Other modern databases such as Oracle and PostgreSQL include features that allow login without a password under specific conditions.

Local passwordless login support has been added to GemStone. This feature is controlled by a new configuration parameter, STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED, which is disabled by default. For details on this parameter, STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED.

This feature is used by upgradeImage in v3.7.6. It must be enabled during the upgrade process; passwordless login can be enabled transiently and re-disabled immediately after upgrade, using new scripts.

With this configuration parameter enabled, any user (regardless of authentication scheme) can login with an empty password field, provided that all the following conditions apply:

  • The process logging in is running on the same host as the Stone.
  • The process is logging in linked (such as topaz -l).
  • The effective userId of the process logging in is the same as the effective userId of the Stone process.
  • The password is an empty String.

Use caution when enabling passwordless login, other than during upgrade. If you are running the Netldi in guest mode with captive account, and the captive account is the same user that started the Stone, then any RPC Gem started by that Netldi on the Stone’s node is running as the captive account’s Unix user. This Gem may be able to exploit passwordless login via triggering separate linked login.

Impact on Upgrade

GemStone upgrade now relies on the passwordless login, to avoid the security hole of setting SystemUser’s password to the default. The upgrade instructions have changed; before executing upgradeImage, you must enable passwordless login.

Please read the Installation Guide for v3.7.6 carefully for changes.

Enabling/Disabling passwordless login

STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED can be enabled and disabled at runtime.

  • The runtime parameter #StnLocalPasswordlessLoginsEnabled can be updated from Smalltalk code, by a session logged in as SystemUser.
  • New utility scripts are provided that enable and disable on the command line, respectively enablepasswordlesslogin and disablepasswordlesslogin.

enablepasswordlesslogin

enablepasswordlesslogin [ -h ] [ -l log ] -p systemUserPassword [ -s stoneName ]

-h

Display a usage line and exit

-l logfilepath

Full path to a log file for debugging. File is appended if it already exists. Default: /dev/null

-p systemUserPassword

The password for SystemUser. Required

-s stoneName

The name of a running stone. Default: gs64stone

Enable passwordless login for the specified Stone. This script logs in as SystemUser with the given password. Upon success, passwordless logins are enabled for all UserProfiles, as long as all the following conditions are true:

  • The process logging in is on the same host as the Stone.
  • The process is logging in linked (such as topaz -l).
  • The effective userId of the process logging in is the same as the effective userId of the Stone process.
  • The password is left blank, or set to an empty string ('').

The change made by this script is NOT permanent; the Stone will revert to the config file setting STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED on Stone restart.

disablepasswordlesslogin

disablepasswordlesslogin [ -h ] [ -l log ] [ -s stoneName ]

-h

Display a usage line and exit

-l logfilepath

Full path to a log file for debugging. File is appended if it already exists. Default: /dev/null

-s stoneName

The name of a running stone. Default: gs64stone

Disable passwordless login for the specified stone. This script assumes passwordless logins are already enabled and logs as SystemUser without a password. That login will fail, and this script will error, if passwordless logins were already disabled. Upon success, passwordless logins are disabled.

The change made by this script is NOT permanent; the Stone will revert to the config file setting STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED on Stone restart.

Image Changes

Support for translating PID to Session ID

The following method has been added, which can look up the sessionId based on the PID for a local or remote gem.

System class >> sessionIdForPid: aPid
Answer the session ID for the given gem process ID, or nil if no such gem exists.

Change in offset for _sessionStateAt: and _sessionStateAt:put:

GemStone provides access to an array of session state, which includes offsets that are reserved for GemStone internal values, and offsets for use by customer applications. Over the years, the range of offset reserved for GemStone has changed.

The original methods _sessionStateAt:/_sessionStateAt:put: were replaced by public methods sessionStateAt:/sessionStateAt:put: in v3.2. The methods _sessionStateAt: and _sessionStateAt:put: were deprecated. These methods were not updated for the new reserved range for GemStone internal session state; that has been corrected in this release (#51948).

If your application uses the deprecated _sessionStateAt:* methods, it is strongly recommended to upgrade these to use the public sessionStateAt:* methods.

You should see no issues if you only use _sessionStateAt:/_sessionStateAt:put: within an application. However, if you mix the use of _sessionStateAt:/_sessionStateAt:put: and sessionStateAt:/sessionStateAt:put: in the same session, or if you are accessing GemStone internal values using the underscore methods, the results may be inconsistent.

Removed Classes and Methods

The classes TrueClass and FalseClass, which were provided to support Ruby, have been moved to ObsoleteClasses, and are no longer visible.

The method System class >> encryptPassword:withSalt: has been removed, to avoid issues with library dependencies (GemStone did not run on RedHat v10 due to libxcrypt dependency).

Additional Stone log message when continuousRestore stops

In a hot standby system, when continuousRestoreFromArchiveLogs: exits, it prints messages about the shutdown of the working threads. Now it also explicitly reports the continuous restore shutdown, for example:

--- 04/15/26 15:38:26.136 PDT Continuous Restore stopped

Configuration parameter changes

STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED

The following configuration parameter has been added:

STN_LOCAL_PASSWORDLESS_LOGINS_ENABLED
A boolean which indicates if logins without a password are allowed when all of the following conditions are true:

1) The login is from a linked GCI application (e.g.: topaz -l).

2) The process is running on the same host as the Stone process.

3) The effective user ID of the process is the same as the effective user ID of the Stone process.

4) The password field is left blank or set to an empty string ('')

Must be set to TRUE during GemStone upgrades. Refer to the installation documentation for further details.

Runtime equivalent: #StnLocalPasswordlessLoginsEnabled

Default: FALSE

STN_LOGIN_LOG_ENABLED log file includes passwordless login

The output printed to the Login log, as enabled by the configuration parameter STN_LOGIN_LOG_ENABLED, includes a "Login authentication kind" field.

Logins that use the passwordless login process will be specified by a -2 value.

Changes in default configuration computations with many extent files

The calculation for system default values, such as the number of reclaim threads or AIO page servers, depends on the repository size, cache size, and number of extents, but was too heavily skewed by the number of extents. This computation has been adjusted to avoid producing unreasonable values for some configurations.

After upgrading to v3.7.6, please review the computed values documented in the Stone log against the defaults from earlier versions. These changes may affect your performance.

Explicit setting for STN_NUM_LOCAL_AIO_SERVERS was ignored

An explicit definition of STN_NUM_LOCAL_AIO_SERVERS in the configuration file used by the Stone was ignored, and a default value calculated based on extent size, repository size and cache size was always used. (#51969)

STN_COMMIT_TOKEN_TIMEOUT now configurable at runtime

The configuration parameter STN_COMMIT_TOKEN_TIMEOUT is now configurable at runtime, with the runtime parameter #StnCommitTokenTimeout. This may only be set by SystemUser.

Gslist now included in Windows Client

The GemStone Windows client now includes gslist.exe. While GemStone server processes do not run on Windows, using gslist on Windows with the -m option allows you to query for information on GemStone servers on a Linux or Mac host.

Cache Statistic Changes

Added Cache Statistic

Support has been added for tracking the time spent in FFI calls.

TimeInFfi (Gem)
Approximate total number of real milliseconds spent in FFI callouts.

Changed Cache Statistic

NextSleepTime for the StnAioThr stat type has been changed to NextSleepTimeUs

NextSleepTimeUs (StnAioThr)
NextSleepTimeUs is the number of microseconds that a free frame or extent write thread will sleep during the next sleep period. This value is adjusted based on cache pressure and checkpointing.

NextSleepTime for the FreeFrameThr stat type is unchanged.

Bug Fixes

The following bugs were present in v3.7.5 and are fixed in this version.

SEGV during in-memory garbage collection

Under rare circumstances, the in-memory garbage collector may have misidentified a non-oop pointer as an oop, when the garbage collection was triggered from an optimized (frameless) method. This resulted in a SEGV. (#51970)

Tranlog restore issues

Restore from logs failed on zero-sized tranlogs

Restore from transaction logs considers a tranlog with no records as invalid. However, a tranlog is created as an empty file, with a record written immediately afterwards. Using the split tranlogs feature, this may mean an empty tranlog is part of the sequence, and the timing of hot standby restore on some configurations can attempt to restore the empty tranlog and cause continuous restore to stop. This caused the restore to fail although the tranlog series was valid. (#51977, #51967)

In restore mode, it was possible to login after suspendLogins

System >> suspendLogins is designed to prevent user logins. This did not work when the repository was in restore mode. (#51962)

Tranlog restore may fail with gzipped tranlogs where transaction crosses starting checkpoint

When a transaction crosses the checkpoint in which tranlog replay should start, a gzip tranlog may cause restore from logs to hang or return without starting. (#51943)

File handle leak in split tranlogs

Using the split tranlogs feature (WORM tranlogs), a single logical tranlog is written to multiple smaller files, per a configurable time limit. There was a file handle leak when these tranlogs were replayed. (#52021)

Free frame and AIO pageservers did not limit scan regions

When running multiple of either of these types of pageservers, they should scan sections of the cache to distribute the work. They were scanning the entire cache, which is less efficient. This can lead to serious performance problems on systems with a very large SPC. (#51998)

Logout may SEGV if GsFile or GsSocket modified in a nested transaction

If an instance of GsFile or GsSocket is modified in a nested transaction and then committed, the subsequent logout SEGVed. (#51954)

Stone crash when remote cache cannot be found

When sessions are starting up, if a remote cache cannot be found, the code may SEGV. (#52017)

Stone crash when using JWT logins, due to buffer grow calculation

When loading data configured for STN_OPENID_DISCOVERY_URLS to support JWT logins, if the data is larger than the buffer such that the buffer is grown, the new size of the buffer not correctly computed and might not have been large enough to accommodate longer JSON strings. This resulted in a buffer overrun and SEGV. (#52019)

GemStone did not run on RedHat v10 due to libxcrypt dependency

RedHat v10 did not by default install libxcrypt-compat, which was required for GemStone to run. This dependency has been removed from GemStone. (#51854).

Stopping Stone with kill -TERM may not complete shut down immediately

Using kill -TERM on the Stone process performs a clean shutdown, similar to stopstone. However, the sequence of shutdown operations was slightly different between stopstone and kill -TERM, and after kill -TERM, there might be some delay before the shared memory segment was freed. The shutdown process for both stopstone and kill -TERM has been updated in this version to provide a clean shutdown; the lock file is not removed until all shutdown is complete. (#51945)

Cache warmer could hang reading working set

When the cache warmer warms a cache using the working set file, there are ways that invalid pages (with id -1, or out of range) may be introduced. Reading these invalid page ids from the working set file errored, which caused cache warming to hang. (#51584)

Send of dynamicInstVarPairs to a special object caused SEGV

Object >> dynamicInstVarPairs did not handle the case where the receiver is a special (Character, SmallInteger, etc.), and SEGVed. (#52002)

GCI and GCITS issues

Some GCI calls involving Symbol added String to the ExportSet

Objects returned from GCI calls are typically added to the PureExportSet on the GCI client, to ensure these are not garbage collected. The GciTsResolveSymbol, GciExecuteStrTrav, and GciExecuteStrTrav_ calls that return a Symbol, inadvertently added a String to the PureExportSet, causing the PureExportSet to grow. (#51976)

GciTsNbLogout had no effect if called while an *NbLogin is in progress

When a non-blocking login is in progress but not complete, sending GciTsNbLogout does not log out, and login may complete and stay logged in. (#51873)

libgcits has an undocumented dependency

It was possible for GCITS applications on windows to encounter failures to load a shared library. (#51823)

GciTsFetchUtf8Bytes did not handle a Utf16 argument

Invoking GciTsFetchUtf8Bytes with an argument that was an instance of Utf16 was not handled correctly; this returned -1 with the incorrect error 4137/NET_ERROR. (#51985)

ISOLatin objects errored on printOn:

ISOLatin >> printOn: errored when the argument was not a kind of PrintStream (#51980)

"fast" repository scan operations may use excessive threads

The "fast" versions of repository scan operations, such as fastMarkForCollection, are designed to use more system resources to complete faster. However, the calculation for the number of threads was excessive, increasing system load without improving scan progress. (#51951)

Remote cache timeout calculations not adequate

The processes that support remote caches are subject to a number of timeouts for startup and reconnect. The calculated remote cache page server timeout was incorrectly too small, resulting in disconnects where a reconnect was possible. (#52018)

ProgressCount percent for MFC did not account for free oops

The cache statistics ProgressCount allows you to see the progress of a repository scan over all OOPS in the repository. This is used to compute the percentage complete, which is reported periodically on stdout during an MFC. This computed percentage complete did not account for the number of FreeOops in the repository, and thus was potentially much lower than the actual percent complete. The percent complete cannot be determined precisely, but the estimate is now much closer to the actual percent complete. (#51952)

Listing References to Classes issues

fastListReferencesToInstancesOfClasses: excessive system load

Repository >> fastListReferencesToInstancesOfClasses: was not scalable on larger systems, due to inefficient code and a too-small buffer size. (#49957)

*ReferencesToInstancesOfClasses: did not handle recent special classes

The Repository methods allReferencesToInstancesOfClasses:, fastListReferencesToInstancesOfClasses:, etc. did not handle the special classes added in v3.6, including SmallDate, SmallDateAndTime, SmallScaledDecimal, and SmallTime. (#51876)

JwtSecurityData>>validateAudiences incorrect return value

This method accessed an incorrect variable, and did not produce correct results. (#52008)

Tranlog records for PersistentCounter values may be omitted

PersistentCounter updates (System persistentCounter* methods) should be written to the tranlogs; a case was found in which records for persistent counter updates were not flushed during a checkpoint, and could be missing from the tranlogs. (#51858)

Some cache statistics for pageserver threads are zero

The following statistics on pageserver threads are incorrectly all zero (#51939).

Affected statistics include:

DataPageReads

ObjectTablePageReads

BitmPageReads

OtherPageReads

TimeWaitingForCommit

TimeStoneCommit

TimeProcessingCommit

TimeWaitingForIo

PageReads

PageWrites

GemHasCommitToken

Changes and Bug Fixes for X509-Secured GemStone

The following changes only apply in X509-secured GemStone

Improved handling of X509 certificate expiration

When a certificate used to authenticate in X509-secured GemStone expires, the expiration was not clearly reported.

Now, the X509 Netldi and HostAgent will check for expired certs, and always refuse to start if a cert is expired. Note that if the cert expires while the Netldi or HostAgent are running, these will continue to run.

At startup of the X509 Netldi or HostAgent, they will print the expiration dates of all certs in their chain. These will also print a warning if any cert will expire within 30 days.

HostAgent name now has hostname rather than IP address

To support environments in which host names are more reliably unique than IP addresses, the HostAgent name (used in the lock file and reported by gslist) has been changed. Previously, this had the form:

hostagent-stonename-IPAddress (for example, hostagent-gs64stone-10.95.143.15)

now it is:

hostagent-stonename-hostname (for example, hostagent-gs64stone-lark).

GEMSTONE_CERT_DEBUG environment variable not working correctly

This environment variable is intended to support debugging certificate scripts in an X509-secure GemStone environment. It failed to correctly print output. (#51919)

SIGABRT/C Heap corruption during HostAgent shutdown

After the loss of a connection to a leaf Netldi, the HostAgent shutdown could report a SIGABRT. (#51957)