summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Shchelokovskyy <pshchelo@users.noreply.github.com>2016-10-06 22:30:20 +0300
committerJames Cammarata <jimi@sngx.net>2016-10-06 14:30:20 -0500
commitaa1ec8af17dc90f20079252010d6a4f93fde4b35 (patch)
tree18917ea4f288ce1955176cc28a3f6579e4c54f3d
parentf01215986079219377e48893c80b53307955870d (diff)
downloadansible-aa1ec8af17dc90f20079252010d6a4f93fde4b35.tar.gz
Make interprocess polling interval configurable (#16560)
As recently there was back-and-forth with this hardcoded value (0.001 -> 0.01 -> 0.005), obviousely the optimal value for it depends on Ansible usage scanario and is better to be configurable. This patch adds a new config option in DEFAULT section, `internal_poll_interval`, with default of 0.001 corresponding to the value hardcoded in Ansible v2.1. This config option is then used instead of hardcoded values where needed. Related GH issue: 14219
-rw-r--r--docsite/rst/intro_configuration.rst14
-rw-r--r--lib/ansible/constants.py3
-rw-r--r--lib/ansible/plugins/strategy/__init__.py3
-rw-r--r--lib/ansible/plugins/strategy/free.py3
4 files changed, 20 insertions, 3 deletions
diff --git a/docsite/rst/intro_configuration.rst b/docsite/rst/intro_configuration.rst
index 06db8fa3e0..7549793e3c 100644
--- a/docsite/rst/intro_configuration.rst
+++ b/docsite/rst/intro_configuration.rst
@@ -432,6 +432,20 @@ implications and wish to disable it, you may do so here by setting the value to
host_key_checking=True
+.. _internal_poll_interval:
+
+internal_poll_interval
+======================
+
+.. versionadded:: 2.2
+
+This sets the interval (in seconds) of Ansible internal processes polling each other.
+Lower values improve performance with large playbooks at the expense of extra CPU load.
+Higher values are more suitable for Ansible usage in automation scenarios, when UI responsiveness is not required but CPU usage might be a concern.
+Default corresponds to the value hardcoded in Ansible ≤ 2.1::
+
+ internal_poll_interval=0.001
+
.. _inventory_file:
inventory
diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py
index 77b1d20c20..0ace1782b7 100644
--- a/lib/ansible/constants.py
+++ b/lib/ansible/constants.py
@@ -146,7 +146,7 @@ DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'd
DEFAULTS='defaults'
# FIXME: add deprecation warning when these get set
-#### DEPRECATED VARS ####
+#### DEPRECATED VARS ####
# use more sanely named 'inventory'
DEPRECATED_HOST_LIST = get_config(p, DEFAULTS, 'hostfile', 'ANSIBLE_HOSTS', '/etc/ansible/hosts', ispath=True)
# this is not used since 0.5 but people might still have in config
@@ -195,6 +195,7 @@ DEFAULT_LOG_PATH = get_config(p, DEFAULTS, 'log_path', 'ANSIB
DEFAULT_FORCE_HANDLERS = get_config(p, DEFAULTS, 'force_handlers', 'ANSIBLE_FORCE_HANDLERS', False, boolean=True)
DEFAULT_INVENTORY_IGNORE = get_config(p, DEFAULTS, 'inventory_ignore_extensions', 'ANSIBLE_INVENTORY_IGNORE', ["~", ".orig", ".bak", ".ini", ".cfg", ".retry", ".pyc", ".pyo"], islist=True)
DEFAULT_VAR_COMPRESSION_LEVEL = get_config(p, DEFAULTS, 'var_compression_level', 'ANSIBLE_VAR_COMPRESSION_LEVEL', 0, integer=True)
+DEFAULT_INTERNAL_POLL_INTERVAL = get_config(p, DEFAULTS, 'internal_poll_interval', None, 0.001, floating=True)
# static includes
DEFAULT_TASK_INCLUDES_STATIC = get_config(p, DEFAULTS, 'task_includes_static', 'ANSIBLE_TASK_INCLUDES_STATIC', False, boolean=True)
diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py
index 5944e5bc03..79c0ccf16f 100644
--- a/lib/ansible/plugins/strategy/__init__.py
+++ b/lib/ansible/plugins/strategy/__init__.py
@@ -26,6 +26,7 @@ from collections import deque
from multiprocessing import Lock
from jinja2.exceptions import UndefinedError
+from ansible import constants as C
from ansible.compat.six.moves import queue as Queue
from ansible.compat.six import iteritems, string_types
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable
@@ -530,7 +531,7 @@ class StrategyBase:
results = self._process_pending_results(iterator)
ret_results.extend(results)
if self._pending_results > 0:
- time.sleep(0.001)
+ time.sleep(C.DEFAULT_INTERNAL_POLL_INTERVAL)
display.debug("no more pending results, returning what we have")
diff --git a/lib/ansible/plugins/strategy/free.py b/lib/ansible/plugins/strategy/free.py
index 7f92de60ac..45e417a23e 100644
--- a/lib/ansible/plugins/strategy/free.py
+++ b/lib/ansible/plugins/strategy/free.py
@@ -21,6 +21,7 @@ __metaclass__ = type
import time
+from ansible import constants as C
from ansible.errors import AnsibleError
from ansible.playbook.included_file import IncludedFile
from ansible.plugins import action_loader
@@ -202,7 +203,7 @@ class StrategyModule(StrategyBase):
display.debug("done adding collected blocks to iterator")
# pause briefly so we don't spin lock
- time.sleep(0.001)
+ time.sleep(C.DEFAULT_INTERNAL_POLL_INTERVAL)
# collect all the final results
results = self._wait_on_pending_results(iterator)