Skip to content

Commit b8ce165

Browse files
committed
- Upgrade S3 SDK from v2 to v3
- Fix invalid call to stats collector Signed-off-by: Ben <[email protected]>
1 parent a2a97ea commit b8ce165

File tree

1 file changed

+49
-24
lines changed

1 file changed

+49
-24
lines changed

src/sdk/namespace_gcp.js

+49-24
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ const s3_utils = require('../endpoint/s3/s3_utils');
1111
const S3Error = require('../endpoint/s3/s3_errors').S3Error;
1212
// we use this wrapper to set a custom user agent
1313
const GoogleCloudStorage = require('../util/google_storage_wrap');
14-
const AWS = require('aws-sdk');
14+
const {
15+
AbortMultipartUploadCommand,
16+
CompleteMultipartUploadCommand,
17+
CreateMultipartUploadCommand,
18+
ListPartsCommand,
19+
S3Client,
20+
UploadPartCommand,
21+
UploadPartCopyCommand,
22+
} = require('@aws-sdk/client-s3');
1523

1624
/**
1725
* @implements {nb.Namespace}
@@ -54,10 +62,13 @@ class NamespaceGCP {
5462
private_key: this.private_key,
5563
}
5664
});
57-
this.s3_client = new AWS.S3({
65+
this.s3_client = new S3Client({
5866
endpoint: 'https://storage.googleapis.com',
59-
accessKeyId: hmac_key.access_id,
60-
secretAccessKey: hmac_key.secret_key
67+
region: 'auto', //https://cloud.google.com/storage/docs/aws-simple-migration#storage-list-buckets-s3-python
68+
credentials: {
69+
accessKeyId: hmac_key.access_id,
70+
secretAccessKey: hmac_key.secret_key,
71+
},
6172
});
6273

6374
this.bucket = target_bucket;
@@ -196,7 +207,7 @@ class NamespaceGCP {
196207
read_stream.on('response', () => {
197208
let count = 1;
198209
const count_stream = stream_utils.get_tap_stream(data => {
199-
this.stats_collector.update_namespace_write_stats({
210+
this.stats.update_namespace_write_stats({
200211
namespace_resource_id: this.namespace_resource_id,
201212
bucket_name: params.bucket,
202213
size: data.length,
@@ -303,28 +314,30 @@ class NamespaceGCP {
303314
async create_object_upload(params, object_sdk) {
304315
dbg.log0('NamespaceGCP.create_object_upload:', this.bucket, inspect(params));
305316
const Tagging = params.tagging && params.tagging.map(tag => tag.key + '=' + tag.value).join('&');
306-
/** @type {AWS.S3.CreateMultipartUploadRequest} */
307-
const request = {
317+
318+
/** @type {import('@aws-sdk/client-s3').CreateMultipartUploadRequest} */
319+
const mp_upload_input = {
308320
Bucket: this.bucket,
309321
Key: params.key,
310322
ContentType: params.content_type,
311323
StorageClass: params.storage_class,
312324
Metadata: params.xattr,
313325
Tagging
314326
};
315-
const res = await this.s3_client.createMultipartUpload(request).promise();
327+
const mp_upload_cmd = new CreateMultipartUploadCommand(mp_upload_input);
328+
const res = await this.s3_client.send(mp_upload_cmd);
316329

317330
dbg.log0('NamespaceGCP.create_object_upload:', this.bucket, inspect(params), 'res', inspect(res));
318331
return { obj_id: res.UploadId };
319332
}
320333

