Skip to content

12.3.0

Latest
Compare
Choose a tag to compare
@github-actions github-actions released this 20 Jul 00:11
· 3 commits to main since this release
2a5f1bd

12.3.0 (2024-07-17)

Deprecations

  • The Logger has been deprecated in favor of RealmLogger, which Logger currently derives from. (PR #3634)
    • The Logger.LogLevel set and get accessors have been deprecated. Please use RealmLogger.SetLogLevel() and RealmLogger.GetLogLevel() (see Enhancements below).
    • The Logger.Function(Action<LogLevel, string> logFunction) have been deprecated. Please use RealmLogger.Function(Action<LogLevel, LogCategory, string> logFunction) (see Enhancements below).

Enhancements

  • Allow ShouldCompactOnLaunch to be set on SyncConfiguration, not only RealmConfiguration. (Issue #3617)
  • Reduce the size of the local transaction log produced by creating objects, improving the performance of insertion-heavy transactions (Core 14.10.0).
  • Performance has been improved for range queries on integers and timestamps. Requires that you use the "BETWEEN" operation in Realm.All<T>().Filter(...). (Core 14.10.1)
  • Allowed ShouldCompactOnLaunch to be set on SyncConfiguration, not only RealmConfiguration. (Issue #3617)
  • Introduced a LogCategory and allowed for more control over which category of messages should be logged and at which criticality level. (PR #3634)
    • Allowed setting and getting a LogLevel for a given LogCategory. The hierarchy of categories starts at LogCategory.Realm.
      RealmLogger.SetLogLevel(LogLevel.Warn, LogCategory.Realm.Sync);
      RealmLogger.GetLogLevel(LogCategory.Realm.Sync.Client.Session); // LogLevel.Warn
    • Added a function logger that accepts a callback that will receive the LogLevel, LogCategory, and the message when invoked.
      RealmLogger.Default = RealmLogger.Function((level, category, message) => /* custom implementation */);
    • Added a RealmLogger.Log() overload taking a category. The pre-existing Log() API will implicitly log at LogCategory.Realm.SDK.
      RealmLogger.Default.Log(LogLevel.Warn, LogCategory.Realm, "A warning message");
  • On Windows devices Device Sync will additionally look up SSL certificates in the Windows Trusted Root Certification Authorities certificate store when establishing a connection. (Core 14.11.0)
  • Role and permissions changes no longer require a client reset to update the local realm. (Core 14.11.0)

Fixed

  • A ForCurrentlyOutstandingWork progress notifier would not immediately call its callback after registration. Instead you would have to wait for some data to be received to get your first update - if you were already caught up when you registered the notifier you could end up waiting a long time for the server to deliver a download that would call/expire your notifier. (Core 14.8.0)
  • After compacting, a file upgrade would be triggered. This could cause loss of data if ShouldDeleteIfMigrationNeeded is set to true. (Issue #3583, Core 14.9.0)
  • Passing in a deleted object as a substitution argument to .Filter() would throw a confusing error with a message starting with invalid RQL for table. It now throws a more descriptive error instead. (Issue #3619)
  • Fix some client resets (such as migrating to flexible sync) potentially failing with AutoClientResetFailed if a new client reset condition (such as rolling back a flexible sync migration) occurred before the first one completed. (Core 14.10.0)
  • Encrypted files on Windows had a maximum size of 2GB even on x64 due to internal usage of off_t, which is a 32-bit type on 64-bit Windows. (Core 14.10.0)
  • The encryption code no longer behaves differently depending on the system page size, which should entirely eliminate a recurring source of bugs related to copying encrypted Realm files between platforms with different page sizes. One known outstanding bug was (RNET-1141), where opening files on a system with a larger page size than the writing system would attempt to read sections of the file which had never been written to. (Core 14.10.0)
  • There were several complicated scenarios which could result in stale reads from encrypted files in multiprocess scenarios. These were very difficult to hit and would typically lead to a crash, either due to an assertion failure or DecryptionFailure being thrown. (Core 14.10.0)
  • Encrypted files have some benign data races where we can memcpy a block of memory while another thread is writing to a limited range of it. It is logically impossible to ever read from that range when this happens, but Thread Sanitizer quite reasonably complains about this. We now perform a slower operations when running with TSan which avoids this benign race. (Core 14.10.0)
  • Tokenizing strings for full-text search could pass values outside the range [-1, 255] to isspace(), which is undefined behavior. (Core 14.10.0)
  • Opening an Flexible Sync Realm asynchronously may not wait to download all data. (Core 14.10.1)
  • Clearing a List of RealmValue in an upgraded file would lead to an assertion failing. (Core 14.10.1)
  • You could get unexpected merge results when assigning to a nested collection. (Core 14.10.2)
  • Fixed removing backlinks from the wrong objects if the link came from a nested list, nested dictionary, top-level dictionary, or list of RealmValue, and the source table had more than 256 objects. This could manifest as array_backlink.cpp:112: Assertion failed: int64_t(value >> 1) == key.value when removing an object. (Core 14.10.3)
  • Fixed the collapse/rejoin of clusters which contained nested collections with links. This could manifest as array.cpp:319: Array::move() Assertion failed: begin <= end [2, 1] when removing an object. (Core 14.10.3)
  • Session.WaitForUpload() was inconsistent in how it handled commits which did not produce any changesets to upload. Previously it would sometimes complete immediately if all commits waiting to be uploaded were empty, and at other times it would wait for a server roundtrip. It will now always complete immediately. (Core 14.10.3)
  • When a property is remapped, calling .Filter("... SORT/DISTINCT(mapped-to-name)") with the internal name could throw an error like Cannot sort on key path 'NAME': property 'PersonObject.NAME' does not exist. (Core 14.10.4)
  • Sync client can crash if a session is resumed while the session is being suspended. (Core 14.11.0)
  • If a sync session is interrupted by a disconnect or restart while downloading a bootstrap, stale data from the previous bootstrap may be included when the session reconnects and downloads the bootstrap. This can lead to objects stored in the database that do not match the actual state of the server and potentially leading to compensating writes. (Core 14.11.0)
  • Fixed unnecessary server roundtrips when there is no download to acknowledge. (Core 14.11.0)

Compatibility

  • Realm Studio: 15.0.0 or later.

Internal

  • Using Core v14.10.3.