@@ -1970,24 +1970,38 @@ 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
+ for start := 0 ; start < len (digests ); {
1982
+ size := min (len (digests )- start , AwsS3BatchLimit )
1983
+ end := start + size
1984
+
1985
+ resp , err := dwr .Client .BatchGetItem (ctx , & dynamodb.BatchGetItemInput {
1986
+ RequestItems : map [string ]types.KeysAndAttributes {
1987
+ dwr .ImageMetaTablename : {
1988
+ Keys : getBatchImageKeys (digests [start :end ]),
1989
+ },
1979
1990
},
1980
- },
1981
- })
1982
- if err != nil {
1983
- return nil , err
1984
- }
1991
+ })
1992
+ if err != nil {
1993
+ return nil , err
1994
+ }
1985
1995
1986
- if len (resp .Responses [dwr .ImageMetaTablename ]) != len (digests ) {
1987
- return nil , zerr .ErrImageMetaNotFound
1996
+ if len (resp .Responses [dwr .ImageMetaTablename ]) != size {
1997
+ return nil , zerr .ErrImageMetaNotFound
1998
+ }
1999
+
2000
+ batchedResp = append (batchedResp , resp .Responses [dwr .ImageMetaTablename ]... )
2001
+ start = end
1988
2002
}
1989
2003
1990
- return resp . Responses [ dwr . ImageMetaTablename ] , nil
2004
+ return batchedResp , nil
1991
2005
}
1992
2006
1993
2007
func getBatchImageKeys (digests []string ) []map [string ]types.AttributeValue {
0 commit comments