From a4fe5f36b59720b54ca57d7d8c0ff3140e32d6b8 Mon Sep 17 00:00:00 2001 From: Ali Maredia Date: Wed, 12 Jun 2019 16:12:47 -0400 Subject: [PATCH] qa: use curl in wait_for_radosgw() in util/rgw.py Signed-off-by: Ali Maredia (cherry picked from commit 9c6afa3fb570629a57612f250a6a4890a65cbc6e) --- qa/tasks/rgw.py | 3 ++- qa/tasks/rgw_multisite.py | 2 +- qa/tasks/util/rgw.py | 26 ++++++++++++++++++++++---- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/qa/tasks/rgw.py b/qa/tasks/rgw.py index babfa5d5bc974..26a174e4e2623 100644 --- a/qa/tasks/rgw.py +++ b/qa/tasks/rgw.py @@ -140,7 +140,8 @@ def start_rgw(ctx, config, clients): endpoint = ctx.rgw.role_endpoints[client] url = endpoint.url() log.info('Polling {client} until it starts accepting connections on {url}'.format(client=client, url=url)) - wait_for_radosgw(url) + (remote,) = ctx.cluster.only(client).remotes.iterkeys() + wait_for_radosgw(url, remote) try: yield diff --git a/qa/tasks/rgw_multisite.py b/qa/tasks/rgw_multisite.py index c39cb935fb3eb..a41238daa0419 100644 --- a/qa/tasks/rgw_multisite.py +++ b/qa/tasks/rgw_multisite.py @@ -226,7 +226,7 @@ class Gateway(multisite.Gateway): """ (re)start the daemon """ self.daemon.restart() # wait until startup completes - wait_for_radosgw(self.endpoint()) + wait_for_radosgw(self.endpoint(), self.remote) def stop(self): """ stop the daemon """ diff --git a/qa/tasks/util/rgw.py b/qa/tasks/util/rgw.py index ab76b50a2282f..ee79208cc5bd7 100644 --- a/qa/tasks/util/rgw.py +++ b/qa/tasks/util/rgw.py @@ -2,6 +2,7 @@ from cStringIO import StringIO import logging import json import requests +import time from requests.packages.urllib3 import PoolManager from requests.packages.urllib3.util import Retry @@ -70,12 +71,29 @@ def get_user_successful_ops(out, user): return 0 return get_user_summary(out, user)['total']['successful_ops'] -def wait_for_radosgw(url): +def wait_for_radosgw(url, remote): """ poll the given url until it starts accepting connections add_daemon() doesn't wait until radosgw finishes startup, so this is used to avoid racing with later tasks that expect radosgw to be up and listening """ - # use a connection pool with retry/backoff to poll until it starts listening - http = PoolManager(retries=Retry(connect=8, backoff_factor=1)) - http.request('GET', url) + # TODO: use '--retry-connrefused --retry 8' when teuthology is running on + # Centos 8 and other OS's with an updated version of curl + curl_cmd = ['curl', + url] + exit_status = 0 + num_retries = 8 + for seconds in range(num_retries): + proc = remote.run( + args=curl_cmd, + check_status=False, + stdout=StringIO(), + stderr=StringIO(), + stdin=StringIO(), + ) + exit_status = proc.exitstatus + if exit_status == 0: + break + time.sleep(2**seconds) + + assert exit_status == 0 -- 2.39.5