@@ -173,13 +173,14 @@ auto ExternalBlockStorageAws::put(
173173 async_counter.add_and_notify_result ();
174174 };
175175 async_counter.add_task ();
176- m_client.PutObjectAsync (put_request, responseReceivedHandler);
176+ m_client.PutObjectAsync (
177+ put_request, std::move (responseReceivedHandler));
177178 }
178179 return sanitized;
179180}
180181
181182void ExternalBlockStorageAws::get (
182- std::string const &external_ref, void * data, size_t len)
183+ std::string const &external_ref, std::shared_ptr< void > data, size_t len)
183184{
184185 if (len == 0 )
185186 {
@@ -190,23 +191,69 @@ void ExternalBlockStorageAws::get(
190191 get_request.SetBucket (m_bucketName);
191192 get_request.SetKey (external_ref);
192193
193- auto get_outcome = m_client.GetObject (get_request);
194- if (!get_outcome.IsSuccess ())
194+ auto processGetOutcome = [len](
195+ Aws::S3::Model::GetObjectOutcome const
196+ &get_outcome,
197+ void *data_lambda) {
198+ auto &body = get_outcome.GetResult ().GetBody ();
199+ body.read (
200+ reinterpret_cast <char *>(data_lambda),
201+ static_cast <std::streamsize>(len));
202+ std::streamsize read_bytes = body.gcount ();
203+ if (read_bytes != static_cast <std::streamsize>(len))
204+ {
205+ throw std::runtime_error (
206+ " ExternalBlockStorageAws: failed to read expected number of "
207+ " bytes "
208+ " from S3 object" );
209+ }
210+ };
211+
212+ if (!m_async.has_value ())
195213 {
196- throw std::runtime_error (
197- std::string (" ExternalBlockStorageAws::get failed: " ) +
198- get_outcome.GetError ().GetMessage ());
199- }
214+ auto get_outcome = m_client.GetObject (get_request);
215+ if (!get_outcome.IsSuccess ())
216+ {
217+ throw std::runtime_error (
218+ std::string (" ExternalBlockStorageAws::get failed: " ) +
219+ get_outcome.GetError ().GetMessage ());
220+ }
200221
201- auto &body = get_outcome.GetResult ().GetBody ();
202- body.read (
203- reinterpret_cast <char *>(data), static_cast <std::streamsize>(len));
204- std::streamsize read_bytes = body.gcount ();
205- if (read_bytes != static_cast <std::streamsize>(len))
222+ processGetOutcome (get_outcome, data.get ());
223+ }
224+ else
206225 {
207- throw std::runtime_error (
208- " ExternalBlockStorageAws: failed to read expected number of bytes "
209- " from S3 object" );
226+ auto &async_counter = this ->m_async ->shared_ptr_operations ;
227+ auto responseReceivedHandler =
228+ [&async_counter,
229+ external_ref,
230+ processGetOutcome_lambda = std::move (processGetOutcome),
231+ data_lambda = std::move (data)](
232+ const Aws::S3::S3Client *,
233+ const Aws::S3::Model::GetObjectRequest &,
234+ const Aws::S3::Model::GetObjectOutcome &get_outcome,
235+ const std::shared_ptr<const Aws::Client::AsyncCallerContext>
236+ &) {
237+ if (get_outcome.IsSuccess ())
238+ {
239+ // std::cout << "File asynchronously downloaded successfully
240+ // "
241+ // "from S3!"
242+ // << std::endl;
243+ }
244+ else
245+ {
246+ std::cerr << " Asynchronous download failed for '"
247+ << external_ref
248+ << " ': " << get_outcome.GetError ().GetMessage ()
249+ << std::endl;
250+ }
251+ processGetOutcome_lambda (get_outcome, data_lambda.get ());
252+ async_counter.add_and_notify_result ();
253+ };
254+ async_counter.add_task ();
255+ m_client.GetObjectAsync (
256+ get_request, std::move (responseReceivedHandler));
210257 }
211258}
212259
0 commit comments