X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/5dd1249f3ec74643957202977f92e42be78f65d8..00af5ad16232b856ef1f3620a4f62f0946c681a7:/sdk/python/arvados/keep.py?ds=sidebyside diff --git a/sdk/python/arvados/keep.py b/sdk/python/arvados/keep.py index b2bf3b40a9..e8be158c4f 100644 --- a/sdk/python/arvados/keep.py +++ b/sdk/python/arvados/keep.py @@ -142,7 +142,7 @@ class KeepClient(object): def shuffled_service_roots(self, hash): if self.service_roots == None: self.lock.acquire() - keep_disks = api().keep_disks().list().execute()['items'] + keep_disks = arvados.api().keep_disks().list().execute()['items'] roots = (("http%s://%s:%d/" % ('s' if f['service_ssl_flag'] else '', f['service_host'], @@ -174,26 +174,38 @@ class KeepClient(object): return KeepClient.local_store_get(locator) expect_hash = re.sub(r'\+.*', '', locator) for service_root in self.shuffled_service_roots(expect_hash): - h = httplib2.Http() url = service_root + expect_hash api_token = config.get('ARVADOS_API_TOKEN') headers = {'Authorization': "OAuth2 %s" % api_token, 'Accept': 'application/octet-stream'} - try: - resp, content = h.request(url.encode('utf-8'), 'GET', - headers=headers) - if re.match(r'^2\d\d$', resp['status']): - m = hashlib.new('md5') - m.update(content) - md5 = m.hexdigest() - if md5 == expect_hash: - return content - logging.warning("Checksum fail: md5(%s) = %s" % (url, md5)) - except (httplib2.HttpLib2Error, httplib.ResponseNotReady) as e: - logging.info("Request fail: GET %s => %s: %s" % - (url, type(e), str(e))) + blob = self.get_url(url, headers, expect_hash) + if blob: + return blob + for location_hint in re.finditer(r'\+K@([a-z0-9]+)', locator): + instance = location_hint.group(1) + url = 'http://keep.' + instance + '.arvadosapi.com/' + expect_hash + blob = self.get_url(url, {}, expect_hash) + if blob: + return blob raise arvados.errors.NotFoundError("Block not found: %s" % expect_hash) + def get_url(self, url, headers, expect_hash): + h = httplib2.Http() + try: + resp, content = h.request(url.encode('utf-8'), 'GET', + headers=headers) + if re.match(r'^2\d\d$', resp['status']): + m = hashlib.new('md5') + m.update(content) + md5 = m.hexdigest() + if md5 == expect_hash: + return content + logging.warning("Checksum fail: md5(%s) = %s" % (url, md5)) + except Exception as e: + logging.info("Request fail: GET %s => %s: %s" % + (url, type(e), str(e))) + return None + def put(self, data, **kwargs): if 'KEEP_LOCAL_STORE' in os.environ: return KeepClient.local_store_put(data)