X-Git-Url: https://code.grnet.gr/git/kamaki/blobdiff_plain/b5b4441e5d704a0aaf11dd7f708d1a8c75586b01..feature-input-output-encoding:/kamaki/clients/pithos/__init__.py diff --git a/kamaki/clients/pithos/__init__.py b/kamaki/clients/pithos/__init__.py index ac51812..4eb7153 100644 --- a/kamaki/clients/pithos/__init__.py +++ b/kamaki/clients/pithos/__init__.py @@ -1,4 +1,4 @@ -# Copyright 2011-2013 GRNET S.A. All rights reserved. +# Copyright 2011-2014 GRNET S.A. All rights reserved. # # Redistribution and use in source and binary forms, with or # without modification, are permitted provided that the following @@ -426,8 +426,7 @@ class PithosClient(PithosRestClient): blocksize, blockhash, size, nblocks) = self._get_file_block_info( f, size, container_info_cache) (hashes, hmap, offset) = ([], {}, 0) - if not content_type: - content_type = 'application/octet-stream' + content_type = content_type or 'application/octet-stream' self._calculate_blocks_for_upload( *block_info, @@ -467,10 +466,7 @@ class PithosClient(PithosRestClient): sendlog.info('%s blocks missing' % len(missing)) num_of_blocks = len(missing) missing = self._upload_missing_blocks( - missing, - hmap, - f, - upload_gen) + missing, hmap, f, upload_gen) if missing: if num_of_blocks == len(missing): retries -= 1 @@ -619,14 +615,13 @@ class PithosClient(PithosRestClient): tries -= 1 old_failures = len(missing) if missing: - raise ClientError( - '%s blocks failed to upload' % len(missing), - details=['%s' % thread.exception for thread in missing]) + raise ClientError('%s blocks failed to upload' % len(missing)) except KeyboardInterrupt: sendlog.info('- - - wait for threads to finish') for thread in activethreads(): thread.join() raise + self._cb_next() r = self.object_put( obj, @@ -1362,6 +1357,7 @@ class PithosClient(PithosRestClient): finally: from time import sleep sleep(2 * len(activethreads())) + self._cb_next() return headers.values() def truncate_object(self, obj, upto_bytes): @@ -1384,8 +1380,9 @@ class PithosClient(PithosRestClient): def overwrite_object( self, obj, start, end, source_file, - content_type=None, upload_cb=None): + source_version=None, upload_cb=None): """Overwrite a part of an object from local source file + ATTENTION: content_type must always be application/octet-stream :param obj: (str) remote object path @@ -1395,26 +1392,19 @@ class PithosClient(PithosRestClient): :param source_file: open file descriptor - :param content_type: (str) default: application/octet-stream - :param upload_db: progress.bar for uploading """ - r = self.get_object_info(obj) - rf_size = int(r['content-length']) - if rf_size < int(start): - raise ClientError( - 'Range start exceeds file size', - status=416) - elif rf_size < int(end): - raise ClientError( - 'Range end exceeds file size', - status=416) self._assert_container() + r = self.get_object_info(obj, version=source_version) + rf_size = int(r['content-length']) + start, end = int(start), int(end) + assert rf_size >= start, 'Range start %s exceeds file size %s' % ( + start, rf_size) meta = self.get_container_info() blocksize = int(meta['x-container-block-size']) filesize = fstat(source_file.fileno()).st_size - datasize = int(end) - int(start) + 1 + datasize = end - start + 1 nblocks = 1 + (datasize - 1) // blocksize offset = 0 if upload_cb: @@ -1427,16 +1417,17 @@ class PithosClient(PithosRestClient): r = self.object_post( obj, update=True, - content_type=content_type or 'application/octet-stream', + content_type='application/octet-stream', content_length=len(block), content_range='bytes %s-%s/*' % ( start + offset, start + offset + len(block) - 1), + source_version=source_version, data=block) headers.append(dict(r.headers)) offset += len(block) - - self._cb_next + self._cb_next() + self._cb_next() return headers def copy_object(