The following bugs have been fixed in this release.
During startup, the sockets that connect the Stone and AIO page servers do not detect disconnects. If the AIO page servers encountered an error such as a write failure, it exited (correctly); but the Stone continued to wait for a response. (#44587)
In previous 3.x versions, the multi-threaded scans used by operations such as markForCollection could only be run multithreaded on Gems on the Stone's host. When executed from a remote Gem, these operations would run single-threaded. This restriction has been removed, and now remote Gems can run multithreaded scans. (#41178, #41177)
Remote connections require that each host have a /opt/gemstone/locks/gemstone.hostid file to identify themselves. On a remote host, if this file is not found, it is created when a netldi starts up. However, if there has never been a netldi started, and the first GemStone process is a linked session which no longer requires a netldi, the login failed with a file not found error. (#45111)
There were bugs in the primitive code supporting garbage collection of unused Symbols, as enabled by STN_SYMBOL_GC_ENABLED; it did not complete correctly with a non-trivial number of symbols or with corner cases of symbol references. Symbol GC was disabled in v3.2.7 and later. (#45403)
The internal phases in markGcCandidates were numbered incorrectly with respect to the object table sweep phase number, resulting in some phases sweeping pages that incorrectly include scavengeable pages. (#45227).
Since markGcCandidates is no longer of significant benefit, this function has been removed in v3.3.
If an exception handler was triggered from within low-level C code in a primitive, nil was incorrectly returned as the result of the Smalltalk method that called the primitive. (#44375)
A non-local return within an ensure block did not correctly override the on:do: handling. (#45056)
For example, the following previously returned #ok, while the correct return should be 7.
[ [3 zork] ensure: [^7].
] on: Error do: [:ex | ex return: #ok]
A block that is nested within another block can, in some cases, have the wrong value for a variable that is declared in an outer scope. An assignment to the variable performed in the outer scope is not always propagated to the inner block when it should be. (#44478).
For example, the following previously returned 1,while the correct result should be 100.
[ | temp myBlock |
temp := 1.
myBlock := [ temp ].
temp := 100.
myBlock value ] value
Soft breaks can normally be caught by a handler. While this worked in RPC topaz, in linked the soft break was treated like a hard break. (#43502)
The classes CompileWarning, Deprecated, InterSessionSignal, TestFailure and ReusmableTestFailure inherited the error number from their superclass. (#43411)
Compilation errors that occur in some block contexts; for example, In code sent to External sessions; did not display useful information, only a message such as ’a CompileError occurred (error 1001), compilation errors -- parameter 1 is error descriptor’. Now, the error text is provided. (#45626)
When the primitive failed, no useful information was provided. (#44140)
Working with instance of an internal class (such as LargeObjectNode), the error returned was "Unable to store forward reference to object that is not allocated to this session", which is not clear; it now says "Attempt to store a reference to a hidden object". (#44232)
An error message saying "Primitive number -1 does not exist in the virtual machine" is incorrectly worded. These values are error indicators, with -1 meaning is does not exist, and -2 meaning it should not be used. The most likely cause is incompatible Stone image and executable versions. (#45692)
For certain kinds of errors from an attempt to connect to a mid-level cache using midLevelCacheConnect:* , the connection could fail, but the return value was an empty string rather a error message. (#45142)
The error returned when setting a runtime configuration parameter did not include details (#44107).
Service names that require ports, such as gs64stone and gs64ldi, look for assigned port numbers in the OS services database. If a name is used that is already defined by the system, such as "auth", it will find this port, which may not be usable by the GemStone process. Now, the log files will indicate how the port was determined to distinguish this case. (#45268)
Some kernel methods referenced System myUserProfile symbolList, which did not respect any transient changes to the symbol list. This has been changed to use GsSession currentSession symbolList. (#45236)
Since Strings and Symbols, for example, shared a superclass and can be ordered using <=, etc., it is allowed to mix instances of each together as objects that are in an index. However, a String and a Symbol with the same contents are not equal, in other words, a <= b and
a >= b does not mean a = b; so a query using = must only return instances of the appropriate class. GsQuery readStream incorrectly returned objects of any class in which a >= b and a <= b, rather than requiring a = b. (#44079)
removeAllIndexes bypassed the collections and updated the dependency maps for each index element directly. On a large collection, this could result in AlmostOutOfMemory errors. Now, the DependencyMaps are put into a hidden set for processing, where they do not affect temporary object memory.
The Linux network statistics InputPackets, InputKBytes, MulticastInputPackets, OutputPackets, and OutputKBytes were relative to when statmonitor started recording, rather than absolute values. (#45052)
The Gem configuration option GEM_PGSVR_COMPRESS_PAGE_TRANSFERS, when true, compresses page transfers from the Page Server to the Gem. However, it did not compress transfers in the other direction, from the Gem to the Page Server. (#44783)
The encoding functions in the GCI were not working correctly. GciGetFreeOops failed if called after GciEnableFreeOopEncoding, and GciGetFreeOopsEncoded always failed. (#44738)
When the NetLDI opened a connection to an incompatible version of GemStone, there was a code path in which the socket connection was not closed, resulting in a socket leak in the NetLDI. (#45902)
Dictionaries locate keys using hash, and may lookup Strings and Symbols interchangeably, or (in Unicode comparison mode) mix Unicode and traditional Strings. However, removeKey: used = to compare keys. It was therefor possible for at: to return a value, but removeKey: to fail. (#44097)
The methods StringKeyValueDictionary >> at:ifAbsent: and StringKeyValueDictionary >> at:otherwise: returned the error #rtErrNilKey (error 2090) when the specified key was nil, rather than executing the block supplied to handle nil keys. (#45367)
When C functions are invoked from the VisualWorks executable, the stack pointer is not aligned correctly 16 bit. This is related to changes in the stack alignment rules in recent versions of gcc, vs. the compiler versions used for VisualWorks executables. The potential for problems is when using GBS on Linux with application user actions (which are deprecated in GBS), and depending on the compiler version and optimization used for the user actions. (#42632)
A customized value for IcuCollator default, IcuLocale default, and Locale, were retained in a linked topaz process, and persisted through logout and login. (#45532)
The topaz command nbstep returned a message not understood error on #_stepOverInFrame:mode:replace:tos: (#44590)
When a large reclaim operation occurs on the primary system, the same reclaim operation will need to be completed on the standby system. This could take significant time, during which period the standby lagged behind the primary. This was difficult to address on the standby, since the configuration of reclaim could only be identical to that on the primary (changes required commit, which is disallowed during restore). (#44265)
In v3.3, the code that coordinates between the transaction log restore and the ReclaimGem has been made more efficient. You may now configure reclaim on the standby differently than on the primary, using the run-time configuration options described under Runtime configuration of ReclaimGem and AdminGem
When there are a large number tranlogs in the master systems tranlog directory, the logsender-logreceiver connection may timeout. (#45473)
In hotstandby systems that are incorrectly configured, it was possible for the logreceiver to reconnect to a logsender that is associated with a different repository than the one previously connected to. Further information has been added to tranlogs so that such inconsistencies are detected. (#43124)
GsHostProcess class >> fork: accepts a String argument containing a command line. This string correctly handled double quotes, but not single quotes. (#45386)
Stopping and restarting the Stone during the restore of transaction logs that include a reclaim of possible dead, required that the reclaim restart from the beginning. Now, checkpoints are written during the replay. The main impact of this would be on warm and hot standby systems. (#45901)
When passing a string that includes characters with codepoints outside the ASCII range to a GsFile file open method, the resulting filename may be truncated or contain invalid characters. (#45326, #44786)
In some earlier releases, using NRS syntax in the stone name argument to startcachewarmer results in a crash; in later version, the startcachewarmer would not crash or error, but it did not perform the warming operation. (#45604)
GemStone/S 64 Bit does not allow Symbols larger than 1024 bytes. However, repositories converted from 32-bit may contain Symbols that are larger, including ones larger than 8K that require LargeObjectNodes for internal storage.
During the conversion to 3.x, startstone -C resorts AllSymbols; this sort operation will fail if any symbols over 8K are present, causing the startstone -C to fail. (#45923)
As of v3.3, the startstone -C conversion will not fail; any symbols over 8K are removed from AllSymbols. These symbols remain as uncanonical symbols and can be removed or, if unreferenced, will be removed by garbage collection. It is recommended that before conversion, you examine your repository for large symbols and convert appropriately.
When a class definition is filed in, it invokes the method
Class>>_equivalentSubclass:superCls:name:newOpts:newFormat:
newInstVars:newClassInstVars:newPools:newClassVars:inDict:
constraints:isKernel:
to determine if a new version of the class should be created, or if the definition is the same in all ways. When this method determined that the classes were not the same, it did not provide details about the specific cause of the failure, which made analysis of upgrade/conversion issues difficult. (#45836)
Persisted instances of ClassOrganizer from a pre-3.2 repository, when upgraded to 3.2 or later, were not fully initialized and encountered errors on use. (#44199)
There were code paths in upgradeImage, in which the handling of #GemStoneRCLock was incorrect and could result in upgrade failure. (#45857)
In version earlier than 3.1, classes comments could be implemented by defining individual #comment class methods. In v3.1 and later, the comment for a class is in a separate field in the Class, and user classes should not reimplement class methods comment or comment:. Now, filing in older code that includes comment or comment: methods will get a compiler warning. (#44566)
When attempting to login to a repository that has been started on extents from an older version, when upgradeImage is required and has not been run, previously one of a number of unspecific errors would occur. Now, this is now handled explicitly with the new error 2486, RT_ERR_UPGRADE_WARNING, and a message that repository upgrade is needed. (#44183)
When the SymbolGem was requested to stop and does not shutdown within the timeout, the Stone sets its cache state to invalid. The terminating SymbolGem reports this as a lostOT, and does not correctly handled the exit. (#45265)
When compiling a method (using compileMethod:dictionaries:category:), with the target dictionaries: argument being an instance of Array, the #OtherPassword privilege was required. This is not correct; this should require #CodeModification, but not #OtherPassword. (#44433)
If a commit fails when there is a lock on a temporary object, after an abort the lock status becomes inconsistent. The lock cannot be removed, and methods to access lock status are inconsistent. (#45744)