ListObjectVersions 未按预期运行(AWS SDK c++)
ListObjectVersions not behaving as expected (AWS SDK c++)
我列出了 s3 上特定密钥的所有可用版本。两个问题:
- 我获得的前 1000 个版本 ID 无效 "NoSuchVersion"。其余版本 ID 工作正常。
- 一旦我环回,IsTruncated 标志就永远不会变回 false。
问题 #2 对我来说不是什么大问题。但是#1 是一个表演终结者。
这是一个代码片段:
Model::ListObjectVersionsRequest object_request;
object_request.WithBucket(this->bucket_name);
object_request.WithKeyMarker( ... + ".json");
do {
auto list_versions_outcome = this->s3_client->ListObjectVersions(object_request);
//...
//prepare for next iteration
object_request.SetVersionIdMarker(list_versions_outcome.GetResult().GetNextVersionIdMarker());
} while (keep_looking);
想法?
所以我找到了解决此问题的方法。这个想法是将版本 ID 结果的第一页的大小限制为一个。完成后,我们可以将页面大小恢复到 1000。即使第一个结果得到错误的版本 ID,这也没有关系,因为检索最新版本是 s3 的默认行为。
代码变为:
Model::ListObjectVersionsRequest object_request;
object_request.WithBucket(this->bucket_name);
object_request.WithKeyMarker( ... + ".json");
object_request.WithMaxKeys(1);//HAX because of the first 1000 issue
do {
auto list_versions_outcome = this->s3_client->ListObjectVersions(object_request);
//...
//prepare for next iteration
object_request.SetVersionIdMarker(list_versions_outcome.GetResult().GetNextVersionIdMarker());
object_request.SetMaxKeys(1000); // reset the page number to 1000
} while (keep_looking);
我列出了 s3 上特定密钥的所有可用版本。两个问题:
- 我获得的前 1000 个版本 ID 无效 "NoSuchVersion"。其余版本 ID 工作正常。
- 一旦我环回,IsTruncated 标志就永远不会变回 false。
问题 #2 对我来说不是什么大问题。但是#1 是一个表演终结者。
这是一个代码片段:
Model::ListObjectVersionsRequest object_request;
object_request.WithBucket(this->bucket_name);
object_request.WithKeyMarker( ... + ".json");
do {
auto list_versions_outcome = this->s3_client->ListObjectVersions(object_request);
//...
//prepare for next iteration
object_request.SetVersionIdMarker(list_versions_outcome.GetResult().GetNextVersionIdMarker());
} while (keep_looking);
想法?
所以我找到了解决此问题的方法。这个想法是将版本 ID 结果的第一页的大小限制为一个。完成后,我们可以将页面大小恢复到 1000。即使第一个结果得到错误的版本 ID,这也没有关系,因为检索最新版本是 s3 的默认行为。
代码变为:
Model::ListObjectVersionsRequest object_request;
object_request.WithBucket(this->bucket_name);
object_request.WithKeyMarker( ... + ".json");
object_request.WithMaxKeys(1);//HAX because of the first 1000 issue
do {
auto list_versions_outcome = this->s3_client->ListObjectVersions(object_request);
//...
//prepare for next iteration
object_request.SetVersionIdMarker(list_versions_outcome.GetResult().GetNextVersionIdMarker());
object_request.SetMaxKeys(1000); // reset the page number to 1000
} while (keep_looking);