Bot releases are visible (Hide)
Published by ReubenBond over 1 year ago
IGrainActivationContextAccessor
, providing access to IGrainActivationContext
by @ReubenBond in https://github.com/dotnet/orleans/pull/8076
Full Changelog: https://github.com/dotnet/orleans/compare/v3.6.5...v3.7.0
Published by ReubenBond over 1 year ago
The Orleans release team would like to thank everyone who contributed issues, PRs, reviews, and comments.
Collection<T>
(https://github.com/dotnet/orleans/pull/8238)IGrainStorageSerializer
in memory storage (https://github.com/dotnet/orleans/pull/8250)EndpointOptions
by @IEvangelist in https://github.com/dotnet/orleans/pull/8209
AddJsonSerializer
by @ReubenBond in https://github.com/dotnet/orleans/pull/8228
Collection<T>
serialization codec by @ReubenBond in https://github.com/dotnet/orleans/pull/8238
IGrainStorageSerializer
for memory grain storage by @shoneefd in https://github.com/dotnet/orleans/pull/8250
DeleteStateOnClear
for Redis grain storage. by @ReubenBond in https://github.com/dotnet/orleans/pull/8296
PooledArrayBufferWriter.AsMemory
by @ReubenBond in https://github.com/dotnet/orleans/pull/8300
IGrainFactory.GetGrain<T>
for unimplemented generic interfaces by @ReubenBond in https://github.com/dotnet/orleans/pull/8301
Full Changelog: https://github.com/dotnet/orleans/compare/v7.0.0...v7.1.0
Published by ReubenBond almost 2 years ago
Release announcement post: https://devblogs.microsoft.com/dotnet/whats-new-in-orleans-7/
Migration notes: https://learn.microsoft.com/en-us/dotnet/orleans/whats-new-in-orleans
ServiceUrl
when region is provided. by @icanhasjonas in https://github.com/dotnet/orleans/pull/6327
UseProvisionedThroughput
by @icanhasjonas in https://github.com/dotnet/orleans/pull/6328
Catalog
and ActivationDirectory
by @ReubenBond in https://github.com/dotnet/orleans/pull/7231
CoarseStopwatch
using Environment.TickCount64
and use on hot paths by @ReubenBond in https://github.com/dotnet/orleans/pull/7246
ConcurrentObjectPool
instead of DefaultObjectPool
by @ReubenBond in https://github.com/dotnet/orleans/pull/7247
ValueTask
methods by @ReubenBond in https://github.com/dotnet/orleans/pull/7250
MemoryStreamBufferWriter
by @ReubenBond in https://github.com/dotnet/orleans/pull/7270
PersistentStreamPullingAgent
instances by @ReubenBond in https://github.com/dotnet/orleans/pull/7263
Response.ToString()
by @ReubenBond in https://github.com/dotnet/orleans/pull/7296
IGrainStorage
in DI unless there is a provider named "Default" by @ReubenBond in https://github.com/dotnet/orleans/pull/7409
CpuLimit
if deltaTotalTime
is zero in LinuxEnvironmentStatistics
by @ElanHasson in https://github.com/dotnet/orleans/pull/7526
servideId
-> serviceId
by @khalidabuhakmeh in https://github.com/dotnet/orleans/pull/7559
IGrainFactory.CreateObjectReference
and IGrainFactory.DeleteObjectReference
synchronous by @benjaminpetit in https://github.com/dotnet/orleans/pull/7552
PerformanceTuningOptions
by @ReubenBond in https://github.com/dotnet/orleans/pull/7586
IGrainCallContext
for distributed tracing by @ReubenBond in https://github.com/dotnet/orleans/pull/7646
LocalGrainDirectory
calls while shutting down by @ReubenBond in https://github.com/dotnet/orleans/pull/7670
AzureGrainDirectory
and AzureTableDataManager
tests in emulator by @ReubenBond in https://github.com/dotnet/orleans/pull/7729
ServiceCollectionExtensions.AddFromExisting
when ... by @ElanHasson in https://github.com/dotnet/orleans/pull/7724
is not null
over is object
by @ReubenBond in https://github.com/dotnet/orleans/pull/7779
ExecutionContext
when interacting with reminders by @ReubenBond in https://github.com/dotnet/orleans/pull/7789
GrainType
and GrainInterfaceType
by @ReubenBond in https://github.com/dotnet/orleans/pull/7821
IConsistentRingProvider
implementations should notify immediately on subscribe by @ReubenBond in https://github.com/dotnet/orleans/pull/7847
LocalReminderService
, and tests by @ReubenBond in https://github.com/dotnet/orleans/pull/7855
Microsoft.Orleans.OrleansRuntime
package to Microsoft.Orleans.Runtime
by @ReubenBond in https://github.com/dotnet/orleans/pull/7912
Message
object by @ReubenBond in https://github.com/dotnet/orleans/pull/7857
ActivationDataExtra
to reduce overhead by @ReubenBond in https://github.com/dotnet/orleans/pull/7976
StatelessWorkerGrainContext.GetComponent
implementation. by @ReubenBond in https://github.com/dotnet/orleans/pull/7975
scoped
refs) & migrate to .NET 7.0 by @ReubenBond in https://github.com/dotnet/orleans/pull/7987
DateOnly
and TimeOnly
by @ReubenBond in https://github.com/dotnet/orleans/pull/8064
SingleWaiterAutoResetEvent
implementation by @ReubenBond in https://github.com/dotnet/orleans/pull/8105
Full Changelog: https://github.com/dotnet/orleans/compare/v3.0.0...v7.0.0
Published by ReubenBond about 2 years ago
Note that we have aligned versions with .NET, down to the release candidate number. This means that Orleans 7.0.0 replaces the would-be Orleans 4.0.0 release
Microsoft.Orleans.OrleansRuntime
package to Microsoft.Orleans.Runtime
by @ReubenBond in https://github.com/dotnet/orleans/pull/7912
Message
object by @ReubenBond in https://github.com/dotnet/orleans/pull/7857
ActivationDataExtra
to reduce overhead by @ReubenBond in https://github.com/dotnet/orleans/pull/7976
StatelessWorkerGrainContext.GetComponent
implementation. by @ReubenBond in https://github.com/dotnet/orleans/pull/7975
scoped
refs) & migrate to .NET 7.0 by @ReubenBond in https://github.com/dotnet/orleans/pull/7987
Full Changelog: https://github.com/dotnet/orleans/compare/v4.0.0-preview2...v7.0.0-rc1
Published by ReubenBond about 2 years ago
NullReferenceException
when too many instances of a [StatelessWorker]
are created and Debug
logging is enabled by @ReubenBond in https://github.com/dotnet/orleans/pull/7918
Full Changelog: https://github.com/dotnet/orleans/compare/v3.6.4...v3.6.5
Published by ReubenBond about 2 years ago
Full Changelog: https://github.com/dotnet/orleans/compare/v3.6.3...v3.6.4
Published by ReubenBond about 2 years ago
Full Changelog: https://github.com/dotnet/orleans/compare/v3.6.2...v3.6.3
Published by ReubenBond about 2 years ago
CpuLimit
if deltaTotalTime
is zero in LinuxEnvironmentStatistics
by @ElanHasson in https://github.com/dotnet/orleans/pull/7526
servideId
-> serviceId
by @khalidabuhakmeh in https://github.com/dotnet/orleans/pull/7559
IGrainFactory.CreateObjectReference
and IGrainFactory.DeleteObjectReference
synchronous by @benjaminpetit in https://github.com/dotnet/orleans/pull/7552
PerformanceTuningOptions
by @ReubenBond in https://github.com/dotnet/orleans/pull/7586
IGrainCallContext
for distributed tracing by @ReubenBond in https://github.com/dotnet/orleans/pull/7646
LocalGrainDirectory
calls while shutting down by @ReubenBond in https://github.com/dotnet/orleans/pull/7670
AzureGrainDirectory
and AzureTableDataManager
tests in emulator by @ReubenBond in https://github.com/dotnet/orleans/pull/7729
ServiceCollectionExtensions.AddFromExisting
when ... by @ElanHasson in https://github.com/dotnet/orleans/pull/7724
is not null
over is object
by @ReubenBond in https://github.com/dotnet/orleans/pull/7779
ExecutionContext
when interacting with reminders by @ReubenBond in https://github.com/dotnet/orleans/pull/7789
GrainType
and GrainInterfaceType
by @ReubenBond in https://github.com/dotnet/orleans/pull/7821
IConsistentRingProvider
implementations should notify immediately on subscribe by @ReubenBond in https://github.com/dotnet/orleans/pull/7847
LocalReminderService
, and tests by @ReubenBond in https://github.com/dotnet/orleans/pull/7855
Full Changelog: https://github.com/dotnet/orleans/compare/v4.0.0-preview1...v4.0.0-preview2
Published by ReubenBond over 2 years ago
Full Changelog: https://github.com/dotnet/orleans/compare/v3.6.1...v3.6.2
Published by ReubenBond over 2 years ago
Full Changelog: https://github.com/dotnet/orleans/compare/v3.6.0...v3.6.1
Published by ReubenBond over 2 years ago
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 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 GrainId
s 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.
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:
int
, DateTimeOffset
, and user-defined struct
sInstead, 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.
[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.GrainId
and StreamId
are so different, persistence, streams, and reminders are not forward-compatible yet.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:
The second analyzer will add [Id(x)]
attributes for you:
ServiceUrl
when region is provided. by @icanhasjonas in https://github.com/dotnet/orleans/pull/6327
UseProvisionedThroughput
by @icanhasjonas in https://github.com/dotnet/orleans/pull/6328
Catalog
and ActivationDirectory
by @ReubenBond in https://github.com/dotnet/orleans/pull/7231
CoarseStopwatch
using Environment.TickCount64
and use on hot paths by @ReubenBond in https://github.com/dotnet/orleans/pull/7246
ConcurrentObjectPool
instead of DefaultObjectPool
by @ReubenBond in https://github.com/dotnet/orleans/pull/7247
ValueTask
methods by @ReubenBond in https://github.com/dotnet/orleans/pull/7250
MemoryStreamBufferWriter
by @ReubenBond in https://github.com/dotnet/orleans/pull/7270
PersistentStreamPullingAgent
instances by @ReubenBond in https://github.com/dotnet/orleans/pull/7263
Response.ToString()
by @ReubenBond in https://github.com/dotnet/orleans/pull/7296
IGrainStorage
in DI unless there is a provider named "Default" by @ReubenBond in https://github.com/dotnet/orleans/pull/7409
Full Changelog: https://github.com/dotnet/orleans/compare/v3.0.0...v4.0.0-preview1
Published by ReubenBond over 2 years ago
Authentication to Azure services has evolved and connection strings are typically deemphasized in favor of managed identities. In this release, we've migrated Azure providers to newer libraries which support managed identities and other authentication methods and we've updated options to expose this functionality. Since there are a large number of potential authentication methods requiring various combinations of options, we moved away from exposing each property and instead added configuration methods to the provider options.
For example, AzureStorageOperationOptions
has a ConfigureTableServiceClient
method with the following overloads:
void ConfigureTableServiceClient(string connectionString)
void ConfigureTableServiceClient(Uri serviceUri)
void ConfigureTableServiceClient(Func<Task<TableServiceClient>> createClientCallback)
void ConfigureTableServiceClient(Uri serviceUri, TokenCredential tokenCredential)
void ConfigureTableServiceClient(Uri serviceUri, AzureSasCredential azureSasCredential)
void ConfigureTableServiceClient(Uri serviceUri, TableSharedKeyCredential sharedKeyCredential)
Configuration methods help to ensure that the right combination of parameters are provided.
Note, if you are using ASP.NET Core 2.1, please note that we have had reports of users running into an incompatibility issue in Microsoft.Extensions, preventing the upgrade. Please see https://github.com/dotnet/extensions/issues/3800, https://github.com/dotnet/aspnetcore/issues/40255, and https://github.com/dotnet/orleans/issues/7608
Breaking and potentially breaking changes
Non-breaking improvements
Non-breaking bug fixes
Thank you to the following community members for your PR contributions and to everyone else who contributed: @mjameson-se @dave-b-code @michaeltdaniels @EdeMeijer @shmurchi
Full Changelog: https://github.com/dotnet/orleans/compare/v3.5.1...v3.6.0
Published by ReubenBond almost 3 years ago
Potentially-breaking changes
Non-breaking improvements
Microsoft.Orleans.Kubernetes.Hosting
package (Fix: Orleans.Hosting.KubernetesHosting: System.MissingMethodException (#7364))Non-breaking bug fixes
Published by benjaminpetit about 3 years ago
This release is based on 3.4.3, but without some changes made in 3.5.0, noticeably the Event Hubs library upgrade.
If possible, users should upgrade to 3.5.0 instead.
Published by ReubenBond about 3 years ago
Non-breaking improvements
ILBasedSerializer
when BinaryFormatter
is disabled (#7198)TokenCredential
support on Azure Event Hubs Stream Provider (#7166)MembershipVersion
in GrainAddress
(#7133)ValueTask
and ValueTask<T>
to be used in generic grain methods (#7190)Non-breaking bug fixes
PooledQueueCache
, avoid cache miss if we know that we didn't miss any event (#7060)GenericMethodInvoker
now correctly handles generic methods with overloads (#6844)EventHubReceiverProxy
: ignore if offset isn't valid (#7192)GrainTimer
(#7234)Published by ReubenBond about 3 years ago
Published by ReubenBond over 3 years ago
Non-breaking improvements
Non-breaking bug fixes
Published by ReubenBond over 3 years ago
The Microsoft.Orleans.Kubernetes.Hosting
package is now marked as stable. This package is intended to help users who are deploying to Kubernetes by automating configuration of silos, monitoring Kubernetes for changes in the active pods, and terminating pods which are marked as defunct by the Orleans cluster. Please try it and give us your feedback. Documentation is available here and a sample project is available here.
Non-breaking improvements
LRU.Add()
(#6872)IStorage
that is not generic (#6928) (#6931)Non-breaking bug fixes
RunningRequestSenders
(#6903)LinuxEnvironmentStatistics
(#6842) (#6887)GrainDirectoryPartition
, throw an exception instead of returning null
if trying to register an activation on a non-valid silo (#6896) (#6901)OnActivateAsync()
(#6891) (#6893)Published by ReubenBond almost 4 years ago
This release includes improvements to the cluster membership algorithm which are opt-in in this initial release. These changes are aimed at improving the accuracy of cluster membership when some or all nodes are in a degraded state. Details follow.
This PR implements some of the ideas from Lifeguard (paper, talk, blog) which can help during times of catastrophe, where a large portion of a cluster is in a state of partial failure. One cause for these kinds of partial failures is large scale thread pool starvation, which can cause a node to run slowly enough to not process messages in a timely manner. Slow nodes can therefore suspect healthy nodes simply because the slow node is not able to process the healthy node's timely response. If a sufficiently proportion of nodes in a cluster are slow (eg, due to an application bug), then healthy nodes may have trouble joining and remaining in the cluster, since the slow nodes can evict them. In this scenario, slow nodes will also be evicting each other. The intention is to improve cluster stability in these scenarios.
This PR introduces LocalSiloHealthMonitor
which uses heuristics to score the local silo's health. A low score (0) represents a healthy node and a high score (1 to 8) represents an unhealthy node.
LocalSiloHealthMonitor
implements the following heuristics:
Active
in membershipFailing heuristics contribute to increased probe timeouts, which has two effects:
This effects of this feature are disabled by default in this release, with only passive background monitoring being enabled. The extended probe timeouts feature can be enabled by setting ClusterMembershipOptions.ExtendProbeTimeoutDuringDegradation
to true
. The passive background monitoring period can be configured by changing ClusterMembershipOptions.LocalHealthDegradationMonitoringPeriod
from its default value of 10 seconds.
This PR adds support for indirectly pinging silos before suspecting/declaring them dead.
When a silo is one missed probe away from being voted, the monitoring silo switches to indirect pings. In this mode, the silo picks a random other silo and sends it a request to probe the target silo. If that silo responds promptly with a negative acknowledgement (after waiting for a specified timeout), then the silo will be suspected/declared dead.
Additionally, when the vote limit to declare a silo dead is 2 silos, a negative acknowledgement counts for both required votes and the silos is unilaterally declared dead.
The feature is disabled by default in this release - only direct probes are used by-default - but could be enabled in a later release, or by users by setting ClusterMembershipOptions.EnableIndirectProbes
to true
.
Published by ReubenBond almost 4 years ago
This release includes improvements to the cluster membership algorithm which are opt-in in this initial release. These changes are aimed at improving the accuracy of cluster membership when some or all nodes are in a degraded state. Details follow.
This PR implements some of the ideas from Lifeguard (paper, talk, blog) which can help during times of catastrophe, where a large portion of a cluster is in a state of partial failure. One cause for these kinds of partial failures is large scale thread pool starvation, which can cause a node to run slowly enough to not process messages in a timely manner. Slow nodes can therefore suspect healthy nodes simply because the slow node is not able to process the healthy node's timely response. If a sufficiently proportion of nodes in a cluster are slow (eg, due to an application bug), then healthy nodes may have trouble joining and remaining in the cluster, since the slow nodes can evict them. In this scenario, slow nodes will also be evicting each other. The intention is to improve cluster stability in these scenarios.
This PR introduces LocalSiloHealthMonitor
which uses heuristics to score the local silo's health. A low score (0) represents a healthy node and a high score (1 to 8) represents an unhealthy node.
LocalSiloHealthMonitor
implements the following heuristics:
Active
in membershipFailing heuristics contribute to increased probe timeouts, which has two effects:
This effects of this feature are disabled by default in this release, with only passive background monitoring being enabled. The extended probe timeouts feature can be enabled by setting ClusterMembershipOptions.ExtendProbeTimeoutDuringDegradation
to true
. The passive background monitoring period can be configured by changing ClusterMembershipOptions.LocalHealthDegradationMonitoringPeriod
from its default value of 10 seconds.
This PR adds support for indirectly pinging silos before suspecting/declaring them dead.
When a silo is one missed probe away from being voted, the monitoring silo switches to indirect pings. In this mode, the silo picks a random other silo and sends it a request to probe the target silo. If that silo responds promptly with a negative acknowledgement (after waiting for a specified timeout), then the silo will be suspected/declared dead.
Additionally, when the vote limit to declare a silo dead is 2 silos, a negative acknowledgement counts for both required votes and the silos is unilaterally declared dead.
The feature is disabled by default in this release - only direct probes are used by-default - but could be enabled in a later release, or by users by setting ClusterMembershipOptions.EnableIndirectProbes
to true
.