5. Bug Fixes

Previous chapter

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

Checkpoint when tranlogs full can result in Stone shutdown

When the transaction logs are full, the Stone pauses to wait for space to become available. If a checkpoint starts while the Stone is waiting, it may have resulted in the Stone shutting down. (#49704)

Cache warming could have caused commit record backlog

Cache warming runs in transaction, and when performing a large amount of warming over a slower connection, it could result in a commit record backlog. Now, while still running in transaction, cache warming monitors the commit record backlog and aborts if necessary. (#48419)

A stuck login with UserSecurityData locked may block further logins

During login, the session briefly locks the UserSecurityData for update. If the login process has problems and does not complete, so the UserSecurityData remains locked, further logins for that user may fail. (#49866)

When commits suspended, symbol creation causes SymbolGem failure

When commits are suspended (as by Repository>>suspendCommitsForFailover), the SymbolGem cannot commit. If a symbol is created (e.g. by executing code), the SymbolGem errored and shutdown, and the Gem hung. (#50185)

Finding references failed to report objects in large IdentityBags

The operations allReferences:, findAllReferences, and findReferences do not include references for an objects in a large IdentityBag (more than 2K elements). (#40163)

Backup and Restore issues

Very slow restore of compressed tranlogs

Restoring compressed tranlogs is unusably slow; the restore is doing excessive seeks due to a prematurely cleared buffer. This affects both gzip and lz4 compressed tranlogs. (#50692)

Backup to a file could produce unclear error message

When making a programmatic backup and including a directory with the pathname, the error message reported was not helpful. (#50239)

Commit as restoreFromBackup starts could cause Stone shutdown

When restoreFromBackup: is initiated, another session such as the SymbolGem or ReclaimGem could commit. This would cause the Stone to shutdown. The restore code now checks for this condition and errors. (#50184)

RcIdentityBag >> remove:otherwise: errored

The inherited implementation was not appropriate for RcIdentityBag, so this method errored; an RcIdentityBag-specific method has been added. (#50588)

Issues with stacks and memory stats when using setcap to enable LargeMemoryPages or OOM killer protection

To configure Linux to allow huge pages, to protect critical processes from the Linux OOM killer, and to lock the shared page cache in memory, the Installation Guide directed using setcap to provide specific capabilities to GemStone executables. Setting these capabilities has the effect of preventing gdb from attaching to generate C stacks, and statmonitor from collecting certain host process statistics. (#50580).

Bugs in Configuration Parameters

Improved distribution over extents for DBF_ALLOCATION_MODE

Previously, allocation to extents was by free pages, not by extent size, which meant that in certain configurations the extents would not grow per the weights in DBF_ALLOCATION_MODE. (#49992)

Computation of SHR_PAGE_CACHE_NUM_PROCS too small

When SHR_PAGE_CACHE_NUM_PROCS is default (-1), it computes a value based on STN_MAX_SESSIONS and other configuration parameters. This computation was incorrect, resulting in a value that was somewhat smaller than necessary, in the case where every slot was required. (#49458)

Numeric and Time related issues

Float = and ~= always returned false for SmallScaledDecimal arguments

The primitives supporting the Float methods = and ~= return false, rather than failing the primitive, for SmallScaledDecimal arguments. This bypasses the handling that converts the SmallScaledDecimal to a comparable value. (#50597)

A Time did not compare equal to equivalent SmallTime

A SmallTime and a Time that represent equivalent points in time did not compare as equal using = (equal sign). (#50118)

SmallDateAndTime passivate activate failed for years 2035-2072

Activating a passivated SmallDateAndTime in the approximate year range 2035 to 2072 errored; the activation expected a SmallScaledDecimal value in the internal storage, but the stored value was not in the SmallScaledDecimal range. (#50172)

CharacterCollection >> isDigits incorrect for empty string

For an empty String, this method incorrectly returned true. (#50145)

Float >> asDecimalFloat results not as precise as possible

For many values, converting a Float to a DecimalFloat using asDecimalFloat returned a result that was not the closest possible DecimalFloat to the given Float. (#50212)

isExceptionalFloat returned true for subnormal numbers

The method Float>>isExceptional incorrectly returned true for subnormal Floats. Subnormal values are not exceptional; exceptional numbers are limited to infinity and NaN (not a number) values. (#50378)

$GEMSTONE paths containing symlinks

The NetLDI and gemnetobject and related scripts did not properly handle the case where the $GEMSTONE path included a symbolic link, and the target of the symbolic link changed while the NetLDI was running. The gemnetobject (and related scripts) used the current value of $GEMSTONE, rather than the argument from the NetLDI, which created an unclear state.

Now, if the resolved $GEMSTONE in the environment in which login is initiated does not match the $GEMSTONE path resolved when the NetLDI was started, login will fail with the message "expanded value of GEMSTONE environment variable changed" (#50173)

As a result, logins will also fail if the sys directory within the GemStone distribution is a symbolic link. This is not a supported configuration. The error reported to topaz on login is "socket read EOF"; the actual error message is in the gem log.

File handle leak in GsTsExternalSession

In-memory GC of a logged-in GsTsExternalSession caused a file handle leak (#50624)

stoned exited with code 3 on clean shutdown

On a clean stone shutdown using stopstone, stopstone exited with code 0. However, the stoned process itself exited with code 3. Now, stoned will exit with code 0 on clean stopstone. (#50222)

FFI structures may fault out of memory and lose C data

There are cases in which CByteArrays and CPointers that used by FFI can be committed, faulted out, and lose C data when faulted in. (#49769).

Recent releases include workarounds to avoid the subsequent Gem crash due to bug 49765; the underlying condition is fixed in v3.7.

Lost InterSessionSignal or other interrupt

Due to non-atomic updates in signal handling, it was possible for an InterSessionSignal to be lost or delayed, or other interrupt to be handled incorrectly; this might, for example, cause failure to respect a socket read or write timeout. (#49877)

GsHostProcess could not redirect stdout and stderr to same file

To redirect both stdout and stderr to the same disk file, it did not work to individually specify the path for each. A new method has been added to support this use case: GsHostProcess >> redirectStderrToStdout. (#50445)

GsSignalingSocket >> acceptTimeoutMs: may fail when receiver is a GsSecureSocket

Due to an inappropriate use of _peek:, GsSignalingSocket >> acceptTimeoutMs: failed when the receiver was an instance of GsSecureSocket. (#50504)

asJson problems with Date, Time, DateTime, and DateAndTime

The results produced by sending asJson were empty for instances of Date, Time, and DateAndTime. While DateTime produced a valid string, it was not quoted correctly. (#50391)

Upgrading did not preserve default legacy indexes

In v3.4, the BtreePlus indexes were introduced, and are used by default in new repositories. Upgraded repositories defaulted to legacy indexes. This behavior on upgrade was lost due to code reorganization in v3.6; upgrading from pre-3.4 to 3.6 or later would result in the default for GsIndexOptions to include btreePlusIndex, rather than legacyIndex. (#50318)

Class subclassed from nil did not have default doesNotUnderstand handling

If a class was subclassed from nil, and doesNotUnderstand: was not implemented for that subclass, sending a message selector to an instance that was not understood resulted in infinite recursion. (#49768)

Bitmap written by #saveWriteSetUnionToFile not readable

The Admin GcGem option #saveWriteSetUnionToFile, which is false by default, triggers the AdminGem to write a bitmap file containing the write set union. This file was not readable by hidden set nor by GsBitmap protocol. (#49730)

GsTestCase assert:isEquivalentTo: failed to catch errors

This method has been removed, to avoid a false impression of providing test coverage. This method supported returning true for two numeric arguments that are somewhat close, but not exactly equal. This resulted in failure to detect actual incorrect results. (#50159)

PositionableStreamLegacy positionW, positionW: did not signal Warning

These methods are intended to signal a Warning to verify code when transitioning an application from 1-based to 0-based legacy streams (that is, not PostionableStreamPortable). Previously, these wrote a stack to the Stone; now, a Warning is signaled.

PPParser >> child included a send to #assert:

The PetiteParser class PPParser method #child included a send to #assert:, although #assert: is not implemented within that hierarchy. (#50193)

gemnetobject -T, -N argument was ignored if no separator

When setting the temporary object cache size or native code using gemnetobjects (e.g. set gemnetid 'gemnetobject -T value'), the -T -N argument was ignored if there was no space between the -T or -N and the argument. (#50338)

Previous chapter