|
18 | 18 |
|
19 | 19 | import static java.util.Objects.requireNonNull;
|
20 | 20 |
|
| 21 | +import static com.google.common.base.Throwables.getStackTraceAsString; |
21 | 22 | import static com.google.common.base.Throwables.propagate;
|
22 | 23 |
|
23 | 24 | import java.io.BufferedReader;
|
24 | 25 | import java.io.IOException;
|
25 | 26 | import java.io.InputStreamReader;
|
26 | 27 | import java.util.ArrayList;
|
| 28 | +import java.util.HashMap; |
27 | 29 | import java.util.List;
|
| 30 | +import java.util.Map; |
28 | 31 | import java.util.Objects;
|
29 | 32 | import java.util.Optional;
|
30 | 33 | import java.util.stream.Collectors;
|
@@ -151,34 +154,59 @@ public BulkDeleteResult bulkDelete(@NotNull @PathParam("account") String account
|
151 | 154 | }
|
152 | 155 |
|
153 | 156 | BulkDeleteResult result = new BulkDeleteResult();
|
| 157 | + Map<String, List<String>> removeBlobsMap = new HashMap<>(); |
| 158 | + List<String> deleteContainers = new ArrayList<>(); |
154 | 159 | for (String objectContainer : objects) {
|
155 | 160 | try {
|
156 | 161 | if (objectContainer.startsWith("/")) {
|
157 | 162 | objectContainer = objectContainer.substring(1);
|
158 | 163 | }
|
159 | 164 | int separatorIndex = objectContainer.indexOf('/');
|
160 | 165 | if (separatorIndex < 0) {
|
161 |
| - blobStore.deleteContainer(objectContainer.substring(1)); |
162 |
| - result.numberDeleted += 1; |
| 166 | + deleteContainers.add(objectContainer.substring(1)); |
163 | 167 | continue;
|
164 | 168 | }
|
165 | 169 | String container = objectContainer.substring(0, separatorIndex);
|
166 | 170 | String object = objectContainer.substring(separatorIndex + 1);
|
167 | 171 |
|
168 |
| - if (!blobStore.blobExists(container, object)) { |
169 |
| - result.numberNotFound += 1; |
170 |
| - } else { |
171 |
| - blobStore.removeBlob(container, object); |
172 |
| - result.numberDeleted += 1; |
| 172 | + if (!removeBlobsMap.containsKey(container)) { |
| 173 | + removeBlobsMap.put(container, new ArrayList<>()); |
173 | 174 | }
|
| 175 | + removeBlobsMap.get(container).add(object); |
174 | 176 | } catch (ContainerNotFoundException e) {
|
175 | 177 | result.numberNotFound += 1;
|
176 | 178 | } catch (Exception e) {
|
177 |
| - e.printStackTrace(); |
| 179 | + logger.error(e.toString()); |
| 180 | + logger.debug(getStackTraceAsString(e)); |
178 | 181 | result.errors.add(objectContainer);
|
179 | 182 | }
|
180 | 183 | }
|
181 | 184 |
|
| 185 | + removeBlobsMap.forEach((container, blobList) -> { |
| 186 | + try { |
| 187 | + blobStore.removeBlobs(container, blobList); |
| 188 | + result.numberDeleted += blobList.size(); |
| 189 | + } catch (ContainerNotFoundException e) { |
| 190 | + result.numberNotFound += blobList.size(); |
| 191 | + } catch (Exception e) { |
| 192 | + logger.error(e.toString()); |
| 193 | + logger.debug(getStackTraceAsString(e)); |
| 194 | + blobList.forEach(blob -> result.errors.add(container + "/" + blob)); |
| 195 | + } |
| 196 | + }); |
| 197 | + deleteContainers.forEach(container -> { |
| 198 | + try { |
| 199 | + blobStore.deleteContainer(container); |
| 200 | + result.numberDeleted += 1; |
| 201 | + } catch (ContainerNotFoundException e) { |
| 202 | + result.numberNotFound += 1; |
| 203 | + } catch (Exception e) { |
| 204 | + logger.error(e.toString()); |
| 205 | + logger.debug(getStackTraceAsString(e)); |
| 206 | + result.errors.add(container); |
| 207 | + } |
| 208 | + }); |
| 209 | + |
182 | 210 | if (result.errors.isEmpty()) {
|
183 | 211 | result.responseStatus = Response.Status.OK.toString();
|
184 | 212 | return result;
|
|
0 commit comments