@@ -24,19 +24,44 @@ To avail of fixes in an unreleased version, please download a ZIP file
2424Enhancements
2525^^^^^^^^^^^^
2626
27- * `#587 <https://github.com/dw/mitogen/issues/587 >`_: partial support for
28- Ansible 2.8 is available. This implementation does not yet support the new
29- `become plugins
30- <https://docs.ansible.com/ansible/latest/plugins/become.html> `_
31- functionality, which will be addressed in a future release.
27+ * `#587 <https://github.com/dw/mitogen/issues/587 >`_: Ansible 2.8 is partially
28+ supported. `Become plugins
29+ <https://docs.ansible.com/ansible/latest/plugins/become.html> `_ and
30+ `interpreter discovery
31+ <https://docs.ansible.com/ansible/latest/reference_appendices/interpreter_discovery.html> `_
32+ are not yet handled.
33+
34+ * The ``MITOGEN_CPU_COUNT `` environment variable shards the connection
35+ multiplexer into per-CPU worker processes. This improves throughput for large
36+ runs especially involving file transfer, and is a prerequisite to future
37+ in-process SSH support. To match the behaviour of older releases, only one
38+ multiplexer is started by default.
39+
40+ * `#419 <https://github.com/dw/mitogen/issues/419 >`_,
41+ `#470 <https://github.com/dw/mitogen/issues/470 >`_, file descriptor usage
42+ during large runs is halved, as it is no longer necessary to manage read and
43+ write sides distinctly in order to work around a design limitation.
44+
45+ * `#419 <https://github.com/dw/mitogen/issues/419 >`_: almost all connection
46+ setup happens on one thread, reducing GIL contention and context switching
47+ early in a run.
48+
49+ * `#419 <https://github.com/dw/mitogen/issues/419 >`_: 2 network round-trips
50+ were removed from early connection setup.
51+
52+ * `? <https://github.com/dw/mitogen/commit/7ae926b3 >`_,
53+ `? <https://github.com/dw/mitogen/commit/7ae926b3 >`_,
54+ `? <https://github.com/dw/mitogen/commit/7ae926b3 >`_,
55+ `? <https://github.com/dw/mitogen/commit/7ae926b3 >`_: locking is avoided in
56+ some hot paths, and locks that must be taken are held for less time.
3257
3358
3459Fixes
3560^^^^^
3661
37- * `#363 <https://github.com/dw/mitogen/issues/363 >`_: fix a rare race matching
38- *Permission denied * errors from some versions of ``su `` running on heavily
39- loaded machines.
62+ * `#363 <https://github.com/dw/mitogen/issues/363 >`_: fix an obscure race
63+ matching *Permission denied * errors from some versions of ``su `` running on
64+ heavily loaded machines.
4065
4166* `#578 <https://github.com/dw/mitogen/issues/578 >`_: the extension could crash
4267 while rendering an error message, due to an incorrect format string.
@@ -61,61 +86,56 @@ Fixes
6186 ``lineinfile `` module began leaking writable temporary file descriptors since
6287 Ansible 2.7.0. When ``lineinfile `` was used to create or modify a script, and
6388 that script was later executed, the execution could fail with "*text file
64- busy *" due to the open descriptor. Temporary descriptors are now tracked and
65- cleaned up on module exit.
89+ busy *" due to the leaked descriptor. Temporary descriptors are now tracked
90+ and cleaned up on exit for all modules .
6691
6792
6893Core Library
6994~~~~~~~~~~~~
7095
7196* Logs are more readable, and many :func: `repr ` strings are more descriptive.
72- The old pseudo-function-call format is slowly being migrated to
73- human-readable output where appropriate . For example,
74- * "Stream(ssh:123).connect()" * could become *"connecting to ssh:123" *.
97+ The old pseudo-function-call format is slowly migrating to human-readable
98+ output where possible . For example, * "Stream(ssh:123).connect()" * might
99+ be written *"connecting to ssh:123" *.
75100
76101* :func: `bytearray ` was removed from the list of supported serialization types.
77- It has never been portable, and does not appear to have been used.
102+ It was never portable between Python versions, unused, and never made much
103+ sense to support as a wire type.
78104
79- * `#170 <https://github.com/dw/mitogen/issues/170 >`_: to better support child
80- process management and a future asynchronous connect implementation, a
81- :class: `mitogen.parent.TimerList ` API is available.
105+ * `#170 <https://github.com/dw/mitogen/issues/170 >`_: to improve subprocess
106+ management and asynchronous connect, a :class: `mitogen.parent.TimerList `
107+ interface is available, accessible as :attr: `Broker.timers ` in an
108+ asynchronous context.
82109
83110* `#419 <https://github.com/dw/mitogen/issues/419 >`_: the internal
84111 :class: `mitogen.core.Stream ` has been refactored into 7 new classes,
85112 modularizing protocol behaviour, output buffering, line-oriented input
86- parsing, options handling and connection management. Connection setup is
113+ parsing, option handling and connection management. Connection setup is
87114 internally asynchronous, laying almost all the groundwork needed for fully
88115 asynchronous connect, proxied Ansible become plug-ins, and integrating
89116 `libssh <https://www.libssh.org/ >`_.
90117
91- * `#419 <https://github.com/dw/mitogen/issues/419 >`_: zombie process reaping
92- has vastly improved, by using the timer API to efficiently poll for a slow
93- child to finish exiting. Polling avoids the need to install a process-global
94- `SIGCHLD ` handler, or rely on the process-global 'signal file descriptor'
95- functionality only available in newer Python releases.
118+ * `#169 <https://github.com/dw/mitogen/issues/169 >`_,
119+ `#419 <https://github.com/dw/mitogen/issues/419 >`_: zombie child reaping has
120+ vastly improved, by using timers to efficiently poll for a slow child to
121+ finish exiting. Polling avoids relying on process-global configuration such
122+ as a `SIGCHLD ` handler, or :func: `signal.set_wakeup_fd ` available in modern
123+ Python.
96124
97- * `#419 <https://github.com/dw/mitogen/issues/419 >`_: most uses of
98- :func: `os.dup ` have been removed, along with almost all cases of manual file
99- descriptor management. Descriptors are trapped in :func: `os.fdopen ` objects
100- as soon as they are opened, ensuring a leaked object will close itself, and
101- ensuring every descriptor is fused to a `closed ` flag, preventing historical
102- bugs where a double close could destroy descriptors belonging to an unrelated
103- stream.
125+ * `#256 <https://github.com/dw/mitogen/issues/256 >`_,
104126
105- * `#419 <https://github.com/dw/mitogen/issues/419 >`_,
106- ` #549 < https://github.com/dw/mitogen/issues/549 >`_, file descriptor usage
107- during large runs has approximately halved, as it is no longer necessary to
108- manage every read and write side distinctly, in order to avoid double-close
109- bugs. Avoiding double-close is instead handled by Python's built-in file
110- object .
127+ `#419 <https://github.com/dw/mitogen/issues/419 >`_: most :func: ` os.dup ` was
128+ eliminated, along with almost all manual file descriptor management.
129+ Descriptors are trapped in :func: ` os.fdopen ` objects when they are created,
130+ ensuring a leaked object will close itself, and ensuring every descriptor is
131+ fused to a ` closed ` flag, preventing historical bugs where a double close
132+ could destroy descriptors belonging to unrelated streams .
111133
112134* `a5536c35 <https://github.com/dw/mitogen/commit/a5536c35 >`_: avoid quadratic
113135 buffer management when logging lines received from a child's redirected
114136 standard IO.
115137
116138
117-
118-
119139Thanks!
120140~~~~~~~
121141
0 commit comments