@@ -1970,24 +1970,39 @@ func (dwr DynamoDB) DeleteUserData(ctx context.Context) error {
1970
1970
return err
1971
1971
}
1972
1972
1973
+ const AwsS3BatchLimit = 100
1974
+
1973
1975
func (dwr * DynamoDB ) fetchImageMetaAttributesByDigest (ctx context.Context , digests []string ,
1974
1976
) ([]map [string ]types.AttributeValue , error ) {
1975
- resp , err := dwr .Client .BatchGetItem (ctx , & dynamodb.BatchGetItemInput {
1976
- RequestItems : map [string ]types.KeysAndAttributes {
1977
- dwr .ImageMetaTablename : {
1978
- Keys : getBatchImageKeys (digests ),
1977
+ // AWS S3 as a limit (=100) on number of keys that can retrieved in one
1978
+ // request, so break it up
1979
+ batchedResp := []map [string ]types.AttributeValue {}
1980
+
1981
+ var end int
1982
+
1983
+ for start := 0 ; start < len (digests ); {
1984
+ end = min (len (digests )- start , AwsS3BatchLimit )
1985
+
1986
+ resp , err := dwr .Client .BatchGetItem (ctx , & dynamodb.BatchGetItemInput {
1987
+ RequestItems : map [string ]types.KeysAndAttributes {
1988
+ dwr .ImageMetaTablename : {
1989
+ Keys : getBatchImageKeys (digests [start :end ]),
1990
+ },
1979
1991
},
1980
- },
1981
- })
1982
- if err != nil {
1983
- return nil , err
1984
- }
1992
+ })
1993
+ if err != nil {
1994
+ return nil , err
1995
+ }
1985
1996
1986
- if len (resp .Responses [dwr .ImageMetaTablename ]) != len (digests ) {
1987
- return nil , zerr .ErrImageMetaNotFound
1997
+ if len (resp .Responses [dwr .ImageMetaTablename ]) != (end - start ) {
1998
+ return nil , zerr .ErrImageMetaNotFound
1999
+ }
2000
+
2001
+ batchedResp = append (batchedResp , resp .Responses [dwr .ImageMetaTablename ]... )
2002
+ start = end
1988
2003
}
1989
2004
1990
- return resp . Responses [ dwr . ImageMetaTablename ] , nil
2005
+ return batchedResp , nil
1991
2006
}
1992
2007
1993
2008
func getBatchImageKeys (digests []string ) []map [string ]types.AttributeValue {
0 commit comments