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
""" (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 """
import logging
import json
import requests
+import time
from requests.packages.urllib3 import PoolManager
from requests.packages.urllib3.util import Retry
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