Browse Source

Updates whatsnew document

Ask Solem 11 years ago
parent
commit
3608c06416
1 changed files with 480 additions and 307 deletions
  1. 480 307
      docs/whatsnew-3.1.rst

+ 480 - 307
docs/whatsnew-3.1.rst

@@ -59,106 +59,364 @@ Highlights
 Important Notes
 Important Notes
 ===============
 ===============
 
 
-XXX
----
+No longer supports Python 2.5
+-----------------------------
 
 
-YYY
+Celery now requires Python 2.6 or later.
+
+We now have a dual codebase that runs on both Python 2 and 3 without
+using the ``2to3`` porting tool.
+
+Last version to use Pickle.
+---------------------------
+
+Starting from Celery 3.2 the default serializer will be json.
+
+If you depend on pickle being accepted you should be prepared
+for this change by explicitly allowing your worker
+to consume pickled messages using the :setting:`CELERY_ACCEPT_CONTENT``
+setting::
+
+    CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
+
+Make sure you select only the serialization formats that you will actually be using,
+and make sure you have properly secured your broker from unwanted access
+(see the :ref:`guide-security` guide).
+
+The worker will show a deprecation warning if you don't define this setting.
 
 
 .. _v310-news:
 .. _v310-news:
 
 
 News
 News
 ====
 ====
 
 
-XXX
----
+Now supports Django out of the box.
+-----------------------------------
 
 
-YYY
+The fixes and improvements applied by the django-celery library is now
+automatically applied by core Celery when it detects that
+the :envvar:`DJANGO_SETTINGS_MODULE` environment variable is set.
 
 
-In Other News
--------------
+The distribution ships with a new example project using Django
+in :file:`examples/django`:
 
 
-- No longer supports Python 2.5
+http://github.com/celery/celery/tree/master/examples/django
 
 
-    From this version Celery requires Python 2.6 or later.
+Some features still require the :mod:`django-celery` library:
 
 
-    Insteaad of using the 2to3 porting tool we now have
-    a dual codebase that runs on both Python 2 and Python 3.
+    - Celery does not implement the Django database or cache result backends.
+    - Celery does not ship with the database-based periodic task
+        scheduler.
 
 
-- Now depends on :ref:`Kombu 3.0 <kombu:version-3.0.0>`.
+.. note::
 
 
-- Now depends on :mod:`billiard` version 3.3.
+    If you are using django-celery then it is crucial that you have
+    ``djcelery.setup_loader()`` in your settings module, as this
+    no longer happens as a side-effect of importing the :mod:`djcelery`
+    module.
 
 
-- No longer depends on ``python-dateutil``
+Multiprocessing Pool improvements
 
 
-    Instead a dependency on :mod:`pytz` has been added, which was already
-    recommended in the documentation for accurate timezone support.
+:mod:`pytz` replaces ``python-dateutil`` dependency.
+----------------------------------------------------
 
 
-    This also means that dependencies are on the same on both Python 2 and
-    Python 3, and that the :file:`requirements/default-py3k.txt` file has
-    been removed.
+Celery no longer depends on the ``python-dateutil`` library,
+but instead a new dependency on the :mod:`pytz` library was added.
 
 
-- Time limits can now be set by the client for individual tasks (Issue #802).
+The :mod:`pytz` library was already recommended for accurate timezone support.
 
 
-    You can set both hard and soft time limits using the ``timeout`` and
-    ``soft_timeout`` calling options:
+This also means that dependencies are the same for both Python 2 and
+Python 3, and that the :file:`requirements/default-py3k.txt` file has
+been removed.
 
 
-    .. code-block:: python
+Old command-line programs removed and deprecated
+------------------------------------------------
 
 
-        >>> res = add.apply_async((2, 2), timeout=10, soft_timeout=8)
+The goal is that everyone should move the new :program:`celery` umbrella
+command, so with this version we deprecate the old command names,
+and remove commands that are not used in init scripts.
 
 
-        >>> res = add.subtask((2, 2), timeout=10, soft_timeout=8)()
++-------------------+--------------+-------------------------------------+
+| Program           | New Status   | Replacement                         |
++===================+==============+=====================================+
+| ``celeryd``       | *DEPRECATED* | :program:`celery worker`            |
++-------------------+--------------+-------------------------------------+
+| ``celerybeat``    | *DEPRECATED* | :program:`celery beat`              |
++-------------------+--------------+-------------------------------------+
+| ``celeryd-multi`` | *DEPRECATED* | :program:`celery multi`             |
++-------------------+--------------+-------------------------------------+
+| ``celeryctl``     | **REMOVED**  | :program:`celery`                   |
++-------------------+--------------+-------------------------------------+
+| ``celeryev``      | **REMOVED**  | :program:`celery events`            |
++-------------------+--------------+-------------------------------------+
+| ``camqadm``       | **REMOVED**  | :program:`celery amqp`              |
++-------------------+--------------+-------------------------------------+
 
 
-        >>> res = add.s(2, 2).set(timeout=10, soft_timeout=8)()
+Please see :program:`celery --help` for help using the umbrella command.
 
 
-    Contributed by Mher Movsisyan.
+Bootsteps: Extending the worker
+-------------------------------
 
 
-- Old command-line programs removed and deprecated
+By writing bootsteps you can now easily extend the consumer part
+of the worker to add additional features, or even message consumers.
 
 
-    The goal is that everyone should move the new :program:`celery` umbrella
-    command, so with this version we deprecate the old command names,
-    and remove commands that are not used in init scripts.
+The worker has been using bootsteps for some time, but these were never
+documented.  In this version the consumer part of the worker
+has also been rewritten to use bootsteps and the new :ref:`guide-extending`
+guide documents examples extending the worker, including adding
+custom message consumers.
 
 
-    +-------------------+--------------+-------------------------------------+
-    | Program           | New Status   | Replacement                         |
-    +===================+==============+=====================================+
-    | ``celeryd``       | *DEPRECATED* | :program:`celery worker`            |
-    +-------------------+--------------+-------------------------------------+
-    | ``celerybeat``    | *DEPRECATED* | :program:`celery beat`              |
-    +-------------------+--------------+-------------------------------------+
-    | ``celeryd-multi`` | *DEPRECATED* | :program:`celery multi`             |
-    +-------------------+--------------+-------------------------------------+
-    | ``celeryctl``     | **REMOVED**  | :program:`celery`                   |
-    +-------------------+--------------+-------------------------------------+
-    | ``celeryev``      | **REMOVED**  | :program:`celery events`            |
-    +-------------------+--------------+-------------------------------------+
-    | ``camqadm``       | **REMOVED**  | :program:`celery amqp`              |
-    +-------------------+--------------+-------------------------------------+
+See the :ref:`guide-extending` guide for more information.
 
 
-    Please see :program:`celery --help` for help using the umbrella command.
+.. note::
 
 
-- Celery now support Django out of the box.
+    Bootsteps written for older versions will not be compatible
+    with this version, as the API has changed significantly.
 
 
-    The fixes and improvements applied by the django-celery library is now
-    automatically applied by core Celery when it detects that
-    the :envvar:`DJANGO_SETTINGS_MODULE` environment setting is set.
+    The old API was experimental and internal so hopefully no one
+    is depending.  Should you happen to be using it then please
+    contact the mailing-list and we will help you port to the new version.
 
 
-    The distribution ships with a new example project using Django
-    in :file:`examples/django`:
+New result backend with RPC semantics
+-------------------------------------
 
 
-    http://github.com/celery/celery/tree/master/examples/django
+This version of the ``amqp`` result backend is a very good alternative
+to use in classical RPC scenarios, where the process that initiates
+the task is always the process to retrieve the result.
 
 
-    There are cases where you would want to use django-celery still
-    as:
+It uses Kombu to send and retrieve results, and each client
+will create a unique queue for replies to be sent to. Avoiding
+the significant overhead of the original amqp backend which creates
+one queue per task.
 
 
-        - Celery does not implement the Django database or cache backends.
-        - Celery does not automatically read configuration from Django settings.
-        - Celery does not ship with the database-based periodic task
-          scheduler.
+Results sent using this backend is not persistent, and so will
+not survive a broker restart, but you can set
+the :setting:`CELERY_RESULT_PERSISTENT` setting to change that.
 
 
-    If you are using django-celery then it is crucial that you have
-    ``djcelery.setup_loader()`` in your settings module, as this
-    no longer happens as a side-effect of importing the :mod:`djcelery`
-    module.
+.. code-block:: python
+
+    CELERY_RESULT_BACKEND = 'rpc'
+
+Note that chords are currently not supported by the RPC backend.
+
+Time limits can now be set by the client.
+-----------------------------------------
+
+You can set both hard and soft time limits using the ``time_limit`` and
+``soft_time_limit`` calling options:
+
+.. code-block:: python
+
+    >>> res = add.apply_async((2, 2), time_limit=10, soft_time_limit=8)
+
+    >>> res = add.subtask((2, 2), time_limit=10, soft_time_limit=8).delay()
+
+    >>> res = add.s(2, 2).set(time_limit=10, soft_time_limit=8).delay()
+
+Contributed by Mher Movsisyan.
+
+Redis: Separate broadcast messages by virtual host
+---------------------------------------------------------------------------
+
+Broadcast messages are seen by all virtual hosts when using the Redis
+transport.  You can fix this by enabling a prefix to all channels
+so that the messages are separated by virtual host::
+
+    BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}
+
+Note that you will not be able to communicate with workers running older
+versions or workers that does not have this setting enabled.
+
+This setting will be the default in the future, so better to migrate
+sooner rather than later.
+
+Related to Issue #1490.
+
+Events are now ordered using logical time.
+------------------------------------------
+
+Timestamps are not a reliable way to order events in a distributed system,
+for one the floating point value does not have enough precision, but
+also it's impossible to keep physical clocks in sync.
+
+Celery event messages have included a logical clock value for some time,
+but starting with this version that field is also used to order them
+(that is if the monitor is using :mod:`celery.events.state`).
+
+The logical clock is currently implemented using Lamport timestamps,
+which does not have a high degree of accuracy, but should be good
+enough to casually order the events.
+
+Also, events now records timezone information for better timestamp
+accuracy, where a new ``utcoffset`` field is included in the event.
+This is a signed integer telling the difference from UTC time in hours,
+so e.g. an even sent from the Europe/London timezone in daylight savings
+time will have an offset of 1.
+
+:class:`@events.Receiver` will automatically convert the timestamps
+to the destination timezone.
+
+.. note::
+
+    The logical clock is synchronized with other nodes
+    in the same cluster (neighbors), so this means that the logical
+    epoch will start at the point when the first worker in the cluster
+    starts.
+
+    If all of the workers are shutdown the clock value will be lost
+    and reset to 0, to protect against this you should specify
+    a :option:`--statedb` so that the worker can persist the clock
+    value at shutdown.
+
+    You may notice that the logical clock is an integer value and
+    increases very rapidly.  Do not worry about the value overflowing
+    though, as even in the most busy clusters it may take several
+    millennia before the clock exceeds a 64 bits value.
+
+New worker node name format (``name@host``).
+-------------------------------------------------------------------------
+
+Node names are now constructed by a node name and a hostname separated by '@'.
+
+This change was made to more easily identify multiple instances running
+on the same machine.
+
+If a custom name is not specified then the
+worker will use the name 'celery' by default, resulting in a
+fully qualified node name of 'celery@hostname':
+
+.. code-block:: bash
+
+    $ celery worker -n example.com
+    celery@example.com
+
+To also set the name you must include the @:
+
+.. code-block:: bash
+
+    $ celery worker -n worker1@example.com
+    worker1@example.com
+
+The worker will identify itself using the fully qualified
+node name in events and broadcast messages, so where before
+a worker would identify as 'worker1.example.com', it will now
+use 'celery@worker1.example.com'.
+
+Remember that the ``-n`` argument also supports simple variable
+substitutions, so if the current hostname is *jerry.example.com*
+then ``%h`` will expand into that:
+
+.. code-block:: bash
+
+    $ celery worker -n worker1@%h
+    worker1@jerry.example.com
+
+The available substitutions are as follows:
+
++---------------+---------------------------------------+
+| Variable      | Substitution                          |
++===============+=======================================+
+| ``%h``        | Full hostname (including domain name) |
++---------------+---------------------------------------+
+| ``%d``        | Domain name only                      |
++---------------+---------------------------------------+
+| ``%n``        | Hostname only (without domain name)   |
++---------------+---------------------------------------+
+| ``%%``        | The character ``%``                   |
++---------------+---------------------------------------+
+
+Bound tasks
+-----------
+
+The task decorator can now created "bound tasks", which means that the
+task will receive the ``self`` argument.
+
+.. code-block:: python
+
+    @app.task(bind=True)
+    def send_twitter_status(self, oauth, tweet):
+        try:
+            twitter = Twitter(oauth)
+            twitter.update_status(tweet)
+        except (Twitter.FailWhaleError, Twitter.LoginError) as exc:
+            raise self.retry(exc=exc)
+
+Using *bound tasks* is now the recommended approach whenever
+you need access to the current task or request context.
+Previously one would have to refer to the name of the task
+instead (``send_twitter_status.retry``), but this could lead to problems
+in some instances where the registered task was no longer the same
+object.
+
+Gossip: Worker <-> Worker communication.
+----------------------------------------
+
+Workers now synchronizes revoked tasks with its neighbors.
+
+This happens at startup and causes a one second startup delay
+to collect broadcast responses from other workers.
+
+Now supports Setuptools extra requirements.
+-------------------------------------------
+
+Pip now supports installing setuptools extra requirements
+so we have deprecated the old bundles, replacing them with these
+little creatures, which are more convenient since you can easily
+specify multiple extras (e.g. ``pip install celery[redis,mongodb]``).
+
++-------------+-------------------------+---------------------------+
+| Extension   | Requirement entry       | Type                      |
++=============+=========================+===========================+
+| Redis       | ``celery[redis]``       | transport, result backend |
++-------------+-------------------------+---------------------------+
+| MongoDB``   | ``celery[mongodb]``     | transport, result backend |
++-------------+-------------------------+---------------------------+
+| CouchDB     | ``celery[couchdb]``     | transport                 |
++-------------+-------------------------+---------------------------+
+| Beanstalk   | ``celery[beanstalk]``   | transport                 |
++-------------+-------------------------+---------------------------+
+| ZeroMQ      | ``celery[zeromq]``      | transport                 |
++-------------+-------------------------+---------------------------+
+| Zookeeper   | ``celery[zookeeper]``   | transport                 |
++-------------+-------------------------+---------------------------+
+| SQLAlchemy  | ``celery[sqlalchemy]``  | transport, result backend |
++-------------+-------------------------+---------------------------+
+| librabbitmq | ``celery[librabbitmq]`` | transport (C amqp client) |
++-------------+-------------------------+---------------------------+
+
+There are more examples in the :ref:`bundles` section.
+
+Calling a subtask will now execute the task directly
+----------------------------------------------------
+
+A misunderstanding led to ``Signature.__call__`` being an alias of
+``.delay`` but this does not conform to the calling API of ``Task`` which
+should call the underlying task method.
+
+This means that:
+
+.. code-block:: python
+
+    @app.task
+    def add(x, y):
+        return x + y
+
+    add.s(2, 2)()
+
+now does the same as calling the task directly:
+
+.. code-block:: python
+
+    add(2, 2)
+
+In Other News
+-------------
+
+- Now depends on :ref:`Kombu 3.0 <kombu:version-3.0.0>`.
+
+- Now depends on :mod:`billiard` version 3.3.
+
+- Worker will now crash if running as the root user with pickle enabled.
 
 
 - Canvas: ``group.apply_async`` and ``chain.apply_async`` no longer starts
 - Canvas: ``group.apply_async`` and ``chain.apply_async`` no longer starts
   separate task.
   separate task.
@@ -168,23 +426,10 @@ In Other News
     users.  If you still want this behavior you can create a task to do it
     users.  If you still want this behavior you can create a task to do it
     for you.
     for you.
 
 
-- Redis: Option to separate broadcast messages by virtual host (Issue #1490).
-
-    Broadcast messages are seen by all virtual hosts when using the Redis
-    transport.  You can fix this by enabling a prefix to all channels
-    so that the messages are separated by virtual host::
-
-        BROKER_TRANSPORT_OPTIONS = {'fanout_prefix': True}
+- New method ``Signature.freeze()`` can be used to "finalize"
+  signatures/subtask.
 
 
-    Note that you will not be able to communicate with workers running older
-    versions or workers that does not have this setting enabled.
-
-    This setting will be the default in the future, so better to migrate
-    sooner rather than later.
-
-- ``Signature.freeze()`` can now be used to "finalize" subtasks
-
-    Regular subtask:
+    Regular signature:
 
 
     .. code-block:: python
     .. code-block:: python
 
 
@@ -207,50 +452,8 @@ In Other News
         >>> g()
         >>> g()
         <GroupResult: e1094b1d-08fc-4e14-838e-6d601b99da6d [70c0fb3d-b60e-4b22-8df7-aa25b9abc86d, 58fcd260-2e32-4308-a2ea-f5be4a24f7f4]>
         <GroupResult: e1094b1d-08fc-4e14-838e-6d601b99da6d [70c0fb3d-b60e-4b22-8df7-aa25b9abc86d, 58fcd260-2e32-4308-a2ea-f5be4a24f7f4]>
 
 
-
-
-- The consumer part of the worker has been rewritten to use Bootsteps.
-
-    By writing bootsteps you can now easily extend the consumer part
-    of the worker to add additional features, or even message consumers.
-
-    See the :ref:`guide-extending` guide for more information.
-
-- New Bootsteps implementation.
-
-    The bootsteps and namespaces have been refactored for the better,
-    sadly this means that bootsteps written for older versions will
-    not be compatible with this version.
-
-    Bootsteps were never publicly documented and was considered
-    experimental, so chances are no one has ever implemented custom
-    bootsteps, but if you did please contact the mailing-list
-    and we'll help you port them.
-
-    - Module ``celery.worker.bootsteps`` renamed to :mod:`celery.bootsteps`
-    - The name of a bootstep no longer contain the name of the namespace.
-    - A bootstep can now be part of multiple namespaces.
-    - Namespaces must instantiate individual bootsteps, and
-      there's no global registry of bootsteps.
-
-- New result backend with RPC semantics (``rpc``).
-
-    This version of the ``amqp`` result backend is a very good alternative
-    to use in classical RPC scenarios, where the process that initiates
-    the task is always the process to retrieve the result.
-
-    It uses Kombu to send and retrieve results, and each client
-    will create a unique queue for replies to be sent to. Avoiding
-    the significant overhead of the original amqp backend which creates
-    one queue per task, but it's important to consider that it will
-    not be possible to retrieve the result from another process,
-    and that results sent using this backend is not persistent and so will
-    not survive a broker restart.
-
-    It has only been tested with the AMQP and Redis transports.
-
-- App instances can now add additional command line options
-  to the worker and beat programs.
+-  New ability to specify additional command line options
+   to the worker and beat programs.
 
 
     The :attr:`@Celery.user_options` attribute can be used
     The :attr:`@Celery.user_options` attribute can be used
     to add additional command-line arguments, and expects
     to add additional command-line arguments, and expects
@@ -266,35 +469,11 @@ In Other News
             Option('--my-argument'),
             Option('--my-argument'),
         )
         )
 
 
-    See :ref:`guide-extending` for more information.
-
-- Events are now ordered using logical time.
-
-    Timestamps are not a reliable way to order events in a distributed system,
-    for one the floating point value does not have enough precision, but
-    also it's impossible to keep physical clocks in sync.
-
-    Celery event messages have included a logical clock value for some time,
-    but starting with this version that field is also used to order them
-    (that is if the monitor is using :mod:`celery.events.state`).
-
-    The logical clock is currently implemented using Lamport timestamps,
-    which does not have a high degree of accuracy, but should be good
-    enough to casually order the events.
+    See the :ref:`guide-extending` guide for more information.
 
 
 - All events now include a ``pid`` field, which is the process id of the
 - All events now include a ``pid`` field, which is the process id of the
   process that sent the event.
   process that sent the event.
 
 
-- Events now supports timezones.
-
-    A new ``utcoffset`` field is now sent with every event.  This is a
-    signed integer telling the difference from UTC time in hours,
-    so e.g. an even sent from the Europe/London timezone in daylight savings
-    time will have an offset of 1.
-
-    :class:`@events.Receiver` will automatically convert the timestamps
-    to the destination timezone.
-
 - Event heartbeats are now calculated based on the time when the event
 - Event heartbeats are now calculated based on the time when the event
   was received by the monitor, and not the time reported by the worker.
   was received by the monitor, and not the time reported by the worker.
 
 
@@ -305,6 +484,11 @@ In Other News
     time and the internal time is greater than 15 seconds, suggesting
     time and the internal time is greater than 15 seconds, suggesting
     that the clocks are out of sync.
     that the clocks are out of sync.
 
 
+- Many parts of the Celery codebase now uses a montonic clock.
+
+    The montonic clock function is built-in starting from Python 3.4,
+    but we also have fallback implementaions for Linux and OS X.
+
 - :program:`celery worker` now supports a ``--detach`` argument to start
 - :program:`celery worker` now supports a ``--detach`` argument to start
   the worker as a daemon in the background.
   the worker as a daemon in the background.
 
 
@@ -327,6 +511,11 @@ In Other News
     will only send worker related events and silently drop any attempts
     will only send worker related events and silently drop any attempts
     to send events related to any other group.
     to send events related to any other group.
 
 
+- ``Result.revoke`` will no longer wait for replies.
+
+    You can add the ``reply=True`` argument if you really want to wait for
+    responses from the workers.
+
 - Better support for link and link_error tasks for chords.
 - Better support for link and link_error tasks for chords.
 
 
     Contributed by Steeve Morin.
     Contributed by Steeve Morin.
@@ -352,45 +541,6 @@ In Other News
 
 
     Contributed by Mher Movisyan.
     Contributed by Mher Movisyan.
 
 
-
-- Now supports Setuptools extra requirements.
-
-    +-------------+-------------------------+---------------------------+
-    | Extension   | Requirement entry       | Type                      |
-    +=============+=========================+===========================+
-    | Redis       | ``celery[redis]``       | transport, result backend |
-    +-------------+-------------------------+---------------------------+
-    | MongoDB``   | ``celery[mongodb]``     | transport, result backend |
-    +-------------+-------------------------+---------------------------+
-    | CouchDB     | ``celery[couchdb]``     | transport                 |
-    +-------------+-------------------------+---------------------------+
-    | Beanstalk   | ``celery[beanstalk]``   | transport                 |
-    +-------------+-------------------------+---------------------------+
-    | ZeroMQ      | ``celery[zeromq]``      | transport                 |
-    +-------------+-------------------------+---------------------------+
-    | Zookeeper   | ``celery[zookeeper]``   | transport                 |
-    +-------------+-------------------------+---------------------------+
-    | SQLAlchemy  | ``celery[sqlalchemy]``  | transport, result backend |
-    +-------------+-------------------------+---------------------------+
-    | librabbitmq | ``celery[librabbitmq]`` | transport (C amqp client) |
-    +-------------+-------------------------+---------------------------+
-
-    Examples using :program:`pip install`:
-
-    .. code-block:: bash
-
-        pip install celery[redis]
-        pip install celery[librabbitmq]
-
-        pip install celery[redis,librabbitmq]
-
-        pip install celery[mongodb]
-        pip install celery[couchdb]
-        pip install celery[beanstalk]
-        pip install celery[zeromq]
-        pip install celery[zookeeper]
-        pip install celery[sqlalchemy]
-
 - New settings :setting:`CELERY_EVENT_QUEUE_TTL` and
 - New settings :setting:`CELERY_EVENT_QUEUE_TTL` and
   :setting:`CELERY_EVENT_QUEUE_EXPIRES`.
   :setting:`CELERY_EVENT_QUEUE_EXPIRES`.
 
 
@@ -410,7 +560,6 @@ In Other News
 
 
     .. _`Couchbase`: http://www.couchbase.com
     .. _`Couchbase`: http://www.couchbase.com
 
 
-
 - CentOS init script now supports starting multiple worker instances.
 - CentOS init script now supports starting multiple worker instances.
 
 
     See the script header for details.
     See the script header for details.
@@ -421,95 +570,6 @@ In Other News
 
 
     Fix contributed by Idan Kamara
     Fix contributed by Idan Kamara
 
 
-- Worker node names now consists of a name and a hostname separated by '@'.
-
-    This change is to more easily identify multiple instances running
-    on the same machine.
-
-    If a custom name is not specified then the
-    worker will use the name 'celery' in default, resulting in a
-    fully qualified node name of 'celery@hostname':
-
-    .. code-block:: bash
-
-        $ celery worker -n example.com
-        celery@example.com
-
-    To set the name you must include the @:
-
-    .. code-block:: bash
-
-        $ celery worker -n worker1@example.com
-        worker1@example.com
-
-    This also means that the worker will identify itself using the full
-    nodename in events and broadcast messages, so where before
-    a worker would identify as 'worker1.example.com', it will now
-    use 'celery@worker1.example.com'.
-
-    Remember that the ``-n`` argument also supports simple variable
-    substitutions, so if the current hostname is *jerry.example.com*
-    then ``%h`` will expand into that:
-
-    .. code-block:: bash
-
-        $ celery worker -n worker1@%h
-        worker1@jerry.example.com
-
-    The table of substitutions is as follows:
-
-    +---------------+---------------------------------------+
-    | Variable      | Substitution                          |
-    +===============+=======================================+
-    | ``%h``        | Full hostname (including domain name) |
-    +---------------+---------------------------------------+
-    | ``%d``        | Domain name only                      |
-    +---------------+---------------------------------------+
-    | ``%n``        | Hostname only (without domain name)   |
-    +---------------+---------------------------------------+
-    | ``%%``        | The character ``%``                   |
-    +---------------+---------------------------------------+
-
-- Task decorator can now create "bound tasks"
-
-    This means that the function will be a method in the resulting
-    task class and so will have a ``self`` argument that can be used
-    to refer to the current task:
-
-    .. code-block:: python
-
-        @app.task(bind=True)
-        def send_twitter_status(self, oauth, tweet):
-            try:
-                twitter = Twitter(oauth)
-                twitter.update_status(tweet)
-            except (Twitter.FailWhaleError, Twitter.LoginError) as exc:
-                raise self.retry(exc=exc)
-
-    Using *bound tasks* is now the recommended approach whenever
-    you need access to the current task or request context.
-    Previously one would have to refer to the name of the task
-    instead (``send_twitter_status.retry``), but this could lead to problems
-    in some instances where the registered task was no longer the same
-    object.
-
-- Workers now synchronizes revoked tasks with its neighbors.
-
-    This happens at startup and causes a one second startup delay
-    to collect broadcast responses from other workers.
-
-- Workers logical clock value is now persisted so that the clock
-  is not reset when a worker restarts.
-
-    The logical clock is also synchronized with other nodes
-    in the same cluster (neighbors), so this means that the logical
-    epoch will start at the point when the first worker in the cluster
-    starts.
-
-    You may notice that the logical clock is an integer value and increases
-    very rapidly. It will take several millennia before the clock overflows 64 bits,
-    so this is not a concern.
-
 - New setting :setting:`BROKER_LOGIN_METHOD`
 - New setting :setting:`BROKER_LOGIN_METHOD`
 
 
     This setting can be used to specify an alternate login method
     This setting can be used to specify an alternate login method
@@ -520,28 +580,6 @@ In Other News
 - The ``dump_conf`` remote control command will now give the string
 - The ``dump_conf`` remote control command will now give the string
   representation for types that are not JSON compatible.
   representation for types that are not JSON compatible.
 
 
-- Calling a subtask will now execute the task directly as documented.
-
-    A misunderstanding led to ``Signature.__call__`` being an alias of
-    ``.delay`` but this does not conform to the calling API of ``Task`` which
-    should call the underlying task method.
-
-    This means that:
-
-    .. code-block:: python
-
-        @app.task
-        def add(x, y):
-            return x + y
-
-        add.s(2, 2)()
-
-    does the same as calling the task directly:
-
-    .. code-block:: python
-
-        add(2, 2)
-
 - Function `celery.security.setup_security` is now :func:`celery.setup_security`.
 - Function `celery.security.setup_security` is now :func:`celery.setup_security`.
 
 
 - Message expires value is now forwarded at retry (Issue #980).
 - Message expires value is now forwarded at retry (Issue #980).
@@ -609,7 +647,6 @@ In Other News
         # Create graph from the current cluster
         # Create graph from the current cluster
         $ celery graph workers | dot -T png -o workers.png
         $ celery graph workers | dot -T png -o workers.png
 
 
-
         # Create graph from a specified list of workers
         # Create graph from a specified list of workers
         $ celery graph workers nodes:w1,w2,w3 | dot -T png workers.png
         $ celery graph workers nodes:w1,w2,w3 | dot -T png workers.png
 
 
@@ -634,7 +671,6 @@ In Other News
 
 
         import celery
         import celery
 
 
-
         class Celery(celery.Celery):
         class Celery(celery.Celery):
 
 
             def __init__(self, *args, **kwargs):
             def __init__(self, *args, **kwargs):
@@ -663,21 +699,69 @@ In Other News
 
 
         $ C_IMPDEBUG=1 celery shell
         $ C_IMPDEBUG=1 celery shell
 
 
+- Message headers now available as part of the task request.
 
 
-- :class:`celery.apps.worker.Worker` has been refactored as a subclass of
-  :class:`celery.worker.WorkController`.
+    Example setting and retreiving a header value::
 
 
-    This removes a lot of duplicate functionality.
+        @app.task(bind=True)
+        def t(self):
+            return self.request.headers.get('sender')
 
 
+        >>> t.apply_async(headers={'sender': 'George Costanza'})
 
 
 - :class:`@events.Receiver` is now a :class:`kombu.mixins.ConsumerMixin`
 - :class:`@events.Receiver` is now a :class:`kombu.mixins.ConsumerMixin`
   subclass.
   subclass.
 
 
+- New :signal:`task_send`` signal dispatched before a task message
+  is sent and can be used to modify the final message fields (Issue #1281).
+
 - ``celery.platforms.PIDFile`` renamed to :class:`celery.platforms.Pidfile`.
 - ``celery.platforms.PIDFile`` renamed to :class:`celery.platforms.Pidfile`.
 
 
 - ``celery.results.BaseDictBackend`` has been removed, replaced by
 - ``celery.results.BaseDictBackend`` has been removed, replaced by
   :class:``celery.results.BaseBackend``.
   :class:``celery.results.BaseBackend``.
 
 
+- MongoDB Backend: Can now be configured using an URL
+
+    See :ref:`example-mongodb-result-config`.
+
+- MongoDB Backend: No longer using deprecated ``pymongo.Connection``.
+
+- MongoDB Backend: Now disables ``auto_start_request``.
+
+- MongoDB Backend: Now enables ``use_greenlets`` when eventlet/gevent is used.
+
+- ``subtask()`` / ``maybe_subtask()`` renamed to
+  ``signature()``/``maybe_signature()``.
+
+    Aliases still available for backwards compatibility.
+
+- The ``correlation_id`` message property is now automatically set to the
+  id of the task.
+
+- The task message ``eta`` and ``expires`` fields now includes timezone
+  information.
+
+- All result backends ``store_result``/``mark_as_*`` methods must now accept
+  a ``request`` keyword argument.
+
+- Events now emit warning if the broken ``yajl`` library is used.
+
+- The :signal:`celeryd_init` signal now takes an extra keyword argument:
+  ``option``.
+
+    This is the mapping of parsed command line arguments, and can be used to
+    prepare new preload arguments (``app.user_options['preload']``).
+
+- New callback: ``Celery.on_configure``.
+
+    This callback is called when an app is about to be configured (a
+    configuration key is required).
+
+- Eventlet/gevent/solo/threads pools now properly handles BaseException errors
+  raised by tasks.
+
+- Multi: Now properly handles both ``-f`` and ``--logfile`` options
+  (Issue #1541).
 
 
 .. _v310-experimental:
 .. _v310-experimental:
 
 
@@ -725,6 +809,13 @@ Scheduled Removals
                 }
                 }
             }
             }
 
 
