Skip to content

Commit 2551391

Browse files
Move 'threads' and 'retries' to top-level upload stage. Added missing retry loop to Gs upload
1 parent 054aa7a commit 2551391

File tree

6 files changed

+25
-12
lines changed

6 files changed

+25
-12
lines changed

mongodb_consistent_backup/Upload/Gs/Gs.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,13 @@ def __init__(self, manager, config, timer, base_dir, backup_dir, **kwargs):
2727
super(Gs, self).__init__(self.__class__.__name__, manager, config, timer, base_dir, backup_dir, **kwargs)
2828
self.backup_location = self.config.backup.location
2929
self.remove_uploaded = self.config.upload.remove_uploaded
30+
self.retries = self.config.upload.retries
3031
self.project_id = self.config.upload.gs.project_id
3132
self.access_key = self.config.upload.gs.access_key
3233
self.secret_key = self.config.upload.gs.secret_key
3334
self.bucket = self.config.upload.gs.bucket
3435

35-
self.threads(self.config.upload.gs.threads)
36+
self.threads(self.config.upload.threads)
3637
self._pool = Pool(processes=self.threads())
3738

3839
def close(self):
@@ -69,7 +70,8 @@ def run(self):
6970
self.project_id,
7071
self.access_key,
7172
self.secret_key,
72-
self.remove_uploaded
73+
self.remove_uploaded,
74+
self.retries
7375
).run)
7476
self._pool.close()
7577
self._pool.join()

mongodb_consistent_backup/Upload/Gs/GsUploadThread.py

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88

99
class GsUploadThread:
10-
def __init__(self, backup_dir, file_path, gs_path, bucket, project_id, access_key, secret_key, remove_uploaded=False):
10+
def __init__(self, backup_dir, file_path, gs_path, bucket, project_id, access_key, secret_key, remove_uploaded=False, retries=5):
1111
self.backup_dir = backup_dir
1212
self.file_path = file_path
1313
self.gs_path = gs_path
@@ -16,6 +16,7 @@ def __init__(self, backup_dir, file_path, gs_path, bucket, project_id, access_ke
1616
self.access_key = access_key
1717
self.secret_key = secret_key
1818
self.remove_uploaded = remove_uploaded
19+
self.retries = retries
1920

2021
self.path = "%s/%s" % (self.bucket, self.gs_path)
2122
self.meta_data_dir = "mongodb_consistent_backup-META"
@@ -76,10 +77,21 @@ def run(self):
7677
logging.debug("Path %s does not exist, uploading" % self.path)
7778

7879
try:
79-
f = open(self.file_path, 'r')
80-
uri = self.get_uri()
81-
logging.info("Uploading %s to Google Cloud Storage" % self.path)
82-
uri.new_key().set_contents_from_file(f)
80+
f = open(self.file_path, 'r')
81+
uri = self.get_uri()
82+
retry = 0
83+
error = None
84+
while retry < self.retries:
85+
try:
86+
logging.info("Uploading %s to Google Cloud Storage (attempt %i/%i)" % (self.path, retry, self.retries))
87+
uri.new_key().set_contents_from_file(f)
88+
except Exception, e:
89+
logging.error("Received error for Google Cloud Storage upload of %s: %s" % (self.path, e))
90+
error = e
91+
retry += 1
92+
continue
93+
if retry >= self.retries and error:
94+
raise error
8395
finally:
8496
if f:
8597
f.close()

mongodb_consistent_backup/Upload/Gs/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,4 @@ def config(parser):
77
parser.add_argument("--upload.gs.secret_key", dest="upload.gs.secret_key", help="Google Cloud Storage Uploader Secret Key (required for GS upload)", type=str)
88
parser.add_argument("--upload.gs.bucket_name", dest="upload.gs.bucket_name", help="Google Cloud Storage Uploader destination bucket name", type=str)
99
parser.add_argument("--upload.gs.bucket_prefix", dest="upload.gs.bucket_prefix", help="Google Cloud Storage Uploader destination bucket path prefix", type=str)
10-
parser.add_argument("--upload.gs.threads", dest="upload.gs.threads", help="Google Cloud Storage Uploader worker threads (default: 4)", default=4, type=int)
1110
return parser

mongodb_consistent_backup/Upload/S3/S3.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,16 @@ class S3(Task):
2929
def __init__(self, manager, config, timer, base_dir, backup_dir, **kwargs):
3030
super(S3, self).__init__(self.__class__.__name__, manager, config, timer, base_dir, backup_dir, **kwargs)
3131
self.remove_uploaded = self.config.upload.remove_uploaded
32+
self.retries = self.config.upload.retries
33+
self.thread_count = self.config.upload.threads
3234
self.region = self.config.upload.s3.region
3335
self.bucket_name = self.config.upload.s3.bucket_name
3436
self.bucket_prefix = self.config.upload.s3.bucket_prefix
3537
self.access_key = self.config.upload.s3.access_key
3638
self.secret_key = self.config.upload.s3.secret_key
37-
self.thread_count = self.config.upload.s3.threads
3839
self.chunk_size_mb = self.config.upload.s3.chunk_size_mb
3940
self.chunk_size = self.chunk_size_mb * 1024 * 1024
4041
self.secure = self.config.upload.s3.secure
41-
self.retries = self.config.upload.s3.retries
4242
self.s3_acl = self.config.upload.s3.acl
4343
self.key_prefix = base_dir
4444

mongodb_consistent_backup/Upload/S3/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@ def config(parser):
77
parser.add_argument("--upload.s3.secret_key", dest="upload.s3.secret_key", help="S3 Uploader AWS Secret Key (required for S3 upload)", type=str)
88
parser.add_argument("--upload.s3.bucket_name", dest="upload.s3.bucket_name", help="S3 Uploader destination bucket name", type=str)
99
parser.add_argument("--upload.s3.bucket_prefix", dest="upload.s3.bucket_prefix", help="S3 Uploader destination bucket path prefix", type=str)
10-
parser.add_argument("--upload.s3.threads", dest="upload.s3.threads", help="S3 Uploader worker threads (default: 4)", default=4, type=int)
1110
parser.add_argument("--upload.s3.chunk_size_mb", dest="upload.s3.chunk_size_mb", help="S3 Uploader upload chunk size, in megabytes (default: 50)", default=50, type=int)
1211
parser.add_argument("--upload.s3.secure", dest="upload.s3.secure", help="S3 Uploader connect over SSL (default: true)", default=True, action="store_false")
13-
parser.add_argument("--upload.s3.retries", dest="upload.s3.retries", help="S3 Uploader retry times (default: 5)", default=5, type=int)
1412
parser.add_argument("--upload.s3.acl", dest="upload.s3.acl", help="S3 Uploader ACL associated with objects (default: none)", default=None, type=str)
1513
return parser

mongodb_consistent_backup/Upload/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,6 @@
44
def config(parser):
55
parser.add_argument("--upload.method", dest="upload.method", help="Uploader method (default: none)", default='none', choices=['gs', 's3', 'none'])
66
parser.add_argument("--upload.remove_uploaded", dest="upload.remove_uploaded", help="Remove source files after successful upload (default: false)", default=False, action="store_true")
7+
parser.add_argument("--upload.retries", dest="upload.retries", help="Number of times to retry upload attempts (default: 5)", default=5, type=int)
8+
parser.add_argument("--upload.threads", dest="upload.threads", help="Number of threads to use for upload (default: 4)", default=4, type=int)
79
return parser

0 commit comments

Comments
 (0)