tMerge pull request #4422 from SomberNight/fix_4421 - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit 5a75ce74d775ec5ea789c546f879c7212027ba06 DIR parent 0682166314464506d07e58ce95da96ba8940a900 HTML Author: ThomasV <thomasv@electrum.org> Date: Mon, 11 Jun 2018 12:18:37 +0200 Merge pull request #4422 from SomberNight/fix_4421 socket.getaddrinfo on win32: do our own dns resolution outside the lock Diffstat: M lib/network.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) --- DIR diff --git a/lib/network.py b/lib/network.py t@@ -32,8 +32,12 @@ from collections import defaultdict import threading import socket import json +import sys +import dns +import dns.resolver import socks + from . import util from . import bitcoin from .bitcoin import * t@@ -413,7 +417,23 @@ class Network(util.DaemonThread): socket.getaddrinfo = lambda *args: [(socket.AF_INET, socket.SOCK_STREAM, 6, '', (args[0], args[1]))] else: socket.socket = socket._socketobject - socket.getaddrinfo = socket._getaddrinfo + if sys.platform == 'win32': + # on Windows, socket.getaddrinfo takes a mutex, and might hold it for up to 10 seconds + # when dns-resolving. to speed it up drastically, we resolve dns ourselves, outside that lock + def fast_getaddrinfo(host, *args, **kwargs): + try: + if str(host) not in ('localhost', 'localhost.',): + answers = dns.resolver.query(host) + addr = str(answers[0]) + else: + addr = host + except: + raise socket.gaierror(11001, 'getaddrinfo failed') + else: + return socket._getaddrinfo(addr, *args, **kwargs) + socket.getaddrinfo = fast_getaddrinfo + else: + socket.getaddrinfo = socket._getaddrinfo def start_network(self, protocol, proxy): assert not self.interface and not self.interfaces