Explorar el Código

Merge pull request #141 from Dany9966/requests-timeout

Add timeout config option for all internal HTTP requests.
Nashwan Azhari hace 5 años
padre
commit
772e628c3e

+ 3 - 0
coriolis/cmd/__init__.py

@@ -2,4 +2,7 @@
 # All Rights Reserved.
 # All Rights Reserved.
 
 
 import eventlet
 import eventlet
+
+from coriolis import conf
+
 eventlet.monkey_patch()
 eventlet.monkey_patch()

+ 13 - 0
coriolis/conf.py

@@ -0,0 +1,13 @@
+# Copyright 2020 Cloudbase Solutions Srl
+# All Rights Reserved.
+
+from oslo_config import cfg
+
+opts = [
+    cfg.IntOpt('default_requests_timeout',
+               default=60,
+               help='Number of seconds for HTTP request timeouts.'),
+]
+
+CONF = cfg.CONF
+CONF.register_opts(opts)

+ 2 - 1
coriolis/data_transfer.py

@@ -71,7 +71,8 @@ def compression_proxy(content, fmt):
             headers = {
             headers = {
                 "X-Compression-Format": fmt,
                 "X-Compression-Format": fmt,
             }
             }
-            ret = sess.post(url, data=data, headers=headers)
+            ret = sess.post(url, data=data, headers=headers,
+                            timeout=CONF.default_requests_timeout)
             ret.raise_for_status()
             ret.raise_for_status()
             compressed_data = ret.content
             compressed_data = ret.content
         except Exception as err:
         except Exception as err:

+ 4 - 1
coriolis/licensing/client.py

@@ -7,10 +7,12 @@ import requests
 
 
 from coriolis import exception
 from coriolis import exception
 from coriolis import utils
 from coriolis import utils
+from oslo_config import cfg
 from oslo_log import log as logging
 from oslo_log import log as logging
 
 
 
 
 LOG = logging.getLogger(__name__)
 LOG = logging.getLogger(__name__)
+CONF = cfg.CONF
 
 
 RESERVATION_TYPE_REPLICA = "replica"
 RESERVATION_TYPE_REPLICA = "replica"
 RESERVATION_TYPE_MIGRATION = "migration"
 RESERVATION_TYPE_MIGRATION = "migration"
@@ -63,7 +65,8 @@ class LicensingClient(object):
 
 
         url = self._get_url_for_resource(resource)
         url = self._get_url_for_resource(resource)
 
 
-        kwargs = {"verify": self._verify}
+        kwargs = {"verify": self._verify,
+                  "timeout": CONF.default_requests_timeout}
         if body:
         if body:
             if not isinstance(body, (str, bytes)):
             if not isinstance(body, (str, bytes)):
                 body = json.dumps(body)
                 body = json.dumps(body)

+ 6 - 3
coriolis/providers/backup_writers.py

@@ -563,7 +563,8 @@ class HTTPBackupWriterImpl(BaseBackupWriterImpl):
         self._ensure_session()
         self._ensure_session()
         uri = "%s/acquire" % self._uri
         uri = "%s/acquire" % self._uri
         headers = {"X-Client-Token": self._id}
         headers = {"X-Client-Token": self._id}
-        resp = self._session.get(uri, headers=headers)
+        resp = self._session.get(
+            uri, headers=headers, timeout=CONF.default_requests_timeout)
         LOG.debug("Returned code: %d. Msg: %s" % (
         LOG.debug("Returned code: %d. Msg: %s" % (
             resp.status_code, resp.content))
             resp.status_code, resp.content))
         resp.raise_for_status()
         resp.raise_for_status()
@@ -573,7 +574,8 @@ class HTTPBackupWriterImpl(BaseBackupWriterImpl):
         self._ensure_session()
         self._ensure_session()
         uri = "%s/release" % self._uri
         uri = "%s/release" % self._uri
         headers = {"X-Client-Token": self._id}
         headers = {"X-Client-Token": self._id}
-        resp = self._session.get(uri, headers=headers)
+        resp = self._session.get(
+            uri, headers=headers, timeout=CONF.default_requests_timeout)
         LOG.debug("Returned code: %d. Msg: %s" %
         LOG.debug("Returned code: %d. Msg: %s" %
                   (resp.status_code, resp.content))
                   (resp.status_code, resp.content))
         resp.raise_for_status()
         resp.raise_for_status()
