Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v1.3.13 Production Release #3772

Merged
merged 22 commits into from
Apr 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
38084e0
Add ability to disable IPv6 for DNS resolution and outgoing socket co…
snekbaev Dec 20, 2018
49ea474
Merge branch 'dev' into configurable-io-socket-and-dns
Aaronontheweb Jan 8, 2019
e90ba36
Merge branch 'dev' into configurable-io-socket-and-dns
Aaronontheweb Jan 10, 2019
b6413e5
Merge branch 'dev' into configurable-io-socket-and-dns
snekbaev Feb 1, 2019
a63e752
Merge branch 'dev' into configurable-io-socket-and-dns
snekbaev Feb 20, 2019
da9ee86
Added v1.4 placeholder for nightlies (#3739)
Aaronontheweb Mar 14, 2019
863c644
Merge branch 'dev' into configurable-io-socket-and-dns
snekbaev Mar 18, 2019
a4876ff
Added an UnboundStablePriorityMailbox (#3536)
AndreSteenbergen Mar 21, 2019
980a009
[docs] fix broken links on website (#3745)
sean-gilliam Mar 26, 2019
b30e434
Merge branch 'dev' into configurable-io-socket-and-dns
sean-gilliam Apr 2, 2019
a579c97
Update books.md (#3750)
ThomasWetzel Apr 4, 2019
3a8e75e
Merge branch 'dev' into configurable-io-socket-and-dns
snekbaev Apr 8, 2019
130382e
Ensure that BatchingSqlJournal will propagate sql connection opening …
Horusiath Apr 8, 2019
9eaeb7b
Merge branch 'dev' into configurable-io-socket-and-dns
snekbaev Apr 11, 2019
fcddf96
Add public API change to approved
snekbaev Apr 12, 2019
d3b56f0
Merge pull request #3684 from snekbaev/configurable-io-socket-and-dns
Horusiath Apr 13, 2019
9cfa5a2
made ThrottleTransportAdapter messages public (#3761)
Aaronontheweb Apr 24, 2019
5ca783f
OnPersistRejected now logs an error with the complete stacktrace (#3763)
ismaelhamed Apr 25, 2019
47c42f1
Reducing log level of restarting to WARN (#3766)
ismaelhamed Apr 29, 2019
76d70a4
Ensure Arguments are never null (#3770)
Apr 30, 2019
9f75cf0
Akka.Remote socket leak fixes (#3764)
Aaronontheweb Apr 30, 2019
0b5e945
added v1.3.13 release notes (#3769)
Aaronontheweb Apr 30, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,25 @@
#### 1.3.13 April 30 2019 ####
**Maintenance Release for Akka.NET 1.3**
Well, we thought 1.3.12 would be the final release for Akka.NET v1.3.* - but then we found some nasty bugs prior to merging any of the v1.4 features into our development branch. But finally, for real this time - this is really the last v1.3.13 release.

This patch contains some critical bug fixes and improvements to Akka.NET:
* [Akka.Persistence: OnPersistRejected now logs an error with the complete stacktrace](https://github.com/akkadotnet/akka.net/pull/3763)
* [Akka.Persistence.Sql: Ensure that BatchingSqlJournal will propagate sql connection opening failure](https://github.com/akkadotnet/akka.net/pull/3754)
* [Akka: Add UnboundedStablePriorityMailbox](https://github.com/akkadotnet/akka.net/issues/2652)
* [Akka.Remote and Akka.Cluster: Port exhaustion problem with Akka.Cluster](https://github.com/akkadotnet/akka.net/issues/2575)

To [see the full set of changes for Akka.NET v1.3.13, click here](https://github.com/akkadotnet/akka.net/milestone/31).

| COMMITS | LOC+ | LOC- | AUTHOR |
| --- | --- | --- | --- |
| 2 | 5 | 6 | Ismael Hamed |
| 2 | 45 | 7 | Shukhrat Nekbaev |
| 2 | 23 | 30 | Aaron Stannard |
| 1 | 87 | 7 | Bartosz Sypytkowski |
| 1 | 492 | 9 | AndreSteenbergen |
| 1 | 2 | 2 | ThomasWetzel |
| 1 | 12 | 12 | Sean Gilliam |

#### 1.3.12 March 13 2019 ####
**Maintenance Release for Akka.NET 1.3**
This will be the final bugfix release for Akka.NET v1.3.* - going forward we will be working on releasing Akka.NET v1.4.
Expand Down
2 changes: 1 addition & 1 deletion docs/articles/actors/di-core.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ title: DI Core

**Akka.DI.Core** is an **ActorSystem extension** library for the Akka.NET
framework that provides a simple way to create an Actor Dependency Resolver
that can be used an alternative to the basic capabilities of [Props](Props)
that can be used an alternative to the basic capabilities of [Props](xref:receive-actor-api#props)
when you have actors with multiple dependencies.

# How do you create an Extension?
Expand Down
2 changes: 1 addition & 1 deletion docs/articles/actors/fault-tolerance.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ by overriding the `logFailure` method.
## Supervision of Top-Level Actors

Top-level actors means those which are created using `system.ActorOf()`, and
they are children of the [User Guardian](User guardian). There are no
they are children of the [User Guardian](xref:supervision#user-the-guardian-actor). There are no
special rules applied in this case, the guardian simply applies the configured
strategy.

Expand Down
2 changes: 1 addition & 1 deletion docs/articles/concepts/actors.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ title: Actors

The previous section about [Actor Systems](xref:actor-systems) explained how actors form hierarchies and are the smallest unit when building an application. This section looks at one such actor in isolation, explaining the concepts you encounter while implementing it. For a more in depth reference with all the details please refer to F# API or C# API.

An actor is a container for [State](#state), [Behavior](#behavior), a [Mailbox](#mailbox), [Children](#children) and a [Supervisor Strategy](#supervisor-strategy). All of this is encapsulated behind an [Actor Reference](#actor-reference). One noteworthy aspect is that actors have an explicit lifecycle, they are not automatically destroyed when no longer referenced; after having created one, it is your responsibility to make sure that it will eventually be terminated as well—which also gives you control over how resources are released [When an Actor Terminates](#when-an-actor-terminates).
An actor is a container for [State](#state), [Behavior](#behavior), a [Mailbox](#mailbox), [Children](#child-actors) and a [Supervisor Strategy](#supervisor-strategy). All of this is encapsulated behind an [Actor Reference](#actor-reference). One noteworthy aspect is that actors have an explicit lifecycle, they are not automatically destroyed when no longer referenced; after having created one, it is your responsibility to make sure that it will eventually be terminated as well—which also gives you control over how resources are released [When an Actor Terminates](#when-an-actor-terminates).

![Actor](/images/actor.png)

Expand Down
4 changes: 2 additions & 2 deletions docs/articles/intro/what-problems-does-actor-model-solve.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
uid: what-are-actors
uid: what-problems-does-actor-model-solve
title: What problems does the actor model solve?
---
# What problems does the actor model solve?
Expand Down Expand Up @@ -186,7 +186,7 @@ In this way, actors actually achieve the execution we imagined for objects:
![actors interact with each other by sending messages](/images/actor_graph.png)

An important difference of passing messages instead of calling methods is that messages have no return value.
By sending a message, an actor delegates work to another actor. As we saw in [The illusion of a call stack](what-are-actors.md#the-illusion-of-a-call-stack),
By sending a message, an actor delegates work to another actor. As we saw in [The illusion of a call stack](what-problems-does-actor-model-solve.md#the-illusion-of-a-call-stack),
if it expected a return value, the sending actor would either need to block or to execute the other actor's work on the same thread.
Instead, the receiving actor delivers the results in a reply message.

Expand Down
2 changes: 1 addition & 1 deletion docs/articles/persistence/event-sourcing.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ protected override void PreStart()

If persistence of an event is rejected before it is stored, e.g. due to serialization error, `OnPersistRejected` will be invoked (logging a warning by default), and the actor continues with next message.

If there is a problem with recovering the state of the actor from the journal when the actor is started, `OnRecoveryFailure` is called (logging the error by default), and the actor will be stopped. Note that failure to load snapshot is also treated like this, but you can disable loading of snapshots if you for example know that serialization format has changed in an incompatible way, see [Recovery customization](#recovery customization).
If there is a problem with recovering the state of the actor from the journal when the actor is started, `OnRecoveryFailure` is called (logging the error by default), and the actor will be stopped. Note that failure to load snapshot is also treated like this, but you can disable loading of snapshots if you for example know that serialization format has changed in an incompatible way, see [Recovery customization](#recovery-customization).

## Atomic writes
Each event is of course stored atomically, but it is also possible to store several events atomically by using the `PersistAll` or `PersistAllAsync` method. That means that all events passed to that method are stored or none of them are stored if there is an error.
Expand Down
4 changes: 2 additions & 2 deletions docs/articles/streams/pipeliningandparallelism.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ parallelisable (for example because the result of a processing step depends on a
step). One drawback is that if the processing times of the stages are very different then some of the stages will not
be able to operate at full throughput because they will wait on a previous or subsequent stage most of the time. In the
pancake example frying the second half of the pancake is usually faster than frying the first half, ``fryingPan2`` will
not be able to operate at full capacity [*1](_).
not be able to operate at full capacity <a href="#foot-note-1">[1]</a>.

> [!NOTE]
> Asynchronous stream processing stages have internal buffers to make communication between them more efficient.
Expand Down Expand Up @@ -171,5 +171,5 @@ compared to the parallel pipelines. This pattern rebalances after each step, whi
at the entry point of the pipeline. This only matters however if the processing time distribution has a large
deviation.

[*1](_) Bartosz's reason for this seemingly suboptimal procedure is that he prefers the temperature of the second pan
<a name="foot-note-1">[1]</a> Bartosz's reason for this seemingly suboptimal procedure is that he prefers the temperature of the second pan
to be slightly lower than the first in order to achieve a more homogeneous result.
6 changes: 3 additions & 3 deletions docs/articles/toc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
items:
- name: What is Akka.NET?
href: intro/what-is-akka.md
- name: What are actors?
href: intro/what-are-actors.md
- name: What problems does the actor model solve?
href: intro/what-problems-does-actor-model-solve.md
- name: Akka.NET Libraries and Modules
href: intro/modules.md
- name: Part 1. Top-level Architecture
Expand Down Expand Up @@ -121,7 +121,7 @@
- name: Streams Cookbook
href: streams/cookbook.md
- name: Configuration
href: streams/configuration.md
href: configuration/akka.streams.md
- name: Networking
items:
- name: I/O
Expand Down
4 changes: 2 additions & 2 deletions docs/community/books.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ title: Books
## Akka/Akka.NET
* [Reactive Web Applications](https://www.manning.com/books/reactive-web-applications) (Manuel Bernhardt, June 2016)
* [Akka in action](https://www.manning.com/books/akka-in-action) (Raymond Roestenburg, Rob Bakker, and Rob Williams, September 2016)
* [Reactive Applications with Akka.NET](https://www.manning.com/books/reactive-applications-with-akka-net) (Anthony Brown, **Not released yet**, MEAP began January 2016 Publication in Summer 2017)
* [Reactive Applications with Akka.NET](https://www.manning.com/books/reactive-applications-with-akka-net) (Anthony Brown, September 2018)

## Reactive programming
* [Reactive Messaging Patterns with the Actor Model](https://www.amazon.com/dp/B011S8YC5G) (Vaughn Vernon, July 2015)
* [Functional Reactive Programming](https://www.manning.com/books/functional-reactive-programming) (Stephen Blackheath and Anthony Jones, July 2016)
* [Functional and Reactive Domain Modeling](https://www.manning.com/books/functional-and-reactive-domain-modeling) (Debasish Ghosh, October 2016)
* [Reactive Design Patterns](https://www.manning.com/books/reactive-design-patterns) (Roland Kuhn with Brian Hanafee and Jamie Allen, February 2017)
* [Rx.NET in Action](https://www.manning.com/books/rx-dot-net-in-action) (Tamir Dresher, **Not released yet**, MEAP began July 2015 Publication in March 2017)
* [Reactive Application Development](https://www.manning.com/books/reactive-application-development) (Duncan K. DeVore, Sean Walsh, and Brian Hanafee, **Not released yet**, MEAP began December 2014 Publication in Summer 2017)
* [Reactive Application Development](https://www.manning.com/books/reactive-application-development) (Duncan K. DeVore, Sean Walsh, and Brian Hanafee, **Not released yet**, MEAP began December 2014 Publication in Summer 2017)
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ h2:before{
<p class="lead">
The Actor Model provides a higher level of abstraction for writing concurrent and distributed systems. It alleviates the developer from having to deal with explicit locking and thread management, making it easier to write correct concurrent and parallel systems. </p>
<p>Actors were defined in the 1973 paper by <a href="http://en.wikipedia.org/wiki/Carl_Hewitt">Carl Hewitt</a> but have been popularized by the Erlang language, and used for example at Ericsson with great success to build highly concurrent and reliable telecom systems.</p>
<p><a href="/articles/intro/what-are-actors.html">Read more</a></p>
<p><a href="/articles/intro/what-problems-does-actor-model-solve.html">Read more</a></p>
</div>

<div class="col-md-6 text-center">
Expand Down
1 change: 1 addition & 0 deletions src/Akka.sln.DotSettings
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpPlaceEmbeddedOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpRenamePlacementToArrangementMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpUseContinuousIndentInsideBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002ECSharpPlaceAttributeOnSameLineMigration/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
Expand Down
38 changes: 15 additions & 23 deletions src/common.props
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<PropertyGroup>
<Copyright>Copyright © 2013-2018 Akka.NET Team</Copyright>
<Authors>Akka.NET Team</Authors>
<VersionPrefix>1.3.12</VersionPrefix>
<VersionPrefix>1.3.13</VersionPrefix>
<PackageIconUrl>http://getakka.net/images/akkalogo.png</PackageIconUrl>
<PackageProjectUrl>https://github.com/akkadotnet/akka.net</PackageProjectUrl>
<PackageLicenseUrl>https://github.com/akkadotnet/akka.net/blob/master/LICENSE</PackageLicenseUrl>
Expand All @@ -19,29 +19,21 @@
</PropertyGroup>
<PropertyGroup>
<PackageReleaseNotes>Maintenance Release for Akka.NET 1.3**
This will be the final bugfix release for Akka.NET v1.3.* - going forward we will be working on releasing Akka.NET v1.4.
This patch contains many important bug fixes and improvements:
[Akka.Cluster.Sharding: Automatic passivation for sharding](https://github.com/akkadotnet/akka.net/pull/3718)
[Akka.Persistence: Optimize AtLeastOnceDelivery by not scheduling ticks when not needed](https://github.com/akkadotnet/akka.net/pull/3704)
[Akka.Persistence.Sql.Common: Bugfix CurrentEventsByTag does not return more than a 100 events](https://github.com/akkadotnet/akka.net/issues/3697)
[Akka.Persistence.Sql.Common: DeleteMessages when journal is empty causes duplicate key SQL exception](https://github.com/akkadotnet/akka.net/issues/3721)
[Akka.Cluster: SplitBrainResolver: don't down oldest if alone in cluster](https://github.com/akkadotnet/akka.net/pull/3690)
[Akka: Include manifest or class in missing serializer failure if possible](https://github.com/akkadotnet/akka.net/pull/3701)
[Akka: Memory leak when disposing actor system with non default ActorRefProvider](https://github.com/akkadotnet/akka.net/issues/2640)
To [see the full set of changes for Akka.NET v1.3.12, click here](https://github.com/akkadotnet/akka.net/milestone/30).
Well, we thought 1.3.12 would be the final release for Akka.NET v1.3.* - but then we found some nasty bugs prior to merging any of the v1.4 features into our development branch. But finally, for real this time - this is really the last v1.3.13 release.
This patch contains some critical bug fixes and improvements to Akka.NET:
[Akka.Persistence: OnPersistRejected now logs an error with the complete stacktrace](https://github.com/akkadotnet/akka.net/pull/3763)
[Akka.Persistence.Sql: Ensure that BatchingSqlJournal will propagate sql connection opening failure](https://github.com/akkadotnet/akka.net/pull/3754)
[Akka: Add UnboundedStablePriorityMailbox](https://github.com/akkadotnet/akka.net/issues/2652)
[Akka.Remote and Akka.Cluster: Port exhaustion problem with Akka.Cluster](https://github.com/akkadotnet/akka.net/issues/2575)
To [see the full set of changes for Akka.NET v1.3.13, click here](https://github.com/akkadotnet/akka.net/milestone/31).
| COMMITS | LOC+ | LOC- | AUTHOR |
| --- | --- | --- | --- |
| 8 | 1487 | 357 | Ismael Hamed |
| 7 | 126 | 120 | jdsartori |
| 3 | 198 | 4 | JSartori |
| 3 | 155 | 22 | Aaron Stannard |
| 2 | 11 | 2 | Peter Lin |
| 1 | 8 | 4 | Raimund Hirz |
| 1 | 7 | 0 | Warren Falk |
| 1 | 45 | 6 | Peter Huang |
| 1 | 14 | 13 | Bartosz Sypytkowski |
| 1 | 11 | 1 | Greg Shackles |
| 1 | 10 | 10 | Jill D. Headen |
| 1 | 1 | 1 | Isaac Z |</PackageReleaseNotes>
| 2 | 5 | 6 | Ismael Hamed |
| 2 | 45 | 7 | Shukhrat Nekbaev |
| 2 | 23 | 30 | Aaron Stannard |
| 1 | 87 | 7 | Bartosz Sypytkowski |
| 1 | 492 | 9 | AndreSteenbergen |
| 1 | 2 | 2 | ThomasWetzel |
| 1 | 12 | 12 | Sean Gilliam |</PackageReleaseNotes>
</PropertyGroup>
</Project>
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,18 @@ public abstract class BatchingSqlJournal<TConnection, TCommand> : WriteJournalBa
where TCommand : DbCommand
{
#region internal classes

private sealed class ChunkExecutionFailure : IDeadLetterSuppression
{
public Exception Cause { get; }
public IJournalRequest[] Requests { get; }

public ChunkExecutionFailure(Exception cause, IJournalRequest[] requests)
{
Cause = cause;
Requests = requests;
}
}

private sealed class BatchComplete
{
Expand Down Expand Up @@ -658,10 +670,36 @@ protected sealed override bool Receive(object message)
else if (message is Terminated) RemoveSubscriber(((Terminated)message).ActorRef);
else if (message is GetCurrentPersistenceIds) InitializePersistenceIds();
else if (message is CurrentPersistenceIds) SendCurrentPersistenceIds((CurrentPersistenceIds)message);
else if (message is ChunkExecutionFailure) FailChunkExecution((ChunkExecutionFailure)message);
else return false;
return true;
}

private void FailChunkExecution(ChunkExecutionFailure message)
{
var cause = message.Cause;
Log.Error(cause, "Failed to execute chunk for {0} requests", message.Requests.Length);

foreach (var req in message.Requests)
{
switch (req)
{
case WriteMessages write:
write.PersistentActor.Tell(new WriteMessagesFailed(cause));
break;
case ReplayMessages replay:
replay.PersistentActor.Tell(new ReplayMessagesFailure(cause));
break;
case DeleteMessagesTo delete:
delete.PersistentActor.Tell(new DeleteMessagesFailure(cause, delete.ToSequenceNr));
break;
case ReplayTaggedMessages replayTagged:
replayTagged.ReplyTo.Tell(new ReplayMessagesFailure(cause));
break;
}
}
}

private void SendCurrentPersistenceIds(CurrentPersistenceIds message)
{
foreach (var persistenceId in message.AllPersistenceIds)
Expand Down Expand Up @@ -837,7 +875,8 @@ private void TryProcess()

var chunk = DequeueChunk(_remainingOperations);
var context = Context;
_circuitBreaker.WithCircuitBreaker(() => ExecuteChunk(chunk, context)).PipeTo(Self);
_circuitBreaker.WithCircuitBreaker(() => ExecuteChunk(chunk, context))
.PipeTo(Self, failure: ex => new ChunkExecutionFailure(ex, chunk.Requests));
}
}

Expand Down
Loading