Commit Graph

378 Commits (3f1ef6e24395e39bbcf8462ef33bc64fa538d64e)

Author SHA1 Message Date
David Wilson aba396d4c5 core: bootstrap FD management improvements
- open fd 0/1/2 with correct file mode
- trap reserve_tty_fd in a file object, since all other FD manual FD
  management is going away.
7 years ago
David Wilson 4f0a946f30 core: pending timers should keep broker alive. 7 years ago
David Wilson 237a3babaf core: more succinct iter_split(). 7 years ago
David Wilson dfefc4c05c core: replace UTF8_CODEC with encodings.utf_8.encode() function. 7 years ago
David Wilson 3f90030c1e core: docstring style cleanups, dead code. 7 years ago
David Wilson 5aca9d6c3f core: split out iter_split() for use in parent.py. 7 years ago
David Wilson a5536c3514 core: eliminate some quadratric behaviour from IoLogger
This is the same problem as used to afflict Stream: large input buffers
containing many small messages cause intense string copying. This
eliminates the worst of it.
7 years ago
David Wilson 2fbc77a155 issue #170: implement timers. 7 years ago
Jordan Webb 1a02a86331
Add buildah transport 7 years ago
David Wilson 8f940e2ccb issue #590: teach importer to handle self-replacing modules 7 years ago
David Wilson ee62c57c9d issue #576: fix Kwargs minor version check.
Unicode kwargs were introduced in Python 2.6.5, not 2.6.0.
7 years ago
David Wilson 87c8ab4323 issue #550: fix up TTY ioctls on WSL 2016 Anniversary Update 7 years ago
David Wilson 18b984a0b4 issue #535: activate Corker on 2.4 in master too. 7 years ago
David Wilson 06e52ca89f issue #535: wire mitogen.os_fork into Broker and Pool. 7 years ago
David Wilson 63f4864b21 issue #535: introduce mitogen.os_fork module and Corker class. 7 years ago
David Wilson eb9ec26622 issue #535: core: unicode.encode() may take importer lock on 2.x
Found on Python 2.4, where import happens immediately following connect.

- Main thread executes import statement, triggers request to parent
- Broker thread attempts to deliver request via Router
- Router discovers parent has disconnected, prepares a dead message
- .dead() calls unicode.encode() to format reason string
- .encode() attemptsto import a codec module
- deadlock

----

(gdb) pystack
/usr/local/python2.4.6/lib/python2.4/encodings/__init__.py (69): search_function
<stdin> (733): dead
<stdin> (2717): _maybe_send_dead
<stdin> (2724): _invoke
<stdin> (2749): _async_route
<stdin> (1635): _receive_one
<stdin> (1603): _internal_receive
<stdin> (1613): on_receive
<stdin> (2931): _call
<stdin> (2942): _loop_once
<stdin> (2988): _do_broker_main
<stdin> (545): _profile_hook
<stdin> (3007): _broker_main
/usr/local/python2.4.6/lib/python2.4/threading.py (420): run
/usr/local/python2.4.6/lib/python2.4/threading.py (424): __bootstrap
7 years ago
David Wilson b3f592acee issue #535: core/select: support selecting from Latches. 7 years ago
David Wilson 7d0480e8bd core: increase cookie field lengths to 64-bit; closes #545. 7 years ago
David Wilson ca63c26e01 core: Make Latch.put(obj=) optional. 7 years ago
David Wilson 9bcd2ec56c issue #542: return of select poller, new selection logic 7 years ago
David Wilson 2a8567b432 core: serialize calls to _service_stub_main().
See comment.
7 years ago
David Wilson 1f77d24bec Update copyright year everywhere. 7 years ago
David Wilson 7ff4e6694c issue #536: rework how 2.3-compatible simplejson is served
Regardless of the version of simplejson loaded in the master, load up
the ModuleResponder cache with our 2.4-compatible version.

To cope with simplejson being loaded due to modules like ec2_group that
try to import it before importing 'json', also update target.py to
remove it from the whitelist if a local 'json' module import succeeds.
7 years ago
David Wilson 78ec634dab issue #481: core: preserve stderr TTY FD if one is present.
Since 802de6a8d5, sudo on CentOS 5 had
begun failing due to a TTY FD leak in the parent process being fixed.

The old versions of sudo doesn't hang around after starting a child --
they exec the privilege-escalated child process on top of themselves,
meaning no spare copy of the TTY FD is kept alive by sudo.

When the child starts up, it replaces stdio with IoLoggers, including
the inherited stderr FD connected to DiagLogStream/the slave PTY. When
the last process closes a slave PTY, the kernel sends SIGHUP to any
processes still having it as the controlling TTY.

Therefore we must either ignore SIGHUP until the first stage has been
waited on (since the first stage also preserve the FD), or dup the
inherited TTY FD and keep it around forever.

Wasting one FD seems less annoying than modifying process signals for
all potential library users, so that is the approach taken here.
7 years ago
David Wilson 5ae7464011 core: cProfile is not available in 2.4. 7 years ago
David Wilson 0e193c223c issue #508: master: minify all Mitogen/ansible_mitogen sources.
Minify-safe files are marked with a magical "# !mitogen: minify_safe"
comment anywhere in the file, which activates the minifier. The result
is naturally cached by ModuleResponder, therefore lru_cache is gone too.

