@@ -1099,21 +1099,31 @@ func deleteContainers(opts *clientconfig.ClientOpts, filter Filter, logger logru
10991099 return false , err
11001100 }
11011101 queue .Add (func () {
1102- logger .Debugf ("Initiating bulk deletion of %d objects in container %q" , len (objectsOnPage ), container )
1103- resp , err := objects .BulkDelete (conn , container , objectsOnPage ).Extract ()
1104- if err != nil {
1105- errCh <- err
1106- return
1107- }
1108- if len (resp .Errors ) > 0 {
1109- // Convert resp.Errors to golang errors.
1110- // Each error is represented by a list of 2 strings, where the first one
1111- // is the object name, and the second one contains an error message.
1112- for _ , objectError := range resp .Errors {
1113- errCh <- fmt .Errorf ("cannot delete object %q: %s" , objectError [0 ], objectError [1 ])
1102+ for len (objectsOnPage ) > 0 {
1103+ logger .Debugf ("Initiating bulk deletion of %d objects in container %q" , len (objectsOnPage ), container )
1104+ resp , err := objects .BulkDelete (conn , container , objectsOnPage ).Extract ()
1105+ if err != nil {
1106+ errCh <- err
1107+ return
1108+ }
1109+ if len (resp .Errors ) > 0 {
1110+ // Convert resp.Errors to golang errors.
1111+ // Each error is represented by a list of 2 strings, where the first one
1112+ // is the object name, and the second one contains an error message.
1113+ for _ , objectError := range resp .Errors {
1114+ errCh <- fmt .Errorf ("cannot delete object %q: %s" , objectError [0 ], objectError [1 ])
1115+ }
1116+ logger .Debugf ("Terminating object deletion routine with error. Deleted %d objects out of %d." , resp .NumberDeleted , len (objectsOnPage ))
11141117 }
1118+
1119+ // Some object-storage instances may be set to have a limit to the LIST operation
1120+ // that is higher to the limit to the BULK DELETE operation. On those clouds, objects
1121+ // in the BULK DELETE call beyond the limit are silently ignored. In this loop, after
1122+ // checking that no errors were encountered, we reduce the BULK DELETE list by the
1123+ // number of processed objects, and send it back to the server if it's not empty.
1124+ objectsOnPage = objectsOnPage [resp .NumberDeleted + resp .NumberNotFound :]
11151125 }
1116- logger .Debugf ("Terminating object deletion routine. Deleted %d objects out of %d." , resp . NumberDeleted , len ( objectsOnPage ) )
1126+ logger .Debugf ("Terminating object deletion routine." )
11171127 })
11181128 return true , nil
11191129 })
0 commit comments