19
19
import pickle
20
20
import json
21
21
import msgpack
22
+ import time
22
23
23
24
from cortex .lib import util
24
25
from cortex .lib .exceptions import CortexException
@@ -114,18 +115,32 @@ def _get_matching_s3_keys_generator(self, prefix="", suffix=""):
114
115
def _upload_string_to_s3 (self , string , key ):
115
116
self .s3 .put_object (Bucket = self .bucket , Key = key , Body = string )
116
117
117
- def _read_bytes_from_s3 (self , key , allow_missing = False , ext_bucket = None ):
118
+ def _read_bytes_from_s3 (
119
+ self , key , allow_missing = False , ext_bucket = None , num_retries = 0 , retry_delay_sec = 2
120
+ ):
121
+ while True :
122
+ try :
123
+ return self ._read_bytes_from_s3_single (
124
+ key , allow_missing = allow_missing , ext_bucket = ext_bucket
125
+ )
126
+ except :
127
+ if num_retries <= 0 :
128
+ raise
129
+ num_retries -= 1
130
+ time .sleep (retry_delay_sec )
131
+
132
+ def _read_bytes_from_s3_single (self , key , allow_missing = False , ext_bucket = None ):
118
133
bucket = self .bucket
119
134
if ext_bucket is not None :
120
135
bucket = ext_bucket
121
136
122
137
try :
123
138
try :
124
139
byte_array = self .s3 .get_object (Bucket = bucket , Key = key )["Body" ].read ()
125
- except self .s3 .exceptions .NoSuchKey as e :
140
+ except self .s3 .exceptions .NoSuchKey :
126
141
if allow_missing :
127
142
return None
128
- raise e
143
+ raise
129
144
except Exception as e :
130
145
raise CortexException (
131
146
'key "{}" in bucket "{}" could not be accessed; ' .format (key , bucket )
@@ -140,26 +155,41 @@ def search(self, prefix="", suffix=""):
140
155
def put_json (self , obj , key ):
141
156
self ._upload_string_to_s3 (json .dumps (obj ), key )
142
157
143
- def get_json (self , key , allow_missing = False ):
144
- obj = self ._read_bytes_from_s3 (key , allow_missing )
158
+ def get_json (self , key , allow_missing = False , num_retries = 0 , retry_delay_sec = 2 ):
159
+ obj = self ._read_bytes_from_s3 (
160
+ key ,
161
+ allow_missing = allow_missing ,
162
+ num_retries = num_retries ,
163
+ retry_delay_sec = retry_delay_sec ,
164
+ )
145
165
if obj is None :
146
166
return None
147
167
return json .loads (obj .decode ("utf-8" ))
148
168
149
169
def put_msgpack (self , obj , key ):
150
170
self ._upload_string_to_s3 (msgpack .dumps (obj ), key )
151
171
152
- def get_msgpack (self , key , allow_missing = False ):
153
- obj = self ._read_bytes_from_s3 (key , allow_missing )
172
+ def get_msgpack (self , key , allow_missing = False , num_retries = 0 , retry_delay_sec = 2 ):
173
+ obj = self ._read_bytes_from_s3 (
174
+ key ,
175
+ allow_missing = allow_missing ,
176
+ num_retries = num_retries ,
177
+ retry_delay_sec = retry_delay_sec ,
178
+ )
154
179
if obj == None :
155
180
return None
156
181
return msgpack .loads (obj , raw = False )
157
182
158
183
def put_pyobj (self , obj , key ):
159
184
self ._upload_string_to_s3 (pickle .dumps (obj ), key )
160
185
161
- def get_pyobj (self , key , allow_missing = False ):
162
- obj = self ._read_bytes_from_s3 (key , allow_missing )
186
+ def get_pyobj (self , key , allow_missing = False , num_retries = 0 , retry_delay_sec = 2 ):
187
+ obj = self ._read_bytes_from_s3 (
188
+ key ,
189
+ allow_missing = allow_missing ,
190
+ num_retries = num_retries ,
191
+ retry_delay_sec = retry_delay_sec ,
192
+ )
163
193
if obj is None :
164
194
return None
165
195
return pickle .loads (obj )
@@ -207,9 +237,15 @@ def download_file_external(self, s3_path, local_path):
207
237
+ "it may not exist, or you may not have suffienct permissions"
208
238
) from e
209
239
210
- def get_json_external (self , s3_path ):
240
+ def get_json_external (self , s3_path , num_retries = 0 , retry_delay_sec = 2 ):
211
241
bucket , key = self .deconstruct_s3_path (s3_path )
212
- obj = self ._read_bytes_from_s3 (key , ext_bucket = bucket )
242
+ obj = self ._read_bytes_from_s3 (
243
+ key ,
244
+ allow_missing = False ,
245
+ ext_bucket = bucket ,
246
+ num_retries = num_retries ,
247
+ retry_delay_sec = retry_delay_sec ,
248
+ )
213
249
if obj is None :
214
250
return None
215
251
return json .loads (obj .decode ("utf-8" ))
0 commit comments