[Returned for revision] SE-0344: Distributed Actor Runtime

Hi everyone. The first review for SE-0344, Distributed Actor Runtime, concluded on March 8, 2022. The core team has decided to return the proposal for revision. Enthusiasm for the distributed actor feature remains high, but there were a handful of design points that deserve further discussion:

Module for distributed actor related APIs

There were concerns about polluting the default Swift standard library module with the newly proposed APIs. The implementation of this proposal is being prototyped in a distinct _Distributed module, and the core team agrees it should remain in a distinct module. There is already precedent for language features requiring importing additional modules, particularly how @objc interop requires importing Foundation on Apple platforms. We'd like this review to determine the final name for the module should be. Removing the underscore and calling it Distributed may be fine, but we want to make sure the community gets a chance to comment on this in the next round of review.

More explicit initialization of actor system in initializers

The previous distributed actor proposal, SE-0336, specified that all non-delegating init members of a distributed actor take an ActorSystem parameter, and that the corresponding argument would be used by implicit compiler-synthesized code inside of the initializer to set the new actor instance's id and actorSystem properties. This design was chosen because there are nontrivial invariants that must be maintained, and we were concerned about implementation complexity of trying to maintain these invariants when these fundamental distributed actor properties could be initialized under the control of user code. However, YR Chen criticized this design, noting that the behavior is inconsistent with how most Swift initializers behave, and offering an alternative:

The core team agrees that this is more explicit and expressive than the originally proposed behavior, and the proposal authors have prototyped this new behavior and found it feasible to implement. We'd like to see SE-0344 re-reviewed with changes consistent with this new initializer behavior in mind.

Use of mangled names in method identifiers

There was a lot of deep discussion about the mechanism for identifying methods. As proposed, methods would be identified using their Swift mangled names as identifiers, and this fact was exposed through parts of the API design, particularly the mangledName and fullName properties of RemoteCallTarget. Mangled names have a major advantage that they unambiguously identify Swift methods in all their full generality of overloading, genericity, etc., so distributed actor methods can use the entirety of Swift's expressivity without worrying about collisions. Reviewers however noted several deficiencies:

  • They are too specific. Small changes to a method signature that might otherwise be wire-protocol-compatible will lead to changes in mangled name.
  • The mangled name format is nontrivial for non-Swift nodes to implement that might want to interop with a Swift distributed actor system.
  • There were efficiency concerns with string-based identifiers in general.

Discussion about alternative schemes for method identification continued up to and past the review date, so the core team would like to see this discussion continue in the next round of review. We also request that the proposal authors summarize the alternatives considered thus far, and include additional rationale addressing how these tradeoffs play out in the design of the feature.

Thank you to everyone who participated in the review!