From 8cccede0d435c799385828ce55521c910dc69b13 Mon Sep 17 00:00:00 2001
From: Abhijeet Kasurde <akasurde@redhat.com>
Date: Wed, 22 Jul 2020 09:18:21 +0530
Subject: [PATCH] basic: use PollSelector implementation (#70352)

Some platform such as ESXi does not implement EpollSelector,
which is selected by DefaultSelector. Use SelectSelector which is
based upon 'select' implementation. This works perfectly with
a platform like VMware ESXi.

Fixes: #70238

Signed-off-by: Abhijeet Kasurde <akasurde@redhat.com>
---
 changelogs/fragments/70238_selector.yml | 2 ++
 lib/ansible/module_utils/basic.py       | 8 +++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 changelogs/fragments/70238_selector.yml

diff --git a/changelogs/fragments/70238_selector.yml b/changelogs/fragments/70238_selector.yml
new file mode 100644
index 00000000000..3a0193d0387
--- /dev/null
+++ b/changelogs/fragments/70238_selector.yml
@@ -0,0 +1,2 @@
+bugfixes:
+- basic - use PollSelector implementation when DefaultSelector fails (https://github.com/ansible/ansible/issues/70238).
diff --git a/lib/ansible/module_utils/basic.py b/lib/ansible/module_utils/basic.py
index 232c4873890..608f39017de 100644
--- a/lib/ansible/module_utils/basic.py
+++ b/lib/ansible/module_utils/basic.py
@@ -2613,7 +2613,13 @@ class AnsibleModule(object):
 
             stdout = b''
             stderr = b''
-            selector = selectors.DefaultSelector()
+            try:
+                selector = selectors.DefaultSelector()
+            except OSError:
+                # Failed to detect default selector for the given platform
+                # Select PollSelector which is supported by major platforms
+                selector = selectors.PollSelector()
+
             selector.register(cmd.stdout, selectors.EVENT_READ)
             selector.register(cmd.stderr, selectors.EVENT_READ)
             if os.name == 'posix':