321334
async upload_multipart(params, object_sdk) {
322335
dbg.log0('NamespaceGCP.upload_multipart:', this.bucket, inspect(params));
336+
let etag;
323337
let res;
324338
if (params.copy_source) {
325339
const { copy_source, copy_source_range } = s3_utils.format_copy_source(params.copy_source);
326-
327-
/** @type {AWS.S3.UploadPartCopyRequest} */
340+
/** @type {import('@aws-sdk/client-s3').UploadPartCopyRequest} */
328341
const request = {
329342
Bucket: this.bucket,
330343
Key: params.key,
@@ -334,7 +347,9 @@ class NamespaceGCP {
334347
CopySourceRange: copy_source_range,
335348
};
336349

337-
res = await this.s3_client.uploadPartCopy(request).promise();
350+
const command = new UploadPartCopyCommand(request);
351+
res = await this.s3_client.send(command);
352+
etag = s3_utils.parse_etag(res.CopyPartResult.ETag);
338353
} else {
339354
let count = 1;
340355
const count_stream = stream_utils.get_tap_stream(data => {
@@ -346,7 +361,7 @@ class NamespaceGCP {
346361
// clear count for next updates
347362
count = 0;
348363
});
349-
/** @type {AWS.S3.UploadPartRequest} */
364+
/** @type {import('@aws-sdk/client-s3').UploadPartRequest} */
350365
const request = {
351366
Bucket: this.bucket,
352367
Key: params.key,
@@ -357,7 +372,8 @@ class NamespaceGCP {
357372
ContentLength: params.size,
358373
};
359374
try {
360-
res = await this.s3_client.uploadPart(request).promise();
375+
const command = new UploadPartCommand(request);
376+
res = await this.s3_client.send(command);
361377
} catch (err) {
362378
object_sdk.rpc_client.pool.update_issues_report({
363379
namespace_resource_id: this.namespace_resource_id,
@@ -366,22 +382,25 @@ class NamespaceGCP {
366382
});
367383
throw err;
368384
}
385+
etag = s3_utils.parse_etag(res.ETag);
369386
}
370387
dbg.log0('NamespaceGCP.upload_multipart:', this.bucket, inspect(params), 'res', inspect(res));
371-
const etag = s3_utils.parse_etag(res.ETag);
372388
return { etag };
373389
}
374390

375391
async list_multiparts(params, object_sdk) {
376392
dbg.log0('NamespaceGCP.list_multiparts:', this.bucket, inspect(params));
377393

378-
const res = await this.s3_client.listParts({
394+
/** @type {import('@aws-sdk/client-s3').ListPartsRequest} */
395+
const request = {
379396
Bucket: this.bucket,
380397
Key: params.key,
381398
UploadId: params.obj_id,
382399
MaxParts: params.max,
383400
PartNumberMarker: params.num_marker,
384-
}).promise();
401+
};
402+
const command = new ListPartsCommand(request);
403+
const res = await this.s3_client.send(command);
385404

386405
dbg.log0('NamespaceGCP.list_multiparts:', this.bucket, inspect(params), 'res', inspect(res));
387406
return {
@@ -399,7 +418,8 @@ class NamespaceGCP {
399418
async complete_object_upload(params, object_sdk) {
400419
dbg.log0('NamespaceGCP.complete_object_upload:', this.bucket, inspect(params));
401420

402-
const res = await this.s3_client.completeMultipartUpload({
421+
/** @type {import('@aws-sdk/client-s3').CompleteMultipartUploadRequest} */
422+
const request = {
403423
Bucket: this.bucket,
404424
Key: params.key,
405425
UploadId: params.obj_id,
@@ -409,7 +429,9 @@ class NamespaceGCP {
409429
ETag: `"${p.etag}"`,
410430
}))
411431
}
412-
}).promise();
432+
};
433+
const command = new CompleteMultipartUploadCommand(request);
434+
const res = await this.s3_client.send(command);
413435

414436
dbg.log0('NamespaceGCP.complete_object_upload:', this.bucket, inspect(params), 'res', inspect(res));
415437
const etag = s3_utils.parse_etag(res.ETag);
@@ -418,11 +440,14 @@ class NamespaceGCP {
418440

419441
async abort_object_upload(params, object_sdk) {
420442
dbg.log0('NamespaceGCP.abort_object_upload:', this.bucket, inspect(params));
421-
const res = await this.s3_client.abortMultipartUpload({
443+
/** @type {import('@aws-sdk/client-s3').AbortMultipartUploadRequest} */
444+
const request = {
422445
Bucket: this.bucket,
423446
Key: params.key,
424447
UploadId: params.obj_id,
425-
}).promise();
448+
};
449+
const command = new AbortMultipartUploadCommand(request);
450+
const res = await this.s3_client.send(command);
426451

427452
dbg.log0('NamespaceGCP.abort_object_upload:', this.bucket, inspect(params), 'res', inspect(res));
428453
}
@@ -471,8 +496,8 @@ class NamespaceGCP {
471496

472497
const res = await P.map_with_concurrency(10, params.objects, obj =>
473498
this.gcs.bucket(this.bucket).file(obj.key).delete()
474-
.then(() => ({}))
475-
.catch(err => ({ err_code: err.code, err_message: err.errors[0].reason || 'InternalError' })));
499+
.then(() => ({}))
500+
.catch(err => ({ err_code: err.code, err_message: err.errors[0].reason || 'InternalError' })));
476501

477502
dbg.log1('NamespaceGCP.delete_multiple_objects:', this.bucket, inspect(params), 'res', inspect(res));
478503

@@ -500,9 +525,9 @@ class NamespaceGCP {
500525
// Set an empty metadata object to remove all tags
501526
const res = await this.gcs.bucket(this.bucket).file(params.key).setMetadata({});
502527
dbg.log0('NamespaceGCP.delete_object_tagging:', this.bucket, inspect(params), 'res', inspect(res));
503-
} catch (err) {
528+
} catch (err) {
504529
dbg.error('NamespaceGCP.delete_object_tagging error:', err);
505-
}
530+
}
506531
}
507532
async put_object_tagging(params, object_sdk) {
508533
dbg.log0('NamespaceGCP.put_object_tagging:', this.bucket, inspect(params));

0 commit comments

Comments
 (0)