github dotnet/orleans v4.0.0-preview1

latest releases: v3.7.2, v8.1.0, v8.1.0-preview3...
pre-release2 years ago

Major changes from the 3.x release series

The full change log lists around 500 changes, and many involve small quality of life improvements, internal refactorings for performance, reliability, versatility, and maintainability. What follows are the larger changes which we would like to highlight in these release notes since they are more likely to impact application developers.

Grain and Stream identity enhancements

Grain identities now take the form type/key where both type and key are strings. This greatly simplifies how grain identity works and improves support for generic grain types.
Previous versions of Orleans used a compound type for GrainIds in order to support grain keys of either: Guid, long, string, Guid + string, or long + string. This involves some complexity when it comes to dealing with grain keys. Grain identities consist of two components: a type and a key. The type component previously consisted of a numeric type code, a category, and 3 bytes of generic type information.

Streams are also now identified using a string instead of a Guid, which grants more flexibility, especially when working with declarative subscriptions (most commonly accessed via the [ImplicitStreamSubscription(...)] attribute)

This move to stringly-typed ids is expected to be easier for developers to work with, particularly since the GrainId and StreamId types are now public (they were internal) and GrainId is able to identify any grain.

Version-tolerant, high-performance serialization & RPC

4.x changes how serialization works. The default serializer in previous releases of Orleans is not tolerant to changes in a type's schema. Adding, removing, or renaming a field or type could cause serialization to break without obvious recourse. In 4.x, we introduce a new version-tolerant serializer which allows adding/removing/renaming fields and some type change operations (widening or narrowing a numeric type, for example). We still recommended that developers use JSON serialization for persistence. The new serializer is also designed for high performance and as a result, it is substantially faster than the serializer which it replaces.

Aside from serialization, the remote procedure call internals have been overhauled for performance and flexibility. Previous versions of Orleans use a type called InvokeMethodRequest which identifies the interface and method being invoked using generated integer values and contain an array of objects representing the arguments. The InvokeMethodRequest object is passed to a generated IGrainMethodInvoker implementation which essentially contains some nested switch statements to find the correct method to invoke, then casts the arguments in the object array to the correct types in the invocation. This design has several drawbacks:

  • Handling of overloads and complex generic types is complicated and sometimes intractable
  • It requires boxing primitive argument types, such as int, DateTimeOffset, and user-defined structs
  • Type information must be serialized for all method arguments

Instead, the replacement (which lives in Microsoft.Orleans.Serialization) involves generating an implementation of IInvokable for every method. This interface gives infrastructure components like grain filters enough information to see interface and method information as well as to inspect and manipulate arguments and return values. It is also more efficient to serialize and invoke and relies on the C# compiler to perform method overloading. Generic parameters from generic grain interfaces and generic methods become generic parameters of the implementation, avoiding or offloading most of the complexities involved with generics.

Notice about Breaking Changes

  • Clusters cannot be smoothly upgraded from a previous version of Orleans to Orleans 4.0 via a rolling upgrade.
  • Serializable types must be marked with the [GenerateSerializer] attribute, with any serializable property or field marked with the corresponding [Id(x)] attribute. This is intentionally less magical than in previous versions of Orleans, which did its best to infer what types needed to have serializers generated for them. What this extra ceremony buys you is valuable, though: version tolerance.
  • Since GrainId and StreamId are so different, persistence, streams, and reminders are not forward-compatible yet.
  • We will have more to say regarding our plans to facilitate migration of Orleans 3.x applications to Orleans 4.x.

Here is an example of a type which Orleans would generate a serializer for previously, versus how that same type should be written for Orleans 4.0:

Orleans 3.x and below:

[Serializable]
public class UserProfile
{
    public string DisplayName { get; set; }

    public string PreferredLanguage { get; set; }

    public DateTimeOffset AccountCreated { get; set; }
}

Orleans 4.x and above:

[GenerateSerializer]
public class UserProfile
{
    [Id(0)]
    public string DisplayName { get; set; }

    [Id(1)]
    public string PreferredLanguage { get; set; }

    [Id(2)]
    public DateTimeOffset AccountCreated { get; set; }
}

We have included some analyzers to make this process easier for developers. The first code fix prompts you to add the [GenerateSerializer] attribute for any type which has the [Serializable] attribute:
image
The second analyzer will add [Id(x)] attributes for you:
orleans_analyzer