@@ -650,7 +652,8 @@ class HTTPBackupWriterImpl(BaseBackupWriterImpl):
             def send():
             def send():
                 self._ensure_session()
                 self._ensure_session()
                 resp = self._session.post(
                 resp = self._session.post(
-                    self._uri, headers=headers, data=payload["chunk"]
+                    self._uri, headers=headers, data=payload["chunk"],
+                    timeout=CONF.default_requests_timeout
                 )
                 )
                 LOG.debug(
                 LOG.debug(
                     "Response code: %r, content: %r" %
                     "Response code: %r, content: %r" %

+ 17 - 8
coriolis/providers/replicator.py

@@ -1,13 +1,11 @@
 # Copyright 2019 Cloudbase Solutions Srl
 # Copyright 2019 Cloudbase Solutions Srl
 # All Rights Reserved.
 # All Rights Reserved.
 
 
-import errno
 import json
 import json
 import os
 import os
 import shutil
 import shutil
 import tempfile
 import tempfile
 import time
 import time
-import uuid
 
 
 from oslo_config import cfg
 from oslo_config import cfg
 from oslo_log import log as logging
 from oslo_log import log as logging
@@ -38,6 +36,9 @@ replicator_opts = [
     cfg.IntOpt('port',
     cfg.IntOpt('port',
                default=DEFAULT_REPLICATOR_PORT,
                default=DEFAULT_REPLICATOR_PORT,
                help='The replicator TCP port.'),
                help='The replicator TCP port.'),
+    cfg.IntOpt('default_requests_timeout',
+               default=60,
+               help='Number of seconds for HTTP request timeouts.'),
 ]
 ]
 
 
 CONF = cfg.CONF
 CONF = cfg.CONF
@@ -171,7 +172,9 @@ class Client(object):
         params = {
         params = {
             "brief": brief,
             "brief": brief,
         }
         }
-        status = self._cli.get(uri, params=params)
+        status = self._cli.get(
+            uri, params=params,
+            timeout=CONF.replicator.default_requests_timeout)
         status.raise_for_status()
         status.raise_for_status()
         return status.json()
         return status.json()
 
 
@@ -181,21 +184,25 @@ class Client(object):
         params = {
         params = {
             "skipZeros": skip_zeros,
             "skipZeros": skip_zeros,
         }
         }
-        chunks = self._cli.get(uri, params=params)
+        chunks = self._cli.get(
+            uri, params=params,
+            timeout=CONF.replicator.default_requests_timeout)
         chunks.raise_for_status()
         chunks.raise_for_status()
         return chunks.json()
         return chunks.json()
 
 
     @utils.retry_on_error()
     @utils.retry_on_error()
     def get_changes(self, device):
     def get_changes(self, device):
         uri = "%s/api/v1/dev/%s/chunks/changes/" % (self._base_uri, device)
         uri = "%s/api/v1/dev/%s/chunks/changes/" % (self._base_uri, device)
-        chunks = self._cli.get(uri)
+        chunks = self._cli.get(
+            uri, timeout=CONF.replicator.default_requests_timeout)
         chunks.raise_for_status()
         chunks.raise_for_status()
         return chunks.json()
         return chunks.json()
 
 
     @utils.retry_on_error()
     @utils.retry_on_error()
     def get_disk_size(self, disk):
     def get_disk_size(self, disk):
         diskUri = self.raw_disk_uri(disk)
         diskUri = self.raw_disk_uri(disk)
-        info = self._cli.head(diskUri)
+        info = self._cli.head(
+            diskUri, timeout=CONF.replicator.default_requests_timeout)
         info.raise_for_status()
         info.raise_for_status()
         return int(info.headers["Content-Length"])
         return int(info.headers["Content-Length"])
 
 
@@ -213,7 +220,8 @@ class Client(object):
             headers["Accept-encoding"] = "identity"
             headers["Accept-encoding"] = "identity"
 
 
         data = self._cli.get(
         data = self._cli.get(
-            diskUri, headers=headers)
+            diskUri, headers=headers,
+            timeout=CONF.replicator.default_requests_timeout)
         data.raise_for_status()
         data.raise_for_status()
         return data.content
         return data.content
 
 
@@ -825,7 +833,8 @@ class Replicator(object):
             "{:.0f}%%" % disk)
             "{:.0f}%%" % disk)
 
 
         total = 0
         total = 0
-        with self._cli._cli.get(diskUri, stream=True) as dw:
+        with self._cli._cli.get(diskUri, stream=True,
+                                timeout=CONF.replicator.default_requests_timeout) as dw:
             with open(path, 'wb') as dsk:
             with open(path, 'wb') as dsk:
                 for chunk in dw.iter_content(chunk_size=self._chunk_size):
                 for chunk in dw.iter_content(chunk_size=self._chunk_size):
                     if chunk:
                     if chunk: