GemStone/S 64 Bitâ„¢ 3.4.2 is a new version of the GemStone/S 64 Bit object server. This release includes a number of new features and bug fixes. We recommend everyone using or planning to use GemStone/S 64 Bit upgrade to this new version.
These release notes describe changes between the previous version of GemStone/S 64 Bit, version 3.4.1, and version 3.4.2. If you are upgrading from a version prior to 3.4.1, review the release notes for each intermediate release to see the full set of changes. Particularly note that there were many changes in v3.4, including the requirement for updated keyfiles and GBS upgrade.
The Installation Guide has not been updated for this release. For installation, upgrade and conversion instructions, use the Installation Guide for version 3.4.
GemStone/S 64 Bit version 3.4.2 is supported on the following platforms:
For more information and detailed requirements for each supported platforms, please refer to the GemStone/S 64 Bit v3.4 Installation Guide for that platform.
The GemStone/S 64 Bit Community and Web Edition licensing now also include licencing for GemBuilder for Smalltalk (GBS). This allows free for commercial use, in production as well as development, for GBS.
The Community Edition license for GemBuilder applies to all GemBuilder client platforms, with Community Edition GemStone/S 64 Bit on Linux and Macintosh.
The Starter Community and Web Edition keyfile that is included in the GemStone/S 64 Bit distribution for Linux and Macintosh now allows GBS logins.
The version of LZ4 has been updated to v1.8.2.
To increase the clarity of the timestamps in GemStone process header, the UTC offset has been added after the time.
DATE: 07/11/2018 10:53:31 PDT (UTC +7:00)
When a new session is logged in, historically it is always started in #autoBegin transaction mode and must be manually changed into another mode, if desired.
Now, you may configure the repository to start sessions in other modes.
If any of the objects being added or updated by a commit include a reference to an instance of a class with the option instancesNonPersistent, such as a Semaphore, commit will signal a TransactionError, to avoid committing an object with missing data or a nil reference. However, there are cases, notably for committing error stacks within the Seaside framework, where the specific non-persitent object is not important and there is no need to prevent the commit.
Now, if you set the runtime configuration option GemCommitStubsForNpObjects, the commit will commit a string in place of any non-persistent objects, rather than erroring.
Runtime-only config option for the gem, enabled by:
System gemConfigurationAt: #GemCommitStubsForNpObjects put: true
If true, an invariant String will be committed in place of an instance of a class which has the instancesNonPersistent option, instead of signalling TransactionError 2407.
When a hot standby system has a master repository that produces small tranlogs at a rapid rate, the replay into the slave system could fall behind. (#47566)
The transfer rate in this situation has been improved in several ways:
The startlogreceiver utlity now accepts the -f <seconds> argument, configuring the flush interval for the logreciver to flush. The default is 10 seconds.
Previously, the flushing interval was always 2 seconds, which could reduce performance depending on the underlying disk performance, number and size of files.
-f <seconds> Interval in seconds at which the logreceiver flushes the tranlog file.
0 means flush as often as possible (caution: this may be very slow).
-1 disables flushing (file is flushed only when closed).
default: 10 seconds
In the report created by copydbf -i on a backup file, the GemStone version that made the backup file is included.
However, if using copydbf -i on a backup file that was created by a different version of GemStone, and there are incompatibilties between the GemStone version of copydbf and the GemStone version used to generated the backup, copydbf did not handle the incompatibilities correctly.
In extreme cases, such as 3.4.x copydbf against a 2.4.x backup, the copydbf could SEGV with a log record swizzle error. More commonly, it reported an unhelpful error such as "expected compatibility level = 850, found 256".
Now, copydbf -i against a backup generated by an incompatible version of GemStone will include information about the version information if that is available. Version information is avilable for backups created from3.1.x and 3.2.x, but not from 3.3.x.
The size of the POM Generation memory space can be set explicitly using the configuration parameter GEM_TEMPOBJ_POMGEN_SIZE, but is normally derived from the GEM_TEMPOBJ_CACHE_SIZE setting.
Previously, the calculation of the default was linear, setting the POM gen space to about 0.8 times (80%) of the TOC size. For very large temporary object caches, this is larger than is useful. Now, the multipler used is based on the size of the TOC, using interpolation on the line defined by these values::
This configuration parameter has been added to control the size of the PERM Generational memory space.
If the configuration value is zero the Perm generation is sized at 10% of CFG_GEM_TEMPOBJ_CACHE_SIZE up to a maximum of 30MB.
Default units K Bytes, suffixes KB, MB, GB may be used to specify units.
Secure backups are always signed, and are optionally encrypted, with signing and encryption using separate keys.
Now, DSA (Digital Signature Algorithm) keys are supported for signing a secure backup, as well as RSA keys. Only RSA keys are supported for encryption.
Scripts have been added under $GEMSTONE/examples/openssl to create DSA keys and cert files:
create_new_dsa_cert.sh
and example DSA cert and key files, also under $GEMSTONE/examples/openssl:
certs/backup_sign_3_client_dsa_cert.pem
certs/backup_sign_3_client_dsa_req.pem
private/backup_sign_3_client_dsa_key.pem
private/backup_sign_3_client_dsa_passwd.txt
The following functions have been added:
(int64) GciFetchUtf8Bytes__(
OopType aString,
int64 startIndex,
ByteType *buf,
int64 bufSize,
OopType *utf8String,
int flags,
int64 maxConvert
);
(void) GciNbExecuteFromContextDbg_(
OopType source,
OopType contextObject,
OopType symbolList,
int flags,
ushort environmentId
);
This is a non-blocking variant of GciExecuteFromContextDbg_().
These flags now include mneumonics:
GCI_UTF8_FetchNormal = 0,
GCI_UTF8_FilterIllegalCodePoints = 0x1, /* not yet implemented*/
GCI_UTF8_NoError = 0x2 /* return message instead of signalling Exception*/
} GciFetchUtf8Flags ;
If a lostOt is deferred for certain reasons (blocked on a queue on the Stone or in the run queue), lostOt handling is deferred by an entire STN_GEM_ABORT_TIMEOUT / StnMntGemAbortTimeout interval, rather than by a fraction of a second. (#47329)
There was a slow C heap memory leak in the handling of bitmap caching for commit records. (#47646).
Under certain sequences of operations, when using NonTranloggedGlobals when the oopHighWaterMark is increasing, the oopHighWaterMark is not updated corrrectly. This does not cause the restoreFromLogs to fail, however, the stone cannot subsequently start up. (#47679)
There is a sequence of processing within a nested transaction that has the ability to create a committed reference to an object that does not exist.
This involves a nested transaction followed by a failed commit of the outer transaction; then an abort and another commit. The problem is related to objects that were not correctly sorted between the closures of the inner and outer commits, such that state was not correctly handled by the abort. (#47659)
If the closure of a nestedBeginTransaction contained instances of classes with the option instancesNonPersistent, or other instances that were immune to rollback on abort, these objects were incorrectly being added to the closure of the nested transaction. This cause the later commit to the outer transaction to fail with error 2407 , attempt to commit a not committable object. (#47584)
If you run with tranlogs set to /dev/null, no tranlogs are generated. When you restart with tranlogs set to a normal directory, the sequence of tranlogs that is generated should begin with tranlog1.dbf, but in some cases it was starting with tranlog0.dbf. (#47636)
A backup taken when the current tranlog is tranlog0.dbf cannot be restored.
When running listInstancesInPageOrder:toFile:, and there are no instances of the given class, it signalled an AlmostOutOfMemory error. (#47583)
When single stepping through code in a debugger, it was possible for stepping to get stuck and be unable to advance. (#47314)
GsHostProcess finalization of in-memory instances did not properly close its three pipes. (#47630)
In 3.4 and earlier, if a backup file has corruption which prevents certain objects from being restored, the restore would terminate with a non-fatal error depending on the specific problem, and the backup file could not be restored. In v3.4.1, this was changed, such that restore would continue to complete the restore of backup and tranlogs and allow commitRestore.
In v3.4.2, there has been further refinement in the handling of this scenario. Now, while the backup continues, on completion, the restore reports a new fatal error, BKUP_ERR_RESTORE_FAILURE/4152, and commitRestore is disallowed.
To commit the restored backup, instead of commitRestore, you must invoke the new method Repository >> commitRestoreWithLostData. After executing commitRestoreWithLostData, you should log in and perform an object audit to determine the extent of the problems, and if possible, attempt to repair the issues.
Backups taken from repositories with transaction logs written to /dev/null, or in partial logging mode, normally automatically perform the commitRestore when the backup is completed (since it is not possible to restore tranlogs). If corruption is detected, however, the restore will return BKUP_ERR_RESTORE_FAILURE/4152. The restore is not automatically committed, and you must execute commitRestoreWithLostData in order to commit the restore.
During the vfork() call invoked by System class >> performOnServer:, all signals are blocked (this was done to avoid a deadlock). Now, SIGTERM is not blocked during the fork. (#47409)
When the method selector sent to perform: had a mismatch with the number of arguments (the number of with: keywords used), the error message indicated a message not understood with invalid detail string. (#47448)
Adding individual elements to an RcLowMaintenanceIdentityBag was significantly slower than adding to a RcIdentityBag. (#47452)
The stone consumed excessive amounts of CPU, and performance was degraded, when handling a large number of sessions doing commits involving RC (reduced conflict) objects during the same time window. (#47647)
When one session is performing a cleanup and another session is using the queue, there is an incorrect sequence of events in conflict resolution handling. The result is a nil element may be returned from the queue when not expected. No data is lost in this scenario. (#47445)
The values returned by the exponent and mantissa methods, and values derived from these, were incorrect for subnormal instances of Float; that is, floats that are larger than zero but smaller than the smallest possible positive Float. (#47642)
Executing the reserved selector repeat with a block that was entirely empty caused the method compiler to SEGV. (#47635)
It is legal to use a zero-argument block for the do: argument in an on:do: statement. However, this zero argument block failed with a subsequent pass. (#47456)
When the connection between the client on windows and the Gem is lost, the Gem log included a unhelpful error "Failed after 0 attempts in sending Error response to GCI client". This now reports a slightly more useful error, for example, "SSL_read(6,0x7f8abd816010,16256) failed with errno=104,ECONNRESET, Connection reset by peer
Error Category: 231169 [GemStone] Number: 4137 Arg Count: 0 Context : 20 exception : 20 "