Full Changelog from 3.0.0 to 4.0.0-preview1: v3.0.0...v4.0.0-preview1

  • Update changelog for final 3.0.0 by @sergeybykov in #6068
  • Azure table grain storage inconsistent state on not found by @jason-bragg in #6071
  • Removed silo status check before cleaing up system targets from… by @jason-bragg in #6072
  • Fix spelling error. by @fatkenny in #6081
  • README spelling fix. by @fatkenny in #6082
  • Update Program.cs by @dustout in #6083
  • fix typo by @JTOne123 in #6086
  • Update OneBoxDeployment to .NET Core 3 by @veikkoeeva in #6092
  • Fixed typo in exception by @shawnallen85 in #6091
  • Consul: support extended membership protocol by @ReubenBond in #6095
  • Fix small typo in readme by @fdbeirao in #6100
  • Add note about Visual Studio Community Edition by @fdbeirao in #6101
  • Migrate HelloWorld sample to 3.0 by @sergeybykov in #6106
  • Add a change missed in #6106 by @sergeybykov in #6119
  • Do not include grain identifier in the ILogger category name by @sehra in #6122
  • Fix routing of gateway count changed events to registered servi… by @mindlink in #6102
  • Allow negative values in TypeCodeAttribute. Fixes #6114 by @yevhen in #6127
  • DynamoDB: support extended membership protocol by @jsteinich in #6126
  • Redact logged connection string in ADO storage provider during init by @benjaminpetit in #6139
  • Fixed CodeGenerator.MSBuild cannot ResolveAssembly in .NetCore 3.0 by @bluexo in #6143
  • Update changelog for 2.4.4. by @sergeybykov in #6147
  • Update changelog for 3.0.1 by @sergeybykov in #6148
  • Specify endpoint AddressFamily in Socket constructor by @ReubenBond in #6168
  • Make IFatalErrorHandler public so that it can be replaced by users by @ReubenBond in #6170
  • CodeGen: fix ambiguous reference to Orleans namespace by @ReubenBond in #6171
  • Update changelog for 3.0.2 by @sergeybykov in #6175
  • Switch to .NET Core SDK 3.1.100 by @sergeybykov in #6159
  • Initial cross-platform build unification by @ReubenBond in #6183
  • Avoid potential NullReferenceException when re-initializing statistics by @ReubenBond in #6179
  • Fix 'dotnet pack --no-build' by @ReubenBond in #6184
  • Migrate 'src' subdirectory to new code generator by @ReubenBond in #6188
  • Allow MayInterleaveAttribute on base grains. Fix for issue #6189 by @cjenp in #6192
  • Multi-target Orleans sln and tests by @ReubenBond in #6190
  • Update changelog for 2.4.5 by @sergeybykov in #6201
  • Updated Presence Sample added to Samples/3.0 folder by @thelaughingman in #6205
  • Serialization optimizations for .NET Core 3.1 by @ReubenBond in #6207
  • Updated Blazor Sample (both Server and Client working) added to Sampl… by @thelaughingman in #6204
  • Shorten ConcurrentPing_SiloToSilo by @ReubenBond in #6211
  • refactor(blazor sample): use asp.net core hosting like the webapi template by @ElderJames in #6208
  • Add OrleansDebuggerHelper.GetGrainInstance to aid in local debugging by @ReubenBond in #6221
  • Added ASP.NET Core co-hosting sample by @mxplusb in #6130
  • Improve logging and tracing, part 1 by @ReubenBond in #6226
  • Remove accidental commit of ASPNetCoreHostedServices folder by @ReubenBond in #6233
  • Close ConnectionManager later in shutdown stage by @benjaminpetit in #6217
  • Obsolete IGatewayListProvider.IsUpdatable by @ReubenBond in #6236
  • Avoid capturing ExecutionContext in GrainTimer and other timers by @ReubenBond in #6234
  • Allow TestTargetFrameworks property to be specified by environment by @ReubenBond in #6222
  • Expose IClusterMembershipService publicly by @ReubenBond in #6243
  • Remove defunct *nix build scripts by @ReubenBond in #6242
  • Minor perf tweak for RequestContext when removing last item by @ReubenBond in #6216
  • Change duplicate activation to a debug-level message by @OracPrime in #6246
  • Add support Microsoft.Data.SqlClient provider, fix #6229 by @voronov-maxim in #6238
  • Contributing: fixed some typos by @MaherJendoubi in #6254
  • TestCluster: support configurators for IHostBuilder & ISiloBuilder by @ReubenBond in #6250
  • Adds reading material to resilient CPS scenarios by @veikkoeeva in #6252
  • Adds MySqlConnector library using invariant MySql.Data.MySqlConnector by @veikkoeeva in #6251
  • Enable remaining test suites by @ReubenBond in #6241
  • Expose exception when initializing PerfCounterEnvironmentStatistics by @JorgeCandeias in #6260
  • Skip flaky EHStatistics_MonitorCalledAccordingly test by @ReubenBond in #6259
  • Minor serialization perf improvements for .NET Core by @ReubenBond in #6212
  • Implement mTLS support for .NET Standard 2.0 by @juyuz in #6154
  • Fix codegen incremental rebuild by @ReubenBond in #6258
  • CodeGen: combine cache file with args file and fix incremental rebuild by @ReubenBond in #6266
  • Avoid lookup when getting WorkItemGroup for SchedulingContext by @ReubenBond in #6265
  • Membership: allow a minimum grace period during ungraceful shutdown by @ReubenBond in #6267
  • Provide exception to FailFast in FatalErrorHandler by @pentp in #6272
  • Add support for DynamoDB Pay Per Request Billing Mode by @icanhasjonas in #6268
  • Use RegionEndpoint.GetBySystemName() to resolve AWS region by @icanhasjonas in #6269
  • Add missing reference to Microsoft.Orleans.Persistence.AzureStorage package by @sergeybykov in #6284
  • Support Grain Persistency TTL On dynamo DB by @AmirSasson in #6275
  • Fixing code gen for ValueTask by @jsteinich in #6285
  • Change TTL Dynamo DB Persistenecy Attribute name, as it is reserved attribute name of DynamoDB by @AmirSasson in #6287
  • Replaced throwing Exception to Logger.Warn by @JohnDebono in #6286
  • Add missing dependency to Orleans.CodeGenerator by @benjaminpetit in #6297
  • Add System.Threading.Tasks.Extensions dependency to Abstractions by @benjaminpetit in #6301
  • Added ability to skip client TLS authentication. by @Ilchert in #6302
  • Update changelog for 3.1.0-rc1 - 3.1.0-rc3 by @sergeybykov in #6295
  • Use current element for SimpleQueueCacheCursor.Element by @KevinCathcart in #6299
  • Manual stats dump #6310 by @OracPrime in #6311
  • Remove current multicluster implementation by @benjaminpetit in #6305
  • Fix SQL Server connection string by @veikkoeeva in #6320
  • Schedule Tasks and WorkItems on .NET ThreadPool by @ReubenBond in #6261
  • Schedule received messages onto .NET ThreadPool by @ReubenBond in #6263
  • Remove Message.DebugContext and related code by @ReubenBond in #6323
  • Remove GrainId clusterId constructor parameter and associated code by @ReubenBond in #6322
  • Remove AsynchAgent, Executor, and related by @ReubenBond in #6264
  • Fix GatewayPerSilo setting in TestClusterOptions by @benjaminpetit in #6326
  • Avoid registering Gateway in DI since it can be null by @benjaminpetit in #6312
  • [AWS:DynamoDB] Don't set ServiceUrl when region is provided. by @icanhasjonas in #6327
  • [AWS:DynamoDB] Explicit setting for UseProvisionedThroughput by @icanhasjonas in #6328
  • Fix build warnings by @sergeybykov in #6329
  • Change NETSTANDARD2_1 preprocessor directives to NETCOREAPP by @ReubenBond in #6332
  • Implement CleanupDefunctSiloEntries for DynamoDB membership provider by @pipermatt in #6333
  • Update changelog for 3.1.0 by @sergeybykov in #6337
  • Fix CleanupDefunctSiloMembership & MembershipTableTests by @pipermatt in #6344
  • Schedule IMembershipTable.CleanupDefunctSiloEntries more frequently by @ReubenBond in #6346
  • Fix deadlocks with MySQL Storage by @srollinet in #6331
  • AdoNet: Rename Storage table to OrleansStorage for consistency with other tables. by @alexrp in #6336
  • Basic support for pluggable grain directory by @benjaminpetit in #6340
  • CodeGenerator fixes by @pentp in #6347
  • Fix DependencyInjectionSiloStartsUsingAutofac.ClusterStart by @benjaminpetit in #6348
  • Remove new() constraint for grain persistence by @ReubenBond in #6351
  • Improve TLS troubleshooting experience by @ReubenBond in #6352
  • Avoid destructuring in log templates by @ReubenBond in #6356
  • Clear RequestContext after use by @ReubenBond in #6358
  • Undo unnecessary RequestContext.Clear in networking by @ReubenBond in #6357
  • Cleanup GrainBasedReminderTable by @ReubenBond in #6355
  • Avoid using GrainTimer in non-grain contexts by @ReubenBond in #6342
  • Add UnregisterMany to IGrainDirectory to support batch unregistrations by @sergeybykov in #6354
  • Remove test code referencing GeoCluster by @ReubenBond in #6361
  • Remove unnecessary provider runtime members by @ReubenBond in #6362
  • Remove ClientInvokeCallback by @ReubenBond in #6364
  • Remove ProcessExitHandlingOptions by @ReubenBond in #6369
  • Reorient RuntimeContext around IGrainContext by @ReubenBond in #6365
  • Simplify OrleansTaskScheduler by @ReubenBond in #6370
  • Remove IServiceProvider from IGrainContext by @ReubenBond in #6372
  • Streamline MemoryStorage and InMemoryReminderTable by @pentp in #6315
  • Fix test glitch in PersistenceProvider_Memory_FixedLatency_WriteRead by @jthelin in #6378
  • Basic implementation of IGrainDirectory using the Azure Table API by @benjaminpetit in #6366
  • Amended LinuxEnvironmentStatistics registration to register services on Linux only by @xontab in #6375
  • Fix errors reported by GitHub Semmle code analysis tools. by @jthelin in #6374
  • Omit assembly name for all types from System namespace during codegen by @ReubenBond in #6394
  • Fix System namespace classification in Orleans.CodeGenerator by @ReubenBond in #6396
  • Update performance counter dependencies by @ReubenBond in #6397
  • Update changelog for 3.1.2 by @sergeybykov in #6379
  • Remove unused legacy XML configuration files by @ReubenBond in #6400
  • Reminders period overflow issue in ADO.NET Reminders Table by @xontab in #6390
  • Reduce port clashes in TestCluster by @ReubenBond in #6399
  • Update changelog for 3.1.3 by @sergeybykov in #6407
  • Fix log message by @oleggolovkovuss in #6408
  • Use the overload of ConcurrentDictionary.GetOrAdd that takes a method by @abe545 in #6409
  • Update DotNetCore sdk to 3.1.200 by @jason-bragg in #6411
  • Read only the body segment from EventData by @jason-bragg in #6412
  • Make GrainLocator listen to cluster changes by @benjaminpetit in #6385
  • Avoid prematurely releasing mutex in TestClusterPortAllocator by @ReubenBond in #6413
  • Fix flaky locator tests by @benjaminpetit in #6421
  • Ignore not foud exception when clearing azure queues by @jason-bragg in #6419
  • MembershipTableCleanupAgent: dispose timer if cleanup is unsupported by @ReubenBond in #6415
  • Allow grain call filters to retry calls by @ReubenBond in #6414
  • Skip SiloGracefulShutdown_ForwardPendingRequest for now by @benjaminpetit in #6425
  • Avoid most cases of loggers with non-static category names by @ReubenBond in #6430
  • Remove Microsoft prefix from logging categories by @ReubenBond in #6431
  • Free SerializationContext and DeserializationContext between calls by @ReubenBond in #6433
  • Update changelog for 3.1.4 by @sergeybykov in #6435
  • Dont use iowait in cpu calcs on linux by @mchandler-manticore in #6444
  • Expose timeouts for Azure Table Storage by @govenkat-ms in #6432
  • Revert "Expose timeouts for Azure Table Storage (#6432)" by @sergeybykov in #6452
  • TLS: specify an application protocol to satisfy ALPN by @ReubenBond in #6455
  • Change the error about not supported membership table cleanup functionality into a warning by @sergeybykov in #6447
  • Improves adaptive and complex systems literature by @veikkoeeva in #6454
  • Link Code of Conduct by @terrajobst in #6457
  • Update obsoletion warning for ISiloBuilderConfigurator by @ReubenBond in #6461
  • Allow GatewayManager initialization to be retried by @ReubenBond in #6459
  • Consistently sanitize properties for Azure Table Storage reminders implementation by @ReubenBond in #6460
  • Streamline Dictionary use and remove some dead code by @pentp in #6439
  • make methods on AiTelemetryConsumer virtual; clean-up by @johnazariah in #6469
  • Setting eventIndex by @adyada in #6467
  • Expose timeouts for Azure Table Storage (part 2) by @ReubenBond in #6462
  • Update changelog for 3.1.5 by @sergeybykov in #6472
  • Do not try to group grain directory unregistration calls. by @benjaminpetit in #6473
  • Send rejections for messages enqueued on stopped outbound queue by @ReubenBond in #6474
  • Fix links to Code of Conduct by @terrajobst in #6476
  • Simplified grain identity by @ReubenBond in #6468
  • Gossip that the silo is dead before the outbound queue gets closed by @benjaminpetit in #6480
  • Stopped WorkItemGroup logging enhanchement by @pentp in #6483
  • Streamline LINQ/Enumerable use by @pentp in #6482
  • Fix a race condition in LifecycleSubject by @pentp in #6481
  • Remove IHostedClient abstraction by @ReubenBond in #6475
  • Reduce duplication within GrainFactory by @ReubenBond in #6484
  • Per grain type directory by @benjaminpetit in #6485
  • Clean up some parts of IGrainTypeResolver and related by @ReubenBond in #6479
  • Encode SiloAddress into GrainId for SystemTarget by @ReubenBond in #6487
  • Update changelog for 3.1.6 by @sergeybykov in #6490
  • Remove ObserverId from GrainReference, and add ClientGrainId & ObserverGraindId by @ReubenBond in #6491
  • Less allocations on serialization manager by @ThiagoT1 in #6493
  • Fix typo in Adventure sample by @atifaziz in #6496
  • Fix unquoted members in adventure map JSON by @atifaziz in #6497
  • Fix flakiness in Azure Storage providers introduced by #6462 by @ReubenBond in #6509
  • Support ValueTask as [OneWay] Methods Return Type by @ThiagoT1 in #6521
  • Do not reject rejection messages locally. Drop them instead by @benjaminpetit in #6525
  • Update changelog for 3.2.0-rc1 and 3.1.7 by @sergeybykov in #6538
  • New type metadata system by @ReubenBond in #6503
  • Fix MSBuild code generator support for HashSet and some other system types by @ReubenBond in #6544
  • Fix netstandard2.0 compatibility by @pentp in #6549
  • Grain Directory Redis implementation by @benjaminpetit in #6543
  • Remove unused AppDomainTestHooks type by @ReubenBond in #6563
  • Made ShouldPurge protected and virtual in eviction strategy. by @adyada in #6560
  • More graceful termination of network connections by @ReubenBond in #6557
  • Remove Message.TargetObserverId by @ReubenBond in #6492
  • Remove reflection-based code generator by @ReubenBond in #6545
  • Implement CLR type name parser and rewriter by @ReubenBond in #6546
  • Port pluggable directory fixes from 3.2.0 by @benjaminpetit in #6582
  • Adding reference parameter analyzer by @miker1423 in #6567
  • Use TaskCompletionSource.RunContinuationsAsynchronously by @ReubenBond in #6573
  • Update changelog for 3.2.0 by @sergeybykov in #6579
  • Observe discarded ping task results by @pentp in #6577
  • Constrain work done under a lock in BatchWorker by @pentp in #6586
  • Make sure LocalGrainDirectory.UnregisterManyAsync is not called from a Grain context by @benjaminpetit in #6590
  • GrainId: Activations & References by @ReubenBond in #6585
  • Support deterministic builds with CodeGenerator by @rikbosch in #6592
  • Make stuck activation unregistration more reliable by @benjaminpetit in #6593
  • Fix some xUnit test discovery issues by @ReubenBond in #6584
  • Improve ClusterClient disposal by @ReubenBond in #6583
  • Spelling error then => them by @ElanHasson in #6611
  • Update OneBoxDeployment libraries and fix fault injection test by @veikkoeeva in #6602
  • Update .NET Core SDK to 3.1.301 by @sergeybykov in #6616
  • Delete old Joining records as part of cleanup of defunct entries by @sergeybykov in #6601
  • Propagate additional transaction abort exceptions by @ReubenBond in #6615
  • Use stable hash in GrainId by @ReubenBond in #6618
  • Fix SequenceNumber for MemoryStream by @benjaminpetit in #6622
  • Fix defunct silo cleanup for Azure Table Storage by @ReubenBond in #6624
  • Fix call pattern that throws. by @rrector in #6626
  • Avoid NullReferenceException in Message.TargetAddress by @ReubenBond in #6635
  • Added 'RecordExists' flag to perisistent store so that grains can det… by @zeus82 in #6580
  • Update changelog for 3.2.1 by @sergeybykov in #6636
  • Fix named tuples in codegen by @benjaminpetit in #6641
  • Fix unobserved ArgumentOutOfRangeException from Task.Delay by @pentp in #6640
  • Remove redundant NuGet package references, particularly for .NET Core. by @teo-tsirpanis in #6638
  • SocketConnectionListener: allow address reuse by @ReubenBond in #6653
  • Update changelog for 3.2.2 by @sergeybykov in #6658
  • Avoid race in GatewaySender.Send by @ReubenBond in #6657
  • AAD authentication for Azure providers (blob, queue & table) by @aelij in #6648
  • Reduce package dependencies by @pentp in #6673
  • Use "static" client observer to notify from the gateway when the silo is shutting down by @benjaminpetit in #6643
  • Analyze running activations and report back status to callers for long-running and blocked requests by @ReubenBond in #6672
  • Fixes #6675: Update IEventHubDataAdapter to support StreamId to partition mapping by @alexmg in #6676
  • Make delay after GW shutdown notification configurable by @benjaminpetit in #6679
  • StreamId v2 by @benjaminpetit in #6660
  • Implement == and != operators in StreamId and InternalStreamId by @benjaminpetit in #6681
  • Pluggable StreamId to GrainId mapper by @benjaminpetit in #6682
  • Avoid closing known-masked connections on client by @ReubenBond in #6683
  • Set longer timeout for ASP.NET core example to match modern versions by @highlyunavailable in #6689
  • Tweak shutdown completion signalling by @ReubenBond in #6685
  • Update Newtonsoft.Json to 11.0.1 and remove redundant/unused dependencies by @pentp in #6678
  • Close some kinds of misbehaving connections during shutdown by @ReubenBond in #6684
  • Fix ordering in ASP.NET Co-hosting sample by @ReubenBond in #6693
  • Force System.Net.NameResolution version in project with Azure dependencies by @benjaminpetit in #6698
  • Update changelog for 3.3.0-rc1 by @sergeybykov in #6700
  • update dependencies for the blazor sample by @ElderJames in #6706
  • Disable flaky SiloGracefulShutdown_ForwardPendingRequest test by @ReubenBond in #6713
  • AAD authentication for Azure Event Hub by @aelij in #6667
  • Ensure that only only instance of IncomingRequestMonitor is created by @ReubenBond in #6715
  • Reduce log noise from Catalog and SiloConnectionMaintainer by @ReubenBond in #6705
  • Kubernetes hosting integration by @ReubenBond in #6707
  • Add initial workflow file for GitHub PR builds by @ReubenBond in #6692
  • Add workflow to build docs without publishing them by @ReubenBond in #6691
  • Update release notes for 3.3.0 to reflect the fact that addition of RecordExists is a potentially breaking change by @sergeybykov in #6725
  • Initial message scheduling reorganization by @ReubenBond in #6621
  • Removed filtering from streaming infrastructure by @benjaminpetit in #6711
  • Update changelog for 3.3.0-rc2 by @sergeybykov in #6727
  • Fix handling of requests to invalid activation by @ReubenBond in #6728
  • Update changelog for 3.3.0 by @sergeybykov in #6738
  • Reintroduce a simpler stream filter mechanism by @benjaminpetit in #6739
  • Point README to new nightly build feed by @ReubenBond in #6773
  • 2359 Update GenericHost to dotnet core 3.1 by @kashifsoofi in #6769
  • Update IHostEnvironmentStatistics.cs by @Kritner in #6780
  • Fix GitHub Actions ci.yml by @ReubenBond in #6788
  • Fix race in shutdown WorkItemGroups by @ReubenBond in #6785
  • Update README.md by @jingeno in #6771
  • Fix ActivationData.ToString() and SystemTarget.ToString() output by @ReubenBond in #6789
  • 2359 Upgrade HelloWorld to 3.3 by @kashifsoofi in #6768
  • 2359 upgrade chirper to 3.3 by @kashifsoofi in #6770
  • Add two samples that use Event Hub streaming by @benjaminpetit in #6760
  • Update OrleansServiceListener.cs by @danvanderboom in #6750
  • Perform self-health checks before suspecting other nodes by @ReubenBond in #6745
  • [CI] Build & publish docs on push to docs branch by @ReubenBond in #6791
  • Avoid race for stateless worker grains with activation limit #6795 by @EdeMeijer in #6796
  • Mark Kubernetes hosting package as stable by @ReubenBond in #6804
  • Fixing GrainReference.GetUniformHashCode() so that it produces uniform hashes again by @icanhasjonas in #6807
  • Format generic type parameters from generic type definition to have consistent grain interface ids for grains and interface by @Ilchert in #6777
  • Probe silos indirectly before submitting a vote by @ReubenBond in #6800
  • Fix for half and nested generics. by @Ilchert in #6810
  • Fix typo by @ReubenBond in #6814
  • Fix broken links as per #6821 by @ReubenBond in #6825
  • Fix broken link in README.md by @ChaosEx in #6824
  • Add IManagementGrain.GetActivationAddress() by @galvesribeiro in #6816
  • Support EventHubsTransportType on EventHub streams by @fuocor in #6813
  • Reduce allocations when parsing/comparing/formatting SiloAddresses, IDs, etc. by @pentp in #6823
  • Avoid disposing uncompleted task in LinuxEnvironmentStatistics by @galvesribeiro in #6842
  • Fix ToGatewayUri after #6823 by @ReubenBond in #6851
  • Fix typo in nuget package description of Microsoft.Orleans.GrainDirectory.Redis by @benjaminpetit in #6859
  • fix: genericmethodinvoker now correctly handles generic methods with overloads by @oising in #6844
  • Added ability to configure reminder period by @Chrishayes94 in #6854
  • Add ADO.NET Provider support MySqlConector 0.x and 1.x. by @buzzers in #6831
  • Improve performance of LRU.Add() by @jaslawinMs in #6870
  • Update OneBoxDeployment libraries and code and fix annoyances by @veikkoeeva in #6737
  • Remove IGatewayListListener and IGatewayListObservable by @ReubenBond in #6878
  • Flush test log output before process termination by @ReubenBond in #6876
  • Correctly log silo and client shutdown initiation and completion by @ReubenBond in #6875
  • Remove unused multicluster directory components by @ReubenBond in #6882
  • Improve output of GrainId.ToString(), InvokeMethodRequest.ToString() and Message.ToString() by @benjaminpetit in #6792
  • Close connections asynchronously and improve gracefulness by @JohnMorman in #6762
  • Remove unnecessary variable assignments by @ReubenBond in #6881
  • Ensure proper closure of file logging output by @ReubenBond in #6890
  • [Dispatcher] Moving the forwarding message by @maryammadzadeh in #6892
  • Avoid registering client observers during shutdown by @ReubenBond in #6879
  • Do not hand off grain directory during shutdown by @ReubenBond in #6883
  • Update NuGet.Config by @ReubenBond in #6873
  • Try to limit forwarding when a grain activation throws an exception in OnActivateAsync() by @benjaminpetit in #6891
  • Do not retry to send streaming events if the pulling agent has been stopped by @benjaminpetit in #6897
  • Throw an exception when trying to register an activation on an invalid silo by @benjaminpetit in #6896
  • Cleanup Kubernetes hosting package for stable release by @ReubenBond in #6902
  • Client directory by @ReubenBond in #6884
  • Update CI NuGet feed URL by @ReubenBond in #6906
  • Use TLS 1.2 when using Azure in tests by @benjaminpetit in #6909
  • Hack to force TLS 1.2 when using AppDomain based test silo by @benjaminpetit in #6916
  • Implement ISerializable fallback serializer by @ReubenBond in #6917
  • Fixing potential oversight of immutable code call by @berdon in #6923
  • Remove BinaryFormatter altogether by @ReubenBond in #6922
  • Updating Orleans.CodeGenerator.MSBuild with better documentation by @berdon in #6914
  • Update samples directory NuGet.config files by @ReubenBond in #6927
  • Added a base class to IStorage that is not generic by @zeus82 in #6928
  • Update tooling & targets to .NET 5 by @ReubenBond in #6924
  • EventHubs: Force latest version of Microsoft.Azure.Amqp by @benjaminpetit in #6935
  • Remove AssemblyLoader by @ReubenBond in #6939
  • Replace SafeRandom instances with a static ThreadSafeRandom by @pentp in #6938
  • Optimize and cleanup RingRange handling by @pentp in #6818
  • Adding analyzer to notify user classes that implement IGrain should inherit from Grain by @QueenCitySmitty in #6941
  • Only send a rejection if the message is a request by @benjaminpetit in #6946
  • Avoid Message.Id collision in the message callback dictionary lookup by @benjaminpetit in #6945
  • Fix .NET 5 CI build by @ReubenBond in #6947
  • Fix codegen NuGet package by @ReubenBond in #6949
  • Refactor Orleans.Streaming into separate packages by @ReubenBond in #6942
  • Event Hubs: Update to the latest GA package by @jsquire in #6951
  • Fix distributed load test depending on internals by @ReubenBond in #6953
  • Fix LRU race conditions and remove dead code by @pentp in #6952
  • Move all event sourcing code into Orleans.EventSourcing by @ReubenBond in #6940
  • Project and package dependencies cleanup by @pentp in #6956
  • Avoid exceptions from AsyncTimer cancellation by @pentp in #6697
  • Reduce global lock use for ConcurrentDictionary by @pentp in #6955
  • Implement C# Source Generator by @ReubenBond in #6925
  • Remove dead code in Message class by @chwarr in #6970
  • Rename Microsoft.Orleans.OrleansServiceBus package to Microsoft.Orleans.Streaming.EventHubs by @QueenCitySmitty in #6966
  • Return zero elapsed time for unstarted Messages by @chwarr in #6969
  • Add test for concurrent GrainCancellationTokens by @enewnham in #6967
  • Improve error message for OpenConnectionTimeout by @pentp in #6716
  • Fix breaking of outstanding messages when a silo shuts down by @ReubenBond in #6977
  • GrainId.ToString(): use Type if GetGrainTypeName returns null by @ReubenBond in #6965
  • Populate application parts from generated code by @ReubenBond in #6971
  • Remove dependence on AppDomain from tests by @ReubenBond in #6937
  • Call ScheduleCollection before starting processing requests by @benjaminpetit in #6975
  • Fix retry logic in PersistentStreamPullingAgent.RunConsumerCursor by @benjaminpetit in #6982
  • Code cleanup in Task Scheduler by @andrew-kuzovov in #6981
  • Remove Performance Counters package by @ReubenBond in #6972
  • Remove .NET Standard 2.0 target and set .NET Core 3.1 as the minimum by @ReubenBond in #6984
  • Fix count check when trying to create new stateless workers by @benjaminpetit in #6988
  • Remove code obsoleted by TargetFramework change by @ReubenBond in #6986
  • Remove unused code in TaskSchedulerAgent by @ReubenBond in #6995
  • Configure MemoryGrainStorageOptionsValidator by @ReubenBond in #6993
  • Remove SimpleAzureQueueAdapter by @benjaminpetit in #6998
  • Remove more unused code by @ReubenBond in #6996
  • Prevent source generator from running during design time by @ReubenBond in #7000
  • Fix a typo in AnalyzeWorkload by @linluxiang in #7009
  • TickStatus constructor access modifier changed to public by @syberside in #7038
  • Add GrainStorage.AdoNet benchmark along with concurency and larger payloads by @enewnham in #7010
  • Remove support for multiple activations in grain directory by @ReubenBond in #7047
  • Refactor PlacementService and reduce allocations by @ReubenBond in #7048
  • Catch potential exceptions in AddOnDeactivate calls by @ReubenBond in #6994
  • Do not retry handshake with consumer if agent is shutting down by @benjaminpetit in #7068
  • In PooledQueueCache, avoid cache miss if we know that we didn't missed any event by @benjaminpetit in #7101
  • Consolidated DynamoDBClientOptions by @PiotrJustyna in #7083
  • Add c#9 record support to serializer by @oising in #7108
  • Overhaul samples by @ReubenBond in #7114
  • Add Orleans.Serialization library as a high-fidelity, version-tolerant serializer by @ReubenBond in #7070
  • Fix how README files are linked within samples by @ReubenBond in #7115
  • Added token to DynamoDB client configuration. by @PiotrJustyna in #7104
  • Fix SQL Server connection string by @veikkoeeva in #7079
  • Fix SonarQube's "Any() should be used to test for emptiness" / Code S… by @marodev in #7080
  • Remove SiloHostBuilder by @ReubenBond in #7117
  • In GrainId, use concrete types instead of string and store the MembershipVersion by @benjaminpetit in #7118
  • Add Silo RoleName based placement by @Mazurkevichkv in #7061
  • EditorConfig - prefix private fields with '_' by @ReubenBond in #7125
  • Remove logging noise from MemoryStorageGrain by @ReubenBond in #7123
  • Updated AzureBlobStorage to use state type during JSON deserialization by @benthepoet in #7147
  • Fix summary reference on GrainCallFilterExtensions by @Arithmomaniac in #7163
  • Make OnStop observer optional by @pentp in #7173
  • Fix unhandled exception on k8s watcher background task by @hami89 in #7168
  • Fix streaming caching tests by @benjaminpetit in #7137
  • Clean up Counters logging by @ReubenBond in #7149
  • Fix SimpleQueueCache log calls - one of them had a broken log string by @ReubenBond in #7150
  • Added AWS profile name support to DynamoDBStorage. by @PiotrJustyna in #7159
  • Move OnexBoxDeployment to another location by @veikkoeeva in #7129
  • Cleanup dependencies by @pentp in #7178
  • Improve code generator editor experience by @ReubenBond in #7152
  • Avoid excessive locking on grainBucketUpdateLock in ClientMessageCenter by @ReubenBond in #7151
  • Set a default ClusterId and ServiceId by @ReubenBond in #7122
  • #6908 - change the ETag options when writing to Azure Blob Storage Provider by @richorama in #7187
  • Prevent exceptions from participating in reference cycles by @ReubenBond in #7196
  • Add selector for the client by @andyatwork in #7144
  • VirtualBucketsRingProvider.RemoveServer: check if removed buckets belonged to removed silo by @Horusiath in #7200
  • Initial support to CodeSpaces and Dev Container by @galvesribeiro in #7209
  • Add VSCode launch settings by @galvesribeiro in #7211
  • Add ActivationWorkingSet to monitor recently active activations by @ReubenBond in #7127
  • Refactor activation message flow by @ReubenBond in #7153
  • Fix [KeepAlive] for MemoryStorageGrain & ReminderTableGrain by @ReubenBond in #7214
  • PlacementService: improve performance, reduce directory requests, improve consistency of decisions by @ReubenBond in #7154
  • ExceptionCodec: use Activator, not ActivatorUtilities, to instantiate exceptions by @ReubenBond in #7217
  • Remove IGrainLocator.TryLocalLookup and rename TryCacheOnlyLookup by @ReubenBond in #7215
  • Reduce allocations in IOQueue by @ReubenBond in #7219
  • [CodeGen] Avoid calling GetInvokable for empty-constructable types by @ReubenBond in #7220
  • Fix ResponseCompletionSource.SetResult for exception results by @ReubenBond in #7221
  • Clean up noisy logging in DeploymentLoadPublisher by @ReubenBond in #7218
  • Fix incremental rebuild for MSBuild codegen package by @ReubenBond in #7224
  • Improved Exception serialization by @ReubenBond in #7225
  • Use more appropriate logger names for lifecycle types by @ReubenBond in #7226
  • Remove superfluous IGrainRuntime.ServiceId by @ReubenBond in #7229
  • Avoid accessing ActivationData.ActivationId in tests by @ReubenBond in #7230
  • Support custom grain directory cache implementations by @ReubenBond in #7232
  • More fix to avoid shutdown pulling agent sending messages by @benjaminpetit in #7223
  • Add IManagementGrain method to get all active grains of a given type & improve SMSDeactivation test with it by @ReubenBond in #7216
  • Fix shutdown race condition in GrainTimer by @benjaminpetit in #7233
  • Add ObjectSerializer to support serialization of known types without generics by @ReubenBond in #7235
  • Remove multi-activation grains from Catalog and ActivationDirectory by @ReubenBond in #7231
  • Remove unneccessary GrainReference method and async state machine by @ReubenBond in #7239
  • Reduce indirection in RuntimeContext by @ReubenBond in #7240
  • Change equality for IdSpan so that empty and null values are identical by @ReubenBond in #7241
  • Remove irrelevant message serialization benchmark by @ReubenBond in #7242
  • Make ActivationId a struct backed by a Guid by @ReubenBond in #7243
  • Merge HeadersContainer into Message by @ReubenBond in #7245
  • LocalGrainDirectory: reduce lookup contention by consulting cache before partition by @ReubenBond in #7244
  • Add CoarseStopwatch using Environment.TickCount64 and use on hot paths by @ReubenBond in #7246
  • Add and use ConcurrentObjectPool instead of DefaultObjectPool by @ReubenBond in #7247
  • Added distributed tracing support: activity and diagnostic listener. by @Ilchert in #6853
  • Fix break to LRU.RemoveExpired() by @ReubenBond in #7252
  • Remove NewGrainReference by @ReubenBond in #7249
  • Improve performance for ValueTask methods by @ReubenBond in #7250
  • Remove unused code in MemoryStreamBufferWriter by @ReubenBond in #7270
  • Avoid unregistering PersistentStreamPullingAgent instances by @ReubenBond in #7263
  • #7189 Updated Newtonsoft JSON library by @dpbevin in #7272
  • [Dependencies] Updating Event Hubs SDK by @jsquire in #7281
  • Add TelemetryConfiguration support for AITelemetryConsumer by @xinyi-joffre in #7278
  • [Dependencies] Updating Azure Storage Versions by @jsquire in #7288
  • Fix: wrong parameter used when throwing QueueCacheMissException by @benjaminpetit in #7295
  • Make IGrainState and IGrainStorage methods generic by @benjaminpetit in #7265
  • Remove unnecessary xml configuration files by @ReubenBond in #7297
  • Fix Response.ToString() by @ReubenBond in #7296
  • Remove ISerializableSupport namespace segment by @ReubenBond in #7298
  • Simplify IMemoryGrainStorage by @benjaminpetit in #7269
  • Fix token comparison in SetCursor (#7308) by @benjaminpetit in #7315
  • Add Google.Protobuf to benchmarks by @JamesNK in #7329
  • #6662 New UseOrleansClient for generic HostBuilder by @dpbevin in #7276
  • Rename the Consul package to Microsoft.Orleans.Clustering.Consul and clean up package metadata by @bjorkstromm in #7331
  • Rename the ZooKeeper package to Microsoft.Orleans.Clustering.ZooKeeper and clean up metadata by @bjorkstromm in #7332
  • [Perf] SerializerSessionPool should use SerializerSession constructor directly by @ReubenBond in #7334
  • Migrate to Azure.Data.Tables SDK for Azure Table Storage by @ReubenBond in #7300
  • Fix well-known static copier implementations by @ReubenBond in #7343
  • Remove unused Request types from Orleans.Serialization by @ReubenBond in #7347
  • Fix: Orleans.Hosting.KubernetesHosting: System.MissingMethodException by @highlyunavailable in #7346
  • Make Silo.WaitForMessageToBeQueuedForOutbound configurable. Fixes #7350 by @notanaverageman in #7354
  • Fix minor typo in comment in Postgres persistence setup by @nycdotnet in #7356
  • Rewrite batch build script in powershell by @benjaminpetit in #7379
  • Support additional authentication options for Azure Event Hub streams provider by @ReubenBond in #7383
  • Do not register IGrainStorage in DI unless there is a provider named "Default" by @ReubenBond in #7409
  • Fix Discord server status button link by @ReubenBond in #7413
  • Use Ordinal comparisons instead of culture sensitive comparisons by @meziantou in #7426
  • Remove closures when using ConcurrentDictionary by @meziantou in #7425
  • Flow CancellationToken in Roslyn Analyzers by @meziantou in #7428
  • Replace First and Last with indexer and FirstOrDefault with Find when available by @meziantou in #7427
  • Remove FrameworkPartAttribute by @ReubenBond in #7422
  • Fix equality comparer used in ReferencedObjectCollection's overflow dictionary by @ReubenBond in #7433
  • Support serialization of manual (non-auto) properties by @ReubenBond in #7435
  • Replace ActivationAddress by GrainAddress by @benjaminpetit in #7372
  • Initial commit for distributed tests using crank by @benjaminpetit in #7323
  • Options formatter should not format obsolete or inaccessible properties by @ReubenBond in #7432
  • Fix in Redis GrainDirectory: when deleting, check only the ActivationId by @benjaminpetit in #7378
  • Porting IOQueue lock free implementation by @brunolins16 in #7449
  • Rename CheapStopwatch.cs to CoarseStopwatch.cs by @davidelettieri in #7452
  • Fix some test code crashes caused by logging from unawaited background tasks by @ReubenBond in #7446
  • AdoNet - be more explicit when extracting DateTime from IDataRecord by @mjameson-se in #6968
  • Use DistributedContextPropagator to propagate Activities by @suraciii in #7443
  • Adding a default value to EndpointOptions.AdvertisedIPAddress by @brunolins16 in #7457
  • Create PostgreSQL migrations for version 3.5.2 by @EdeMeijer in #7490
  • Configure grain state serializer per storage provider by @benjaminpetit in #7416
  • Add a catch block in Azure DeleteQueueMessage for 404 error (#7461) by @rmt2021 in #7508
  • Small telemetry correlation fix by @Vlad-Stryapko in #7506
  • Expose deactivation reason to user code and flow timeouts for activation/deactivation by @ReubenBond in #7503
  • Upgrade to .NET 6.0.101 SDK, add .NET 6.0 target, fix packaging by @ReubenBond in #7511
  • Move RequestContext to end of message headers by @ReubenBond in #7512
  • Use ExceptionDispatchInfo.SetRemoteStackTrace API in .NET 6.0 builds by @ReubenBond in #7513
  • Add support for POCO grains by @ReubenBond in #7360
  • Fix serialization of exceptions with a null stack trace by @ReubenBond in #7533
  • Upgrade to .NET 6 and modernize by @IEvangelist in #7537
  • Use Orleans.Serialization for the default IGrainStorageSerializer by @ReubenBond in #7542
  • Facilitate attaching debugger to Orleans.TestingHost by @ReubenBond in #7541
  • Fix potential NullReferenceException during GatewayManager initialization by @ReubenBond in #7540
  • Remove last reference to gitter. by @ElanHasson in #7550
  • Add the Microsoft prefix for newly added packages by @ReubenBond in #7549

New Contributors

  • @fatkenny made their first contribution in #6081
  • @dustout made their first contribution in #6083
  • @JTOne123 made their first contribution in #6086
  • @shawnallen85 made their first contribution in #6091
  • @fdbeirao made their first contribution in #6100
  • @sehra made their first contribution in #6122
  • @mindlink made their first contribution in #6102
  • @cjenp made their first contribution in #6192
  • @thelaughingman made their first contribution in #6205
  • @ElderJames made their first contribution in #6208
  • @voronov-maxim made their first contribution in #6238
  • @MaherJendoubi made their first contribution in #6254
  • @juyuz made their first contribution in #6154
  • @icanhasjonas made their first contribution in #6268
  • @AmirSasson made their first contribution in #6275
  • @JohnDebono made their first contribution in #6286
  • @Ilchert made their first contribution in #6302
  • @pipermatt made their first contribution in #6333
  • @oleggolovkovuss made their first contribution in #6408
  • @abe545 made their first contribution in #6409
  • @mchandler-manticore made their first contribution in #6444
  • @govenkat-ms made their first contribution in #6432
  • @terrajobst made their first contribution in #6457
  • @johnazariah made their first contribution in #6469
  • @adyada made their first contribution in #6467
  • @atifaziz made their first contribution in #6496
  • @teo-tsirpanis made their first contribution in #6638
  • @aelij made their first contribution in #6648
  • @jingeno made their first contribution in #6771
  • @danvanderboom made their first contribution in #6750
  • @ChaosEx made their first contribution in #6824
  • @fuocor made their first contribution in #6813
  • @Chrishayes94 made their first contribution in #6854
  • @jaslawinMs made their first contribution in #6870
  • @maryammadzadeh made their first contribution in #6892
  • @QueenCitySmitty made their first contribution in #6941
  • @jsquire made their first contribution in #6951
  • @chwarr made their first contribution in #6970
  • @enewnham made their first contribution in #6967
  • @andrew-kuzovov made their first contribution in #6981
  • @linluxiang made their first contribution in #7009
  • @syberside made their first contribution in #7038
  • @PiotrJustyna made their first contribution in #7083
  • @marodev made their first contribution in #7080
  • @benthepoet made their first contribution in #7147
  • @Arithmomaniac made their first contribution in #7163
  • @hami89 made their first contribution in #7168
  • @andyatwork made their first contribution in #7144
  • @Horusiath made their first contribution in #7200
  • @dpbevin made their first contribution in #7272
  • @xinyi-joffre made their first contribution in #7278
  • @JamesNK made their first contribution in #7329
  • @notanaverageman made their first contribution in #7354
  • @nycdotnet made their first contribution in #7356
  • @meziantou made their first contribution in #7426
  • @brunolins16 made their first contribution in #7449
  • @davidelettieri made their first contribution in #7452
  • @mjameson-se made their first contribution in #6968
  • @rmt2021 made their first contribution in #7508
  • @Vlad-Stryapko made their first contribution in #7506

Full Changelog: v3.0.0...v4.0.0-preview1

Don't miss a new orleans release

NewReleases is sending notifications on new releases.