+- Worker: No longer forks on :sig:`HUP`
+
+    This means that the worker will reuse the same pid, which makes it
+    easier for process supervisors.
+
+    Contributed by Jameel Al-Aziz.
+
 - The ``CELERY_AMQP_TASK_RESULT_EXPIRES`` setting is no longer supported.
 - The ``CELERY_AMQP_TASK_RESULT_EXPIRES`` setting is no longer supported.
 
 
     Use :setting:`CELERY_TASK_RESULT_EXPIRES` instead.
     Use :setting:`CELERY_TASK_RESULT_EXPIRES` instead.
@@ -739,6 +830,40 @@ Scheduled Removals
 - The ``Celery.with_default_connection`` method has been removed in favor
 - The ``Celery.with_default_connection`` method has been removed in favor
   of ``with app.connection_or_acquire``.
   of ``with app.connection_or_acquire``.
 
 
+- The :signal:`task_revoked` signal now accepts new ``request`` argument
+  (Issue #1555).
+
+    The revoked signal is dispatched after the task request is removed from
+    the stack, so it must instead use the :class:`~celery.worker.job.Request`
+    object to get information about the task.
+
+- Worker: New :option:`-X` command line argument to exclude queues
+  (Issue #1399).
+
+    The :option:`-X` argument is the inverse of the :option:`-Q` argument
+    and accepts a list of queues to exclude (not consume from):
+
+    .. code-block:: bash
+
+        # Consume from all queues in CELERY_QUEUES, but not the 'foo' queue.
+        $ celery worker -A proj -l info -X foo
+
+- New public API to push and pop from the current task stack:
+
+    :func:`celery.app.push_current_task` and
+    :func:`celery.app.pop_current_task``.
+
+- ``RetryTaskError`` has been renamed to :exc:`~celery.exceptions.Retry`.
+
+    The old name is still available for backwards compatibility.
+
+- New semipredicate exception :exc:`~celery.exceptions.Reject`
+
+    This exception can be raised to reject/requeue the task message,
+    see :ref:`task-semipred-reject` for examples.
+
+- Semipredicates documented: :ref:`task-semipredicates` (Retry/Ignore/Reject).
+
 .. _v310-deprecations:
 .. _v310-deprecations:
 
 
 Deprecations
 Deprecations
@@ -756,7 +881,50 @@ See the :ref:`deprecation-timeline`.
 Fixes
 Fixes
 =====
 =====
 
 
-- XXX
+- AMQP Backend: join did not convert exceptions when using the json
+  serializer.
+
+- Worker: Workaround for unicode errors in logs (Issue #427)
+
+- Task methods: ``.apply_async`` now works properly if args list is None
+  (Issue #1459).
+
+- Autoscale and ``pool_grow``/``pool_shrink`` remote control commands
+  will now also automatically increase and decrease the consumer prefetch count.
+
+    Fix contributed by Daniel M. Taub.
+
+- Optimization: Improved performance of ``ResultSet.join_native()``.
+
+    Contributed by Stas Rudakou.
+
+- ``celery control pool_`` commands did not coerce string arguments to int.
+
+- Redis/Cache chords: Callback result is now set to failure if the group
+  disappeared from the database (Issue #1094).
+
+- Worker: Now makes sure that the shutdown process is not initiated multiple
+  times.
+
+- Adds :envvar:`C_FAKEFORK` envvar for simple init script/multi debugging
+
+    This means that you can now do:
+
+    .. code-block:: bash
+
+            $ C_FAKEFORK=1 celery multi start 10
+
+    or:
+
+    .. code-block:: bash
+
+        $ C_FAKEFORK=1 /etc/init.d/celeryd start
+
+    to avoid the daemonization step to see errors that are not visible
+    due to missing stdout/stderr.
+
+    A ``dryrun`` command has been added to the generic init script that
+    enables this option.
 
 
 .. _v310-internal:
 .. _v310-internal:
 
 
@@ -780,3 +948,8 @@ Internal changes
 - Removed unused and never documented global instance
 - Removed unused and never documented global instance
   ``celery.events.state.state``.
   ``celery.events.state.state``.
 
 
+- :class:`celery.apps.worker.Worker` has been refactored as a subclass of
+  :class:`celery.worker.WorkController`.
+
+    This removes a lot of duplicate functionality.
+