Given:

    import os, mitogen
    @mitogen.main()
    def main(router):
        c = router.ssh(hostname='k3')
        c.call(os.getpid)
        router.sudo(via=c)

SSH footprint drops from 56.2 KiB to 42.75 KiB (-23.9%)
Ansible "shell: hostname" drops 149.26 KiB to 117.42 KiB (-21.3%)
7 years ago
David Wilson 960392cf50 core: tidy up existing profiling code and support MITOGEN_PROFILE_FMT 7 years ago
David Wilson 3606580f05 issue #260: redundant if statement. 7 years ago
David Wilson 696cee57dd issue #260: hide force-disconnect messages.
Parent is always force-disconnected, and now it shows up quite visibly
on every exit.
7 years ago
David Wilson 26c6c6d048 issue #498: fix shutdown crash
Traceback (most recent call last):
      File "<stdin>", line 2707, in _invoke
      File "<stdin>", line 2480, in _on_del_route
    NameError: global name 'target_id' is not defined
7 years ago
David Wilson a18a083c94 issue #260: avoid start_transmit()/on_transmit()/stop_transmit()
Previous transmit sequence was:
        Router._async_route -> Stream._send -> Broker._start_transmit ->
        Broker.loop -> Stream.on_transmit -> socket.write ->
        Broker.stop_transmit

New sequence, when socket buffer can hold message is:
        Router._async_route -> Stream._send -> socket.write

bench/roundtrip.py
        Before: 240 usec
        after: 178 usec

Stat before:
       5088.276050      task-clock (msec)         #    0.997 CPUs utilized
           185,568      context-switches          #    0.036 M/sec
                 0      cpu-migrations            #    0.000 K/sec
            18,923      page-faults               #    0.004 M/sec
    13,063,871,501      cycles                    #    2.567 GHz
    12,834,579,684      instructions              #    0.98  insn per cycle
     2,669,820,684      branches                  #  524.700 M/sec
       107,296,033      branch-misses             #    4.02% of all branches

       5.105018296 seconds time elapsed

       2.350970000 seconds user
       0.345497000 seconds sys

Stat after:
       4019.208047      task-clock (msec)         #    0.998 CPUs utilized
           249,471      context-switches          #    0.062 M/sec
                 0      cpu-migrations            #    0.000 K/sec
            20,990      page-faults               #    0.005 M/sec
    10,312,535,979      cycles                    #    2.566 GHz
    11,586,365,995      instructions              #    1.12  insn per cycle
     2,392,933,370      branches                  #  595.374 M/sec
        75,432,205      branch-misses             #    3.15% of all branches

       4.028763347 seconds time elapsed

       3.367051000 seconds user
       0.652962000 seconds sys
7 years ago
David Wilson d4a0b70e15 core: ensure broker profiling output reaches disk
Profiler hasn't been used much since the hard exit was added.
7 years ago
David Wilson 0c0d34241b core: Latch._wake improvements
os.write() can fail with EINTR due to signals, so wrap it in
io_op(). Closes #483.

Masking EBADF looks like it is/was almost certainly papering over a bug,
remove it and suffer the bug reports. Closes #495.
7 years ago
David Wilson e2478dcb9f issue #498: wrap Router dict mutations in a lock 7 years ago
David Wilson ec789513dc ssh: tidy up logs and stream names. 7 years ago
David Wilson 16a2de65c4 issue #493: another Py3.x fix. 7 years ago
David Wilson 2a70b3d5f4 issue #493: Py3.x fix. 7 years ago
David Wilson bc84d1e950 issue #493: less CPU-intensive cookie format. 7 years ago
David Wilson 7dae88f0f5 issue #490: have Side._on_fork() empty _fork_refs
This is mostly to avoid ugly debugging that depends on the state of GC.
Discard sides from _fork_refs after they have been closed.
7 years ago
David Wilson 2b234936b8 core: docstring tidyups. 7 years ago
David Wilson f17fb91993 core: ensure early debug messages are logged correctly.
The magical _v and _vv were being set too late. Drag _setup_logging()
out of the Router constructor and call it at the right moment during
bootstrap.
7 years ago
David Wilson 8a931e79b0 core: log disconnection reason. 7 years ago
David Wilson 1f59bcc313 issue #477: fix another Threading.getName() call. 7 years ago
David Wilson d6dcb8d010 issue #477: blacklist 'thread' module to avoid roundtrip on 2.x->3.x 7 years ago
David Wilson 4c1ddf6fc1 issue #477: Python3 does not have Pickler.dispatch. 7 years ago
David Wilson a31718a6bc issue #477: use PY24 constant rather than explicit test. 7 years ago
David Wilson ffd46e9f1c issue #477: parent: make iter_read() log disconnect reason. 7 years ago
David Wilson e9706a4a09 issue #477: _update_linecache() must append newlines. 7 years ago
David Wilson 19b708e141 issue #415, #477: Poller must handle POLLHUP too.
Linux will fire poll() with simply the POLLHUP bit set even though it
was not requested, resulting in an infinite loop.
7 years ago
David Wilson 07f1b9bdd0 issue #477: Python 2.5 needs next() polyfill too. 7 years ago