Replace "experimental" with "may change" (#22326)

* Replacing "experimental" with "may change" #22305

* Right syntax for links

* Correct annotation name

* Final small changes
This commit is contained in:
Johan Andrén 2017-02-20 12:05:21 +01:00 committed by Patrik Nordwall
parent a7dfaf00a4
commit 64b35cf1f1
21 changed files with 114 additions and 114 deletions

View file

@ -300,11 +300,12 @@ You can read up on `remaining` and friends in [TestKit.scala](https://github.com
For external contributions of entire features, the normal way is to establish it
as a stand-alone feature first, to show that there is a need for the feature. The
next step would be to add it to Akka as an "experimental feature" (in the
akka-contrib subproject), then when the feature is hardened, well documented and
next step would be to add it to Akka as an "may change"-feature (in the
akka-contrib subproject) and marking it's public api with the `ApiMayChange` annotation,
then when the feature is hardened, well documented and
tested it becomes an officially supported Akka feature.
[List of experimental Akka features](http://doc.akka.io/docs/akka/current/experimental/index.html)
[List of Akka features marked as may change](http://doc.akka.io/docs/akka/current/common/may-change.html)
# Supporting infrastructure

View file

@ -5,6 +5,7 @@ Additional Information
:maxdepth: 2
../common/binary-compatibility-rules
../common/may-change
faq
books
osgi

View file

@ -20,7 +20,7 @@ Binary compatibility is maintained between:
Binary compatibility is **NOT** maintained between:
- **major** versions
- any versions of **experimental** modules read :ref:`meaning-of-experimental` for details
- any versions of **may change** modules read :ref:`may-change` for details
- a few notable exclusions explained below
Specific examples (please read :ref:`24versioningChange` to understand the difference in "before 2.4 era" and "after 2.4 era")::
@ -47,7 +47,7 @@ Some modules are excluded from the binary compatibility guarantees, such as:
- ``*-tck`` modules - since they may want to add new tests (or force configuring something), in order to discover possible
failures in an existing implementation that the TCK is supposed to be testing.
Compatibility here is not *guaranteed*, however it is attempted to make the upgrade prosess as smooth as possible.
- all :ref:`experimental <meaning-of-experimental>` modules - which by definition are subject to rapid iteration and change. Read more about them in :ref:`meaning-of-experimental`
- all :ref:`may change <may-change>` modules - which by definition are subject to rapid iteration and change. Read more about that in :ref:`may-change`
.. _24versioningChange:
@ -59,7 +59,7 @@ Historically, Akka has been following the Java or Scala style of versioning wher
the second one would mean **major**, and third be the **minor**, thus: ``epoch.major.minor`` (versioning scheme followed until and during ``2.3.x``).
**Currently**, since Akka ``2.4.0``, the new versioning applies which is closer to semantic versioning many have come to expect,
in which the version number is deciphered as ``major.minor.patch``. This also means that Akka ``2.5.x`` is binary compatible with the ``2.4`` series releases (with the exception of experimental APIs of course).
in which the version number is deciphered as ``major.minor.patch``. This also means that Akka ``2.5.x`` is binary compatible with the ``2.4`` series releases (with the exception of "may change" APIs of course).
In addition to that, Akka ``2.4.x`` has been made binary compatible with the ``2.3.x`` series,
so there is no reason to remain on Akka 2.3.x, since upgrading is completely compatible
@ -80,25 +80,11 @@ thus such change is considered safe.
We recommend keeping an ``akkaVersion`` variable in your build file, and re-use it for all
included modules, so when you upgrade you can simply change it in this one place.
.. _meaning-of-experimental:
The meaning of "experimental"
=============================
**Experimental** is a keyword used in module descriptions as well as their artifact names,
in order to signify that the API that they contain is subject to change without any prior warning.
Experimental modules are are not covered by Lightbend's Commercial Support, unless specifically stated otherwise.
The purpose of releasing them early, as
experimental, is to make them easily available and improve based on
feedback, or even discover that the module wasn't useful.
An experimental module doesn't have to obey the rule of staying binary
compatible between micro releases. Breaking API changes may be introduced
in minor releases without notice as we refine and simplify based on your
feedback. An experimental module may be dropped in minor releases without
prior deprecation.
Best effort migration guides may be provided, but this is decided on a case-by-case basis for **experimental** modules.
The meaning of "may change"
===========================
**May change** is used in module descriptions and docs in order to signify that the API that they contain
is subject to change without any prior warning and is not covered by the binary compatibility promise.
Read more in :ref:`may-change`.
API stability annotations and comments
======================================
@ -130,11 +116,7 @@ The ``@DoNotInherit`` and ``@ApiMayChange`` markers
In addition to the special internal API marker two annotations exist in Akka and specifically address the following use cases:
- ``@ApiMayChange`` which marks APIs which are known to be not fully stable yet. For example, when while introducing
"new" Java 8 APIs into existing stable modules, these APIs may be marked with this annotation to signal that they are
not frozen yet. Please use such methods and classes with care, however if you see such APIs that is the best point in
time to try them out and provide feedback (e.g. using the akka-user mailing list, github issues or gitter) before they
are frozen as fully stable API.
- ``@ApiMayChange`` which marks APIs which are known to be not fully stable yet. Read more in :ref:`may-change`
- ``@DoNotInherit`` which marks APIs that are designed under an closed-world assumption, and thus must not be
extended outside Akka itself (or such code will risk facing binary incompatibilities). E.g. an interface may be
marked using this annotation, and while the type is public, it is not meant for extension by user-code. This allows

View file

@ -0,0 +1,49 @@
.. _may-change:
###########################
Modules marked "May Change"
###########################
To be able to introduce new modules and APIs without freezing them the moment they
are released because of our :ref:`binary compatibility guarantees <BinCompatRules>` we have introduced
the term **may change**.
Concretely **may change** means that an API or module is in early access mode and that it:
- is not covered by Lightbend's commercial support (unless specifically stated otherwise)
- is not guaranteed to be binary compatible in minor releases
- may have its API change in breaking ways in minor releases
- may be entirely dropped from Akka in a minor release
Complete modules can be marked as **may change**, this will can be found in their module description and in the docs.
Individual public APIs can be annotated with ``akka.api.annotation.ApiMayChange`` to signal that it has less
guarantees than the rest of the module it lives in. For example, when while introducing "new" Java 8 APIs into
existing stable modules, these APIs may be marked with this annotation to signal that they are not frozen yet.
Please use such methods and classes with care, however if you see such APIs that is the best point in time to try them
out and provide feedback (e.g. using the akka-user mailing list, github issues or gitter) before they are frozen as
fully stable API.
Best effort migration guides may be provided, but this is decided on a case-by-case basis for **may change** modules.
The purpose of this is to be able to release features early and
make them easily available and improve based on feedback, or even discover
that the module or API wasn't useful.
These are the current complete modules marked as **may change**:
.. toctree::
:maxdepth: 1
../dev/multi-node-testing
../scala/typed
Another reason for marking a module as "may change" is that it's too early
to tell if the module has a maintainer that can take the responsibility
of the module over time. These modules live in the ``akka-contrib`` subproject:
.. toctree::
:maxdepth: 1
../contrib/index

View file

@ -201,7 +201,7 @@ Multi Node Additions
====================
There has also been some additions made to the ``SbtMultiJvm`` plugin to accommodate the
:ref:`experimental <experimental>` module :ref:`multi node testing <multi-node-testing>`,
:ref:`may change <may-change>` module :ref:`multi node testing <multi-node-testing>`,
described in that section.
.. _sample project: @samples@/tree/master/akka-sample-multi-node-scala

View file

@ -4,29 +4,5 @@
Experimental Modules
####################
The following modules of Akka are marked as experimental, which means
that they are in early access mode, which also means that they are not
covered by commercial support. The purpose of releasing them early, as
experimental, is to make them easily available and improve based on
feedback, or even discover that the module wasn't useful.
An experimental module doesn't have to obey the rule of staying binary
compatible between micro releases. Breaking API changes may be introduced
in minor releases without notice as we refine and simplify based on your
feedback. An experimental module may be dropped in minor releases without
prior deprecation.
.. toctree::
:maxdepth: 1
../dev/multi-node-testing
Another reason for marking a module as experimental is that it's too early
to tell if the module has a maintainer that can take the responsibility
of the module over time. These modules live in the ``akka-contrib`` subproject:
.. toctree::
:maxdepth: 1
../contrib/index
The label experimental caused confusion and discomfort and has therefore been replaced with "May Change"
please see :ref:`may-change`.

View file

@ -4,30 +4,5 @@
Experimental Modules
####################
The following modules of Akka are marked as experimental, which means
that they are in early access mode, which also means that they are not
covered by commercial support. The purpose of releasing them early, as
experimental, is to make them easily available and improve based on
feedback, or even discover that the module wasn't useful.
An experimental module doesn't have to obey the rule of staying binary
compatible between micro releases. Breaking API changes may be introduced
in minor releases without notice as we refine and simplify based on your
feedback. An experimental module may be dropped in minor releases without
prior deprecation.
.. toctree::
:maxdepth: 1
../dev/multi-node-testing
../scala/typed
Another reason for marking a module as experimental is that it's too early
to tell if the module has a maintainer that can take the responsibility
of the module over time. These modules live in the ``akka-contrib`` subproject:
.. toctree::
:maxdepth: 1
../contrib/index
The label experimental caused confusion and discomfort and has therefore been replaced with "May Change"
please see :ref:`may-change`.

View file

@ -56,7 +56,7 @@ Akka is very modular and consists of several JARs containing different features.
- ``akka-testkit`` Toolkit for testing Actor systems
In addition to these stable modules there are several which are on their way
into the stable core but are still marked “experimental” at this point. This
into the stable core but are still marked :ref:`may change <may-change>` at this point. This
does not mean that they do not function as intended, it primarily means that
their API has not yet solidified enough in order to be considered frozen. You
can help accelerating this process by giving feedback on these modules on our

View file

@ -17,7 +17,6 @@ Java Documentation
java/http/index
java/howto
java/scala-compat
experimental/index-java
dev/index
project/index
additional/index

View file

@ -6,8 +6,8 @@ Remoting (codename Artery)
.. note::
This page describes the experimental remoting subsystem, codenamed *Artery* that will eventually replace the
old remoting implementation. For the current stable remoting system please refer to :ref:`remoting-java`.
This page describes the :ref:`may change <may-change>` remoting subsystem, codenamed *Artery* that will eventually
replace the old remoting implementation. For the current stable remoting system please refer to :ref:`remoting-java`.
Remoting enables Actor systems on different hosts or JVMs to communicate with each other. By enabling remoting
the system will start listening on a provided network address and also gains the ability to connect to other

View file

@ -362,7 +362,7 @@ Integration with actors
-----------------------
**This section is a stub and will be extended in the next release**
**This is an experimental feature***
**This is a :ref:`may change <may-change>` feature***
It is possible to acquire an ActorRef that can be addressed from the outside of the stage, similarly how
:class:`AsyncCallback` allows injecting asynchronous events into a stage logic. This reference can be obtained

View file

@ -10,7 +10,7 @@ Actor (Java)
AbstractActor
-------------
``AbstractActor`` has been promoted from its experimental state and while doing this we
``AbstractActor`` has been promoted from its experimental/may change state and while doing this we
did some small, but important, improvements to the API that will require some mechanical
changes of your source code.
@ -491,7 +491,7 @@ for Scala and :ref:`Java <stream-integrations-java>`.
The consuming actor may be a plain ``Actor`` or an ``PersistentActor`` if it needs to store its own state (e.g. ``fromSequenceNr`` offset).
Please note that Persistence Query is not experimental anymore in Akka ``2.5.0``, so you can safely upgrade to it.
Please note that Persistence Query is not experimental/may-change anymore in Akka ``2.5.0``, so you can safely upgrade to it.
Persistence Plugin Proxy
------------------------
@ -548,3 +548,16 @@ the Agents, as they rarely are really enough and do not fit the Akka spirit of t
We also anticipate to replace the uses of Agents by the upcoming Akka Typed, so in preparation thereof the Agents have been deprecated in 2.5.
If you use Agents and would like to take over the maintanance thereof, please contact the team on gitter or github.
Akka Typed
==========
With the new term :ref:`may change <may-change>` we will no longer have a different artifact for modules that are not
stable, and ``akka-typed-experimental`` has therefore been renamed to ``akka-typed``. Note that it is still not
promoted to a stable module.
Experimental modules
====================
We have previously marked modules that we did not want to freeze the APIs of a **experimental**, such modules will
instead be marked as :ref:`may change <may-change>` from now on.

View file

@ -16,7 +16,6 @@ Scala Documentation
scala/stream/index
scala/http/index
scala/howto
experimental/index
dev/index
project/index
additional/index

View file

@ -6,7 +6,7 @@ Remoting (codename Artery)
.. note::
This page describes the experimental remoting subsystem, codenamed *Artery* that will eventually replace the
This page describes the :ref:`may change <may-change>` remoting subsystem, codenamed *Artery* that will eventually replace the
old remoting implementation. For the current stable remoting system please refer to :ref:`remoting-scala`.
Remoting enables Actor systems on different hosts or JVMs to communicate with each other. By enabling remoting

View file

@ -367,7 +367,7 @@ Integration with actors
-----------------------
**This section is a stub and will be extended in the next release**
**This is an experimental feature***
**This is a :ref:`may change <may-change>` feature***
It is possible to acquire an ActorRef that can be addressed from the outside of the stage, similarly how
:class:`AsyncCallback` allows injecting asynchronous events into a stage logic. This reference can be obtained

View file

@ -6,10 +6,10 @@ Akka Typed
.. warning::
This module is currently experimental in the sense of being the subject of
active research. This means that API or semantics can change without warning
or deprecation period and it is not recommended to use this module in
production just yet—you have been warned.
This module is currently marked as :ref:`may change <may-change>` in the sense
of being the subject of active research. This means that API or semantics can
change without warning or deprecation period and it is not recommended to use
this module in production just yet—you have been warned.
As discussed in :ref:`actor-systems` (and following chapters) Actors are about
sending messages between independent units of computation, but how does that
@ -283,9 +283,9 @@ Status of this Project and Relation to Akka Actors
Akka Typed is the result of many years of research and previous attempts
(including Typed Channels in the 2.2.x series) and it is on its way to
stabilization, but maturing such a profound change to the core concept of Akka
will take a long time. We expect that this module will stay experimental for
multiple major releases of Akka and the plain ``akka.actor.Actor`` will not be
deprecated or go away anytime soon.
will take a long time. We expect that this module will stay marked
:ref:`may change <may-change>` for multiple major releases of Akka and the
plain ``akka.actor.Actor`` will not be deprecated or go away anytime soon.
Being a research project also entails that the reference documentation is not
as detailed as it will be for a final version, please refer to the API

View file

@ -1,4 +1,5 @@
import akka.{AkkaBuild, Formatting}
AkkaBuild.mayChangeSettings
AkkaBuild.defaultSettings
Formatting.formatSettings

View file

@ -3,17 +3,21 @@
*/
package akka.stream.stage
import java.util.concurrent.atomic.{ AtomicReference }
import java.util.concurrent.atomic.AtomicReference
import akka.NotUsed
import java.util.concurrent.locks.ReentrantLock
import akka.actor._
import akka.japi.function.{ Effect, Procedure }
import akka.annotation.ApiMayChange
import akka.japi.function.{Effect, Procedure}
import akka.stream._
import akka.stream.impl.StreamLayout.Module
import akka.stream.impl.fusing.{ GraphInterpreter, GraphStageModule, SubSource, SubSink }
import akka.stream.impl.fusing.{GraphInterpreter, GraphStageModule, SubSink, SubSource}
import akka.stream.impl.ReactiveStreamsCompliance
import scala.collection.mutable.ArrayBuffer
import scala.collection.{ immutable, mutable }
import scala.collection.{immutable, mutable}
import scala.concurrent.duration.FiniteDuration
import akka.stream.actor.ActorSubscriberMessage
@ -921,6 +925,7 @@ abstract class GraphStageLogic private[stream] (val inCount: Int, val outCount:
* @return minimal actor with watch method
*/
// FIXME: I don't like the Pair allocation :(
@ApiMayChange
final protected def getStageActor(receive: ((ActorRef, Any)) Unit): StageActor = {
_stageActor match {
case null

View file

@ -1,7 +1,7 @@
import akka.{ AkkaBuild, Formatting }
AkkaBuild.defaultSettings
AkkaBuild.experimentalSettings
AkkaBuild.mayChangeSettings
Formatting.formatSettings
disablePlugins(MimaPlugin)

View file

@ -96,7 +96,7 @@ object AkkaBuild extends Build {
)
lazy val typed = Project(
id = "akka-typed-experimental",
id = "akka-typed",
base = file("akka-typed"),
dependencies = Seq(testkit % "compile;test->test")
)
@ -294,16 +294,16 @@ object AkkaBuild extends Build {
publishArtifact := false
) ++ dontPublishSettings
lazy val experimentalSettings = Seq(
lazy val mayChangeSettings = Seq(
description := """|This module of Akka is marked as
|experimental, which means that it is in early
|'may change', which means that it is in early
|access mode, which also means that it is not covered
|by commercial support. An experimental module doesn't
|by commercial support. An module marked 'may change' doesn't
|have to obey the rule of staying binary compatible
|between minor releases. Breaking API changes may be
|introduced in minor releases without notice as we
|refine and simplify based on your feedback. An
|experimental module may be dropped in major releases
|refine and simplify based on your feedback. Additionally
|such a module may be dropped in major releases
|without prior deprecation.
|""".stripMargin
)

View file

@ -83,7 +83,6 @@ object ValidatePullRequest extends AutoPlugin {
def changedDirectoryIsDependency(changedDirs: Set[String],
name: String,
graphsToTest: Seq[(Configuration, ModuleGraph)])(log: Logger): Boolean = {
val dirsOrExperimental = changedDirs.flatMap(dir => Set(dir, s"$dir-experimental"))
graphsToTest exists { case (ivyScope, deps) =>
log.debug(s"Analysing [$ivyScope] scoped dependencies...")
@ -92,7 +91,7 @@ object ValidatePullRequest extends AutoPlugin {
// if this project depends on a modified module, we must test it
deps.nodes.exists { m =>
// match just by name, we'd rather include too much than too little
val dependsOnModule = dirsOrExperimental.find(m.id.name contains _)
val dependsOnModule = changedDirs.find(m.id.name contains _)
val depends = dependsOnModule.isDefined
if (depends) log.info(s"Project [$name] must be verified, because depends on [${dependsOnModule.get}]")
depends